| ---
troot.c (1542B)
---
1 #include
2 #include
3 #include
4 #include "cvt.h"
5
6 static int
7 checksize(int n)
8 {
9 if(n < 256) {
10 werrstr("bad block size");
11 return -1;
12 }
13 return 0;
14 }
15
16 extern int vttobig(ulong);
17
18 void
19 vtrootpack(VtRoot *r, uchar *p)
20 {
21 uchar *op = p;
22 int vers, bsize;
23
24 vers = VtRootVersion;
25 bsize = r->blocksize;
26 if(bsize >= (1<<16)) {
27 vers |= _VtRootVersionBig;
28 bsize = vttobig(bsize);
29 if(bsize < 0)
30 sysfatal("invalid root blocksize: %#lx", r->blocksize);
31 }
32 U16PUT(p, vers);
33 p += 2;
34 memmove(p, r->name, sizeof(r->name));
35 p += sizeof(r->name);
36 memmove(p, r->type, sizeof(r->type));
37 p += sizeof(r->type);
38 memmove(p, r->score, VtScoreSize);
39 p += VtScoreSize;
40 U16PUT(p, bsize);
41 p += 2;
42 memmove(p, r->prev, VtScoreSize);
43 p += VtScoreSize;
44
45 assert(p-op == VtRootSize);
46 }
47
48 int
49 vtrootunpack(VtRoot *r, uchar *p)
50 {
51 uchar *op = p;
52 uint vers;
53 memset(r, 0, sizeof(*r));
54
55 vers = U16GET(p);
56 if((vers&~_VtRootVersionBig) != VtRootVersion) {
57 werrstr("unknown root version");
58 return -1;
59 }
60 p += 2;
61 memmove(r->name, p, sizeof(r->name));
62 r->name[sizeof(r->name)-1] = 0;
63 p += sizeof(r->name);
64 memmove(r->type, p, sizeof(r->type));
65 r->type[sizeof(r->type)-1] = 0;
66 p += sizeof(r->type);
67 memmove(r->score, p, VtScoreSize);
68 p += VtScoreSize;
69 r->blocksize = U16GET(p);
70 if(vers & _VtRootVersionBig)
71 r->blocksize = (r->blocksize >> 5) << (r->blocksize & 31);
72 if(checksize(r->blocksize) < 0)
73 return -1;
74 p += 2;
75 memmove(r->prev, p, VtScoreSize);
76 p += VtScoreSize;
77
78 assert(p-op == VtRootSize);
79 return 0;
80 } |