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