Blame


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"
5 056fe1ba 2003-11-23 devnull
6 056fe1ba 2003-11-23 devnull static int
7 056fe1ba 2003-11-23 devnull checksize(int n)
8 056fe1ba 2003-11-23 devnull {
9 056fe1ba 2003-11-23 devnull if(n < 256 || n > VtMaxLumpSize) {
10 23fb2edb 2005-07-24 devnull werrstr("bad block size %#ux", n);
11 056fe1ba 2003-11-23 devnull return -1;
12 056fe1ba 2003-11-23 devnull }
13 056fe1ba 2003-11-23 devnull return 0;
14 056fe1ba 2003-11-23 devnull }
15 056fe1ba 2003-11-23 devnull
16 056fe1ba 2003-11-23 devnull void
17 056fe1ba 2003-11-23 devnull vtentrypack(VtEntry *e, uchar *p, int index)
18 056fe1ba 2003-11-23 devnull {
19 056fe1ba 2003-11-23 devnull ulong t32;
20 056fe1ba 2003-11-23 devnull int flags;
21 056fe1ba 2003-11-23 devnull uchar *op;
22 056fe1ba 2003-11-23 devnull int depth;
23 056fe1ba 2003-11-23 devnull
24 056fe1ba 2003-11-23 devnull p += index * VtEntrySize;
25 056fe1ba 2003-11-23 devnull op = p;
26 056fe1ba 2003-11-23 devnull
27 056fe1ba 2003-11-23 devnull U32PUT(p, e->gen);
28 056fe1ba 2003-11-23 devnull p += 4;
29 056fe1ba 2003-11-23 devnull U16PUT(p, e->psize);
30 056fe1ba 2003-11-23 devnull p += 2;
31 056fe1ba 2003-11-23 devnull U16PUT(p, e->dsize);
32 056fe1ba 2003-11-23 devnull p += 2;
33 056fe1ba 2003-11-23 devnull depth = e->type&VtTypeDepthMask;
34 d23a617a 2004-03-15 devnull flags = (e->flags&~(_VtEntryDir|_VtEntryDepthMask));
35 d23a617a 2004-03-15 devnull flags |= depth << _VtEntryDepthShift;
36 d23a617a 2004-03-15 devnull if(e->type - depth == VtDirType)
37 d23a617a 2004-03-15 devnull flags |= _VtEntryDir;
38 056fe1ba 2003-11-23 devnull U8PUT(p, flags);
39 056fe1ba 2003-11-23 devnull p++;
40 056fe1ba 2003-11-23 devnull memset(p, 0, 5);
41 056fe1ba 2003-11-23 devnull p += 5;
42 056fe1ba 2003-11-23 devnull U48PUT(p, e->size, t32);
43 056fe1ba 2003-11-23 devnull p += 6;
44 056fe1ba 2003-11-23 devnull memmove(p, e->score, VtScoreSize);
45 056fe1ba 2003-11-23 devnull p += VtScoreSize;
46 056fe1ba 2003-11-23 devnull
47 056fe1ba 2003-11-23 devnull assert(p-op == VtEntrySize);
48 056fe1ba 2003-11-23 devnull }
49 056fe1ba 2003-11-23 devnull
50 056fe1ba 2003-11-23 devnull int
51 056fe1ba 2003-11-23 devnull vtentryunpack(VtEntry *e, uchar *p, int index)
52 056fe1ba 2003-11-23 devnull {
53 056fe1ba 2003-11-23 devnull uchar *op;
54 056fe1ba 2003-11-23 devnull
55 056fe1ba 2003-11-23 devnull p += index * VtEntrySize;
56 056fe1ba 2003-11-23 devnull op = p;
57 056fe1ba 2003-11-23 devnull
58 056fe1ba 2003-11-23 devnull e->gen = U32GET(p);
59 056fe1ba 2003-11-23 devnull p += 4;
60 056fe1ba 2003-11-23 devnull e->psize = U16GET(p);
61 056fe1ba 2003-11-23 devnull p += 2;
62 056fe1ba 2003-11-23 devnull e->dsize = U16GET(p);
63 056fe1ba 2003-11-23 devnull p += 2;
64 056fe1ba 2003-11-23 devnull e->flags = U8GET(p);
65 d23a617a 2004-03-15 devnull e->type = (e->flags&_VtEntryDir) ? VtDirType : VtDataType;
66 d23a617a 2004-03-15 devnull e->type += (e->flags & _VtEntryDepthMask) >> _VtEntryDepthShift;
67 d23a617a 2004-03-15 devnull e->flags &= ~(_VtEntryDir|_VtEntryDepthMask);
68 056fe1ba 2003-11-23 devnull p++;
69 056fe1ba 2003-11-23 devnull p += 5;
70 056fe1ba 2003-11-23 devnull e->size = U48GET(p);
71 056fe1ba 2003-11-23 devnull p += 6;
72 056fe1ba 2003-11-23 devnull memmove(e->score, p, VtScoreSize);
73 056fe1ba 2003-11-23 devnull p += VtScoreSize;
74 056fe1ba 2003-11-23 devnull
75 056fe1ba 2003-11-23 devnull assert(p-op == VtEntrySize);
76 056fe1ba 2003-11-23 devnull
77 056fe1ba 2003-11-23 devnull if(!(e->flags & VtEntryActive))
78 056fe1ba 2003-11-23 devnull return 0;
79 056fe1ba 2003-11-23 devnull
80 23fb2edb 2005-07-24 devnull /*
81 23fb2edb 2005-07-24 devnull * Some old vac files use psize==0 and dsize==0 when the
82 23fb2edb 2005-07-24 devnull * file itself has size 0 or is zeros. Just to make programs not
83 23fb2edb 2005-07-24 devnull * have to figure out what block sizes of 0 means, rewrite them.
84 23fb2edb 2005-07-24 devnull */
85 23fb2edb 2005-07-24 devnull if(e->psize == 0 && e->dsize == 0
86 23fb2edb 2005-07-24 devnull && memcmp(e->score, vtzeroscore, VtScoreSize) == 0){
87 23fb2edb 2005-07-24 devnull e->psize = 4096;
88 23fb2edb 2005-07-24 devnull e->dsize = 4096;
89 23fb2edb 2005-07-24 devnull }
90 056fe1ba 2003-11-23 devnull if(checksize(e->psize) < 0 || checksize(e->dsize) < 0)
91 056fe1ba 2003-11-23 devnull return -1;
92 056fe1ba 2003-11-23 devnull
93 056fe1ba 2003-11-23 devnull return 0;
94 056fe1ba 2003-11-23 devnull }
95 056fe1ba 2003-11-23 devnull