]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libsunrpc/mount3.c
mtx: fix pci access routines (see changeset 8012:78891f472fbf)
[plan9front.git] / sys / src / libsunrpc / mount3.c
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
12 nfsMount3TNullPrint(Fmt *fmt, NfsMount3TNull *x)
13 {
14         USED(x);
15         fmtprint(fmt, "%s\n", "NfsMount3TNull");
16 }
17 uint
18 nfsMount3TNullSize(NfsMount3TNull *x)
19 {
20         uint a;
21         USED(x);
22         a = 0;
23         return a;
24 }
25 int
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
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
42 nfsMount3RNullPrint(Fmt *fmt, NfsMount3RNull *x)
43 {
44         USED(x);
45         fmtprint(fmt, "%s\n", "NfsMount3RNull");
46 }
47 uint
48 nfsMount3RNullSize(NfsMount3RNull *x)
49 {
50         uint a;
51         USED(x);
52         a = 0;
53         return a;
54 }
55 int
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
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
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
80 nfsMount3TMntSize(NfsMount3TMnt *x)
81 {
82         uint a;
83         USED(x);
84         a = 0 + sunStringSize(x->path);
85         return a;
86 }
87 int
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
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
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
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
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
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
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
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
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
232 nfsMount3TDumpPrint(Fmt *fmt, NfsMount3TDump *x)
233 {
234         USED(x);
235         fmtprint(fmt, "%s\n", "NfsMount3TDump");
236 }
237 uint
238 nfsMount3TDumpSize(NfsMount3TDump *x)
239 {
240         uint a;
241         USED(x);
242         a = 0;
243         return a;
244 }
245 int
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
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
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
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
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
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
310 nfsMount3RDumpPrint(Fmt *fmt, NfsMount3RDump *x)
311 {
312         USED(x);
313         fmtprint(fmt, "%s\n", "NfsMount3RDump");
314 }
315 uint
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
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
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
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
381 nfsMount3TUmntSize(NfsMount3TUmnt *x)
382 {
383         uint a;
384         USED(x);
385         a = 0 + sunStringSize(x->path);
386         return a;
387 }
388 int
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
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
409 nfsMount3RUmntPrint(Fmt *fmt, NfsMount3RUmnt *x)
410 {
411         USED(x);
412         fmtprint(fmt, "%s\n", "NfsMount3RUmnt");
413 }
414 uint
415 nfsMount3RUmntSize(NfsMount3RUmnt *x)
416 {
417         uint a;
418         USED(x);
419         a = 0;
420         return a;
421 }
422 int
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
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
439 nfsMount3TUmntallPrint(Fmt *fmt, NfsMount3TUmntall *x)
440 {
441         USED(x);
442         fmtprint(fmt, "%s\n", "NfsMount3TUmntall");
443 }
444 uint
445 nfsMount3TUmntallSize(NfsMount3TUmntall *x)
446 {
447         uint a;
448         USED(x);
449         a = 0;
450         return a;
451 }
452 int
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
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
469 nfsMount3RUmntallPrint(Fmt *fmt, NfsMount3RUmntall *x)
470 {
471         USED(x);
472         fmtprint(fmt, "%s\n", "NfsMount3RUmntall");
473 }
474 uint
475 nfsMount3RUmntallSize(NfsMount3RUmntall *x)
476 {
477         uint a;
478         USED(x);
479         a = 0;
480         return a;
481 }
482 int
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
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
499 nfsMount3TExportPrint(Fmt *fmt, NfsMount3TExport *x)
500 {
501         USED(x);
502         fmtprint(fmt, "%s\n", "NfsMount3TExport");
503 }
504 uint
505 nfsMount3TExportSize(NfsMount3TExport *x)
506 {
507         uint a;
508         USED(x);
509         a = 0;
510         return a;
511 }
512 int
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
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
529 nfsMount3RExportPrint(Fmt *fmt, NfsMount3RExport *x)
530 {
531         USED(x);
532         fmtprint(fmt, "%s\n", "NfsMount3RExport");
533         fmtprint(fmt, "\n");
534 }
535 uint
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
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
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
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
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
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
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 };