1*671dfc47SDavid du Colombier /* packet packing and unpacking */
2*671dfc47SDavid du Colombier #include <u.h>
3*671dfc47SDavid du Colombier #include <libc.h>
4*671dfc47SDavid du Colombier #include <ctype.h>
5*671dfc47SDavid du Colombier #include "cifs.h"
6*671dfc47SDavid du Colombier
7*671dfc47SDavid du Colombier void *
pmem(Pkt * p,void * v,int len)8*671dfc47SDavid du Colombier pmem(Pkt *p, void *v, int len)
9*671dfc47SDavid du Colombier {
10*671dfc47SDavid du Colombier uchar *str = v;
11*671dfc47SDavid du Colombier void *s = p->pos;
12*671dfc47SDavid du Colombier
13*671dfc47SDavid du Colombier if(!len || !v)
14*671dfc47SDavid du Colombier return s;
15*671dfc47SDavid du Colombier while(len--)
16*671dfc47SDavid du Colombier *p->pos++ = *str++;
17*671dfc47SDavid du Colombier return s;
18*671dfc47SDavid du Colombier }
19*671dfc47SDavid du Colombier
20*671dfc47SDavid du Colombier void *
ppath(Pkt * p,char * str)21*671dfc47SDavid du Colombier ppath(Pkt *p, char *str)
22*671dfc47SDavid du Colombier {
23*671dfc47SDavid du Colombier char c;
24*671dfc47SDavid du Colombier Rune r;
25*671dfc47SDavid du Colombier void *s = p->pos;
26*671dfc47SDavid du Colombier
27*671dfc47SDavid du Colombier if(!str)
28*671dfc47SDavid du Colombier return s;
29*671dfc47SDavid du Colombier
30*671dfc47SDavid du Colombier if(p->s->caps & CAP_UNICODE){
31*671dfc47SDavid du Colombier if(((p->pos - p->buf) % 2) != 0) /* pad to even offset */
32*671dfc47SDavid du Colombier p8(p, 0);
33*671dfc47SDavid du Colombier while(*str){
34*671dfc47SDavid du Colombier str += chartorune(&r, str);
35*671dfc47SDavid du Colombier if(r == L'/')
36*671dfc47SDavid du Colombier r = L'\\';
37*671dfc47SDavid du Colombier pl16(p, r);
38*671dfc47SDavid du Colombier }
39*671dfc47SDavid du Colombier pl16(p, 0);
40*671dfc47SDavid du Colombier } else {
41*671dfc47SDavid du Colombier while((c = *str++) != 0){
42*671dfc47SDavid du Colombier if(c == '/')
43*671dfc47SDavid du Colombier c = '\\';
44*671dfc47SDavid du Colombier *p->pos++ = c;
45*671dfc47SDavid du Colombier }
46*671dfc47SDavid du Colombier *p->pos++ = 0;
47*671dfc47SDavid du Colombier }
48*671dfc47SDavid du Colombier return s;
49*671dfc47SDavid du Colombier }
50*671dfc47SDavid du Colombier
51*671dfc47SDavid du Colombier void *
pstr(Pkt * p,char * str)52*671dfc47SDavid du Colombier pstr(Pkt *p, char *str)
53*671dfc47SDavid du Colombier {
54*671dfc47SDavid du Colombier void *s = p->pos;
55*671dfc47SDavid du Colombier Rune r;
56*671dfc47SDavid du Colombier
57*671dfc47SDavid du Colombier if(!str)
58*671dfc47SDavid du Colombier return s;
59*671dfc47SDavid du Colombier
60*671dfc47SDavid du Colombier if(p->s->caps & CAP_UNICODE){
61*671dfc47SDavid du Colombier if(((p->pos - p->buf) % 2) != 0)
62*671dfc47SDavid du Colombier p8(p, 0); /* pad to even offset */
63*671dfc47SDavid du Colombier while(*str){
64*671dfc47SDavid du Colombier str += chartorune(&r, str);
65*671dfc47SDavid du Colombier pl16(p, r);
66*671dfc47SDavid du Colombier }
67*671dfc47SDavid du Colombier pl16(p, 0);
68*671dfc47SDavid du Colombier } else {
69*671dfc47SDavid du Colombier while(*str)
70*671dfc47SDavid du Colombier *p->pos++ = *str++;
71*671dfc47SDavid du Colombier *p->pos++ = 0;
72*671dfc47SDavid du Colombier }
73*671dfc47SDavid du Colombier return s;
74*671dfc47SDavid du Colombier }
75*671dfc47SDavid du Colombier
76*671dfc47SDavid du Colombier void *
pascii(Pkt * p,char * str)77*671dfc47SDavid du Colombier pascii(Pkt *p, char *str)
78*671dfc47SDavid du Colombier {
79*671dfc47SDavid du Colombier void *s = p->pos;
80*671dfc47SDavid du Colombier
81*671dfc47SDavid du Colombier while(*str)
82*671dfc47SDavid du Colombier *p->pos++ = *str++;
83*671dfc47SDavid du Colombier *p->pos++ = 0;
84*671dfc47SDavid du Colombier return s;
85*671dfc47SDavid du Colombier }
86*671dfc47SDavid du Colombier
87*671dfc47SDavid du Colombier
88*671dfc47SDavid du Colombier void *
pl64(Pkt * p,uvlong n)89*671dfc47SDavid du Colombier pl64(Pkt *p, uvlong n)
90*671dfc47SDavid du Colombier {
91*671dfc47SDavid du Colombier void *s = p->pos;
92*671dfc47SDavid du Colombier
93*671dfc47SDavid du Colombier *p->pos++ = n;
94*671dfc47SDavid du Colombier *p->pos++ = n >> 8;
95*671dfc47SDavid du Colombier *p->pos++ = n >> 16;
96*671dfc47SDavid du Colombier *p->pos++ = n >> 24;
97*671dfc47SDavid du Colombier *p->pos++ = n >> 32;
98*671dfc47SDavid du Colombier *p->pos++ = n >> 40;
99*671dfc47SDavid du Colombier *p->pos++ = n >> 48;
100*671dfc47SDavid du Colombier *p->pos++ = n >> 56;
101*671dfc47SDavid du Colombier return s;
102*671dfc47SDavid du Colombier }
103*671dfc47SDavid du Colombier
104*671dfc47SDavid du Colombier void *
pb32(Pkt * p,uint n)105*671dfc47SDavid du Colombier pb32(Pkt *p, uint n)
106*671dfc47SDavid du Colombier {
107*671dfc47SDavid du Colombier void *s = p->pos;
108*671dfc47SDavid du Colombier
109*671dfc47SDavid du Colombier *p->pos++ = n >> 24;
110*671dfc47SDavid du Colombier *p->pos++ = n >> 16;
111*671dfc47SDavid du Colombier *p->pos++ = n >> 8;
112*671dfc47SDavid du Colombier *p->pos++ = n;
113*671dfc47SDavid du Colombier return s;
114*671dfc47SDavid du Colombier }
115*671dfc47SDavid du Colombier
116*671dfc47SDavid du Colombier void *
pl32(Pkt * p,uint n)117*671dfc47SDavid du Colombier pl32(Pkt *p, uint n)
118*671dfc47SDavid du Colombier {
119*671dfc47SDavid du Colombier void *s = p->pos;
120*671dfc47SDavid du Colombier
121*671dfc47SDavid du Colombier *p->pos++ = n;
122*671dfc47SDavid du Colombier *p->pos++ = n >> 8;
123*671dfc47SDavid du Colombier *p->pos++ = n >> 16;
124*671dfc47SDavid du Colombier *p->pos++ = n >> 24;
125*671dfc47SDavid du Colombier return s;
126*671dfc47SDavid du Colombier }
127*671dfc47SDavid du Colombier
128*671dfc47SDavid du Colombier void *
pb16(Pkt * p,uint n)129*671dfc47SDavid du Colombier pb16(Pkt *p, uint n)
130*671dfc47SDavid du Colombier {
131*671dfc47SDavid du Colombier void *s = p->pos;
132*671dfc47SDavid du Colombier
133*671dfc47SDavid du Colombier *p->pos++ = n >> 8;
134*671dfc47SDavid du Colombier *p->pos++ = n;
135*671dfc47SDavid du Colombier return s;
136*671dfc47SDavid du Colombier }
137*671dfc47SDavid du Colombier
138*671dfc47SDavid du Colombier void *
pl16(Pkt * p,uint n)139*671dfc47SDavid du Colombier pl16(Pkt *p, uint n)
140*671dfc47SDavid du Colombier {
141*671dfc47SDavid du Colombier void *s = p->pos;
142*671dfc47SDavid du Colombier
143*671dfc47SDavid du Colombier *p->pos++ = n;
144*671dfc47SDavid du Colombier *p->pos++ = n >> 8;
145*671dfc47SDavid du Colombier return s;
146*671dfc47SDavid du Colombier }
147*671dfc47SDavid du Colombier
148*671dfc47SDavid du Colombier void *
p8(Pkt * p,uint n)149*671dfc47SDavid du Colombier p8(Pkt *p, uint n)
150*671dfc47SDavid du Colombier {
151*671dfc47SDavid du Colombier void *s = p->pos;
152*671dfc47SDavid du Colombier
153*671dfc47SDavid du Colombier *p->pos++ = n;
154*671dfc47SDavid du Colombier return s;
155*671dfc47SDavid du Colombier }
156*671dfc47SDavid du Colombier
157*671dfc47SDavid du Colombier /*
158*671dfc47SDavid du Colombier * Encode a Netbios name
159*671dfc47SDavid du Colombier */
160*671dfc47SDavid du Colombier void *
pname(Pkt * p,char * name,char pad)161*671dfc47SDavid du Colombier pname(Pkt *p, char *name, char pad)
162*671dfc47SDavid du Colombier {
163*671dfc47SDavid du Colombier int i, done = 0;
164*671dfc47SDavid du Colombier char c;
165*671dfc47SDavid du Colombier void *s = p->pos;
166*671dfc47SDavid du Colombier
167*671dfc47SDavid du Colombier *p->pos++ = ' ';
168*671dfc47SDavid du Colombier for(i = 0; i < 16; i++) {
169*671dfc47SDavid du Colombier c = pad;
170*671dfc47SDavid du Colombier if(!done && name[i] == '\0')
171*671dfc47SDavid du Colombier done = 1;
172*671dfc47SDavid du Colombier if(!done)
173*671dfc47SDavid du Colombier c = islower(name[i])? toupper(name[i]): name[i];
174*671dfc47SDavid du Colombier *p->pos++ = ((uchar)c >> 4) + 'A';
175*671dfc47SDavid du Colombier *p->pos++ = (c & 0xf) + 'A';
176*671dfc47SDavid du Colombier }
177*671dfc47SDavid du Colombier *p->pos++ = '\0';
178*671dfc47SDavid du Colombier return s;
179*671dfc47SDavid du Colombier }
180*671dfc47SDavid du Colombier
181*671dfc47SDavid du Colombier void *
pvtime(Pkt * p,uvlong n)182*671dfc47SDavid du Colombier pvtime(Pkt *p, uvlong n)
183*671dfc47SDavid du Colombier {
184*671dfc47SDavid du Colombier void *s = p->pos;
185*671dfc47SDavid du Colombier
186*671dfc47SDavid du Colombier n += 11644473600LL;
187*671dfc47SDavid du Colombier n *= 10000000LL;
188*671dfc47SDavid du Colombier
189*671dfc47SDavid du Colombier pl32(p, n);
190*671dfc47SDavid du Colombier pl32(p, n >> 32);
191*671dfc47SDavid du Colombier return s;
192*671dfc47SDavid du Colombier }
193*671dfc47SDavid du Colombier
194*671dfc47SDavid du Colombier void *
pdatetime(Pkt * p,long utc)195*671dfc47SDavid du Colombier pdatetime(Pkt *p, long utc)
196*671dfc47SDavid du Colombier {
197*671dfc47SDavid du Colombier void *s = p->pos;
198*671dfc47SDavid du Colombier Tm *tm = localtime(utc);
199*671dfc47SDavid du Colombier int t = tm->hour << 11 | tm->min << 5 | (tm->sec / 2);
200*671dfc47SDavid du Colombier int d = (tm->year - 80) << 9 | (tm->mon + 1) << 5 | tm->mday;
201*671dfc47SDavid du Colombier
202*671dfc47SDavid du Colombier /*
203*671dfc47SDavid du Colombier * bug in word swapping in Win95 requires this
204*671dfc47SDavid du Colombier */
205*671dfc47SDavid du Colombier if(p->s->caps & CAP_NT_SMBS){
206*671dfc47SDavid du Colombier pl16(p, d);
207*671dfc47SDavid du Colombier pl16(p, t);
208*671dfc47SDavid du Colombier } else{
209*671dfc47SDavid du Colombier pl16(p, t);
210*671dfc47SDavid du Colombier pl16(p, d);
211*671dfc47SDavid du Colombier }
212*671dfc47SDavid du Colombier return s;
213*671dfc47SDavid du Colombier }
214*671dfc47SDavid du Colombier
215*671dfc47SDavid du Colombier
216*671dfc47SDavid du Colombier void
gmem(Pkt * p,void * v,int n)217*671dfc47SDavid du Colombier gmem(Pkt *p, void *v, int n)
218*671dfc47SDavid du Colombier {
219*671dfc47SDavid du Colombier uchar *str = v;
220*671dfc47SDavid du Colombier
221*671dfc47SDavid du Colombier if(!n || !v)
222*671dfc47SDavid du Colombier return;
223*671dfc47SDavid du Colombier while(n-- && p->pos < p->eop)
224*671dfc47SDavid du Colombier *str++ = *p->pos++;
225*671dfc47SDavid du Colombier }
226*671dfc47SDavid du Colombier
227*671dfc47SDavid du Colombier /*
228*671dfc47SDavid du Colombier * note len is the length of the source string in
229*671dfc47SDavid du Colombier * in runes or bytes, in ASCII mode this is also the size
230*671dfc47SDavid du Colombier * of the output buffer but this is not so in Unicode mode!
231*671dfc47SDavid du Colombier */
232*671dfc47SDavid du Colombier void
gstr(Pkt * p,char * str,int n)233*671dfc47SDavid du Colombier gstr(Pkt *p, char *str, int n)
234*671dfc47SDavid du Colombier {
235*671dfc47SDavid du Colombier int i;
236*671dfc47SDavid du Colombier Rune r;
237*671dfc47SDavid du Colombier
238*671dfc47SDavid du Colombier if(!n || !str)
239*671dfc47SDavid du Colombier return;
240*671dfc47SDavid du Colombier
241*671dfc47SDavid du Colombier if(p->s->caps & CAP_UNICODE){
242*671dfc47SDavid du Colombier i = 0;
243*671dfc47SDavid du Colombier while(*p->pos && n && p->pos < p->eop){
244*671dfc47SDavid du Colombier r = gl16(p);
245*671dfc47SDavid du Colombier i += runetochar(str +i, &r);
246*671dfc47SDavid du Colombier n -= 2;
247*671dfc47SDavid du Colombier }
248*671dfc47SDavid du Colombier *(str + i) = 0;
249*671dfc47SDavid du Colombier
250*671dfc47SDavid du Colombier while(*p->pos && p->pos < p->eop)
251*671dfc47SDavid du Colombier gl16(p);
252*671dfc47SDavid du Colombier /*
253*671dfc47SDavid du Colombier * some versions of windows terminate a rune string
254*671dfc47SDavid du Colombier * with a single nul so we do a dangerous hack...
255*671dfc47SDavid du Colombier */
256*671dfc47SDavid du Colombier if(p->pos[1])
257*671dfc47SDavid du Colombier g8(p);
258*671dfc47SDavid du Colombier else
259*671dfc47SDavid du Colombier gl16(p);
260*671dfc47SDavid du Colombier } else {
261*671dfc47SDavid du Colombier while(*p->pos && n-- && p->pos < p->eop)
262*671dfc47SDavid du Colombier *str++ = *p->pos++;
263*671dfc47SDavid du Colombier *str = 0;
264*671dfc47SDavid du Colombier while(*p->pos++ && p->pos < p->eop)
265*671dfc47SDavid du Colombier continue;
266*671dfc47SDavid du Colombier }
267*671dfc47SDavid du Colombier }
268*671dfc47SDavid du Colombier
269*671dfc47SDavid du Colombier void
gascii(Pkt * p,char * str,int n)270*671dfc47SDavid du Colombier gascii(Pkt *p, char *str, int n)
271*671dfc47SDavid du Colombier {
272*671dfc47SDavid du Colombier if(!n || !str)
273*671dfc47SDavid du Colombier return;
274*671dfc47SDavid du Colombier
275*671dfc47SDavid du Colombier while(*p->pos && n-- && p->pos < p->eop)
276*671dfc47SDavid du Colombier *str++ = *p->pos++;
277*671dfc47SDavid du Colombier *str = 0;
278*671dfc47SDavid du Colombier while(*p->pos++ && p->pos < p->eop)
279*671dfc47SDavid du Colombier continue;
280*671dfc47SDavid du Colombier }
281*671dfc47SDavid du Colombier
282*671dfc47SDavid du Colombier
283*671dfc47SDavid du Colombier uvlong
gl64(Pkt * p)284*671dfc47SDavid du Colombier gl64(Pkt *p)
285*671dfc47SDavid du Colombier {
286*671dfc47SDavid du Colombier uvlong n;
287*671dfc47SDavid du Colombier
288*671dfc47SDavid du Colombier if(p->pos + 8 > p->eop)
289*671dfc47SDavid du Colombier return 0;
290*671dfc47SDavid du Colombier
291*671dfc47SDavid du Colombier n = (uvlong)*p->pos++;
292*671dfc47SDavid du Colombier n |= (uvlong)*p->pos++ << 8;
293*671dfc47SDavid du Colombier n |= (uvlong)*p->pos++ << 16;
294*671dfc47SDavid du Colombier n |= (uvlong)*p->pos++ << 24;
295*671dfc47SDavid du Colombier n |= (uvlong)*p->pos++ << 32;
296*671dfc47SDavid du Colombier n |= (uvlong)*p->pos++ << 40;
297*671dfc47SDavid du Colombier n |= (uvlong)*p->pos++ << 48;
298*671dfc47SDavid du Colombier n |= (uvlong)*p->pos++ << 56;
299*671dfc47SDavid du Colombier return n;
300*671dfc47SDavid du Colombier }
301*671dfc47SDavid du Colombier
302*671dfc47SDavid du Colombier uvlong
gb48(Pkt * p)303*671dfc47SDavid du Colombier gb48(Pkt *p)
304*671dfc47SDavid du Colombier {
305*671dfc47SDavid du Colombier uvlong n;
306*671dfc47SDavid du Colombier
307*671dfc47SDavid du Colombier if(p->pos + 6 > p->eop)
308*671dfc47SDavid du Colombier return 0;
309*671dfc47SDavid du Colombier
310*671dfc47SDavid du Colombier n = (uvlong)*p->pos++ << 40;
311*671dfc47SDavid du Colombier n |= (uvlong)*p->pos++ << 24;
312*671dfc47SDavid du Colombier n |= (uvlong)*p->pos++ << 32;
313*671dfc47SDavid du Colombier n |= (uvlong)*p->pos++ << 16;
314*671dfc47SDavid du Colombier n |= (uvlong)*p->pos++ << 8;
315*671dfc47SDavid du Colombier n |= (uvlong)*p->pos++;
316*671dfc47SDavid du Colombier return n;
317*671dfc47SDavid du Colombier }
318*671dfc47SDavid du Colombier
319*671dfc47SDavid du Colombier uint
gb32(Pkt * p)320*671dfc47SDavid du Colombier gb32(Pkt *p)
321*671dfc47SDavid du Colombier {
322*671dfc47SDavid du Colombier uint n;
323*671dfc47SDavid du Colombier
324*671dfc47SDavid du Colombier if(p->pos + 4 > p->eop)
325*671dfc47SDavid du Colombier return 0;
326*671dfc47SDavid du Colombier
327*671dfc47SDavid du Colombier n = (uint)*p->pos++ << 24;
328*671dfc47SDavid du Colombier n |= (uint)*p->pos++ << 16;
329*671dfc47SDavid du Colombier n |= (uint)*p->pos++ << 8;
330*671dfc47SDavid du Colombier n |= (uint)*p->pos++;
331*671dfc47SDavid du Colombier return n;
332*671dfc47SDavid du Colombier }
333*671dfc47SDavid du Colombier
334*671dfc47SDavid du Colombier uint
gl32(Pkt * p)335*671dfc47SDavid du Colombier gl32(Pkt *p)
336*671dfc47SDavid du Colombier {
337*671dfc47SDavid du Colombier uint n;
338*671dfc47SDavid du Colombier
339*671dfc47SDavid du Colombier if(p->pos + 4 > p->eop)
340*671dfc47SDavid du Colombier return 0;
341*671dfc47SDavid du Colombier
342*671dfc47SDavid du Colombier n = (uint)*p->pos++;
343*671dfc47SDavid du Colombier n |= (uint)*p->pos++ << 8;
344*671dfc47SDavid du Colombier n |= (uint)*p->pos++ << 16;
345*671dfc47SDavid du Colombier n |= (uint)*p->pos++ << 24;
346*671dfc47SDavid du Colombier return n;
347*671dfc47SDavid du Colombier }
348*671dfc47SDavid du Colombier
349*671dfc47SDavid du Colombier uint
gb16(Pkt * p)350*671dfc47SDavid du Colombier gb16(Pkt *p)
351*671dfc47SDavid du Colombier {
352*671dfc47SDavid du Colombier uint n;
353*671dfc47SDavid du Colombier
354*671dfc47SDavid du Colombier if(p->pos + 2 > p->eop)
355*671dfc47SDavid du Colombier return 0;
356*671dfc47SDavid du Colombier n = (uint)*p->pos++ << 8;
357*671dfc47SDavid du Colombier n |= (uint)*p->pos++;
358*671dfc47SDavid du Colombier return n;
359*671dfc47SDavid du Colombier }
360*671dfc47SDavid du Colombier
361*671dfc47SDavid du Colombier uint
gl16(Pkt * p)362*671dfc47SDavid du Colombier gl16(Pkt *p)
363*671dfc47SDavid du Colombier {
364*671dfc47SDavid du Colombier uint n;
365*671dfc47SDavid du Colombier
366*671dfc47SDavid du Colombier if(p->pos + 2 > p->eop)
367*671dfc47SDavid du Colombier return 0;
368*671dfc47SDavid du Colombier n = (uint)*p->pos++;
369*671dfc47SDavid du Colombier n |= (uint)*p->pos++ << 8;
370*671dfc47SDavid du Colombier return n;
371*671dfc47SDavid du Colombier }
372*671dfc47SDavid du Colombier
373*671dfc47SDavid du Colombier uint
g8(Pkt * p)374*671dfc47SDavid du Colombier g8(Pkt *p)
375*671dfc47SDavid du Colombier {
376*671dfc47SDavid du Colombier if(p->pos + 1 > p->eop)
377*671dfc47SDavid du Colombier return 0;
378*671dfc47SDavid du Colombier return (uint)*p->pos++;
379*671dfc47SDavid du Colombier }
380*671dfc47SDavid du Colombier
381*671dfc47SDavid du Colombier long
gdatetime(Pkt * p)382*671dfc47SDavid du Colombier gdatetime(Pkt *p)
383*671dfc47SDavid du Colombier {
384*671dfc47SDavid du Colombier Tm tm;
385*671dfc47SDavid du Colombier uint d, t;
386*671dfc47SDavid du Colombier
387*671dfc47SDavid du Colombier if(p->pos + 4 > p->eop)
388*671dfc47SDavid du Colombier return 0;
389*671dfc47SDavid du Colombier
390*671dfc47SDavid du Colombier /*
391*671dfc47SDavid du Colombier * bug in word swapping in Win95 requires this
392*671dfc47SDavid du Colombier */
393*671dfc47SDavid du Colombier if(p->s->caps & CAP_NT_SMBS){
394*671dfc47SDavid du Colombier d = gl16(p);
395*671dfc47SDavid du Colombier t = gl16(p);
396*671dfc47SDavid du Colombier }else{
397*671dfc47SDavid du Colombier t = gl16(p);
398*671dfc47SDavid du Colombier d = gl16(p);
399*671dfc47SDavid du Colombier }
400*671dfc47SDavid du Colombier
401*671dfc47SDavid du Colombier tm.year = 80 + (d >> 9);
402*671dfc47SDavid du Colombier tm.mon = ((d >> 5) & 017) - 1;
403*671dfc47SDavid du Colombier tm.mday = d & 037;
404*671dfc47SDavid du Colombier tm.zone[0] = 0;
405*671dfc47SDavid du Colombier tm.tzoff = p->s->tz;
406*671dfc47SDavid du Colombier
407*671dfc47SDavid du Colombier tm.hour = t >> 11;
408*671dfc47SDavid du Colombier tm.min = (t >> 5) & 63;
409*671dfc47SDavid du Colombier tm.sec = (t & 31) << 1;
410*671dfc47SDavid du Colombier
411*671dfc47SDavid du Colombier return tm2sec(&tm);
412*671dfc47SDavid du Colombier }
413*671dfc47SDavid du Colombier
414*671dfc47SDavid du Colombier long
gvtime(Pkt * p)415*671dfc47SDavid du Colombier gvtime(Pkt *p)
416*671dfc47SDavid du Colombier {
417*671dfc47SDavid du Colombier uvlong vl;
418*671dfc47SDavid du Colombier
419*671dfc47SDavid du Colombier if(p->pos + 8 > p->eop)
420*671dfc47SDavid du Colombier return 0;
421*671dfc47SDavid du Colombier
422*671dfc47SDavid du Colombier vl = (uvlong)gl32(p);
423*671dfc47SDavid du Colombier vl |= (uvlong)gl32(p) << 32;
424*671dfc47SDavid du Colombier
425*671dfc47SDavid du Colombier vl /= 10000000LL;
426*671dfc47SDavid du Colombier vl -= 11644473600LL;
427*671dfc47SDavid du Colombier return vl;
428*671dfc47SDavid du Colombier }
429*671dfc47SDavid du Colombier
430*671dfc47SDavid du Colombier void
gconv(Pkt * p,int conv,char * str,int n)431*671dfc47SDavid du Colombier gconv(Pkt *p, int conv, char *str, int n)
432*671dfc47SDavid du Colombier {
433*671dfc47SDavid du Colombier int off;
434*671dfc47SDavid du Colombier uchar *pos;
435*671dfc47SDavid du Colombier
436*671dfc47SDavid du Colombier off = gl32(p) & 0xffff;
437*671dfc47SDavid du Colombier if(off == 0 || p->tdata - conv + off > p->eop){
438*671dfc47SDavid du Colombier memset(str, 0, n);
439*671dfc47SDavid du Colombier return;
440*671dfc47SDavid du Colombier }
441*671dfc47SDavid du Colombier
442*671dfc47SDavid du Colombier pos = p->pos;
443*671dfc47SDavid du Colombier p->pos = p->tdata - conv + off;
444*671dfc47SDavid du Colombier gascii(p, str, n);
445*671dfc47SDavid du Colombier p->pos = pos;
446*671dfc47SDavid du Colombier }
447*671dfc47SDavid du Colombier
448*671dfc47SDavid du Colombier void
goff(Pkt * p,uchar * base,char * str,int n)449*671dfc47SDavid du Colombier goff(Pkt *p, uchar *base, char *str, int n)
450*671dfc47SDavid du Colombier {
451*671dfc47SDavid du Colombier int off;
452*671dfc47SDavid du Colombier uchar *pos;
453*671dfc47SDavid du Colombier
454*671dfc47SDavid du Colombier off = gl16(p);
455*671dfc47SDavid du Colombier if(off == 0 || base + off > p->eop){
456*671dfc47SDavid du Colombier memset(str, 0, n);
457*671dfc47SDavid du Colombier return;
458*671dfc47SDavid du Colombier }
459*671dfc47SDavid du Colombier pos = p->pos;
460*671dfc47SDavid du Colombier p->pos = base + off;
461*671dfc47SDavid du Colombier gstr(p, str, n);
462*671dfc47SDavid du Colombier p->pos = pos;
463*671dfc47SDavid du Colombier }
464