1*9a747e4fSDavid du Colombier #include "all.h"
2*9a747e4fSDavid du Colombier #include "9p1.h"
3*9a747e4fSDavid du Colombier
4*9a747e4fSDavid du Colombier #define CHAR(x) *p++ = f->x
5*9a747e4fSDavid du Colombier #define SHORT(x) { ulong vvv = f->x; p[0] = vvv; p[1] = vvv>>8; p += 2; }
6*9a747e4fSDavid du Colombier #define VLONG(q) p[0] = (q); p[1] = (q)>>8; p[2] = (q)>>16; p[3] = (q)>>24; p += 4
7*9a747e4fSDavid du Colombier #define LONG(x) { ulong vvv = f->x; VLONG(vvv); }
8*9a747e4fSDavid du Colombier #define BYTES(x,n) memmove(p, f->x, n); p += n
9*9a747e4fSDavid du Colombier #define STRING(x,n) strncpy((char*)p, f->x, n); p += n
10*9a747e4fSDavid du Colombier
11*9a747e4fSDavid du Colombier int
convS2M9p1(Oldfcall * f,uchar * ap)12*9a747e4fSDavid du Colombier convS2M9p1(Oldfcall *f, uchar *ap)
13*9a747e4fSDavid du Colombier {
14*9a747e4fSDavid du Colombier uchar *p;
15*9a747e4fSDavid du Colombier int t;
16*9a747e4fSDavid du Colombier
17*9a747e4fSDavid du Colombier p = ap;
18*9a747e4fSDavid du Colombier CHAR(type);
19*9a747e4fSDavid du Colombier t = f->type;
20*9a747e4fSDavid du Colombier SHORT(tag);
21*9a747e4fSDavid du Colombier switch(t)
22*9a747e4fSDavid du Colombier {
23*9a747e4fSDavid du Colombier default:
24*9a747e4fSDavid du Colombier print("convS2M9p1: bad type: %d\n", t);
25*9a747e4fSDavid du Colombier return 0;
26*9a747e4fSDavid du Colombier
27*9a747e4fSDavid du Colombier case Tnop9p1:
28*9a747e4fSDavid du Colombier case Tosession9p1:
29*9a747e4fSDavid du Colombier break;
30*9a747e4fSDavid du Colombier
31*9a747e4fSDavid du Colombier case Tsession9p1:
32*9a747e4fSDavid du Colombier BYTES(chal, sizeof(f->chal));
33*9a747e4fSDavid du Colombier break;
34*9a747e4fSDavid du Colombier
35*9a747e4fSDavid du Colombier case Tflush9p1:
36*9a747e4fSDavid du Colombier SHORT(oldtag);
37*9a747e4fSDavid du Colombier break;
38*9a747e4fSDavid du Colombier
39*9a747e4fSDavid du Colombier case Tattach9p1:
40*9a747e4fSDavid du Colombier SHORT(fid);
41*9a747e4fSDavid du Colombier STRING(uname, sizeof(f->uname));
42*9a747e4fSDavid du Colombier STRING(aname, sizeof(f->aname));
43*9a747e4fSDavid du Colombier BYTES(ticket, sizeof(f->ticket));
44*9a747e4fSDavid du Colombier BYTES(auth, sizeof(f->auth));
45*9a747e4fSDavid du Colombier break;
46*9a747e4fSDavid du Colombier
47*9a747e4fSDavid du Colombier case Toattach9p1:
48*9a747e4fSDavid du Colombier SHORT(fid);
49*9a747e4fSDavid du Colombier STRING(uname, sizeof(f->uname));
50*9a747e4fSDavid du Colombier STRING(aname, sizeof(f->aname));
51*9a747e4fSDavid du Colombier BYTES(ticket, NAMELEN);
52*9a747e4fSDavid du Colombier break;
53*9a747e4fSDavid du Colombier
54*9a747e4fSDavid du Colombier case Tclone9p1:
55*9a747e4fSDavid du Colombier SHORT(fid);
56*9a747e4fSDavid du Colombier SHORT(newfid);
57*9a747e4fSDavid du Colombier break;
58*9a747e4fSDavid du Colombier
59*9a747e4fSDavid du Colombier case Twalk9p1:
60*9a747e4fSDavid du Colombier SHORT(fid);
61*9a747e4fSDavid du Colombier STRING(name, sizeof(f->name));
62*9a747e4fSDavid du Colombier break;
63*9a747e4fSDavid du Colombier
64*9a747e4fSDavid du Colombier case Tclwalk9p1:
65*9a747e4fSDavid du Colombier SHORT(fid);
66*9a747e4fSDavid du Colombier SHORT(newfid);
67*9a747e4fSDavid du Colombier STRING(name, sizeof(f->name));
68*9a747e4fSDavid du Colombier break;
69*9a747e4fSDavid du Colombier
70*9a747e4fSDavid du Colombier case Topen9p1:
71*9a747e4fSDavid du Colombier SHORT(fid);
72*9a747e4fSDavid du Colombier CHAR(mode);
73*9a747e4fSDavid du Colombier break;
74*9a747e4fSDavid du Colombier
75*9a747e4fSDavid du Colombier case Tcreate9p1:
76*9a747e4fSDavid du Colombier SHORT(fid);
77*9a747e4fSDavid du Colombier STRING(name, sizeof(f->name));
78*9a747e4fSDavid du Colombier LONG(perm);
79*9a747e4fSDavid du Colombier CHAR(mode);
80*9a747e4fSDavid du Colombier break;
81*9a747e4fSDavid du Colombier
82*9a747e4fSDavid du Colombier case Tread9p1:
83*9a747e4fSDavid du Colombier SHORT(fid);
84*9a747e4fSDavid du Colombier LONG(offset); VLONG(0);
85*9a747e4fSDavid du Colombier SHORT(count);
86*9a747e4fSDavid du Colombier break;
87*9a747e4fSDavid du Colombier
88*9a747e4fSDavid du Colombier case Twrite9p1:
89*9a747e4fSDavid du Colombier SHORT(fid);
90*9a747e4fSDavid du Colombier LONG(offset); VLONG(0);
91*9a747e4fSDavid du Colombier SHORT(count);
92*9a747e4fSDavid du Colombier p++;
93*9a747e4fSDavid du Colombier if((uchar*)p == (uchar*)f->data) {
94*9a747e4fSDavid du Colombier p += f->count;
95*9a747e4fSDavid du Colombier break;
96*9a747e4fSDavid du Colombier }
97*9a747e4fSDavid du Colombier BYTES(data, f->count);
98*9a747e4fSDavid du Colombier break;
99*9a747e4fSDavid du Colombier
100*9a747e4fSDavid du Colombier case Tclunk9p1:
101*9a747e4fSDavid du Colombier case Tremove9p1:
102*9a747e4fSDavid du Colombier case Tstat9p1:
103*9a747e4fSDavid du Colombier SHORT(fid);
104*9a747e4fSDavid du Colombier break;
105*9a747e4fSDavid du Colombier
106*9a747e4fSDavid du Colombier case Twstat9p1:
107*9a747e4fSDavid du Colombier SHORT(fid);
108*9a747e4fSDavid du Colombier BYTES(stat, sizeof(f->stat));
109*9a747e4fSDavid du Colombier break;
110*9a747e4fSDavid du Colombier /*
111*9a747e4fSDavid du Colombier */
112*9a747e4fSDavid du Colombier case Rnop9p1:
113*9a747e4fSDavid du Colombier case Rosession9p1:
114*9a747e4fSDavid du Colombier case Rflush9p1:
115*9a747e4fSDavid du Colombier break;
116*9a747e4fSDavid du Colombier
117*9a747e4fSDavid du Colombier case Rsession9p1:
118*9a747e4fSDavid du Colombier BYTES(chal, sizeof(f->chal));
119*9a747e4fSDavid du Colombier BYTES(authid, sizeof(f->authid));
120*9a747e4fSDavid du Colombier BYTES(authdom, sizeof(f->authdom));
121*9a747e4fSDavid du Colombier break;
122*9a747e4fSDavid du Colombier
123*9a747e4fSDavid du Colombier case Rerror9p1:
124*9a747e4fSDavid du Colombier STRING(ename, sizeof(f->ename));
125*9a747e4fSDavid du Colombier break;
126*9a747e4fSDavid du Colombier
127*9a747e4fSDavid du Colombier case Rclone9p1:
128*9a747e4fSDavid du Colombier case Rclunk9p1:
129*9a747e4fSDavid du Colombier case Rremove9p1:
130*9a747e4fSDavid du Colombier case Rwstat9p1:
131*9a747e4fSDavid du Colombier SHORT(fid);
132*9a747e4fSDavid du Colombier break;
133*9a747e4fSDavid du Colombier
134*9a747e4fSDavid du Colombier case Rwalk9p1:
135*9a747e4fSDavid du Colombier case Ropen9p1:
136*9a747e4fSDavid du Colombier case Rcreate9p1:
137*9a747e4fSDavid du Colombier case Rclwalk9p1:
138*9a747e4fSDavid du Colombier SHORT(fid);
139*9a747e4fSDavid du Colombier LONG(qid.path);
140*9a747e4fSDavid du Colombier LONG(qid.version);
141*9a747e4fSDavid du Colombier break;
142*9a747e4fSDavid du Colombier
143*9a747e4fSDavid du Colombier case Rattach9p1:
144*9a747e4fSDavid du Colombier SHORT(fid);
145*9a747e4fSDavid du Colombier LONG(qid.path);
146*9a747e4fSDavid du Colombier LONG(qid.version);
147*9a747e4fSDavid du Colombier BYTES(rauth, sizeof(f->rauth));
148*9a747e4fSDavid du Colombier break;
149*9a747e4fSDavid du Colombier
150*9a747e4fSDavid du Colombier case Roattach9p1:
151*9a747e4fSDavid du Colombier SHORT(fid);
152*9a747e4fSDavid du Colombier LONG(qid.path);
153*9a747e4fSDavid du Colombier LONG(qid.version);
154*9a747e4fSDavid du Colombier break;
155*9a747e4fSDavid du Colombier
156*9a747e4fSDavid du Colombier case Rread9p1:
157*9a747e4fSDavid du Colombier SHORT(fid);
158*9a747e4fSDavid du Colombier SHORT(count);
159*9a747e4fSDavid du Colombier p++;
160*9a747e4fSDavid du Colombier if((uchar*)p == (uchar*)f->data) {
161*9a747e4fSDavid du Colombier p += f->count;
162*9a747e4fSDavid du Colombier break;
163*9a747e4fSDavid du Colombier }
164*9a747e4fSDavid du Colombier BYTES(data, f->count);
165*9a747e4fSDavid du Colombier break;
166*9a747e4fSDavid du Colombier
167*9a747e4fSDavid du Colombier case Rwrite9p1:
168*9a747e4fSDavid du Colombier SHORT(fid);
169*9a747e4fSDavid du Colombier SHORT(count);
170*9a747e4fSDavid du Colombier break;
171*9a747e4fSDavid du Colombier
172*9a747e4fSDavid du Colombier case Rstat9p1:
173*9a747e4fSDavid du Colombier SHORT(fid);
174*9a747e4fSDavid du Colombier BYTES(stat, sizeof(f->stat));
175*9a747e4fSDavid du Colombier break;
176*9a747e4fSDavid du Colombier }
177*9a747e4fSDavid du Colombier return p - (uchar*)ap;
178*9a747e4fSDavid du Colombier }
179*9a747e4fSDavid du Colombier
180*9a747e4fSDavid du Colombier /*
181*9a747e4fSDavid du Colombier * buggery to give false qid for
182*9a747e4fSDavid du Colombier * the top 2 levels of the dump fs
183*9a747e4fSDavid du Colombier */
184*9a747e4fSDavid du Colombier static ulong
fakeqid9p1(Dentry * f)185*9a747e4fSDavid du Colombier fakeqid9p1(Dentry *f)
186*9a747e4fSDavid du Colombier {
187*9a747e4fSDavid du Colombier ulong q;
188*9a747e4fSDavid du Colombier int c;
189*9a747e4fSDavid du Colombier
190*9a747e4fSDavid du Colombier q = f->qid.path;
191*9a747e4fSDavid du Colombier if(q == (QPROOT|QPDIR)) {
192*9a747e4fSDavid du Colombier c = f->name[0];
193*9a747e4fSDavid du Colombier if(c >= '0' && c <= '9') {
194*9a747e4fSDavid du Colombier q = 3|QPDIR;
195*9a747e4fSDavid du Colombier c = (c-'0')*10 + (f->name[1]-'0');
196*9a747e4fSDavid du Colombier if(c >= 1 && c <= 12)
197*9a747e4fSDavid du Colombier q = 4|QPDIR;
198*9a747e4fSDavid du Colombier }
199*9a747e4fSDavid du Colombier }
200*9a747e4fSDavid du Colombier return q;
201*9a747e4fSDavid du Colombier }
202*9a747e4fSDavid du Colombier
203*9a747e4fSDavid du Colombier int
convD2M9p1(Dentry * f,char * ap)204*9a747e4fSDavid du Colombier convD2M9p1(Dentry *f, char *ap)
205*9a747e4fSDavid du Colombier {
206*9a747e4fSDavid du Colombier uchar *p;
207*9a747e4fSDavid du Colombier ulong q;
208*9a747e4fSDavid du Colombier
209*9a747e4fSDavid du Colombier p = (uchar*)ap;
210*9a747e4fSDavid du Colombier STRING(name, sizeof(f->name));
211*9a747e4fSDavid du Colombier
212*9a747e4fSDavid du Colombier memset(p, 0, 2*NAMELEN);
213*9a747e4fSDavid du Colombier uidtostr((char*)p, f->uid);
214*9a747e4fSDavid du Colombier p += NAMELEN;
215*9a747e4fSDavid du Colombier
216*9a747e4fSDavid du Colombier uidtostr((char*)p, f->gid);
217*9a747e4fSDavid du Colombier p += NAMELEN;
218*9a747e4fSDavid du Colombier
219*9a747e4fSDavid du Colombier q = fakeqid9p1(f);
220*9a747e4fSDavid du Colombier VLONG(q);
221*9a747e4fSDavid du Colombier LONG(qid.version);
222*9a747e4fSDavid du Colombier {
223*9a747e4fSDavid du Colombier q = f->mode & 0x0fff;
224*9a747e4fSDavid du Colombier if(f->mode & DDIR)
225*9a747e4fSDavid du Colombier q |= PDIR;
226*9a747e4fSDavid du Colombier if(f->mode & DAPND)
227*9a747e4fSDavid du Colombier q |= PAPND;
228*9a747e4fSDavid du Colombier if(f->mode & DLOCK)
229*9a747e4fSDavid du Colombier q |= PLOCK;
230*9a747e4fSDavid du Colombier VLONG(q);
231*9a747e4fSDavid du Colombier }
232*9a747e4fSDavid du Colombier LONG(atime);
233*9a747e4fSDavid du Colombier LONG(mtime);
234*9a747e4fSDavid du Colombier LONG(size); VLONG(0);
235*9a747e4fSDavid du Colombier VLONG(0);
236*9a747e4fSDavid du Colombier return p - (uchar*)ap;
237*9a747e4fSDavid du Colombier }
238*9a747e4fSDavid du Colombier
239*9a747e4fSDavid du Colombier #undef CHAR
240*9a747e4fSDavid du Colombier #undef SHORT
241*9a747e4fSDavid du Colombier #undef LONG
242*9a747e4fSDavid du Colombier #undef VLONG
243*9a747e4fSDavid du Colombier #undef BYTES
244*9a747e4fSDavid du Colombier #undef STRING
245*9a747e4fSDavid du Colombier
246*9a747e4fSDavid du Colombier #define CHAR(x) f->x = *p++
247*9a747e4fSDavid du Colombier #define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2
248*9a747e4fSDavid du Colombier #define VLONG(q) q = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)); p += 4
249*9a747e4fSDavid du Colombier #define LONG(x) VLONG(f->x)
250*9a747e4fSDavid du Colombier #define BYTES(x,n) memmove(f->x, p, n); p += n
251*9a747e4fSDavid du Colombier #define STRING(x,n) memmove(f->x, p, n); p += n
252*9a747e4fSDavid du Colombier
253*9a747e4fSDavid du Colombier int
convM2S9p1(uchar * ap,Oldfcall * f,int n)254*9a747e4fSDavid du Colombier convM2S9p1(uchar *ap, Oldfcall *f, int n)
255*9a747e4fSDavid du Colombier {
256*9a747e4fSDavid du Colombier uchar *p;
257*9a747e4fSDavid du Colombier int t;
258*9a747e4fSDavid du Colombier
259*9a747e4fSDavid du Colombier p = ap;
260*9a747e4fSDavid du Colombier CHAR(type);
261*9a747e4fSDavid du Colombier t = f->type;
262*9a747e4fSDavid du Colombier SHORT(tag);
263*9a747e4fSDavid du Colombier switch(t)
264*9a747e4fSDavid du Colombier {
265*9a747e4fSDavid du Colombier default:
266*9a747e4fSDavid du Colombier /*
267*9a747e4fSDavid du Colombier * only whine if it couldn't be a 9P2000 Tversion9p1.
268*9a747e4fSDavid du Colombier */
269*9a747e4fSDavid du Colombier if(t != 19 || ap[4] != 100)
270*9a747e4fSDavid du Colombier print("convM2S9p1: bad type: %d\n", f->type);
271*9a747e4fSDavid du Colombier return 0;
272*9a747e4fSDavid du Colombier
273*9a747e4fSDavid du Colombier case Tnop9p1:
274*9a747e4fSDavid du Colombier case Tosession9p1:
275*9a747e4fSDavid du Colombier break;
276*9a747e4fSDavid du Colombier
277*9a747e4fSDavid du Colombier case Tsession9p1:
278*9a747e4fSDavid du Colombier BYTES(chal, sizeof(f->chal));
279*9a747e4fSDavid du Colombier break;
280*9a747e4fSDavid du Colombier
281*9a747e4fSDavid du Colombier case Tflush9p1:
282*9a747e4fSDavid du Colombier SHORT(oldtag);
283*9a747e4fSDavid du Colombier break;
284*9a747e4fSDavid du Colombier
285*9a747e4fSDavid du Colombier case Tattach9p1:
286*9a747e4fSDavid du Colombier SHORT(fid);
287*9a747e4fSDavid du Colombier BYTES(uname, sizeof(f->uname));
288*9a747e4fSDavid du Colombier BYTES(aname, sizeof(f->aname));
289*9a747e4fSDavid du Colombier BYTES(ticket, sizeof(f->ticket));
290*9a747e4fSDavid du Colombier BYTES(auth, sizeof(f->auth));
291*9a747e4fSDavid du Colombier break;
292*9a747e4fSDavid du Colombier
293*9a747e4fSDavid du Colombier case Toattach9p1:
294*9a747e4fSDavid du Colombier SHORT(fid);
295*9a747e4fSDavid du Colombier BYTES(uname, sizeof(f->uname));
296*9a747e4fSDavid du Colombier BYTES(aname, sizeof(f->aname));
297*9a747e4fSDavid du Colombier BYTES(ticket, NAMELEN);
298*9a747e4fSDavid du Colombier break;
299*9a747e4fSDavid du Colombier
300*9a747e4fSDavid du Colombier case Tclone9p1:
301*9a747e4fSDavid du Colombier SHORT(fid);
302*9a747e4fSDavid du Colombier SHORT(newfid);
303*9a747e4fSDavid du Colombier break;
304*9a747e4fSDavid du Colombier
305*9a747e4fSDavid du Colombier case Twalk9p1:
306*9a747e4fSDavid du Colombier SHORT(fid);
307*9a747e4fSDavid du Colombier BYTES(name, sizeof(f->name));
308*9a747e4fSDavid du Colombier break;
309*9a747e4fSDavid du Colombier
310*9a747e4fSDavid du Colombier case Tclwalk9p1:
311*9a747e4fSDavid du Colombier SHORT(fid);
312*9a747e4fSDavid du Colombier SHORT(newfid);
313*9a747e4fSDavid du Colombier BYTES(name, sizeof(f->name));
314*9a747e4fSDavid du Colombier break;
315*9a747e4fSDavid du Colombier
316*9a747e4fSDavid du Colombier case Tremove9p1:
317*9a747e4fSDavid du Colombier SHORT(fid);
318*9a747e4fSDavid du Colombier break;
319*9a747e4fSDavid du Colombier
320*9a747e4fSDavid du Colombier case Topen9p1:
321*9a747e4fSDavid du Colombier SHORT(fid);
322*9a747e4fSDavid du Colombier CHAR(mode);
323*9a747e4fSDavid du Colombier break;
324*9a747e4fSDavid du Colombier
325*9a747e4fSDavid du Colombier case Tcreate9p1:
326*9a747e4fSDavid du Colombier SHORT(fid);
327*9a747e4fSDavid du Colombier BYTES(name, sizeof(f->name));
328*9a747e4fSDavid du Colombier LONG(perm);
329*9a747e4fSDavid du Colombier CHAR(mode);
330*9a747e4fSDavid du Colombier break;
331*9a747e4fSDavid du Colombier
332*9a747e4fSDavid du Colombier case Tread9p1:
333*9a747e4fSDavid du Colombier SHORT(fid);
334*9a747e4fSDavid du Colombier LONG(offset); p += 4;
335*9a747e4fSDavid du Colombier SHORT(count);
336*9a747e4fSDavid du Colombier break;
337*9a747e4fSDavid du Colombier
338*9a747e4fSDavid du Colombier case Twrite9p1:
339*9a747e4fSDavid du Colombier SHORT(fid);
340*9a747e4fSDavid du Colombier LONG(offset); p += 4;
341*9a747e4fSDavid du Colombier SHORT(count);
342*9a747e4fSDavid du Colombier p++;
343*9a747e4fSDavid du Colombier f->data = (char*)p; p += f->count;
344*9a747e4fSDavid du Colombier break;
345*9a747e4fSDavid du Colombier
346*9a747e4fSDavid du Colombier case Tclunk9p1:
347*9a747e4fSDavid du Colombier case Tstat9p1:
348*9a747e4fSDavid du Colombier SHORT(fid);
349*9a747e4fSDavid du Colombier break;
350*9a747e4fSDavid du Colombier
351*9a747e4fSDavid du Colombier case Twstat9p1:
352*9a747e4fSDavid du Colombier SHORT(fid);
353*9a747e4fSDavid du Colombier BYTES(stat, sizeof(f->stat));
354*9a747e4fSDavid du Colombier break;
355*9a747e4fSDavid du Colombier
356*9a747e4fSDavid du Colombier /*
357*9a747e4fSDavid du Colombier */
358*9a747e4fSDavid du Colombier case Rnop9p1:
359*9a747e4fSDavid du Colombier case Rosession9p1:
360*9a747e4fSDavid du Colombier break;
361*9a747e4fSDavid du Colombier
362*9a747e4fSDavid du Colombier case Rsession9p1:
363*9a747e4fSDavid du Colombier BYTES(chal, sizeof(f->chal));
364*9a747e4fSDavid du Colombier BYTES(authid, sizeof(f->authid));
365*9a747e4fSDavid du Colombier BYTES(authdom, sizeof(f->authdom));
366*9a747e4fSDavid du Colombier break;
367*9a747e4fSDavid du Colombier
368*9a747e4fSDavid du Colombier case Rerror9p1:
369*9a747e4fSDavid du Colombier BYTES(ename, sizeof(f->ename));
370*9a747e4fSDavid du Colombier break;
371*9a747e4fSDavid du Colombier
372*9a747e4fSDavid du Colombier case Rflush9p1:
373*9a747e4fSDavid du Colombier break;
374*9a747e4fSDavid du Colombier
375*9a747e4fSDavid du Colombier case Rclone9p1:
376*9a747e4fSDavid du Colombier case Rclunk9p1:
377*9a747e4fSDavid du Colombier case Rremove9p1:
378*9a747e4fSDavid du Colombier case Rwstat9p1:
379*9a747e4fSDavid du Colombier SHORT(fid);
380*9a747e4fSDavid du Colombier break;
381*9a747e4fSDavid du Colombier
382*9a747e4fSDavid du Colombier case Rwalk9p1:
383*9a747e4fSDavid du Colombier case Rclwalk9p1:
384*9a747e4fSDavid du Colombier case Ropen9p1:
385*9a747e4fSDavid du Colombier case Rcreate9p1:
386*9a747e4fSDavid du Colombier SHORT(fid);
387*9a747e4fSDavid du Colombier LONG(qid.path);
388*9a747e4fSDavid du Colombier LONG(qid.version);
389*9a747e4fSDavid du Colombier break;
390*9a747e4fSDavid du Colombier
391*9a747e4fSDavid du Colombier case Rattach9p1:
392*9a747e4fSDavid du Colombier SHORT(fid);
393*9a747e4fSDavid du Colombier LONG(qid.path);
394*9a747e4fSDavid du Colombier LONG(qid.version);
395*9a747e4fSDavid du Colombier BYTES(rauth, sizeof(f->rauth));
396*9a747e4fSDavid du Colombier break;
397*9a747e4fSDavid du Colombier
398*9a747e4fSDavid du Colombier case Roattach9p1:
399*9a747e4fSDavid du Colombier SHORT(fid);
400*9a747e4fSDavid du Colombier LONG(qid.path);
401*9a747e4fSDavid du Colombier LONG(qid.version);
402*9a747e4fSDavid du Colombier break;
403*9a747e4fSDavid du Colombier
404*9a747e4fSDavid du Colombier case Rread9p1:
405*9a747e4fSDavid du Colombier SHORT(fid);
406*9a747e4fSDavid du Colombier SHORT(count);
407*9a747e4fSDavid du Colombier p++;
408*9a747e4fSDavid du Colombier f->data = (char*)p; p += f->count;
409*9a747e4fSDavid du Colombier break;
410*9a747e4fSDavid du Colombier
411*9a747e4fSDavid du Colombier case Rwrite9p1:
412*9a747e4fSDavid du Colombier SHORT(fid);
413*9a747e4fSDavid du Colombier SHORT(count);
414*9a747e4fSDavid du Colombier break;
415*9a747e4fSDavid du Colombier
416*9a747e4fSDavid du Colombier case Rstat9p1:
417*9a747e4fSDavid du Colombier SHORT(fid);
418*9a747e4fSDavid du Colombier BYTES(stat, sizeof(f->stat));
419*9a747e4fSDavid du Colombier break;
420*9a747e4fSDavid du Colombier }
421*9a747e4fSDavid du Colombier if((uchar*)ap+n == p)
422*9a747e4fSDavid du Colombier return n;
423*9a747e4fSDavid du Colombier return 0;
424*9a747e4fSDavid du Colombier }
425*9a747e4fSDavid du Colombier
426*9a747e4fSDavid du Colombier int
convM2D9p1(char * ap,Dentry * f)427*9a747e4fSDavid du Colombier convM2D9p1(char *ap, Dentry *f)
428*9a747e4fSDavid du Colombier {
429*9a747e4fSDavid du Colombier uchar *p;
430*9a747e4fSDavid du Colombier char str[28];
431*9a747e4fSDavid du Colombier
432*9a747e4fSDavid du Colombier p = (uchar*)ap;
433*9a747e4fSDavid du Colombier BYTES(name, sizeof(f->name));
434*9a747e4fSDavid du Colombier
435*9a747e4fSDavid du Colombier memmove(str, p, NAMELEN);
436*9a747e4fSDavid du Colombier p += NAMELEN;
437*9a747e4fSDavid du Colombier f->uid = strtouid(str);
438*9a747e4fSDavid du Colombier
439*9a747e4fSDavid du Colombier memmove(str, p, NAMELEN);
440*9a747e4fSDavid du Colombier p += NAMELEN;
441*9a747e4fSDavid du Colombier f->gid = strtouid(str);
442*9a747e4fSDavid du Colombier
443*9a747e4fSDavid du Colombier LONG(qid.path);
444*9a747e4fSDavid du Colombier LONG(qid.version);
445*9a747e4fSDavid du Colombier {
446*9a747e4fSDavid du Colombier LONG(atime);
447*9a747e4fSDavid du Colombier f->mode = (f->atime & 0x0fff) | DALLOC;
448*9a747e4fSDavid du Colombier if(f->atime & PDIR)
449*9a747e4fSDavid du Colombier f->mode |= DDIR;
450*9a747e4fSDavid du Colombier if(f->atime & PAPND)
451*9a747e4fSDavid du Colombier f->mode |= DAPND;
452*9a747e4fSDavid du Colombier if(f->atime & PLOCK)
453*9a747e4fSDavid du Colombier f->mode |= DLOCK;
454*9a747e4fSDavid du Colombier }
455*9a747e4fSDavid du Colombier LONG(atime);
456*9a747e4fSDavid du Colombier LONG(mtime);
457*9a747e4fSDavid du Colombier LONG(size); p += 4;
458*9a747e4fSDavid du Colombier p += 4;
459*9a747e4fSDavid du Colombier return p - (uchar*)ap;
460*9a747e4fSDavid du Colombier }
461*9a747e4fSDavid du Colombier
462