70 lines
1.6 KiB
C
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
|