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)
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;
13 056fe1ba 2003-11-23 devnull return 0;
17 056fe1ba 2003-11-23 devnull vtentrypack(VtEntry *e, uchar *p, int index)
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;
24 056fe1ba 2003-11-23 devnull p += index * VtEntrySize;
27 056fe1ba 2003-11-23 devnull U32PUT(p, e->gen);
29 056fe1ba 2003-11-23 devnull U16PUT(p, e->psize);
31 056fe1ba 2003-11-23 devnull U16PUT(p, e->dsize);
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);
40 056fe1ba 2003-11-23 devnull memset(p, 0, 5);
42 056fe1ba 2003-11-23 devnull U48PUT(p, e->size, t32);
44 056fe1ba 2003-11-23 devnull memmove(p, e->score, VtScoreSize);
45 056fe1ba 2003-11-23 devnull p += VtScoreSize;
47 056fe1ba 2003-11-23 devnull assert(p-op == VtEntrySize);
51 056fe1ba 2003-11-23 devnull vtentryunpack(VtEntry *e, uchar *p, int index)
53 056fe1ba 2003-11-23 devnull uchar *op;
55 056fe1ba 2003-11-23 devnull p += index * VtEntrySize;
58 056fe1ba 2003-11-23 devnull e->gen = U32GET(p);
60 056fe1ba 2003-11-23 devnull e->psize = U16GET(p);
62 056fe1ba 2003-11-23 devnull e->dsize = U16GET(p);
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);
70 056fe1ba 2003-11-23 devnull e->size = U48GET(p);
72 056fe1ba 2003-11-23 devnull memmove(e->score, p, VtScoreSize);
73 056fe1ba 2003-11-23 devnull p += VtScoreSize;
75 056fe1ba 2003-11-23 devnull assert(p-op == VtEntrySize);
77 056fe1ba 2003-11-23 devnull if(!(e->flags & VtEntryActive))
78 056fe1ba 2003-11-23 devnull return 0;
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.
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;
90 056fe1ba 2003-11-23 devnull if(checksize(e->psize) < 0 || checksize(e->dsize) < 0)
91 056fe1ba 2003-11-23 devnull return -1;
93 056fe1ba 2003-11-23 devnull return 0;