plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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);