From 75d048884cfcb7cc4404b384da50923e22224365 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 25 May 2009 02:11:27 -0700 Subject: venti: 32-bit extensions to data structures --- src/libventi/root.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'src/libventi/root.c') diff --git a/src/libventi/root.c b/src/libventi/root.c index 5b4ccac6..b1a153d5 100644 --- a/src/libventi/root.c +++ b/src/libventi/root.c @@ -6,19 +6,30 @@ static int checksize(int n) { - if(n < 256 || n > VtMaxLumpSize) { + if(n < 256) { werrstr("bad block size"); return -1; } return 0; } +extern int vttobig(ulong); + void vtrootpack(VtRoot *r, uchar *p) { uchar *op = p; + int vers, bsize; - U16PUT(p, VtRootVersion); + vers = VtRootVersion; + bsize = r->blocksize; + if(bsize >= (1<<16)) { + vers |= _VtRootVersionBig; + bsize = vttobig(bsize); + if(bsize < 0) + sysfatal("invalid root blocksize: %#x", r->blocksize); + } + U16PUT(p, vers); p += 2; memmove(p, r->name, sizeof(r->name)); p += sizeof(r->name); @@ -26,7 +37,7 @@ vtrootpack(VtRoot *r, uchar *p) p += sizeof(r->type); memmove(p, r->score, VtScoreSize); p += VtScoreSize; - U16PUT(p, r->blocksize); + U16PUT(p, bsize); p += 2; memmove(p, r->prev, VtScoreSize); p += VtScoreSize; @@ -42,7 +53,7 @@ vtrootunpack(VtRoot *r, uchar *p) memset(r, 0, sizeof(*r)); vers = U16GET(p); - if(vers != VtRootVersion) { + if((vers&~_VtRootVersionBig) != VtRootVersion) { werrstr("unknown root version"); return -1; } @@ -56,6 +67,8 @@ vtrootunpack(VtRoot *r, uchar *p) memmove(r->score, p, VtScoreSize); p += VtScoreSize; r->blocksize = U16GET(p); + if(vers & _VtRootVersionBig) + r->blocksize = (r->blocksize >> 5) << (r->blocksize & 31); if(checksize(r->blocksize) < 0) return -1; p += 2; -- cgit v1.2.3