Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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