1*368c31abSDavid du Colombier #include <u.h>
2*368c31abSDavid du Colombier #include <libc.h>
3*368c31abSDavid du Colombier #include <venti.h>
4*368c31abSDavid du Colombier #include "cvt.h"
5*368c31abSDavid du Colombier
6*368c31abSDavid du Colombier static int
checksize(int n)7*368c31abSDavid du Colombier checksize(int n)
8*368c31abSDavid du Colombier {
9*368c31abSDavid du Colombier if(n < 256 || n > VtMaxLumpSize) {
10*368c31abSDavid du Colombier werrstr("bad block size");
11*368c31abSDavid du Colombier return -1;
12*368c31abSDavid du Colombier }
13*368c31abSDavid du Colombier return 0;
14*368c31abSDavid du Colombier }
15*368c31abSDavid du Colombier
16*368c31abSDavid du Colombier void
vtrootpack(VtRoot * r,uchar * p)17*368c31abSDavid du Colombier vtrootpack(VtRoot *r, uchar *p)
18*368c31abSDavid du Colombier {
19*368c31abSDavid du Colombier uchar *op = p;
20*368c31abSDavid du Colombier
21*368c31abSDavid du Colombier U16PUT(p, VtRootVersion);
22*368c31abSDavid du Colombier p += 2;
23*368c31abSDavid du Colombier memmove(p, r->name, sizeof(r->name));
24*368c31abSDavid du Colombier p += sizeof(r->name);
25*368c31abSDavid du Colombier memmove(p, r->type, sizeof(r->type));
26*368c31abSDavid du Colombier p += sizeof(r->type);
27*368c31abSDavid du Colombier memmove(p, r->score, VtScoreSize);
28*368c31abSDavid du Colombier p += VtScoreSize;
29*368c31abSDavid du Colombier U16PUT(p, r->blocksize);
30*368c31abSDavid du Colombier p += 2;
31*368c31abSDavid du Colombier memmove(p, r->prev, VtScoreSize);
32*368c31abSDavid du Colombier p += VtScoreSize;
33*368c31abSDavid du Colombier
34*368c31abSDavid du Colombier assert(p-op == VtRootSize);
35*368c31abSDavid du Colombier }
36*368c31abSDavid du Colombier
37*368c31abSDavid du Colombier int
vtrootunpack(VtRoot * r,uchar * p)38*368c31abSDavid du Colombier vtrootunpack(VtRoot *r, uchar *p)
39*368c31abSDavid du Colombier {
40*368c31abSDavid du Colombier uchar *op = p;
41*368c31abSDavid du Colombier uint vers;
42*368c31abSDavid du Colombier memset(r, 0, sizeof(*r));
43*368c31abSDavid du Colombier
44*368c31abSDavid du Colombier vers = U16GET(p);
45*368c31abSDavid du Colombier if(vers != VtRootVersion) {
46*368c31abSDavid du Colombier werrstr("unknown root version");
47*368c31abSDavid du Colombier return -1;
48*368c31abSDavid du Colombier }
49*368c31abSDavid du Colombier p += 2;
50*368c31abSDavid du Colombier memmove(r->name, p, sizeof(r->name));
51*368c31abSDavid du Colombier r->name[sizeof(r->name)-1] = 0;
52*368c31abSDavid du Colombier p += sizeof(r->name);
53*368c31abSDavid du Colombier memmove(r->type, p, sizeof(r->type));
54*368c31abSDavid du Colombier r->type[sizeof(r->type)-1] = 0;
55*368c31abSDavid du Colombier p += sizeof(r->type);
56*368c31abSDavid du Colombier memmove(r->score, p, VtScoreSize);
57*368c31abSDavid du Colombier p += VtScoreSize;
58*368c31abSDavid du Colombier r->blocksize = U16GET(p);
59*368c31abSDavid du Colombier if(checksize(r->blocksize) < 0)
60*368c31abSDavid du Colombier return -1;
61*368c31abSDavid du Colombier p += 2;
62*368c31abSDavid du Colombier memmove(r->prev, p, VtScoreSize);
63*368c31abSDavid du Colombier p += VtScoreSize;
64*368c31abSDavid du Colombier
65*368c31abSDavid du Colombier assert(p-op == VtRootSize);
66*368c31abSDavid du Colombier return 0;
67*368c31abSDavid du Colombier }
68