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"
6 056fe1ba 2003-11-23 devnull static int
7 056fe1ba 2003-11-23 devnull checksize(int n)
10 23fb2edb 2005-07-24 devnull werrstr("bad block size %#ux", n);
11 056fe1ba 2003-11-23 devnull return -1;
13 056fe1ba 2003-11-23 devnull return 0;
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.
20 75d04888 2009-05-25 rsc vttobig(ulong n)
27 75d04888 2009-05-25 rsc while(n >= (1<<(16 - 5))) {
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);
41 056fe1ba 2003-11-23 devnull vtentrypack(VtEntry *e, uchar *p, int index)
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;
49 056fe1ba 2003-11-23 devnull p += index * VtEntrySize;
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);
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);
68 75d04888 2009-05-25 rsc U16PUT(p, psize);
70 75d04888 2009-05-25 rsc U16PUT(p, dsize);
72 056fe1ba 2003-11-23 devnull U8PUT(p, flags);
74 056fe1ba 2003-11-23 devnull memset(p, 0, 5);
76 056fe1ba 2003-11-23 devnull U48PUT(p, e->size, t32);
78 056fe1ba 2003-11-23 devnull memmove(p, e->score, VtScoreSize);
79 056fe1ba 2003-11-23 devnull p += VtScoreSize;
81 056fe1ba 2003-11-23 devnull assert(p-op == VtEntrySize);
85 056fe1ba 2003-11-23 devnull vtentryunpack(VtEntry *e, uchar *p, int index)
87 056fe1ba 2003-11-23 devnull uchar *op;
89 056fe1ba 2003-11-23 devnull p += index * VtEntrySize;
92 056fe1ba 2003-11-23 devnull e->gen = U32GET(p);
94 056fe1ba 2003-11-23 devnull e->psize = U16GET(p);
96 056fe1ba 2003-11-23 devnull e->dsize = U16GET(p);
98 056fe1ba 2003-11-23 devnull e->flags = U8GET(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);
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);
108 056fe1ba 2003-11-23 devnull e->size = U48GET(p);
110 056fe1ba 2003-11-23 devnull memmove(e->score, p, VtScoreSize);
111 056fe1ba 2003-11-23 devnull p += VtScoreSize;
113 056fe1ba 2003-11-23 devnull assert(p-op == VtEntrySize);
115 056fe1ba 2003-11-23 devnull if(!(e->flags & VtEntryActive))
116 056fe1ba 2003-11-23 devnull return 0;
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.
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;
128 056fe1ba 2003-11-23 devnull if(checksize(e->psize) < 0 || checksize(e->dsize) < 0)
129 056fe1ba 2003-11-23 devnull return -1;
131 056fe1ba 2003-11-23 devnull return 0;