1
0
Files
irix-657m-src/eoe/cmd/efs/lib/efs_enter.c
2022-09-29 17:59:04 +03:00

70 lines
1.6 KiB
C

#ident "$Revision: 1.5 $"
/*
* Enter the given name/inode pair into the given directory.
*/
#include "efs.h"
#ifdef OEFS
void
efs_enter(efs_ino_t dirino, efs_ino_t ino, char *name)
{
struct efs_direct dir;
bzero(&dir, sizeof(dir));
dir.d_ino = ino;
strcpy(dir.d_name, name);
efs_write(dirino, &dir, sizeof(dir));
}
#endif
#ifdef EFS
void
efs_enter(efs_ino_t dirinum, efs_ino_t inum, char *name)
{
int namelen, wantsize;
struct efs_dinode *di;
struct efs_dent *dep;
struct efs_dirblk db;
efs_daddr_t bn;
int offset;
int firstused;
/*
* Scan dirblks for a free spot. Allocate a new dirblk if none
* contain enough free space.
*/
namelen = strlen(name);
wantsize = efs_dentsizebynamelen(namelen);
di = efs_iget(dirinum);
for (offset = 0; ; offset += EFS_DIRBSIZE) {
bn = efs_bmap(di, offset, EFS_DIRBSIZE);
lseek(fs_fd, BBTOB(bn), SEEK_SET);
if (read(fs_fd, &db, sizeof(db)) != sizeof(db))
error();
if (db.magic != EFS_DIRBLK_MAGIC) {
/* must be a new block */
db.magic = EFS_DIRBLK_MAGIC;
db.slots = 0;
db.firstused = 0;
}
if (EFS_DIR_FREESPACE(&db) > wantsize) {
/* put name in free space */
firstused = EFS_DIR_FREEOFF(db.firstused) - wantsize;
dep = EFS_SLOTOFF_TO_DEP(&db, firstused);
EFS_SET_INUM(dep, inum);
dep->d_namelen = namelen;
bcopy(name, dep->d_name, namelen);
db.firstused = EFS_COMPACT(firstused);
EFS_SET_SLOT(&db, db.slots, db.firstused);
db.slots++;
lseek(fs_fd, BBTOB(bn), SEEK_SET);
if (write(fs_fd, &db, sizeof(db)) != sizeof(db))
error();
efs_iput(di, dirinum);
return;
}
}
}
#endif