/* * SUN NFSv3 Mounter. See RFC 1813 */ #include #include #include #include #include void nfsmount3tnullprint(Fmt *fmt, NfsMount3TNull *x) { USED(x); fmtprint(fmt, "%s\n", "NfsMount3TNull"); } uint nfsmount3tnullsize(NfsMount3TNull *x) { uint a; USED(x); a = 0; return a; } int nfsmount3tnullpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TNull *x) { USED(ea); USED(x); *pa = a; return 0; } int nfsmount3tnullunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TNull *x) { USED(ea); USED(x); *pa = a; return 0; } void nfsmount3rnullprint(Fmt *fmt, NfsMount3RNull *x) { USED(x); fmtprint(fmt, "%s\n", "NfsMount3RNull"); } uint nfsmount3rnullsize(NfsMount3RNull *x) { uint a; USED(x); a = 0; return a; } int nfsmount3rnullpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RNull *x) { USED(ea); USED(x); *pa = a; return 0; } int nfsmount3rnullunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RNull *x) { USED(ea); USED(x); *pa = a; return 0; } void nfsmount3tmntprint(Fmt *fmt, NfsMount3TMnt *x) { fmtprint(fmt, "%s\n", "NfsMount3TMnt"); fmtprint(fmt, "\t%s=", "path"); fmtprint(fmt, "\"%s\"", x->path); fmtprint(fmt, "\n"); } uint nfsmount3tmntsize(NfsMount3TMnt *x) { uint a; USED(x); a = 0 + sunstringsize(x->path); return a; } int nfsmount3tmntpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TMnt *x) { if(sunstringpack(a, ea, &a, &x->path, 1024) < 0) goto Err; *pa = a; return 0; Err: *pa = ea; return -1; } int nfsmount3tmntunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TMnt *x) { if(sunstringunpack(a, ea, &a, &x->path, 1024) < 0) goto Err; *pa = a; return 0; Err: *pa = ea; return -1; } void nfsmount3rmntprint(Fmt *fmt, NfsMount3RMnt *x) { fmtprint(fmt, "%s\n", "NfsMount3RMnt"); fmtprint(fmt, "\t%s=", "status"); fmtprint(fmt, "%ud", x->status); fmtprint(fmt, "\n"); switch(x->status){ case 0: fmtprint(fmt, "\t%s=", "handle"); fmtprint(fmt, "%.*H", x->len, x->handle); fmtprint(fmt, "\n"); break; } } uint nfsmount3rmntsize(NfsMount3RMnt *x) { uint a; USED(x); a = 0 + 4; switch(x->status){ case 0: a = a + sunvaropaquesize(x->len); a = a + 4 + 4 * x->nauth; break; } return a; } uint nfsmount1rmntsize(NfsMount3RMnt *x) { uint a; USED(x); a = 0 + 4; switch(x->status){ case 0: a = a + NfsMount1HandleSize; break; } return a; } int nfsmount3rmntpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RMnt *x) { int i; if(sunuint32pack(a, ea, &a, &x->status) < 0) goto Err; switch(x->status){ case 0: if(sunvaropaquepack(a, ea, &a, &x->handle, &x->len, NfsMount3MaxHandleSize) < 0) goto Err; if(sunuint32pack(a, ea, &a, &x->nauth) < 0) goto Err; for(i=0; inauth; i++) if(sunuint32pack(a, ea, &a, &x->auth[i]) < 0) goto Err; break; } *pa = a; return 0; Err: *pa = ea; return -1; } int nfsmount1rmntpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RMnt *x) { if(sunuint32pack(a, ea, &a, &x->status) < 0) goto Err; switch(x->status){ case 0: if(x->len != NfsMount1HandleSize) goto Err; if(sunfixedopaquepack(a, ea, &a, x->handle, NfsMount1HandleSize) < 0) goto Err; if(x->nauth != 0) goto Err; break; } *pa = a; return 0; Err: *pa = ea; return -1; } int nfsmount1rmntunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RMnt *x) { if(sunuint32unpack(a, ea, &a, &x->status) < 0) goto Err; switch(x->status){ case 0: x->len = NfsMount1HandleSize; x->nauth = 0; x->auth = 0; if(sunfixedopaqueunpack(a, ea, &a, x->handle, NfsMount1HandleSize) < 0) goto Err; if(x->nauth != 0) goto Err; break; } *pa = a; return 0; Err: *pa = ea; return -1; } int nfsmount3rmntunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RMnt *x) { int i; if(sunuint32unpack(a, ea, &a, &x->status) < 0) goto Err; switch(x->status){ case 0: if(sunvaropaqueunpack(a, ea, &a, &x->handle, &x->len, NfsMount3MaxHandleSize) < 0) goto Err; if(sunuint32unpack(a, ea, &a, &x->nauth) < 0) goto Err; x->auth = (u32int*)a; for(i=0; inauth; i++) if(sunuint32unpack(a, ea, &a, &x->auth[i]) < 0) goto Err; break; } *pa = a; return 0; Err: *pa = ea; return -1; } void nfsmount3tdumpprint(Fmt *fmt, NfsMount3TDump *x) { USED(x); fmtprint(fmt, "%s\n", "NfsMount3TDump"); } uint nfsmount3tdumpsize(NfsMount3TDump *x) { uint a; USED(x); a = 0; return a; } int nfsmount3tdumppack(uchar *a, uchar *ea, uchar **pa, NfsMount3TDump *x) { USED(ea); USED(x); *pa = a; return 0; } int nfsmount3tdumpunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TDump *x) { USED(ea); USED(x); *pa = a; return 0; } void nfsmount3entryprint(Fmt *fmt, NfsMount3Entry *x) { fmtprint(fmt, "%s\n", "NfsMount3Entry"); fmtprint(fmt, "\t%s=", "host"); fmtprint(fmt, "\"%s\"", x->host); fmtprint(fmt, "\n"); fmtprint(fmt, "\t%s=", "path"); fmtprint(fmt, "\"%s\"", x->path); fmtprint(fmt, "\n"); } uint nfsmount3entrysize(NfsMount3Entry *x) { uint a; USED(x); a = 0 + sunstringsize(x->host) + sunstringsize(x->path); return a; } int nfsmount3entrypack(uchar *a, uchar *ea, uchar **pa, NfsMount3Entry *x) { u1int one; one = 1; if(sunuint1pack(a, ea, &a, &one) < 0) goto Err; if(sunstringpack(a, ea, &a, &x->host, 255) < 0) goto Err; if(sunstringpack(a, ea, &a, &x->path, 1024) < 0) goto Err; *pa = a; return 0; Err: *pa = ea; return -1; } int nfsmount3entryunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3Entry *x) { u1int one; if(sunuint1unpack(a, ea, &a, &one) < 0 || one != 1) goto Err; if(sunstringunpack(a, ea, &a, &x->host, NfsMount3MaxNameSize) < 0) goto Err; if(sunstringunpack(a, ea, &a, &x->path, NfsMount3MaxPathSize) < 0) goto Err; *pa = a; return 0; Err: *pa = ea; return -1; } void nfsmount3rdumpprint(Fmt *fmt, NfsMount3RDump *x) { USED(x); fmtprint(fmt, "%s\n", "NfsMount3RDump"); } uint nfsmount3rdumpsize(NfsMount3RDump *x) { uint a; USED(x); a = 0; a += x->count; a += 4; return a; } int nfsmount3rdumppack(uchar *a, uchar *ea, uchar **pa, NfsMount3RDump *x) { u1int zero; zero = 0; if(a+x->count > ea) goto Err; memmove(a, x->data, x->count); a += x->count; if(sunuint1pack(a, ea, &a, &zero) < 0) goto Err; *pa = a; return 0; Err: *pa = ea; return -1; } int nfsmount3rdumpunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RDump *x) { int i; uchar *oa; u1int u1; u32int u32; oa = a; for(i=0;; i++){ if(sunuint1unpack(a, ea, &a, &u1) < 0) goto Err; if(u1 == 0) break; if(sunuint32unpack(a, ea, &a, &u32) < 0 || u32 > NfsMount3MaxNameSize || (a+=u32) >= ea || sunuint32unpack(a, ea, &a, &u32) < 0 || u32 > NfsMount3MaxPathSize || (a+=u32) >= ea) goto Err; } x->count = (a-4) - oa; x->data = oa; *pa = a; return 0; Err: *pa = ea; return -1; } void nfsmount3tumntprint(Fmt *fmt, NfsMount3TUmnt *x) { fmtprint(fmt, "%s\n", "NfsMount3TUmnt"); fmtprint(fmt, "\t%s=", "path"); fmtprint(fmt, "\"%s\"", x->path); fmtprint(fmt, "\n"); } uint nfsmount3tumntsize(NfsMount3TUmnt *x) { uint a; USED(x); a = 0 + sunstringsize(x->path); return a; } int nfsmount3tumntpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TUmnt *x) { if(sunstringpack(a, ea, &a, &x->path, 1024) < 0) goto Err; *pa = a; return 0; Err: *pa = ea; return -1; } int nfsmount3tumntunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TUmnt *x) { if(sunstringunpack(a, ea, &a, &x->path, 1024) < 0) goto Err; *pa = a; return 0; Err: *pa = ea; return -1; } void nfsmount3rumntprint(Fmt *fmt, NfsMount3RUmnt *x) { USED(x); fmtprint(fmt, "%s\n", "NfsMount3RUmnt"); } uint nfsmount3rumntsize(NfsMount3RUmnt *x) { uint a; USED(x); a = 0; return a; } int nfsmount3rumntpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RUmnt *x) { USED(ea); USED(x); *pa = a; return 0; } int nfsmount3rumntunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RUmnt *x) { USED(ea); USED(x); *pa = a; return 0; } void nfsmount3tumntallprint(Fmt *fmt, NfsMount3TUmntall *x) { USED(x); fmtprint(fmt, "%s\n", "NfsMount3TUmntall"); } uint nfsmount3tumntallsize(NfsMount3TUmntall *x) { uint a; USED(x); a = 0; return a; } int nfsmount3tumntallpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TUmntall *x) { USED(ea); USED(x); *pa = a; return 0; } int nfsmount3tumntallunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TUmntall *x) { USED(ea); USED(x); *pa = a; return 0; } void nfsmount3rumntallprint(Fmt *fmt, NfsMount3RUmntall *x) { USED(x); fmtprint(fmt, "%s\n", "NfsMount3RUmntall"); } uint nfsmount3rumntallsize(NfsMount3RUmntall *x) { uint a; USED(x); a = 0; return a; } int nfsmount3rumntallpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RUmntall *x) { USED(ea); USED(x); *pa = a; return 0; } int nfsmount3rumntallunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RUmntall *x) { USED(ea); USED(x); *pa = a; return 0; } void nfsmount3texportprint(Fmt *fmt, NfsMount3TExport *x) { USED(x); fmtprint(fmt, "%s\n", "NfsMount3TExport"); } uint nfsmount3texportsize(NfsMount3TExport *x) { uint a; USED(x); a = 0; return a; } int nfsmount3texportpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TExport *x) { USED(ea); USED(x); *pa = a; return 0; } int nfsmount3texportunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3TExport *x) { USED(ea); USED(x); *pa = a; return 0; } void nfsmount3rexportprint(Fmt *fmt, NfsMount3RExport *x) { USED(x); fmtprint(fmt, "%s\n", "NfsMount3RExport"); fmtprint(fmt, "\n"); } uint nfsmount3rexportsize(NfsMount3RExport *x) { uint a; USED(x); a = 0; a += x->count; a += 4; /* end of export list */ return a; } int nfsmount3rexportpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RExport *x) { u1int zero; zero = 0; if(a+x->count > ea) goto Err; memmove(a, x->data, x->count); a += x->count; if(sunuint1pack(a, ea, &a, &zero) < 0) goto Err; *pa = a; return 0; Err: *pa = ea; return -1; } int nfsmount3rexportunpack(uchar *a, uchar *ea, uchar **pa, NfsMount3RExport *x) { int ng, ne; uchar *oa; u1int u1; u32int u32; oa = a; ng = 0; for(ne=0;; ne++){ if(sunuint1unpack(a, ea, &a, &u1) < 0) goto Err; if(u1 == 0) break; if(sunuint32unpack(a, ea, &a, &u32) < 0 || (a += (u32+3)&~3) >= ea) goto Err; for(;; ng++){ if(sunuint1unpack(a, ea, &a, &u1) < 0) goto Err; if(u1 == 0) break; if(sunuint32unpack(a, ea, &a, &u32) < 0 || (a += (u32+3)&~3) >= ea) goto Err; } } x->data = oa; x->count = (a-4) - oa; *pa = a; return 0; Err: *pa = ea; return -1; } uint nfsmount3exportgroupsize(uchar *a) { int ng; u1int have; u32int n; a += 4; sunuint32unpack(a, a+4, &a, &n); a += (n+3)&~3; ng = 0; for(;;){ sunuint1unpack(a, a+4, &a, &have); if(have == 0) break; ng++; sunuint32unpack(a, a+4, &a, &n); a += (n+3)&~3; } return ng; } int nfsmount3exportunpack(uchar *a, uchar *ea, uchar **pa, char **gp, char ***pgp, NfsMount3Export *x) { int ng; u1int u1; if(sunuint1unpack(a, ea, &a, &u1) < 0 || u1 != 1) goto Err; if(sunstringunpack(a, ea, &a, &x->path, NfsMount3MaxPathSize) < 0) goto Err; x->g = gp; ng = 0; for(;;){ if(sunuint1unpack(a, ea, &a, &u1) < 0) goto Err; if(u1 == 0) break; if(sunstringunpack(a, ea, &a, &gp[ng++], NfsMount3MaxNameSize) < 0) goto Err; } x->ng = ng; *pgp = gp+ng; *pa = a; return 0; Err: *pa = ea; return -1; } uint nfsmount3exportsize(NfsMount3Export *x) { int i; uint a; a = 4 + sunstringsize(x->path); for(i=0; ing; i++) a += 4 + sunstringsize(x->g[i]); a += 4; return a; } int nfsmount3exportpack(uchar *a, uchar *ea, uchar **pa, NfsMount3Export *x) { int i; u1int u1; u1 = 1; if(sunuint1pack(a, ea, &a, &u1) < 0) goto Err; if(sunstringpack(a, ea, &a, &x->path, NfsMount3MaxPathSize) < 0) goto Err; for(i=0; ing; i++){ if(sunuint1pack(a, ea, &a, &u1) < 0) goto Err; if(sunstringpack(a, ea, &a, &x->g[i], NfsMount3MaxNameSize) < 0) goto Err; } u1 = 0; if(sunuint1pack(a, ea, &a, &u1) < 0) goto Err; *pa = a; return 0; Err: *pa = ea; return -1; } typedef int (*P)(uchar*, uchar*, uchar**, SunCall*); typedef void (*F)(Fmt*, SunCall*); typedef uint (*S)(SunCall*); static SunProc proc3[] = { (P)nfsmount3tnullpack, (P)nfsmount3tnullunpack, (S)nfsmount3tnullsize, (F)nfsmount3tnullprint, sizeof(NfsMount3TNull), (P)nfsmount3rnullpack, (P)nfsmount3rnullunpack, (S)nfsmount3rnullsize, (F)nfsmount3rnullprint, sizeof(NfsMount3RNull), (P)nfsmount3tmntpack, (P)nfsmount3tmntunpack, (S)nfsmount3tmntsize, (F)nfsmount3tmntprint, sizeof(NfsMount3TMnt), (P)nfsmount3rmntpack, (P)nfsmount3rmntunpack, (S)nfsmount3rmntsize, (F)nfsmount3rmntprint, sizeof(NfsMount3RMnt), (P)nfsmount3tdumppack, (P)nfsmount3tdumpunpack, (S)nfsmount3tdumpsize, (F)nfsmount3tdumpprint, sizeof(NfsMount3TDump), (P)nfsmount3rdumppack, (P)nfsmount3rdumpunpack, (S)nfsmount3rdumpsize, (F)nfsmount3rdumpprint, sizeof(NfsMount3RDump), (P)nfsmount3tumntpack, (P)nfsmount3tumntunpack, (S)nfsmount3tumntsize, (F)nfsmount3tumntprint, sizeof(NfsMount3TUmnt), (P)nfsmount3rumntpack, (P)nfsmount3rumntunpack, (S)nfsmount3rumntsize, (F)nfsmount3rumntprint, sizeof(NfsMount3RUmnt), (P)nfsmount3tumntallpack, (P)nfsmount3tumntallunpack, (S)nfsmount3tumntallsize, (F)nfsmount3tumntallprint, sizeof(NfsMount3TUmntall), (P)nfsmount3rumntallpack, (P)nfsmount3rumntallunpack, (S)nfsmount3rumntallsize, (F)nfsmount3rumntallprint, sizeof(NfsMount3RUmntall), (P)nfsmount3texportpack, (P)nfsmount3texportunpack, (S)nfsmount3texportsize, (F)nfsmount3texportprint, sizeof(NfsMount3TExport), (P)nfsmount3rexportpack, (P)nfsmount3rexportunpack, (S)nfsmount3rexportsize, (F)nfsmount3rexportprint, sizeof(NfsMount3RExport), }; static SunProc proc1[] = { (P)nfsmount3tnullpack, (P)nfsmount3tnullunpack, (S)nfsmount3tnullsize, (F)nfsmount3tnullprint, sizeof(NfsMount3TNull), (P)nfsmount3rnullpack, (P)nfsmount3rnullunpack, (S)nfsmount3rnullsize, (F)nfsmount3rnullprint, sizeof(NfsMount3RNull), (P)nfsmount3tmntpack, (P)nfsmount3tmntunpack, (S)nfsmount3tmntsize, (F)nfsmount3tmntprint, sizeof(NfsMount3TMnt), (P)nfsmount1rmntpack, (P)nfsmount1rmntunpack, (S)nfsmount1rmntsize, (F)nfsmount3rmntprint, sizeof(NfsMount3RMnt), (P)nfsmount3tdumppack, (P)nfsmount3tdumpunpack, (S)nfsmount3tdumpsize, (F)nfsmount3tdumpprint, sizeof(NfsMount3TDump), (P)nfsmount3rdumppack, (P)nfsmount3rdumpunpack, (S)nfsmount3rdumpsize, (F)nfsmount3rdumpprint, sizeof(NfsMount3RDump), (P)nfsmount3tumntpack, (P)nfsmount3tumntunpack, (S)nfsmount3tumntsize, (F)nfsmount3tumntprint, sizeof(NfsMount3TUmnt), (P)nfsmount3rumntpack, (P)nfsmount3rumntunpack, (S)nfsmount3rumntsize, (F)nfsmount3rumntprint, sizeof(NfsMount3RUmnt), (P)nfsmount3tumntallpack, (P)nfsmount3tumntallunpack, (S)nfsmount3tumntallsize, (F)nfsmount3tumntallprint, sizeof(NfsMount3TUmntall), (P)nfsmount3rumntallpack, (P)nfsmount3rumntallunpack, (S)nfsmount3rumntallsize, (F)nfsmount3rumntallprint, sizeof(NfsMount3RUmntall), (P)nfsmount3texportpack, (P)nfsmount3texportunpack, (S)nfsmount3texportsize, (F)nfsmount3texportprint, sizeof(NfsMount3TExport), (P)nfsmount3rexportpack, (P)nfsmount3rexportunpack, (S)nfsmount3rexportsize, (F)nfsmount3rexportprint, sizeof(NfsMount3RExport), }; SunProg nfsmount3prog = { NfsMount3Program, NfsMount3Version, proc3, nelem(proc3), }; SunProg nfsmount1prog = { NfsMount1Program, NfsMount1Version, proc1, nelem(proc1), };