123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- typedef struct DirEntry DirEntry;
- typedef struct MetaBlock MetaBlock;
- typedef struct MetaEntry MetaEntry;
- enum {
- MetaMagic = 0x5656fc7a,
- MetaHeaderSize = 12,
- MetaIndexSize = 4,
- IndexEntrySize = 8,
- DirMagic = 0x1c4d9072,
- };
- /*
- * Mode bits
- */
- enum {
- ModeOtherExec = (1<<0),
- ModeOtherWrite = (1<<1),
- ModeOtherRead = (1<<2),
- ModeGroupExec = (1<<3),
- ModeGroupWrite = (1<<4),
- ModeGroupRead = (1<<5),
- ModeOwnerExec = (1<<6),
- ModeOwnerWrite = (1<<7),
- ModeOwnerRead = (1<<8),
- ModeSticky = (1<<9),
- ModeSetUid = (1<<10),
- ModeSetGid = (1<<11),
- ModeAppend = (1<<12), /* append only file */
- ModeExclusive = (1<<13), /* lock file - plan 9 */
- ModeLink = (1<<14), /* sym link */
- ModeDir = (1<<15), /* duplicate of DirEntry */
- ModeHidden = (1<<16), /* MS-DOS */
- ModeSystem = (1<<17), /* MS-DOS */
- ModeArchive = (1<<18), /* MS-DOS */
- ModeTemporary = (1<<19), /* MS-DOS */
- ModeSnapshot = (1<<20), /* read only snapshot */
- };
- /* optional directory entry fields */
- enum {
- DePlan9 = 1, /* not valid in version >= 9 */
- DeNT, /* not valid in version >= 9 */
- DeQidSpace,
- DeGen, /* not valid in version >= 9 */
- };
- struct DirEntry {
- char *elem; /* path element */
- ulong entry; /* entry in directory for data */
- ulong gen; /* generation of data entry */
- ulong mentry; /* entry in directory for meta */
- ulong mgen; /* generation of meta entry */
- uvlong size; /* size of file */
- uvlong qid; /* unique file id */
- char *uid; /* owner id */
- char *gid; /* group id */
- char *mid; /* last modified by */
- ulong mtime; /* last modified time */
- ulong mcount; /* number of modifications: can wrap! */
- ulong ctime; /* directory entry last changed */
- ulong atime; /* last time accessed */
- ulong mode; /* various mode bits */
- /* plan 9 */
- int plan9;
- uvlong p9path;
- ulong p9version;
- /* sub space of qid */
- int qidSpace;
- uvlong qidOffset; /* qid offset */
- uvlong qidMax; /* qid maximum */
- };
- struct MetaEntry {
- uchar *p;
- ushort size;
- };
- struct MetaBlock {
- int maxsize; /* size of block */
- int size; /* size used */
- int free; /* free space within used size */
- int maxindex; /* entries allocated for table */
- int nindex; /* amount of table used */
- int botch; /* compensate for my stupidity */
- uchar *buf;
- };
- void deCleanup(DirEntry*);
- void deCopy(DirEntry*, DirEntry*);
- int deSize(DirEntry*);
- void dePack(DirEntry*, MetaEntry*);
- int deUnpack(DirEntry*, MetaEntry*);
- void mbInit(MetaBlock*, uchar*, int, int);
- int mbUnpack(MetaBlock*, uchar*, int);
- void mbInsert(MetaBlock*, int, MetaEntry*);
- void mbDelete(MetaBlock*, int);
- void mbPack(MetaBlock*);
- uchar *mbAlloc(MetaBlock*, int);
- int mbResize(MetaBlock*, MetaEntry*, int);
- int mbSearch(MetaBlock*, char*, int*, MetaEntry*);
- void meUnpack(MetaEntry*, MetaBlock*, int);
|