Blame


1 6f4d00ee 2013-09-23 0intro #include "stdinc.h"
2 6f4d00ee 2013-09-23 0intro #include "dat.h"
3 6f4d00ee 2013-09-23 0intro #include "fns.h"
4 6f4d00ee 2013-09-23 0intro #include "error.h"
5 6f4d00ee 2013-09-23 0intro
6 6f4d00ee 2013-09-23 0intro /*
7 6f4d00ee 2013-09-23 0intro * integer conversion routines
8 6f4d00ee 2013-09-23 0intro */
9 6f4d00ee 2013-09-23 0intro #define U8GET(p) ((p)[0])
10 6f4d00ee 2013-09-23 0intro #define U16GET(p) (((p)[0]<<8)|(p)[1])
11 6f4d00ee 2013-09-23 0intro #define U32GET(p) (((p)[0]<<24)|((p)[1]<<16)|((p)[2]<<8)|(p)[3])
12 6f4d00ee 2013-09-23 0intro #define U48GET(p) (((uvlong)U16GET(p)<<32)|(uvlong)U32GET((p)+2))
13 6f4d00ee 2013-09-23 0intro #define U64GET(p) (((uvlong)U32GET(p)<<32)|(uvlong)U32GET((p)+4))
14 6f4d00ee 2013-09-23 0intro
15 6f4d00ee 2013-09-23 0intro #define U8PUT(p,v) (p)[0]=(v)
16 6f4d00ee 2013-09-23 0intro #define U16PUT(p,v) (p)[0]=(v)>>8;(p)[1]=(v)
17 b29ebaab 2013-10-23 0intro #define U32PUT(p,v) (p)[0]=((v)>>24)&0xFF;(p)[1]=((v)>>16)&0xFF;(p)[2]=((v)>>8)&0xFF;(p)[3]=(v)&0xFF
18 6f4d00ee 2013-09-23 0intro #define U48PUT(p,v,t32) t32=(v)>>32;U16PUT(p,t32);t32=(v);U32PUT((p)+2,t32)
19 6f4d00ee 2013-09-23 0intro #define U64PUT(p,v,t32) t32=(v)>>32;U32PUT(p,t32);t32=(v);U32PUT((p)+4,t32)
20 6f4d00ee 2013-09-23 0intro
21 6f4d00ee 2013-09-23 0intro void
22 6f4d00ee 2013-09-23 0intro headerPack(Header *h, uchar *p)
23 6f4d00ee 2013-09-23 0intro {
24 6f4d00ee 2013-09-23 0intro memset(p, 0, HeaderSize);
25 6f4d00ee 2013-09-23 0intro U32PUT(p, HeaderMagic);
26 6f4d00ee 2013-09-23 0intro U16PUT(p+4, HeaderVersion);
27 6f4d00ee 2013-09-23 0intro U16PUT(p+6, h->blockSize);
28 6f4d00ee 2013-09-23 0intro U32PUT(p+8, h->super);
29 6f4d00ee 2013-09-23 0intro U32PUT(p+12, h->label);
30 6f4d00ee 2013-09-23 0intro U32PUT(p+16, h->data);
31 6f4d00ee 2013-09-23 0intro U32PUT(p+20, h->end);
32 6f4d00ee 2013-09-23 0intro }
33 6f4d00ee 2013-09-23 0intro
34 6f4d00ee 2013-09-23 0intro int
35 6f4d00ee 2013-09-23 0intro headerUnpack(Header *h, uchar *p)
36 6f4d00ee 2013-09-23 0intro {
37 6f4d00ee 2013-09-23 0intro if(U32GET(p) != HeaderMagic){
38 4b576658 2013-09-23 0intro werrstr("vac header bad magic");
39 6f4d00ee 2013-09-23 0intro return 0;
40 6f4d00ee 2013-09-23 0intro }
41 6f4d00ee 2013-09-23 0intro h->version = U16GET(p+4);
42 6f4d00ee 2013-09-23 0intro if(h->version != HeaderVersion){
43 4b576658 2013-09-23 0intro werrstr("vac header bad version");
44 6f4d00ee 2013-09-23 0intro return 0;
45 6f4d00ee 2013-09-23 0intro }
46 6f4d00ee 2013-09-23 0intro h->blockSize = U16GET(p+6);
47 6f4d00ee 2013-09-23 0intro h->super = U32GET(p+8);
48 6f4d00ee 2013-09-23 0intro h->label = U32GET(p+12);
49 6f4d00ee 2013-09-23 0intro h->data = U32GET(p+16);
50 6f4d00ee 2013-09-23 0intro h->end = U32GET(p+20);
51 6f4d00ee 2013-09-23 0intro return 1;
52 6f4d00ee 2013-09-23 0intro }
53 6f4d00ee 2013-09-23 0intro
54 6f4d00ee 2013-09-23 0intro void
55 6f4d00ee 2013-09-23 0intro labelPack(Label *l, uchar *p, int i)
56 6f4d00ee 2013-09-23 0intro {
57 6f4d00ee 2013-09-23 0intro p += i*LabelSize;
58 6f4d00ee 2013-09-23 0intro U8PUT(p, l->state);
59 6f4d00ee 2013-09-23 0intro U8PUT(p+1, l->type);
60 6f4d00ee 2013-09-23 0intro U32PUT(p+2, l->epoch);
61 6f4d00ee 2013-09-23 0intro U32PUT(p+6, l->epochClose);
62 6f4d00ee 2013-09-23 0intro U32PUT(p+10, l->tag);
63 6f4d00ee 2013-09-23 0intro }
64 6f4d00ee 2013-09-23 0intro
65 6f4d00ee 2013-09-23 0intro int
66 6f4d00ee 2013-09-23 0intro labelUnpack(Label *l, uchar *p, int i)
67 6f4d00ee 2013-09-23 0intro {
68 6f4d00ee 2013-09-23 0intro p += i*LabelSize;
69 6f4d00ee 2013-09-23 0intro l->state = p[0];
70 6f4d00ee 2013-09-23 0intro l->type = p[1];
71 6f4d00ee 2013-09-23 0intro l->epoch = U32GET(p+2);
72 6f4d00ee 2013-09-23 0intro l->epochClose = U32GET(p+6);
73 6f4d00ee 2013-09-23 0intro l->tag = U32GET(p+10);
74 6f4d00ee 2013-09-23 0intro
75 6f4d00ee 2013-09-23 0intro if(l->type > BtMax){
76 6f4d00ee 2013-09-23 0intro Bad:
77 4b576658 2013-09-23 0intro werrstr(EBadLabel);
78 6f4d00ee 2013-09-23 0intro fprint(2, "%s: labelUnpack: bad label: 0x%.2ux 0x%.2ux 0x%.8ux "
79 6f4d00ee 2013-09-23 0intro "0x%.8ux 0x%.8ux\n", argv0, l->state, l->type, l->epoch,
80 6f4d00ee 2013-09-23 0intro l->epochClose, l->tag);
81 6f4d00ee 2013-09-23 0intro return 0;
82 6f4d00ee 2013-09-23 0intro }
83 6f4d00ee 2013-09-23 0intro if(l->state != BsBad && l->state != BsFree){
84 6f4d00ee 2013-09-23 0intro if(!(l->state&BsAlloc) || l->state & ~BsMask)
85 6f4d00ee 2013-09-23 0intro goto Bad;
86 6f4d00ee 2013-09-23 0intro if(l->state&BsClosed){
87 6f4d00ee 2013-09-23 0intro if(l->epochClose == ~(u32int)0)
88 6f4d00ee 2013-09-23 0intro goto Bad;
89 6f4d00ee 2013-09-23 0intro }else{
90 6f4d00ee 2013-09-23 0intro if(l->epochClose != ~(u32int)0)
91 6f4d00ee 2013-09-23 0intro goto Bad;
92 6f4d00ee 2013-09-23 0intro }
93 6f4d00ee 2013-09-23 0intro }
94 6f4d00ee 2013-09-23 0intro return 1;
95 6f4d00ee 2013-09-23 0intro }
96 6f4d00ee 2013-09-23 0intro
97 6f4d00ee 2013-09-23 0intro u32int
98 6f4d00ee 2013-09-23 0intro globalToLocal(uchar score[VtScoreSize])
99 6f4d00ee 2013-09-23 0intro {
100 6f4d00ee 2013-09-23 0intro int i;
101 6f4d00ee 2013-09-23 0intro
102 6f4d00ee 2013-09-23 0intro for(i=0; i<VtScoreSize-4; i++)
103 6f4d00ee 2013-09-23 0intro if(score[i] != 0)
104 6f4d00ee 2013-09-23 0intro return NilBlock;
105 6f4d00ee 2013-09-23 0intro
106 6f4d00ee 2013-09-23 0intro return U32GET(score+VtScoreSize-4);
107 6f4d00ee 2013-09-23 0intro }
108 6f4d00ee 2013-09-23 0intro
109 6f4d00ee 2013-09-23 0intro void
110 6f4d00ee 2013-09-23 0intro localToGlobal(u32int addr, uchar score[VtScoreSize])
111 6f4d00ee 2013-09-23 0intro {
112 6f4d00ee 2013-09-23 0intro memset(score, 0, VtScoreSize-4);
113 6f4d00ee 2013-09-23 0intro U32PUT(score+VtScoreSize-4, addr);
114 6f4d00ee 2013-09-23 0intro }
115 6f4d00ee 2013-09-23 0intro
116 6f4d00ee 2013-09-23 0intro void
117 6f4d00ee 2013-09-23 0intro entryPack(Entry *e, uchar *p, int index)
118 6f4d00ee 2013-09-23 0intro {
119 6f4d00ee 2013-09-23 0intro ulong t32;
120 6f4d00ee 2013-09-23 0intro int flags;
121 6f4d00ee 2013-09-23 0intro
122 6f4d00ee 2013-09-23 0intro p += index * VtEntrySize;
123 6f4d00ee 2013-09-23 0intro
124 6f4d00ee 2013-09-23 0intro U32PUT(p, e->gen);
125 6f4d00ee 2013-09-23 0intro U16PUT(p+4, e->psize);
126 6f4d00ee 2013-09-23 0intro U16PUT(p+6, e->dsize);
127 4b576658 2013-09-23 0intro flags = e->flags | ((e->depth << _VtEntryDepthShift) & _VtEntryDepthMask);
128 6f4d00ee 2013-09-23 0intro U8PUT(p+8, flags);
129 6f4d00ee 2013-09-23 0intro memset(p+9, 0, 5);
130 6f4d00ee 2013-09-23 0intro U48PUT(p+14, e->size, t32);
131 6f4d00ee 2013-09-23 0intro
132 6f4d00ee 2013-09-23 0intro if(flags & VtEntryLocal){
133 6f4d00ee 2013-09-23 0intro if(globalToLocal(e->score) == NilBlock)
134 6f4d00ee 2013-09-23 0intro abort();
135 6f4d00ee 2013-09-23 0intro memset(p+20, 0, 7);
136 6f4d00ee 2013-09-23 0intro U8PUT(p+27, e->archive);
137 6f4d00ee 2013-09-23 0intro U32PUT(p+28, e->snap);
138 6f4d00ee 2013-09-23 0intro U32PUT(p+32, e->tag);
139 6f4d00ee 2013-09-23 0intro memmove(p+36, e->score+16, 4);
140 6f4d00ee 2013-09-23 0intro }else
141 6f4d00ee 2013-09-23 0intro memmove(p+20, e->score, VtScoreSize);
142 6f4d00ee 2013-09-23 0intro }
143 6f4d00ee 2013-09-23 0intro
144 6f4d00ee 2013-09-23 0intro int
145 6f4d00ee 2013-09-23 0intro entryUnpack(Entry *e, uchar *p, int index)
146 6f4d00ee 2013-09-23 0intro {
147 6f4d00ee 2013-09-23 0intro p += index * VtEntrySize;
148 6f4d00ee 2013-09-23 0intro
149 6f4d00ee 2013-09-23 0intro e->gen = U32GET(p);
150 6f4d00ee 2013-09-23 0intro e->psize = U16GET(p+4);
151 6f4d00ee 2013-09-23 0intro e->dsize = U16GET(p+6);
152 6f4d00ee 2013-09-23 0intro e->flags = U8GET(p+8);
153 4b576658 2013-09-23 0intro e->depth = (e->flags & _VtEntryDepthMask) >> _VtEntryDepthShift;
154 4b576658 2013-09-23 0intro e->flags &= ~_VtEntryDepthMask;
155 6f4d00ee 2013-09-23 0intro e->size = U48GET(p+14);
156 6f4d00ee 2013-09-23 0intro
157 6f4d00ee 2013-09-23 0intro if(e->flags & VtEntryLocal){
158 6f4d00ee 2013-09-23 0intro e->archive = p[27];
159 6f4d00ee 2013-09-23 0intro e->snap = U32GET(p+28);
160 6f4d00ee 2013-09-23 0intro e->tag = U32GET(p+32);
161 6f4d00ee 2013-09-23 0intro memset(e->score, 0, 16);
162 6f4d00ee 2013-09-23 0intro memmove(e->score+16, p+36, 4);
163 6f4d00ee 2013-09-23 0intro }else{
164 6f4d00ee 2013-09-23 0intro e->archive = 0;
165 6f4d00ee 2013-09-23 0intro e->snap = 0;
166 6f4d00ee 2013-09-23 0intro e->tag = 0;
167 6f4d00ee 2013-09-23 0intro memmove(e->score, p+20, VtScoreSize);
168 6f4d00ee 2013-09-23 0intro }
169 6f4d00ee 2013-09-23 0intro
170 6f4d00ee 2013-09-23 0intro return 1;
171 6f4d00ee 2013-09-23 0intro }
172 6f4d00ee 2013-09-23 0intro
173 6f4d00ee 2013-09-23 0intro int
174 6f4d00ee 2013-09-23 0intro entryType(Entry *e)
175 6f4d00ee 2013-09-23 0intro {
176 4b576658 2013-09-23 0intro return (((e->flags & _VtEntryDir) != 0) << 3) | e->depth;
177 6f4d00ee 2013-09-23 0intro }
178 6f4d00ee 2013-09-23 0intro
179 6f4d00ee 2013-09-23 0intro
180 6f4d00ee 2013-09-23 0intro void
181 6f4d00ee 2013-09-23 0intro superPack(Super *s, uchar *p)
182 6f4d00ee 2013-09-23 0intro {
183 6f4d00ee 2013-09-23 0intro u32int t32;
184 6f4d00ee 2013-09-23 0intro
185 6f4d00ee 2013-09-23 0intro memset(p, 0, SuperSize);
186 6f4d00ee 2013-09-23 0intro U32PUT(p, SuperMagic);
187 6f4d00ee 2013-09-23 0intro assert(s->version == SuperVersion);
188 6f4d00ee 2013-09-23 0intro U16PUT(p+4, s->version);
189 6f4d00ee 2013-09-23 0intro U32PUT(p+6, s->epochLow);
190 6f4d00ee 2013-09-23 0intro U32PUT(p+10, s->epochHigh);
191 6f4d00ee 2013-09-23 0intro U64PUT(p+14, s->qid, t32);
192 6f4d00ee 2013-09-23 0intro U32PUT(p+22, s->active);
193 6f4d00ee 2013-09-23 0intro U32PUT(p+26, s->next);
194 6f4d00ee 2013-09-23 0intro U32PUT(p+30, s->current);
195 6f4d00ee 2013-09-23 0intro memmove(p+34, s->last, VtScoreSize);
196 6f4d00ee 2013-09-23 0intro memmove(p+54, s->name, sizeof(s->name));
197 6f4d00ee 2013-09-23 0intro }
198 6f4d00ee 2013-09-23 0intro
199 6f4d00ee 2013-09-23 0intro int
200 6f4d00ee 2013-09-23 0intro superUnpack(Super *s, uchar *p)
201 6f4d00ee 2013-09-23 0intro {
202 6f4d00ee 2013-09-23 0intro memset(s, 0, sizeof(*s));
203 6f4d00ee 2013-09-23 0intro if(U32GET(p) != SuperMagic)
204 6f4d00ee 2013-09-23 0intro goto Err;
205 6f4d00ee 2013-09-23 0intro s->version = U16GET(p+4);
206 6f4d00ee 2013-09-23 0intro if(s->version != SuperVersion)
207 6f4d00ee 2013-09-23 0intro goto Err;
208 6f4d00ee 2013-09-23 0intro s->epochLow = U32GET(p+6);
209 6f4d00ee 2013-09-23 0intro s->epochHigh = U32GET(p+10);
210 6f4d00ee 2013-09-23 0intro s->qid = U64GET(p+14);
211 6f4d00ee 2013-09-23 0intro if(s->epochLow == 0 || s->epochLow > s->epochHigh || s->qid == 0)
212 6f4d00ee 2013-09-23 0intro goto Err;
213 6f4d00ee 2013-09-23 0intro s->active = U32GET(p+22);
214 6f4d00ee 2013-09-23 0intro s->next = U32GET(p+26);
215 6f4d00ee 2013-09-23 0intro s->current = U32GET(p+30);
216 6f4d00ee 2013-09-23 0intro memmove(s->last, p+34, VtScoreSize);
217 6f4d00ee 2013-09-23 0intro memmove(s->name, p+54, sizeof(s->name));
218 6f4d00ee 2013-09-23 0intro s->name[sizeof(s->name)-1] = 0;
219 6f4d00ee 2013-09-23 0intro return 1;
220 6f4d00ee 2013-09-23 0intro Err:
221 6f4d00ee 2013-09-23 0intro memset(s, 0, sizeof(*s));
222 4b576658 2013-09-23 0intro werrstr(EBadSuper);
223 6f4d00ee 2013-09-23 0intro return 0;
224 6f4d00ee 2013-09-23 0intro }