xref: /plan9/sys/src/libsunrpc/mount3.c (revision 34e0422554c8e8bef66509534d2c44f4660bf678)
1 /*
2  * SUN NFSv3 Mounter.  See RFC 1813
3  */
4 
5 #include <u.h>
6 #include <libc.h>
7 #include <thread.h>
8 #include <sunrpc.h>
9 #include <nfs3.h>
10 
11 void
nfsMount3TNullPrint(Fmt * fmt,NfsMount3TNull * x)12 nfsMount3TNullPrint(Fmt *fmt, NfsMount3TNull *x)
13 {
14 	USED(x);
15 	fmtprint(fmt, "%s\n", "NfsMount3TNull");
16 }
17 uint
nfsMount3TNullSize(NfsMount3TNull * x)18 nfsMount3TNullSize(NfsMount3TNull *x)
19 {
20 	uint a;
21 	USED(x);
22 	a = 0;
23 	return a;
24 }
25 int
nfsMount3TNullPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3TNull * x)26 nfsMount3TNullPack(uchar *a, uchar *ea, uchar **pa, NfsMount3TNull *x)
27 {
28 	USED(ea);
29 	USED(x);
30 	*pa = a;
31 	return 0;
32 }
33 int
nfsMount3TNullUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3TNull * x)34 nfsMount3TNullUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TNull *x)
35 {
36 	USED(ea);
37 	USED(x);
38 	*pa = a;
39 	return 0;
40 }
41 void
nfsMount3RNullPrint(Fmt * fmt,NfsMount3RNull * x)42 nfsMount3RNullPrint(Fmt *fmt, NfsMount3RNull *x)
43 {
44 	USED(x);
45 	fmtprint(fmt, "%s\n", "NfsMount3RNull");
46 }
47 uint
nfsMount3RNullSize(NfsMount3RNull * x)48 nfsMount3RNullSize(NfsMount3RNull *x)
49 {
50 	uint a;
51 	USED(x);
52 	a = 0;
53 	return a;
54 }
55 int
nfsMount3RNullPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RNull * x)56 nfsMount3RNullPack(uchar *a, uchar *ea, uchar **pa, NfsMount3RNull *x)
57 {
58 	USED(ea);
59 	USED(x);
60 	*pa = a;
61 	return 0;
62 }
63 int
nfsMount3RNullUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RNull * x)64 nfsMount3RNullUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RNull *x)
65 {
66 	USED(ea);
67 	USED(x);
68 	*pa = a;
69 	return 0;
70 }
71 void
nfsMount3TMntPrint(Fmt * fmt,NfsMount3TMnt * x)72 nfsMount3TMntPrint(Fmt *fmt, NfsMount3TMnt *x)
73 {
74 	fmtprint(fmt, "%s\n", "NfsMount3TMnt");
75 	fmtprint(fmt, "\t%s=", "path");
76 	fmtprint(fmt, "\"%s\"", x->path);
77 	fmtprint(fmt, "\n");
78 }
79 uint
nfsMount3TMntSize(NfsMount3TMnt * x)80 nfsMount3TMntSize(NfsMount3TMnt *x)
81 {
82 	uint a;
83 	USED(x);
84 	a = 0 + sunStringSize(x->path);
85 	return a;
86 }
87 int
nfsMount3TMntPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3TMnt * x)88 nfsMount3TMntPack(uchar *a, uchar *ea, uchar **pa, NfsMount3TMnt *x)
89 {
90 	if(sunStringPack(a, ea, &a, &x->path, 1024) < 0) goto Err;
91 	*pa = a;
92 	return 0;
93 Err:
94 	*pa = ea;
95 	return -1;
96 }
97 int
nfsMount3TMntUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3TMnt * x)98 nfsMount3TMntUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TMnt *x)
99 {
100 	if(sunStringUnpack(a, ea, &a, &x->path, 1024) < 0) goto Err;
101 	*pa = a;
102 	return 0;
103 Err:
104 	*pa = ea;
105 	return -1;
106 }
107 void
nfsMount3RMntPrint(Fmt * fmt,NfsMount3RMnt * x)108 nfsMount3RMntPrint(Fmt *fmt, NfsMount3RMnt *x)
109 {
110 	fmtprint(fmt, "%s\n", "NfsMount3RMnt");
111 	fmtprint(fmt, "\t%s=", "status");
112 	fmtprint(fmt, "%ud", x->status);
113 	fmtprint(fmt, "\n");
114 	switch(x->status){
115 	case 0:
116 		fmtprint(fmt, "\t%s=", "handle");
117 		fmtprint(fmt, "%.*H", x->len, x->handle);
118 		fmtprint(fmt, "\n");
119 		break;
120 	}
121 }
122 uint
nfsMount3RMntSize(NfsMount3RMnt * x)123 nfsMount3RMntSize(NfsMount3RMnt *x)
124 {
125 	uint a;
126 	USED(x);
127 	a = 0 + 4;
128 	switch(x->status){
129 	case 0:
130 		a = a + sunVarOpaqueSize(x->len);
131 		a = a + 4 + 4 * x->nauth;
132 		break;
133 	}
134 	a = a;
135 	return a;
136 }
137 uint
nfsMount1RMntSize(NfsMount3RMnt * x)138 nfsMount1RMntSize(NfsMount3RMnt *x)
139 {
140 	uint a;
141 	USED(x);
142 	a = 0 + 4;
143 	switch(x->status){
144 	case 0:
145 		a = a + NfsMount1HandleSize;
146 		break;
147 	}
148 	return a;
149 }
150 
151 int
nfsMount3RMntPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RMnt * x)152 nfsMount3RMntPack(uchar *a, uchar *ea, uchar **pa, NfsMount3RMnt *x)
153 {
154 	int i;
155 	if(sunUint32Pack(a, ea, &a, &x->status) < 0) goto Err;
156 	switch(x->status){
157 	case 0:
158 		if(sunVarOpaquePack(a, ea, &a, &x->handle, &x->len, NfsMount3MaxHandleSize) < 0) goto Err;
159 		if(sunUint32Pack(a, ea, &a, &x->nauth) < 0) goto Err;
160 		for(i=0; i<x->nauth; i++)
161 			if(sunUint32Pack(a, ea, &a, &x->auth[i]) < 0) goto Err;
162 		break;
163 	}
164 	*pa = a;
165 	return 0;
166 Err:
167 	*pa = ea;
168 	return -1;
169 }
170 int
nfsMount1RMntPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RMnt * x)171 nfsMount1RMntPack(uchar *a, uchar *ea, uchar **pa, NfsMount3RMnt *x)
172 {
173 	if(sunUint32Pack(a, ea, &a, &x->status) < 0) goto Err;
174 	switch(x->status){
175 	case 0:
176 		if(x->len != NfsMount1HandleSize)
177 			goto Err;
178 		if(sunFixedOpaquePack(a, ea, &a, x->handle, NfsMount1HandleSize) < 0) goto Err;
179 		if(x->nauth != 0)
180 			goto Err;
181 		break;
182 	}
183 	*pa = a;
184 	return 0;
185 Err:
186 	*pa = ea;
187 	return -1;
188 }
189 int
nfsMount1RMntUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RMnt * x)190 nfsMount1RMntUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RMnt *x)
191 {
192 	if(sunUint32Unpack(a, ea, &a, &x->status) < 0) goto Err;
193 	switch(x->status){
194 	case 0:
195 		x->len = NfsMount1HandleSize;
196 		x->nauth = 0;
197 		x->auth = 0;
198 		if(sunFixedOpaqueUnpack(a, ea, &a, x->handle, NfsMount1HandleSize) < 0) goto Err;
199 		if(x->nauth != 0)
200 			goto Err;
201 		break;
202 	}
203 	*pa = a;
204 	return 0;
205 Err:
206 	*pa = ea;
207 	return -1;
208 }
209 
210 int
nfsMount3RMntUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RMnt * x)211 nfsMount3RMntUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RMnt *x)
212 {
213 	int i;
214 
215 	if(sunUint32Unpack(a, ea, &a, &x->status) < 0) goto Err;
216 	switch(x->status){
217 	case 0:
218 		if(sunVarOpaqueUnpack(a, ea, &a, &x->handle, &x->len, NfsMount3MaxHandleSize) < 0) goto Err;
219 		if(sunUint32Unpack(a, ea, &a, &x->nauth) < 0) goto Err;
220 		x->auth = (u32int*)a;
221 		for(i=0; i<x->nauth; i++)
222 			if(sunUint32Unpack(a, ea, &a, &x->auth[i]) < 0) goto Err;
223 		break;
224 	}
225 	*pa = a;
226 	return 0;
227 Err:
228 	*pa = ea;
229 	return -1;
230 }
231 void
nfsMount3TDumpPrint(Fmt * fmt,NfsMount3TDump * x)232 nfsMount3TDumpPrint(Fmt *fmt, NfsMount3TDump *x)
233 {
234 	USED(x);
235 	fmtprint(fmt, "%s\n", "NfsMount3TDump");
236 }
237 uint
nfsMount3TDumpSize(NfsMount3TDump * x)238 nfsMount3TDumpSize(NfsMount3TDump *x)
239 {
240 	uint a;
241 	USED(x);
242 	a = 0;
243 	return a;
244 }
245 int
nfsMount3TDumpPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3TDump * x)246 nfsMount3TDumpPack(uchar *a, uchar *ea, uchar **pa, NfsMount3TDump *x)
247 {
248 	USED(ea);
249 	USED(x);
250 	*pa = a;
251 	return 0;
252 }
253 int
nfsMount3TDumpUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3TDump * x)254 nfsMount3TDumpUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TDump *x)
255 {
256 	USED(ea);
257 	USED(x);
258 	*pa = a;
259 	return 0;
260 }
261 void
nfsMount3EntryPrint(Fmt * fmt,NfsMount3Entry * x)262 nfsMount3EntryPrint(Fmt *fmt, NfsMount3Entry *x)
263 {
264 	fmtprint(fmt, "%s\n", "NfsMount3Entry");
265 	fmtprint(fmt, "\t%s=", "host");
266 	fmtprint(fmt, "\"%s\"", x->host);
267 	fmtprint(fmt, "\n");
268 	fmtprint(fmt, "\t%s=", "path");
269 	fmtprint(fmt, "\"%s\"", x->path);
270 	fmtprint(fmt, "\n");
271 }
272 uint
nfsMount3EntrySize(NfsMount3Entry * x)273 nfsMount3EntrySize(NfsMount3Entry *x)
274 {
275 	uint a;
276 	USED(x);
277 	a = 0 + sunStringSize(x->host) + sunStringSize(x->path);
278 	return a;
279 }
280 int
nfsMount3EntryPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3Entry * x)281 nfsMount3EntryPack(uchar *a, uchar *ea, uchar **pa, NfsMount3Entry *x)
282 {
283 	u1int one;
284 
285 	one = 1;
286 	if(sunUint1Pack(a, ea, &a, &one) < 0) goto Err;
287 	if(sunStringPack(a, ea, &a, &x->host, 255) < 0) goto Err;
288 	if(sunStringPack(a, ea, &a, &x->path, 1024) < 0) goto Err;
289 	*pa = a;
290 	return 0;
291 Err:
292 	*pa = ea;
293 	return -1;
294 }
295 int
nfsMount3EntryUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3Entry * x)296 nfsMount3EntryUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3Entry *x)
297 {
298 	u1int one;
299 
300 	if(sunUint1Unpack(a, ea, &a, &one) < 0 || one != 1) goto Err;
301 	if(sunStringUnpack(a, ea, &a, &x->host, NfsMount3MaxNameSize) < 0) goto Err;
302 	if(sunStringUnpack(a, ea, &a, &x->path, NfsMount3MaxPathSize) < 0) goto Err;
303 	*pa = a;
304 	return 0;
305 Err:
306 	*pa = ea;
307 	return -1;
308 }
309 void
nfsMount3RDumpPrint(Fmt * fmt,NfsMount3RDump * x)310 nfsMount3RDumpPrint(Fmt *fmt, NfsMount3RDump *x)
311 {
312 	USED(x);
313 	fmtprint(fmt, "%s\n", "NfsMount3RDump");
314 }
315 uint
nfsMount3RDumpSize(NfsMount3RDump * x)316 nfsMount3RDumpSize(NfsMount3RDump *x)
317 {
318 	uint a;
319 	USED(x);
320 	a = 0;
321 	a += x->count;
322 	a += 4;
323 	return a;
324 }
325 int
nfsMount3RDumpPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RDump * x)326 nfsMount3RDumpPack(uchar *a, uchar *ea, uchar **pa, NfsMount3RDump *x)
327 {
328 	u1int zero;
329 
330 	zero = 0;
331 	if(a+x->count > ea) goto Err;
332 	memmove(a, x->data, x->count);
333 	a += x->count;
334 	if(sunUint1Pack(a, ea, &a, &zero) < 0)
335 		goto Err;
336 	*pa = a;
337 	return 0;
338 Err:
339 	*pa = ea;
340 	return -1;
341 }
342 int
nfsMount3RDumpUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RDump * x)343 nfsMount3RDumpUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RDump *x)
344 {
345 	int i;
346 	uchar *oa;
347 	u1int u1;
348 	u32int u32;
349 
350 	oa = a;
351 	for(i=0;; i++){
352 		if(sunUint1Unpack(a, ea, &a, &u1) < 0)
353 			goto Err;
354 		if(u1 == 0)
355 			break;
356 		if(sunUint32Unpack(a, ea, &a, &u32) < 0
357 		|| u32 > NfsMount3MaxNameSize
358 		|| (a+=u32) >= ea
359 		|| sunUint32Unpack(a, ea, &a, &u32) < 0
360 		|| u32 > NfsMount3MaxPathSize
361 		|| (a+=u32) >= ea)
362 			goto Err;
363 	}
364 	x->count = (a-4) - oa;
365 	x->data = oa;
366 	*pa = a;
367 	return 0;
368 Err:
369 	*pa = ea;
370 	return -1;
371 }
372 void
nfsMount3TUmntPrint(Fmt * fmt,NfsMount3TUmnt * x)373 nfsMount3TUmntPrint(Fmt *fmt, NfsMount3TUmnt *x)
374 {
375 	fmtprint(fmt, "%s\n", "NfsMount3TUmnt");
376 	fmtprint(fmt, "\t%s=", "path");
377 	fmtprint(fmt, "\"%s\"", x->path);
378 	fmtprint(fmt, "\n");
379 }
380 uint
nfsMount3TUmntSize(NfsMount3TUmnt * x)381 nfsMount3TUmntSize(NfsMount3TUmnt *x)
382 {
383 	uint a;
384 	USED(x);
385 	a = 0 + sunStringSize(x->path);
386 	return a;
387 }
388 int
nfsMount3TUmntPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3TUmnt * x)389 nfsMount3TUmntPack(uchar *a, uchar *ea, uchar **pa, NfsMount3TUmnt *x)
390 {
391 	if(sunStringPack(a, ea, &a, &x->path, 1024) < 0) goto Err;
392 	*pa = a;
393 	return 0;
394 Err:
395 	*pa = ea;
396 	return -1;
397 }
398 int
nfsMount3TUmntUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3TUmnt * x)399 nfsMount3TUmntUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TUmnt *x)
400 {
401 	if(sunStringUnpack(a, ea, &a, &x->path, 1024) < 0) goto Err;
402 	*pa = a;
403 	return 0;
404 Err:
405 	*pa = ea;
406 	return -1;
407 }
408 void
nfsMount3RUmntPrint(Fmt * fmt,NfsMount3RUmnt * x)409 nfsMount3RUmntPrint(Fmt *fmt, NfsMount3RUmnt *x)
410 {
411 	USED(x);
412 	fmtprint(fmt, "%s\n", "NfsMount3RUmnt");
413 }
414 uint
nfsMount3RUmntSize(NfsMount3RUmnt * x)415 nfsMount3RUmntSize(NfsMount3RUmnt *x)
416 {
417 	uint a;
418 	USED(x);
419 	a = 0;
420 	return a;
421 }
422 int
nfsMount3RUmntPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RUmnt * x)423 nfsMount3RUmntPack(uchar *a, uchar *ea, uchar **pa, NfsMount3RUmnt *x)
424 {
425 	USED(ea);
426 	USED(x);
427 	*pa = a;
428 	return 0;
429 }
430 int
nfsMount3RUmntUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RUmnt * x)431 nfsMount3RUmntUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RUmnt *x)
432 {
433 	USED(ea);
434 	USED(x);
435 	*pa = a;
436 	return 0;
437 }
438 void
nfsMount3TUmntallPrint(Fmt * fmt,NfsMount3TUmntall * x)439 nfsMount3TUmntallPrint(Fmt *fmt, NfsMount3TUmntall *x)
440 {
441 	USED(x);
442 	fmtprint(fmt, "%s\n", "NfsMount3TUmntall");
443 }
444 uint
nfsMount3TUmntallSize(NfsMount3TUmntall * x)445 nfsMount3TUmntallSize(NfsMount3TUmntall *x)
446 {
447 	uint a;
448 	USED(x);
449 	a = 0;
450 	return a;
451 }
452 int
nfsMount3TUmntallPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3TUmntall * x)453 nfsMount3TUmntallPack(uchar *a, uchar *ea, uchar **pa, NfsMount3TUmntall *x)
454 {
455 	USED(ea);
456 	USED(x);
457 	*pa = a;
458 	return 0;
459 }
460 int
nfsMount3TUmntallUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3TUmntall * x)461 nfsMount3TUmntallUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TUmntall *x)
462 {
463 	USED(ea);
464 	USED(x);
465 	*pa = a;
466 	return 0;
467 }
468 void
nfsMount3RUmntallPrint(Fmt * fmt,NfsMount3RUmntall * x)469 nfsMount3RUmntallPrint(Fmt *fmt, NfsMount3RUmntall *x)
470 {
471 	USED(x);
472 	fmtprint(fmt, "%s\n", "NfsMount3RUmntall");
473 }
474 uint
nfsMount3RUmntallSize(NfsMount3RUmntall * x)475 nfsMount3RUmntallSize(NfsMount3RUmntall *x)
476 {
477 	uint a;
478 	USED(x);
479 	a = 0;
480 	return a;
481 }
482 int
nfsMount3RUmntallPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RUmntall * x)483 nfsMount3RUmntallPack(uchar *a, uchar *ea, uchar **pa, NfsMount3RUmntall *x)
484 {
485 	USED(ea);
486 	USED(x);
487 	*pa = a;
488 	return 0;
489 }
490 int
nfsMount3RUmntallUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RUmntall * x)491 nfsMount3RUmntallUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RUmntall *x)
492 {
493 	USED(ea);
494 	USED(x);
495 	*pa = a;
496 	return 0;
497 }
498 void
nfsMount3TExportPrint(Fmt * fmt,NfsMount3TExport * x)499 nfsMount3TExportPrint(Fmt *fmt, NfsMount3TExport *x)
500 {
501 	USED(x);
502 	fmtprint(fmt, "%s\n", "NfsMount3TExport");
503 }
504 uint
nfsMount3TExportSize(NfsMount3TExport * x)505 nfsMount3TExportSize(NfsMount3TExport *x)
506 {
507 	uint a;
508 	USED(x);
509 	a = 0;
510 	return a;
511 }
512 int
nfsMount3TExportPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3TExport * x)513 nfsMount3TExportPack(uchar *a, uchar *ea, uchar **pa, NfsMount3TExport *x)
514 {
515 	USED(ea);
516 	USED(x);
517 	*pa = a;
518 	return 0;
519 }
520 int
nfsMount3TExportUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3TExport * x)521 nfsMount3TExportUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TExport *x)
522 {
523 	USED(ea);
524 	USED(x);
525 	*pa = a;
526 	return 0;
527 }
528 void
nfsMount3RExportPrint(Fmt * fmt,NfsMount3RExport * x)529 nfsMount3RExportPrint(Fmt *fmt, NfsMount3RExport *x)
530 {
531 	USED(x);
532 	fmtprint(fmt, "%s\n", "NfsMount3RExport");
533 	fmtprint(fmt, "\n");
534 }
535 uint
nfsMount3RExportSize(NfsMount3RExport * x)536 nfsMount3RExportSize(NfsMount3RExport *x)
537 {
538 	uint a;
539 	USED(x);
540 	a = 0;
541 	a += x->count;
542 	a += 4;	/* end of export list */
543 	return a;
544 }
545 int
nfsMount3RExportPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RExport * x)546 nfsMount3RExportPack(uchar *a, uchar *ea, uchar **pa, NfsMount3RExport *x)
547 {
548 	u1int zero;
549 
550 	zero = 0;
551 	if(a+x->count > ea) goto Err;
552 	memmove(a, x->data, x->count);
553 	a += x->count;
554 	if(sunUint1Pack(a, ea, &a, &zero) < 0)
555 		goto Err;
556 	*pa = a;
557 	return 0;
558 Err:
559 	*pa = ea;
560 	return -1;
561 }
562 int
nfsMount3RExportUnpack(uchar * a,uchar * ea,uchar ** pa,NfsMount3RExport * x)563 nfsMount3RExportUnpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RExport *x)
564 {
565 	int ng, ne;
566 	uchar *oa;
567 	u1int u1;
568 	u32int u32;
569 
570 	oa = a;
571 	ng = 0;
572 	for(ne=0;; ne++){
573 		if(sunUint1Unpack(a, ea, &a, &u1) < 0)
574 			goto Err;
575 		if(u1 == 0)
576 			break;
577 		if(sunUint32Unpack(a, ea, &a, &u32) < 0
578 		|| (a += (u32+3)&~3) >= ea)
579 			goto Err;
580 		for(;; ng++){
581 			if(sunUint1Unpack(a, ea, &a, &u1) < 0)
582 				goto Err;
583 			if(u1 == 0)
584 				break;
585 			if(sunUint32Unpack(a, ea, &a, &u32) < 0
586 			|| (a += (u32+3)&~3) >= ea)
587 				goto Err;
588 		}
589 	}
590 	x->data = oa;
591 	x->count = (a-4) - oa;
592 	*pa = a;
593 	return 0;
594 Err:
595 	*pa = ea;
596 	return -1;
597 }
598 uint
nfsMount3ExportGroupSize(uchar * a)599 nfsMount3ExportGroupSize(uchar *a)
600 {
601 	int ng;
602 	u1int have;
603 	u32int n;
604 
605 	a += 4;
606 	sunUint32Unpack(a, a+4, &a, &n);
607 	a += (n+3)&~3;
608 	ng = 0;
609 	for(;;){
610 		sunUint1Unpack(a, a+4, &a, &have);
611 		if(have == 0)
612 			break;
613 		ng++;
614 		sunUint32Unpack(a, a+4, &a, &n);
615 		a += (n+3)&~3;
616 	}
617 	return ng;
618 }
619 int
nfsMount3ExportUnpack(uchar * a,uchar * ea,uchar ** pa,char ** gp,char *** pgp,NfsMount3Export * x)620 nfsMount3ExportUnpack(uchar *a, uchar *ea, uchar **pa, char **gp, char ***pgp, NfsMount3Export *x)
621 {
622 	int ng;
623 	u1int u1;
624 
625 	if(sunUint1Unpack(a, ea, &a, &u1) < 0 || u1 != 1) goto Err;
626 	if(sunStringUnpack(a, ea, &a, &x->path, NfsMount3MaxPathSize) < 0) goto Err;
627 	x->g = gp;
628 	ng = 0;
629 	for(;;){
630 		if(sunUint1Unpack(a, ea, &a, &u1) < 0) goto Err;
631 		if(u1 == 0)
632 			break;
633 		if(sunStringUnpack(a, ea, &a, &gp[ng++], NfsMount3MaxNameSize) < 0) goto Err;
634 	}
635 	x->ng = ng;
636 	*pgp = gp+ng;
637 	*pa = a;
638 	return 0;
639 
640 Err:
641 	*pa = ea;
642 	return -1;
643 }
644 uint
nfsMount3ExportSize(NfsMount3Export * x)645 nfsMount3ExportSize(NfsMount3Export *x)
646 {
647 	int i;
648 	uint a;
649 
650 	a = 4 + sunStringSize(x->path);
651 	for(i=0; i<x->ng; i++)
652 		a += 4 + sunStringSize(x->g[i]);
653 	a += 4;
654 	return a;
655 }
656 int
nfsMount3ExportPack(uchar * a,uchar * ea,uchar ** pa,NfsMount3Export * x)657 nfsMount3ExportPack(uchar *a, uchar *ea, uchar **pa, NfsMount3Export *x)
658 {
659 	int i;
660 	u1int u1;
661 
662 	u1 = 1;
663 	if(sunUint1Pack(a, ea, &a, &u1) < 0) goto Err;
664 	if(sunStringPack(a, ea, &a, &x->path, NfsMount3MaxPathSize) < 0) goto Err;
665 	for(i=0; i<x->ng; i++){
666 		if(sunUint1Pack(a, ea, &a, &u1) < 0) goto Err;
667 		if(sunStringPack(a, ea, &a, &x->g[i], NfsMount3MaxNameSize) < 0) goto Err;
668 	}
669 	u1 = 0;
670 	if(sunUint1Pack(a, ea, &a, &u1) < 0) goto Err;
671 	*pa = a;
672 	return 0;
673 
674 Err:
675 	*pa = ea;
676 	return -1;
677 }
678 
679 typedef int (*P)(uchar*, uchar*, uchar**, SunCall*);
680 typedef void (*F)(Fmt*, SunCall*);
681 typedef uint (*S)(SunCall*);
682 
683 static SunProc proc3[] = {
684 	(P)nfsMount3TNullPack, (P)nfsMount3TNullUnpack, (S)nfsMount3TNullSize, (F)nfsMount3TNullPrint, sizeof(NfsMount3TNull),
685 	(P)nfsMount3RNullPack, (P)nfsMount3RNullUnpack, (S)nfsMount3RNullSize, (F)nfsMount3RNullPrint, sizeof(NfsMount3RNull),
686 	(P)nfsMount3TMntPack, (P)nfsMount3TMntUnpack, (S)nfsMount3TMntSize, (F)nfsMount3TMntPrint, sizeof(NfsMount3TMnt),
687 	(P)nfsMount3RMntPack, (P)nfsMount3RMntUnpack, (S)nfsMount3RMntSize, (F)nfsMount3RMntPrint, sizeof(NfsMount3RMnt),
688 	(P)nfsMount3TDumpPack, (P)nfsMount3TDumpUnpack, (S)nfsMount3TDumpSize, (F)nfsMount3TDumpPrint, sizeof(NfsMount3TDump),
689 	(P)nfsMount3RDumpPack, (P)nfsMount3RDumpUnpack, (S)nfsMount3RDumpSize, (F)nfsMount3RDumpPrint, sizeof(NfsMount3RDump),
690 	(P)nfsMount3TUmntPack, (P)nfsMount3TUmntUnpack, (S)nfsMount3TUmntSize, (F)nfsMount3TUmntPrint, sizeof(NfsMount3TUmnt),
691 	(P)nfsMount3RUmntPack, (P)nfsMount3RUmntUnpack, (S)nfsMount3RUmntSize, (F)nfsMount3RUmntPrint, sizeof(NfsMount3RUmnt),
692 	(P)nfsMount3TUmntallPack, (P)nfsMount3TUmntallUnpack, (S)nfsMount3TUmntallSize, (F)nfsMount3TUmntallPrint, sizeof(NfsMount3TUmntall),
693 	(P)nfsMount3RUmntallPack, (P)nfsMount3RUmntallUnpack, (S)nfsMount3RUmntallSize, (F)nfsMount3RUmntallPrint, sizeof(NfsMount3RUmntall),
694 	(P)nfsMount3TExportPack, (P)nfsMount3TExportUnpack, (S)nfsMount3TExportSize, (F)nfsMount3TExportPrint, sizeof(NfsMount3TExport),
695 	(P)nfsMount3RExportPack, (P)nfsMount3RExportUnpack, (S)nfsMount3RExportSize, (F)nfsMount3RExportPrint, sizeof(NfsMount3RExport),
696 };
697 
698 static SunProc proc1[] = {
699 	(P)nfsMount3TNullPack, (P)nfsMount3TNullUnpack, (S)nfsMount3TNullSize, (F)nfsMount3TNullPrint, sizeof(NfsMount3TNull),
700 	(P)nfsMount3RNullPack, (P)nfsMount3RNullUnpack, (S)nfsMount3RNullSize, (F)nfsMount3RNullPrint, sizeof(NfsMount3RNull),
701 	(P)nfsMount3TMntPack, (P)nfsMount3TMntUnpack, (S)nfsMount3TMntSize, (F)nfsMount3TMntPrint, sizeof(NfsMount3TMnt),
702 	(P)nfsMount1RMntPack, (P)nfsMount1RMntUnpack, (S)nfsMount1RMntSize, (F)nfsMount3RMntPrint, sizeof(NfsMount3RMnt),
703 	(P)nfsMount3TDumpPack, (P)nfsMount3TDumpUnpack, (S)nfsMount3TDumpSize, (F)nfsMount3TDumpPrint, sizeof(NfsMount3TDump),
704 	(P)nfsMount3RDumpPack, (P)nfsMount3RDumpUnpack, (S)nfsMount3RDumpSize, (F)nfsMount3RDumpPrint, sizeof(NfsMount3RDump),
705 	(P)nfsMount3TUmntPack, (P)nfsMount3TUmntUnpack, (S)nfsMount3TUmntSize, (F)nfsMount3TUmntPrint, sizeof(NfsMount3TUmnt),
706 	(P)nfsMount3RUmntPack, (P)nfsMount3RUmntUnpack, (S)nfsMount3RUmntSize, (F)nfsMount3RUmntPrint, sizeof(NfsMount3RUmnt),
707 	(P)nfsMount3TUmntallPack, (P)nfsMount3TUmntallUnpack, (S)nfsMount3TUmntallSize, (F)nfsMount3TUmntallPrint, sizeof(NfsMount3TUmntall),
708 	(P)nfsMount3RUmntallPack, (P)nfsMount3RUmntallUnpack, (S)nfsMount3RUmntallSize, (F)nfsMount3RUmntallPrint, sizeof(NfsMount3RUmntall),
709 	(P)nfsMount3TExportPack, (P)nfsMount3TExportUnpack, (S)nfsMount3TExportSize, (F)nfsMount3TExportPrint, sizeof(NfsMount3TExport),
710 	(P)nfsMount3RExportPack, (P)nfsMount3RExportUnpack, (S)nfsMount3RExportSize, (F)nfsMount3RExportPrint, sizeof(NfsMount3RExport),
711 };
712 
713 SunProg nfsMount3Prog =
714 {
715 	NfsMount3Program,
716 	NfsMount3Version,
717 	proc3,
718 	nelem(proc3),
719 };
720 
721 SunProg nfsMount1Prog =
722 {
723 	NfsMount1Program,
724 	NfsMount1Version,
725 	proc1,
726 	nelem(proc1),
727 };
728