108 lines
2.7 KiB
C
108 lines
2.7 KiB
C
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);
|