xref: /plan9/sys/src/libventi/root.c (revision 368c31ab13393dea083228fdd1c3445076f83a4b)
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