diff options
Diffstat (limited to 'src/cmd/vac/pack.c')
-rw-r--r-- | src/cmd/vac/pack.c | 85 |
1 files changed, 55 insertions, 30 deletions
diff --git a/src/cmd/vac/pack.c b/src/cmd/vac/pack.c index 319cb463..79811dfe 100644 --- a/src/cmd/vac/pack.c +++ b/src/cmd/vac/pack.c @@ -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; |