1 056fe1ba 2003-11-23 devnull #include <u.h>
2 056fe1ba 2003-11-23 devnull #include <libc.h>
3 056fe1ba 2003-11-23 devnull #include <venti.h>
4 056fe1ba 2003-11-23 devnull #include "cvt.h"
6 056fe1ba 2003-11-23 devnull static int
7 056fe1ba 2003-11-23 devnull checksize(int n)
10 056fe1ba 2003-11-23 devnull werrstr("bad block size");
11 056fe1ba 2003-11-23 devnull return -1;
13 056fe1ba 2003-11-23 devnull return 0;
16 75d04888 2009-05-25 rsc extern int vttobig(ulong);
19 056fe1ba 2003-11-23 devnull vtrootpack(VtRoot *r, uchar *p)
21 056fe1ba 2003-11-23 devnull uchar *op = p;
22 75d04888 2009-05-25 rsc int vers, bsize;
24 75d04888 2009-05-25 rsc vers = VtRootVersion;
25 75d04888 2009-05-25 rsc bsize = r->blocksize;
26 75d04888 2009-05-25 rsc if(bsize >= (1<<16)) {
27 75d04888 2009-05-25 rsc vers |= _VtRootVersionBig;
28 75d04888 2009-05-25 rsc bsize = vttobig(bsize);
29 75d04888 2009-05-25 rsc if(bsize < 0)
30 75d04888 2009-05-25 rsc sysfatal("invalid root blocksize: %#x", r->blocksize);
32 75d04888 2009-05-25 rsc U16PUT(p, vers);
34 056fe1ba 2003-11-23 devnull memmove(p, r->name, sizeof(r->name));
35 056fe1ba 2003-11-23 devnull p += sizeof(r->name);
36 056fe1ba 2003-11-23 devnull memmove(p, r->type, sizeof(r->type));
37 056fe1ba 2003-11-23 devnull p += sizeof(r->type);
38 056fe1ba 2003-11-23 devnull memmove(p, r->score, VtScoreSize);
39 056fe1ba 2003-11-23 devnull p += VtScoreSize;
40 75d04888 2009-05-25 rsc U16PUT(p, bsize);
42 056fe1ba 2003-11-23 devnull memmove(p, r->prev, VtScoreSize);
43 056fe1ba 2003-11-23 devnull p += VtScoreSize;
45 056fe1ba 2003-11-23 devnull assert(p-op == VtRootSize);
49 056fe1ba 2003-11-23 devnull vtrootunpack(VtRoot *r, uchar *p)
51 056fe1ba 2003-11-23 devnull uchar *op = p;
52 056fe1ba 2003-11-23 devnull uint vers;
53 056fe1ba 2003-11-23 devnull memset(r, 0, sizeof(*r));
55 056fe1ba 2003-11-23 devnull vers = U16GET(p);
56 75d04888 2009-05-25 rsc if((vers&~_VtRootVersionBig) != VtRootVersion) {
57 056fe1ba 2003-11-23 devnull werrstr("unknown root version");
58 0c148046 2004-06-16 devnull return -1;
61 056fe1ba 2003-11-23 devnull memmove(r->name, p, sizeof(r->name));
62 056fe1ba 2003-11-23 devnull r->name[sizeof(r->name)-1] = 0;
63 056fe1ba 2003-11-23 devnull p += sizeof(r->name);
64 056fe1ba 2003-11-23 devnull memmove(r->type, p, sizeof(r->type));
65 056fe1ba 2003-11-23 devnull r->type[sizeof(r->type)-1] = 0;
66 056fe1ba 2003-11-23 devnull p += sizeof(r->type);
67 056fe1ba 2003-11-23 devnull memmove(r->score, p, VtScoreSize);
68 056fe1ba 2003-11-23 devnull p += VtScoreSize;
69 056fe1ba 2003-11-23 devnull r->blocksize = U16GET(p);
70 75d04888 2009-05-25 rsc if(vers & _VtRootVersionBig)
71 75d04888 2009-05-25 rsc r->blocksize = (r->blocksize >> 5) << (r->blocksize & 31);
72 056fe1ba 2003-11-23 devnull if(checksize(r->blocksize) < 0)
73 056fe1ba 2003-11-23 devnull return -1;
75 056fe1ba 2003-11-23 devnull memmove(r->prev, p, VtScoreSize);
76 056fe1ba 2003-11-23 devnull p += VtScoreSize;
78 056fe1ba 2003-11-23 devnull assert(p-op == VtRootSize);
79 056fe1ba 2003-11-23 devnull return 0;