vac: clean up, add unvac

This commit is contained in:
Russ Cox
2008-06-14 13:28:49 -04:00
parent 01cea2ecb8
commit 64f9764ea9
16 changed files with 488 additions and 2421 deletions

View File

@@ -200,7 +200,7 @@ if(0)print("eo = %d en = %d\n", eo, en);
return 0;
}
/* assumes a small amount of checking has been done in mbEntry */
/* assumes a small amount of checking has been done in mbentry */
int
mecmp(MetaEntry *me, char *s)
{
@@ -372,18 +372,17 @@ mballoc(MetaBlock *mb, int n)
}
int
vdsize(VacDir *dir)
vdsize(VacDir *dir, int version)
{
int n;
/* constant part */
if(version < 8 || version > 9)
sysfatal("bad version %d in vdpack", version);
/* constant part */
n = 4 + /* magic */
2 + /* version */
4 + /* entry */
4 + /* guid */
4 + /* mentry */
4 + /* mgen */
8 + /* qid */
4 + /* mtime */
4 + /* mcount */
@@ -392,6 +391,13 @@ vdsize(VacDir *dir)
4 + /* mode */
0;
if(version == 9){
n += 4 + /* gen */
4 + /* mentry */
4 + /* mgen */
0;
}
/* strings */
n += 2 + strlen(dir->elem);
n += 2 + strlen(dir->uid);
@@ -399,35 +405,53 @@ vdsize(VacDir *dir)
n += 2 + strlen(dir->mid);
/* optional sections */
if(version < 9 && dir->plan9) {
n += 3 + /* option header */
8 + /* path */
4; /* version */
}
if(dir->qidspace) {
n += 3 + /* option header */
8 + /* qid offset */
8; /* qid max */
}
if(version < 9 && dir->gen) {
n += 3 + /* option header */
4; /* gen */
}
return n;
}
void
vdpack(VacDir *dir, MetaEntry *me)
vdpack(VacDir *dir, MetaEntry *me, int version)
{
uchar *p;
ulong t32;
if(version < 8 || version > 9)
sysfatal("bad version %d in vdpack", version);
p = me->p;
U32PUT(p, DirMagic);
U16PUT(p+4, 9); /* version */
U16PUT(p+4, version); /* version */
p += 6;
p += stringpack(dir->elem, p);
U32PUT(p, dir->entry);
U32PUT(p+4, dir->gen);
U32PUT(p+8, dir->mentry);
U32PUT(p+12, dir->mgen);
U64PUT(p+16, dir->qid, t32);
p += 24;
p += 4;
if(version == 9){
U32PUT(p, dir->gen);
U32PUT(p+4, dir->mentry);
U32PUT(p+8, dir->mgen);
p += 12;
}
U64PUT(p, dir->qid, t32);
p += 8;
p += stringpack(dir->uid, p);
p += stringpack(dir->gid, p);
@@ -439,6 +463,15 @@ vdpack(VacDir *dir, MetaEntry *me)
U32PUT(p+12, dir->atime);
U32PUT(p+16, dir->mode);
p += 5*4;
if(dir->plan9 && version < 9) {
U8PUT(p, DirPlan9Entry);
U16PUT(p+1, 8+4);
p += 3;
U64PUT(p, dir->p9path, t32);
U32PUT(p+8, dir->p9version);
p += 12;
}
if(dir->qidspace) {
U8PUT(p, DirQidSpaceEntry);
@@ -446,12 +479,20 @@ vdpack(VacDir *dir, MetaEntry *me)
p += 3;
U64PUT(p, dir->qidoffset, t32);
U64PUT(p+8, dir->qidmax, t32);
p += 16;
}
if(dir->gen && version < 9) {
U8PUT(p, DirGenEntry);
U16PUT(p+1, 4);
p += 3;
U32PUT(p, dir->gen);
p += 4;
}
assert(p == me->p + me->size);
}
int
vdunpack(VacDir *dir, MetaEntry *me)
{
@@ -463,14 +504,12 @@ vdunpack(VacDir *dir, MetaEntry *me)
memset(dir, 0, sizeof(VacDir));
if(0)print("vdUnpack\n");
/* magic */
if(n < 4 || U32GET(p) != DirMagic)
goto Err;
p += 4;
n -= 4;
if(0)print("vdUnpack: got magic\n");
/* version */
if(n < 2)
goto Err;
@@ -480,14 +519,10 @@ if(0)print("vdUnpack: got magic\n");
p += 2;
n -= 2;
if(0)print("vdUnpack: got version\n");
/* elem */
if(stringunpack(&dir->elem, &p, &n) < 0)
goto Err;
if(0)print("vdUnpack: got elem\n");
/* entry */
if(n < 4)
goto Err;
@@ -495,8 +530,6 @@ if(0)print("vdUnpack: got elem\n");
p += 4;
n -= 4;
if(0)print("vdUnpack: got entry\n");
if(version < 9) {
dir->gen = 0;
dir->mentry = dir->entry+1;
@@ -511,8 +544,6 @@ if(0)print("vdUnpack: got entry\n");
n -= 3*4;
}
if(0)print("vdUnpack: got gen etc\n");
/* size is gotten from DirEntry */
/* qid */
@@ -522,7 +553,6 @@ if(0)print("vdUnpack: got gen etc\n");
p += 8;
n -= 8;
if(0)print("vdUnpack: got qid\n");
/* skip replacement */
if(version == 7) {
if(n < VtScoreSize)
@@ -543,7 +573,6 @@ if(0)print("vdUnpack: got qid\n");
if(stringunpack(&dir->mid, &p, &n) < 0)
goto Err;
if(0)print("vdUnpack: got ids\n");
if(n < 5*4)
goto Err;
dir->mtime = U32GET(p);
@@ -554,7 +583,6 @@ if(0)print("vdUnpack: got ids\n");
p += 5*4;
n -= 5*4;
if(0)print("vdUnpack: got times\n");
/* optional meta data */
while(n > 0) {
if(n < 3)
@@ -594,15 +622,12 @@ if(0)print("vdUnpack: got times\n");
p += nn;
n -= nn;
}
if(0)print("vdUnpack: got options\n");
if(p != me->p + me->size)
goto Err;
if(0)print("vdUnpack: correct size\n");
return 0;
Err:
if(0)print("vdUnpack: XXXXXXXXXXXX EbadMeta\n");
werrstr(EBadMeta);
vdcleanup(dir);
return -1;