/* * NAME: record->packdirent() * DESCRIPTION: make changes to a catalog record */ void r_packdirent(CatDataRec *data, const hfsdirent *ent) { switch (data->cdrType) { case cdrDirRec: data->u.dir.dirCrDat = d_mtime(ent->crdate); data->u.dir.dirMdDat = d_mtime(ent->mddate); data->u.dir.dirBkDat = d_mtime(ent->bkdate); data->u.dir.dirUsrInfo.frFlags = ent->fdflags; data->u.dir.dirUsrInfo.frLocation.v = ent->fdlocation.v; data->u.dir.dirUsrInfo.frLocation.h = ent->fdlocation.h; data->u.dir.dirUsrInfo.frRect.top = ent->u.dir.rect.top; data->u.dir.dirUsrInfo.frRect.left = ent->u.dir.rect.left; data->u.dir.dirUsrInfo.frRect.bottom = ent->u.dir.rect.bottom; data->u.dir.dirUsrInfo.frRect.right = ent->u.dir.rect.right; break; case cdrFilRec: if (ent->flags & HFS_ISLOCKED) data->u.fil.filFlags |= (1 << 0); else data->u.fil.filFlags &= ~(1 << 0); data->u.fil.filCrDat = d_mtime(ent->crdate); data->u.fil.filMdDat = d_mtime(ent->mddate); data->u.fil.filBkDat = d_mtime(ent->bkdate); data->u.fil.filUsrWds.fdFlags = ent->fdflags; data->u.fil.filUsrWds.fdLocation.v = ent->fdlocation.v; data->u.fil.filUsrWds.fdLocation.h = ent->fdlocation.h; data->u.fil.filUsrWds.fdType = d_getsl((unsigned char *) ent->u.file.type); data->u.fil.filUsrWds.fdCreator = d_getsl((unsigned char *) ent->u.file.creator); break; } }
/* * NAME: findtype() * DESCRIPTION: locate an item in a resource type list */ static const byte *findtype(rsrcmap *map, const char *type) { const byte *ptr; long typeint; short ntypes; typeint = d_getsl((const unsigned char *) type); ntypes = d_getsw(map->tlist); for (ptr = map->tlist + 2; ntypes >= 0; ptr += 8, --ntypes) { if (d_getsl(ptr) == typeint) break; } if (ntypes < 0) ERROR(EINVAL, "resource type not found"); return ptr; fail: return 0; }
/* * NAME: hfs->create() * DESCRIPTION: create and open a new file */ hfsfile *hfs_create(hfsvol *vol, const char *path, const char *type, const char *creator) { hfsfile *file = 0; unsigned long parid; char name[HFS_MAX_FLEN + 1]; CatKeyRec key; byte record[HFS_MAX_CATRECLEN]; unsigned reclen; int found; if (getvol(&vol) == -1) goto fail; file = ALLOC(hfsfile, 1); if (file == 0) ERROR(ENOMEM, 0); found = v_resolve(&vol, path, &file->cat, &parid, name, 0); if (found == -1 || parid == 0) goto fail; if (found) ERROR(EEXIST, 0); if (parid == HFS_CNID_ROOTPAR) ERROR(EINVAL, 0); if (vol->flags & HFS_VOL_READONLY) ERROR(EROFS, 0); /* create file `name' in parent `parid' */ if (bt_space(&vol->cat, 1) == -1) goto fail; f_init(file, vol, vol->mdb.drNxtCNID++, name); vol->flags |= HFS_VOL_UPDATE_MDB; file->parid = parid; /* create catalog record */ file->cat.u.fil.filUsrWds.fdType = d_getsl((const unsigned char *) type); file->cat.u.fil.filUsrWds.fdCreator = d_getsl((const unsigned char *) creator); file->cat.u.fil.filCrDat = d_mtime(time(0)); file->cat.u.fil.filMdDat = file->cat.u.fil.filCrDat; r_makecatkey(&key, file->parid, file->name); r_packcatrec(&key, &file->cat, record, &reclen); if (bt_insert(&vol->cat, record, reclen) == -1 || v_adjvalence(vol, file->parid, 0, 1) == -1) goto fail; /* package file handle for user */ file->next = vol->files; if (vol->files) vol->files->prev = file; vol->files = file; return file; fail: FREE(file); return 0; }