diff options
author | David du Colombier <0intro@gmail.com> | 2013-09-23 23:00:39 +0200 |
---|---|---|
committer | David du Colombier <0intro@gmail.com> | 2013-09-23 23:00:39 +0200 |
commit | 6f4d00ee45693290fae042b27536b54f77b96acd (patch) | |
tree | 60ad31bf16ed2000661c02345dd2a63851588a5d /src/cmd/fossil/vac.h | |
parent | fea86f063930ea187f1c77e93207ac8d39125520 (diff) | |
download | plan9port-6f4d00ee45693290fae042b27536b54f77b96acd.tar.gz plan9port-6f4d00ee45693290fae042b27536b54f77b96acd.tar.bz2 plan9port-6f4d00ee45693290fae042b27536b54f77b96acd.zip |
fossil: import from plan 9
R=rsc
https://codereview.appspot.com/7988047
Diffstat (limited to 'src/cmd/fossil/vac.h')
-rw-r--r-- | src/cmd/fossil/vac.h | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/cmd/fossil/vac.h b/src/cmd/fossil/vac.h new file mode 100644 index 00000000..bd26c62d --- /dev/null +++ b/src/cmd/fossil/vac.h @@ -0,0 +1,107 @@ +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); |