1*5e96a66cSDavid du Colombier typedef struct DirEntry DirEntry; 2*5e96a66cSDavid du Colombier typedef struct MetaBlock MetaBlock; 3*5e96a66cSDavid du Colombier typedef struct MetaEntry MetaEntry; 4*5e96a66cSDavid du Colombier 5*5e96a66cSDavid du Colombier enum { 6*5e96a66cSDavid du Colombier MetaMagic = 0x5656fc7a, 7*5e96a66cSDavid du Colombier MetaHeaderSize = 12, 8*5e96a66cSDavid du Colombier MetaIndexSize = 4, 9*5e96a66cSDavid du Colombier IndexEntrySize = 8, 10*5e96a66cSDavid du Colombier DirMagic = 0x1c4d9072, 11*5e96a66cSDavid du Colombier }; 12*5e96a66cSDavid du Colombier 13*5e96a66cSDavid du Colombier /* 14*5e96a66cSDavid du Colombier * Mode bits 15*5e96a66cSDavid du Colombier */ 16*5e96a66cSDavid du Colombier enum { 17*5e96a66cSDavid du Colombier ModeOtherExec = (1<<0), 18*5e96a66cSDavid du Colombier ModeOtherWrite = (1<<1), 19*5e96a66cSDavid du Colombier ModeOtherRead = (1<<2), 20*5e96a66cSDavid du Colombier ModeGroupExec = (1<<3), 21*5e96a66cSDavid du Colombier ModeGroupWrite = (1<<4), 22*5e96a66cSDavid du Colombier ModeGroupRead = (1<<5), 23*5e96a66cSDavid du Colombier ModeOwnerExec = (1<<6), 24*5e96a66cSDavid du Colombier ModeOwnerWrite = (1<<7), 25*5e96a66cSDavid du Colombier ModeOwnerRead = (1<<8), 26*5e96a66cSDavid du Colombier ModeSticky = (1<<9), 27*5e96a66cSDavid du Colombier ModeSetUid = (1<<10), 28*5e96a66cSDavid du Colombier ModeSetGid = (1<<11), 29*5e96a66cSDavid du Colombier ModeAppend = (1<<12), /* append only file */ 30*5e96a66cSDavid du Colombier ModeExclusive = (1<<13), /* lock file - plan 9 */ 31*5e96a66cSDavid du Colombier ModeLink = (1<<14), /* sym link */ 32*5e96a66cSDavid du Colombier ModeDir = (1<<15), /* duplicate of DirEntry */ 33*5e96a66cSDavid du Colombier ModeHidden = (1<<16), /* MS-DOS */ 34*5e96a66cSDavid du Colombier ModeSystem = (1<<17), /* MS-DOS */ 35*5e96a66cSDavid du Colombier ModeArchive = (1<<18), /* MS-DOS */ 36*5e96a66cSDavid du Colombier ModeTemporary = (1<<19), /* MS-DOS */ 37*5e96a66cSDavid du Colombier ModeSnapshot = (1<<20), /* read only snapshot */ 38*5e96a66cSDavid du Colombier }; 39*5e96a66cSDavid du Colombier 40*5e96a66cSDavid du Colombier /* optional directory entry fields */ 41*5e96a66cSDavid du Colombier enum { 42*5e96a66cSDavid du Colombier DePlan9 = 1, /* not valid in version >= 9 */ 43*5e96a66cSDavid du Colombier DeNT, /* not valid in version >= 9 */ 44*5e96a66cSDavid du Colombier DeQidSpace, 45*5e96a66cSDavid du Colombier DeGen, /* not valid in version >= 9 */ 46*5e96a66cSDavid du Colombier }; 47*5e96a66cSDavid du Colombier 48*5e96a66cSDavid du Colombier struct DirEntry { 49*5e96a66cSDavid du Colombier char *elem; /* path element */ 50*5e96a66cSDavid du Colombier ulong entry; /* entry in directory for data */ 51*5e96a66cSDavid du Colombier ulong gen; /* generation of data entry */ 52*5e96a66cSDavid du Colombier ulong mentry; /* entry in directory for meta */ 53*5e96a66cSDavid du Colombier ulong mgen; /* generation of meta entry */ 54*5e96a66cSDavid du Colombier uvlong size; /* size of file */ 55*5e96a66cSDavid du Colombier uvlong qid; /* unique file id */ 56*5e96a66cSDavid du Colombier 57*5e96a66cSDavid du Colombier char *uid; /* owner id */ 58*5e96a66cSDavid du Colombier char *gid; /* group id */ 59*5e96a66cSDavid du Colombier char *mid; /* last modified by */ 60*5e96a66cSDavid du Colombier ulong mtime; /* last modified time */ 61*5e96a66cSDavid du Colombier ulong mcount; /* number of modifications: can wrap! */ 62*5e96a66cSDavid du Colombier ulong ctime; /* directory entry last changed */ 63*5e96a66cSDavid du Colombier ulong atime; /* last time accessed */ 64*5e96a66cSDavid du Colombier ulong mode; /* various mode bits */ 65*5e96a66cSDavid du Colombier 66*5e96a66cSDavid du Colombier /* plan 9 */ 67*5e96a66cSDavid du Colombier int plan9; 68*5e96a66cSDavid du Colombier uvlong p9path; 69*5e96a66cSDavid du Colombier ulong p9version; 70*5e96a66cSDavid du Colombier 71*5e96a66cSDavid du Colombier /* sub space of qid */ 72*5e96a66cSDavid du Colombier int qidSpace; 73*5e96a66cSDavid du Colombier uvlong qidOffset; /* qid offset */ 74*5e96a66cSDavid du Colombier uvlong qidMax; /* qid maximum */ 75*5e96a66cSDavid du Colombier }; 76*5e96a66cSDavid du Colombier 77*5e96a66cSDavid du Colombier struct MetaEntry { 78*5e96a66cSDavid du Colombier uchar *p; 79*5e96a66cSDavid du Colombier ushort size; 80*5e96a66cSDavid du Colombier }; 81*5e96a66cSDavid du Colombier 82*5e96a66cSDavid du Colombier struct MetaBlock { 83*5e96a66cSDavid du Colombier int maxsize; /* size of block */ 84*5e96a66cSDavid du Colombier int size; /* size used */ 85*5e96a66cSDavid du Colombier int free; /* free space within used size */ 86*5e96a66cSDavid du Colombier int maxindex; /* entries allocated for table */ 87*5e96a66cSDavid du Colombier int nindex; /* amount of table used */ 88*5e96a66cSDavid du Colombier int botch; /* compensate for my stupidity */ 89*5e96a66cSDavid du Colombier uchar *buf; 90*5e96a66cSDavid du Colombier }; 91*5e96a66cSDavid du Colombier 92*5e96a66cSDavid du Colombier void deCleanup(DirEntry*); 93*5e96a66cSDavid du Colombier void deCopy(DirEntry*, DirEntry*); 94*5e96a66cSDavid du Colombier int deSize(DirEntry*); 95*5e96a66cSDavid du Colombier void dePack(DirEntry*, MetaEntry*); 96*5e96a66cSDavid du Colombier int deUnpack(DirEntry*, MetaEntry*); 97*5e96a66cSDavid du Colombier 98*5e96a66cSDavid du Colombier void mbInit(MetaBlock*, uchar*, int, int); 99*5e96a66cSDavid du Colombier int mbUnpack(MetaBlock*, uchar*, int); 100*5e96a66cSDavid du Colombier void mbInsert(MetaBlock*, int, MetaEntry*); 101*5e96a66cSDavid du Colombier void mbDelete(MetaBlock*, int); 102*5e96a66cSDavid du Colombier void mbPack(MetaBlock*); 103*5e96a66cSDavid du Colombier uchar *mbAlloc(MetaBlock*, int); 104*5e96a66cSDavid du Colombier int mbResize(MetaBlock*, MetaEntry*, int); 105*5e96a66cSDavid du Colombier int mbSearch(MetaBlock*, char*, int*, MetaEntry*); 106*5e96a66cSDavid du Colombier 107*5e96a66cSDavid du Colombier void meUnpack(MetaEntry*, MetaBlock*, int); 108