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