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 75d04888 2009-05-25 rsc if(n < 256) {
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 75d04888 2009-05-25 rsc // _VtEntryBig integer format is floating-point:
17 75d04888 2009-05-25 rsc // (n>>5) << (n&31).
18 75d04888 2009-05-25 rsc // Convert this number; must be exact or return -1.
19 75d04888 2009-05-25 rsc int
20 75d04888 2009-05-25 rsc vttobig(ulong n)
21 75d04888 2009-05-25 rsc {
22 75d04888 2009-05-25 rsc int shift;
23 75d04888 2009-05-25 rsc ulong n0;
24 fa325e9b 2020-01-10 cross
25 75d04888 2009-05-25 rsc n0 = n;
26 75d04888 2009-05-25 rsc shift = 0;
27 75d04888 2009-05-25 rsc while(n >= (1<<(16 - 5))) {
28 75d04888 2009-05-25 rsc if(n & 1)
29 75d04888 2009-05-25 rsc return -1;
30 75d04888 2009-05-25 rsc shift++;
31 75d04888 2009-05-25 rsc n >>= 1;
32 75d04888 2009-05-25 rsc }
33 fa325e9b 2020-01-10 cross
34 75d04888 2009-05-25 rsc n = (n<<5) | shift;
35 75d04888 2009-05-25 rsc if(((n>>5)<<(n&31)) != n0)
36 75d04888 2009-05-25 rsc sysfatal("vttobig %#lux => %#lux failed", n0, n);
37 75d04888 2009-05-25 rsc return n;
38 75d04888 2009-05-25 rsc }
39 75d04888 2009-05-25 rsc
40 056fe1ba 2003-11-23 devnull void
41 056fe1ba 2003-11-23 devnull vtentrypack(VtEntry *e, uchar *p, int index)
42 056fe1ba 2003-11-23 devnull {
43 056fe1ba 2003-11-23 devnull ulong t32;
44 056fe1ba 2003-11-23 devnull int flags;
45 056fe1ba 2003-11-23 devnull uchar *op;
46 056fe1ba 2003-11-23 devnull int depth;
47 75d04888 2009-05-25 rsc int psize, dsize;
48 056fe1ba 2003-11-23 devnull
49 056fe1ba 2003-11-23 devnull p += index * VtEntrySize;
50 056fe1ba 2003-11-23 devnull op = p;
51 056fe1ba 2003-11-23 devnull
52 056fe1ba 2003-11-23 devnull depth = e->type&VtTypeDepthMask;
53 d23a617a 2004-03-15 devnull flags = (e->flags&~(_VtEntryDir|_VtEntryDepthMask));
54 d23a617a 2004-03-15 devnull flags |= depth << _VtEntryDepthShift;
55 d23a617a 2004-03-15 devnull if(e->type - depth == VtDirType)
56 d23a617a 2004-03-15 devnull flags |= _VtEntryDir;
57 75d04888 2009-05-25 rsc U32PUT(p, e->gen);
58 75d04888 2009-05-25 rsc p += 4;
59 75d04888 2009-05-25 rsc psize = e->psize;
60 75d04888 2009-05-25 rsc dsize = e->dsize;
61 75d04888 2009-05-25 rsc if(psize >= (1<<16) || dsize >= (1<<16)) {
62 75d04888 2009-05-25 rsc flags |= _VtEntryBig;
63 75d04888 2009-05-25 rsc psize = vttobig(psize);
64 75d04888 2009-05-25 rsc dsize = vttobig(dsize);
65 75d04888 2009-05-25 rsc if(psize < 0 || dsize < 0)
66 36c242dd 2011-11-08 rsc sysfatal("invalid entry psize/dsize: %ld/%ld", e->psize, e->dsize);
67 75d04888 2009-05-25 rsc }
68 75d04888 2009-05-25 rsc U16PUT(p, psize);
69 75d04888 2009-05-25 rsc p += 2;
70 75d04888 2009-05-25 rsc U16PUT(p, dsize);
71 75d04888 2009-05-25 rsc p += 2;
72 056fe1ba 2003-11-23 devnull U8PUT(p, flags);
73 056fe1ba 2003-11-23 devnull p++;
74 056fe1ba 2003-11-23 devnull memset(p, 0, 5);
75 056fe1ba 2003-11-23 devnull p += 5;
76 056fe1ba 2003-11-23 devnull U48PUT(p, e->size, t32);
77 056fe1ba 2003-11-23 devnull p += 6;
78 056fe1ba 2003-11-23 devnull memmove(p, e->score, VtScoreSize);
79 056fe1ba 2003-11-23 devnull p += VtScoreSize;
80 056fe1ba 2003-11-23 devnull
81 056fe1ba 2003-11-23 devnull assert(p-op == VtEntrySize);
82 056fe1ba 2003-11-23 devnull }
83 056fe1ba 2003-11-23 devnull
84 056fe1ba 2003-11-23 devnull int
85 056fe1ba 2003-11-23 devnull vtentryunpack(VtEntry *e, uchar *p, int index)
86 056fe1ba 2003-11-23 devnull {
87 056fe1ba 2003-11-23 devnull uchar *op;
88 056fe1ba 2003-11-23 devnull
89 056fe1ba 2003-11-23 devnull p += index * VtEntrySize;
90 056fe1ba 2003-11-23 devnull op = p;
91 056fe1ba 2003-11-23 devnull
92 056fe1ba 2003-11-23 devnull e->gen = U32GET(p);
93 056fe1ba 2003-11-23 devnull p += 4;
94 056fe1ba 2003-11-23 devnull e->psize = U16GET(p);
95 056fe1ba 2003-11-23 devnull p += 2;
96 056fe1ba 2003-11-23 devnull e->dsize = U16GET(p);
97 056fe1ba 2003-11-23 devnull p += 2;
98 056fe1ba 2003-11-23 devnull e->flags = U8GET(p);
99 75d04888 2009-05-25 rsc p++;
100 75d04888 2009-05-25 rsc if(e->flags & _VtEntryBig) {
101 75d04888 2009-05-25 rsc e->psize = (e->psize>>5)<<(e->psize & 31);
102 75d04888 2009-05-25 rsc e->dsize = (e->dsize>>5)<<(e->dsize & 31);
103 75d04888 2009-05-25 rsc }
104 d23a617a 2004-03-15 devnull e->type = (e->flags&_VtEntryDir) ? VtDirType : VtDataType;
105 d23a617a 2004-03-15 devnull e->type += (e->flags & _VtEntryDepthMask) >> _VtEntryDepthShift;
106 75d04888 2009-05-25 rsc e->flags &= ~(_VtEntryDir|_VtEntryDepthMask|_VtEntryBig);
107 056fe1ba 2003-11-23 devnull p += 5;
108 056fe1ba 2003-11-23 devnull e->size = U48GET(p);
109 056fe1ba 2003-11-23 devnull p += 6;
110 056fe1ba 2003-11-23 devnull memmove(e->score, p, VtScoreSize);
111 056fe1ba 2003-11-23 devnull p += VtScoreSize;
112 056fe1ba 2003-11-23 devnull
113 056fe1ba 2003-11-23 devnull assert(p-op == VtEntrySize);
114 fa325e9b 2020-01-10 cross
115 056fe1ba 2003-11-23 devnull if(!(e->flags & VtEntryActive))
116 056fe1ba 2003-11-23 devnull return 0;
117 056fe1ba 2003-11-23 devnull
118 fa325e9b 2020-01-10 cross /*
119 23fb2edb 2005-07-24 devnull * Some old vac files use psize==0 and dsize==0 when the
120 23fb2edb 2005-07-24 devnull * file itself has size 0 or is zeros. Just to make programs not
121 23fb2edb 2005-07-24 devnull * have to figure out what block sizes of 0 means, rewrite them.
122 23fb2edb 2005-07-24 devnull */
123 23fb2edb 2005-07-24 devnull if(e->psize == 0 && e->dsize == 0
124 23fb2edb 2005-07-24 devnull && memcmp(e->score, vtzeroscore, VtScoreSize) == 0){
125 23fb2edb 2005-07-24 devnull e->psize = 4096;
126 23fb2edb 2005-07-24 devnull e->dsize = 4096;
127 23fb2edb 2005-07-24 devnull }
128 056fe1ba 2003-11-23 devnull if(checksize(e->psize) < 0 || checksize(e->dsize) < 0)
129 056fe1ba 2003-11-23 devnull return -1;
130 056fe1ba 2003-11-23 devnull
131 056fe1ba 2003-11-23 devnull return 0;
132 056fe1ba 2003-11-23 devnull }