|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <thread.h> | 
|  | #include <sunrpc.h> | 
|  |  | 
|  | static void | 
|  | portMapPrint(Fmt *fmt, PortMap *x) | 
|  | { | 
|  | fmtprint(fmt, "[%ud %ud %ud %ud]", x->prog, x->vers, x->prot, x->port); | 
|  | } | 
|  | static uint | 
|  | portMapSize(PortMap *x) | 
|  | { | 
|  | uint a; | 
|  | USED(x); | 
|  | a = 0 + 4 + 4 + 4 + 4; | 
|  | return a; | 
|  | } | 
|  | static int | 
|  | portMapPack(uchar *a, uchar *ea, uchar **pa, PortMap *x) | 
|  | { | 
|  | if(sunuint32pack(a, ea, &a, &x->prog) < 0) goto Err; | 
|  | if(sunuint32pack(a, ea, &a, &x->vers) < 0) goto Err; | 
|  | if(sunuint32pack(a, ea, &a, &x->prot) < 0) goto Err; | 
|  | if(sunuint32pack(a, ea, &a, &x->port) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static int | 
|  | portMapUnpack(uchar *a, uchar *ea, uchar **pa, PortMap *x) | 
|  | { | 
|  | if(sunuint32unpack(a, ea, &a, &x->prog) < 0) goto Err; | 
|  | if(sunuint32unpack(a, ea, &a, &x->vers) < 0) goto Err; | 
|  | if(sunuint32unpack(a, ea, &a, &x->prot) < 0) goto Err; | 
|  | if(sunuint32unpack(a, ea, &a, &x->port) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static void | 
|  | portTNullPrint(Fmt *fmt, PortTNull *x) | 
|  | { | 
|  | USED(x); | 
|  | fmtprint(fmt, "%s", "PortTNull"); | 
|  | } | 
|  | static uint | 
|  | portTNullSize(PortTNull *x) | 
|  | { | 
|  | uint a; | 
|  | USED(x); | 
|  | a = 0; | 
|  | return a; | 
|  | } | 
|  | static int | 
|  | portTNullPack(uchar *a, uchar *ea, uchar **pa, PortTNull *x) | 
|  | { | 
|  | USED(ea); | 
|  | USED(x); | 
|  | *pa = a; | 
|  | return 0; | 
|  | } | 
|  | static int | 
|  | portTNullUnpack(uchar *a, uchar *ea, uchar **pa, PortTNull *x) | 
|  | { | 
|  | USED(ea); | 
|  | USED(x); | 
|  | *pa = a; | 
|  | return 0; | 
|  | } | 
|  | static void | 
|  | portRNullPrint(Fmt *fmt, PortRNull *x) | 
|  | { | 
|  | USED(x); | 
|  | fmtprint(fmt, "%s", "PortRNull"); | 
|  | } | 
|  | static uint | 
|  | portRNullSize(PortRNull *x) | 
|  | { | 
|  | uint a; | 
|  | USED(x); | 
|  | a = 0; | 
|  | return a; | 
|  | } | 
|  | static int | 
|  | portRNullPack(uchar *a, uchar *ea, uchar **pa, PortRNull *x) | 
|  | { | 
|  | USED(ea); | 
|  | USED(x); | 
|  | *pa = a; | 
|  | return 0; | 
|  | } | 
|  | static int | 
|  | portRNullUnpack(uchar *a, uchar *ea, uchar **pa, PortRNull *x) | 
|  | { | 
|  | USED(ea); | 
|  | USED(x); | 
|  | *pa = a; | 
|  | return 0; | 
|  | } | 
|  | static void | 
|  | portTSetPrint(Fmt *fmt, PortTSet *x) | 
|  | { | 
|  | fmtprint(fmt, "PortTSet "); | 
|  | portMapPrint(fmt, &x->map); | 
|  | } | 
|  | static uint | 
|  | portTSetSize(PortTSet *x) | 
|  | { | 
|  | uint a; | 
|  | USED(x); | 
|  | a = 0 + portMapSize(&x->map); | 
|  | return a; | 
|  | } | 
|  | static int | 
|  | portTSetPack(uchar *a, uchar *ea, uchar **pa, PortTSet *x) | 
|  | { | 
|  | if(portMapPack(a, ea, &a, &x->map) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static int | 
|  | portTSetUnpack(uchar *a, uchar *ea, uchar **pa, PortTSet *x) | 
|  | { | 
|  | if(portMapUnpack(a, ea, &a, &x->map) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static void | 
|  | portRSetPrint(Fmt *fmt, PortRSet *x) | 
|  | { | 
|  | fmtprint(fmt, "PortRSet %ud", x->b); | 
|  | } | 
|  | static uint | 
|  | portRSetSize(PortRSet *x) | 
|  | { | 
|  | uint a; | 
|  | USED(x); | 
|  | a = 0 + 4; | 
|  | return a; | 
|  | } | 
|  | static int | 
|  | portRSetPack(uchar *a, uchar *ea, uchar **pa, PortRSet *x) | 
|  | { | 
|  | if(sunuint1pack(a, ea, &a, &x->b) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static int | 
|  | portRSetUnpack(uchar *a, uchar *ea, uchar **pa, PortRSet *x) | 
|  | { | 
|  | if(sunuint1unpack(a, ea, &a, &x->b) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static void | 
|  | portTUnsetPrint(Fmt *fmt, PortTUnset *x) | 
|  | { | 
|  | fmtprint(fmt, "PortTUnset "); | 
|  | portMapPrint(fmt, &x->map); | 
|  | } | 
|  | static uint | 
|  | portTUnsetSize(PortTUnset *x) | 
|  | { | 
|  | uint a; | 
|  | USED(x); | 
|  | a = 0 + portMapSize(&x->map); | 
|  | return a; | 
|  | } | 
|  | static int | 
|  | portTUnsetPack(uchar *a, uchar *ea, uchar **pa, PortTUnset *x) | 
|  | { | 
|  | if(portMapPack(a, ea, &a, &x->map) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static int | 
|  | portTUnsetUnpack(uchar *a, uchar *ea, uchar **pa, PortTUnset *x) | 
|  | { | 
|  | if(portMapUnpack(a, ea, &a, &x->map) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static void | 
|  | portRUnsetPrint(Fmt *fmt, PortRUnset *x) | 
|  | { | 
|  | fmtprint(fmt, "PortRUnset %ud", x->b); | 
|  | } | 
|  | static uint | 
|  | portRUnsetSize(PortRUnset *x) | 
|  | { | 
|  | uint a; | 
|  | USED(x); | 
|  | a = 0 + 4; | 
|  | return a; | 
|  | } | 
|  | static int | 
|  | portRUnsetPack(uchar *a, uchar *ea, uchar **pa, PortRUnset *x) | 
|  | { | 
|  | if(sunuint1pack(a, ea, &a, &x->b) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static int | 
|  | portRUnsetUnpack(uchar *a, uchar *ea, uchar **pa, PortRUnset *x) | 
|  | { | 
|  | if(sunuint1unpack(a, ea, &a, &x->b) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static void | 
|  | portTGetportPrint(Fmt *fmt, PortTGetport *x) | 
|  | { | 
|  | fmtprint(fmt, "PortTGetport "); | 
|  | portMapPrint(fmt, &x->map); | 
|  | } | 
|  | static uint | 
|  | portTGetportSize(PortTGetport *x) | 
|  | { | 
|  | uint a; | 
|  | USED(x); | 
|  | a = 0 + portMapSize(&x->map); | 
|  | return a; | 
|  | } | 
|  | static int | 
|  | portTGetportPack(uchar *a, uchar *ea, uchar **pa, PortTGetport *x) | 
|  | { | 
|  | if(portMapPack(a, ea, &a, &x->map) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static int | 
|  | portTGetportUnpack(uchar *a, uchar *ea, uchar **pa, PortTGetport *x) | 
|  | { | 
|  | if(portMapUnpack(a, ea, &a, &x->map) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static void | 
|  | portRGetportPrint(Fmt *fmt, PortRGetport *x) | 
|  | { | 
|  | fmtprint(fmt, "PortRGetport %ud", x->port); | 
|  | } | 
|  | static uint | 
|  | portRGetportSize(PortRGetport *x) | 
|  | { | 
|  | uint a; | 
|  | USED(x); | 
|  | a = 0 + 4; | 
|  | return a; | 
|  | } | 
|  | static int | 
|  | portRGetportPack(uchar *a, uchar *ea, uchar **pa, PortRGetport *x) | 
|  | { | 
|  | if(sunuint32pack(a, ea, &a, &x->port) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static int | 
|  | portRGetportUnpack(uchar *a, uchar *ea, uchar **pa, PortRGetport *x) | 
|  | { | 
|  | if(sunuint32unpack(a, ea, &a, &x->port) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static void | 
|  | portTDumpPrint(Fmt *fmt, PortTDump *x) | 
|  | { | 
|  | USED(x); | 
|  | fmtprint(fmt, "PortTDump"); | 
|  | } | 
|  | static uint | 
|  | portTDumpSize(PortTDump *x) | 
|  | { | 
|  | uint a; | 
|  | USED(x); | 
|  | a = 0; | 
|  | return a; | 
|  | } | 
|  | static int | 
|  | portTDumpPack(uchar *a, uchar *ea, uchar **pa, PortTDump *x) | 
|  | { | 
|  | USED(ea); | 
|  | USED(x); | 
|  | *pa = a; | 
|  | return 0; | 
|  | } | 
|  | static int | 
|  | portTDumpUnpack(uchar *a, uchar *ea, uchar **pa, PortTDump *x) | 
|  | { | 
|  | USED(ea); | 
|  | USED(x); | 
|  | *pa = a; | 
|  | return 0; | 
|  | } | 
|  | static void | 
|  | portRDumpPrint(Fmt *fmt, PortRDump *x) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | fmtprint(fmt, "PortRDump"); | 
|  | for(i=0; i<x->nmap; i++){ | 
|  | fmtprint(fmt, " "); | 
|  | portMapPrint(fmt, &x->map[i]); | 
|  | } | 
|  | } | 
|  | static uint | 
|  | portRDumpSize(PortRDump *x) | 
|  | { | 
|  | return (5*4*x->nmap) + 4; | 
|  | } | 
|  | static int | 
|  | portRDumpPack(uchar *a, uchar *ea, uchar **pa, PortRDump *x) | 
|  | { | 
|  | int i; | 
|  | u32int zero, one; | 
|  |  | 
|  | zero = 0; | 
|  | one = 1; | 
|  | for(i=0; i<x->nmap; i++){ | 
|  | if(sunuint32pack(a, ea, &a, &one) < 0 | 
|  | || portMapPack(a, ea, &a, &x->map[i]) < 0) | 
|  | goto Err; | 
|  | } | 
|  | if(sunuint32pack(a, ea, &a, &zero) < 0) | 
|  | goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static int | 
|  | portRDumpUnpack(uchar *a, uchar *ea, uchar **pa, PortRDump *x) | 
|  | { | 
|  | int i; | 
|  | u1int u1; | 
|  | PortMap *m; | 
|  |  | 
|  | m = (PortMap*)a; | 
|  | for(i=0;; i++){ | 
|  | if(sunuint1unpack(a, ea, &a, &u1) < 0) | 
|  | goto Err; | 
|  | if(u1 == 0) | 
|  | break; | 
|  | if(portMapUnpack(a, ea, &a, &m[i]) < 0) | 
|  | goto Err; | 
|  | } | 
|  | x->nmap = i; | 
|  | x->map = m; | 
|  | *pa = a; | 
|  | return 0; | 
|  |  | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static void | 
|  | portTCallitPrint(Fmt *fmt, PortTCallit *x) | 
|  | { | 
|  | fmtprint(fmt, "PortTCallit [%ud,%ud,%ud] %ud", x->prog, x->vers, x->proc, x->count); | 
|  | } | 
|  | static uint | 
|  | portTCallitSize(PortTCallit *x) | 
|  | { | 
|  | uint a; | 
|  | USED(x); | 
|  | a = 0 + 4 + 4 + 4 + sunvaropaquesize(x->count); | 
|  | return a; | 
|  | } | 
|  | static int | 
|  | portTCallitPack(uchar *a, uchar *ea, uchar **pa, PortTCallit *x) | 
|  | { | 
|  | if(sunuint32pack(a, ea, &a, &x->prog) < 0) goto Err; | 
|  | if(sunuint32pack(a, ea, &a, &x->vers) < 0) goto Err; | 
|  | if(sunuint32pack(a, ea, &a, &x->proc) < 0) goto Err; | 
|  | if(sunvaropaquepack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static int | 
|  | portTCallitUnpack(uchar *a, uchar *ea, uchar **pa, PortTCallit *x) | 
|  | { | 
|  | if(sunuint32unpack(a, ea, &a, &x->prog) < 0) goto Err; | 
|  | if(sunuint32unpack(a, ea, &a, &x->vers) < 0) goto Err; | 
|  | if(sunuint32unpack(a, ea, &a, &x->proc) < 0) goto Err; | 
|  | if(sunvaropaqueunpack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static void | 
|  | portRCallitPrint(Fmt *fmt, PortRCallit *x) | 
|  | { | 
|  | fmtprint(fmt, "PortRCallit %ud %ud", x->port, x->count); | 
|  | } | 
|  | static uint | 
|  | portRCallitSize(PortRCallit *x) | 
|  | { | 
|  | uint a; | 
|  | USED(x); | 
|  | a = 0 + 4 + sunvaropaquesize(x->count); | 
|  | return a; | 
|  | } | 
|  | static int | 
|  | portRCallitPack(uchar *a, uchar *ea, uchar **pa, PortRCallit *x) | 
|  | { | 
|  | if(sunuint32pack(a, ea, &a, &x->port) < 0) goto Err; | 
|  | if(sunvaropaquepack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err; | 
|  | *pa = a; | 
|  | return 0; | 
|  | Err: | 
|  | *pa = ea; | 
|  | return -1; | 
|  | } | 
|  | static int | 
|  | portRCallitUnpack(uchar *a, uchar *ea, uchar **pa, PortRCallit *x) | 
|  | { | 
|  | if(sunuint32unpack(a, ea, &a, &x->port) < 0) goto Err; | 
|  | if(sunvaropaqueunpack(a, ea, &a, &x->data, &x->count, -1) < 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 proc[] = { | 
|  | (P)portTNullPack, (P)portTNullUnpack, (S)portTNullSize, (F)portTNullPrint, sizeof(PortTNull), | 
|  | (P)portRNullPack, (P)portRNullUnpack, (S)portRNullSize, (F)portRNullPrint, sizeof(PortRNull), | 
|  | (P)portTSetPack, (P)portTSetUnpack, (S)portTSetSize, (F)portTSetPrint, sizeof(PortTSet), | 
|  | (P)portRSetPack, (P)portRSetUnpack, (S)portRSetSize, (F)portRSetPrint, sizeof(PortRSet), | 
|  | (P)portTUnsetPack, (P)portTUnsetUnpack, (S)portTUnsetSize, (F)portTUnsetPrint, sizeof(PortTUnset), | 
|  | (P)portRUnsetPack, (P)portRUnsetUnpack, (S)portRUnsetSize, (F)portRUnsetPrint, sizeof(PortRUnset), | 
|  | (P)portTGetportPack, (P)portTGetportUnpack, (S)portTGetportSize, (F)portTGetportPrint, sizeof(PortTGetport), | 
|  | (P)portRGetportPack, (P)portRGetportUnpack, (S)portRGetportSize, (F)portRGetportPrint, sizeof(PortRGetport), | 
|  | (P)portTDumpPack, (P)portTDumpUnpack, (S)portTDumpSize, (F)portTDumpPrint, sizeof(PortTDump), | 
|  | (P)portRDumpPack, (P)portRDumpUnpack, (S)portRDumpSize, (F)portRDumpPrint, sizeof(PortRDump), | 
|  | (P)portTCallitPack, (P)portTCallitUnpack, (S)portTCallitSize, (F)portTCallitPrint, sizeof(PortTCallit), | 
|  | (P)portRCallitPack, (P)portRCallitUnpack, (S)portRCallitSize, (F)portRCallitPrint, sizeof(PortRCallit), | 
|  | }; | 
|  |  | 
|  | SunProg portprog = | 
|  | { | 
|  | PortProgram, | 
|  | PortVersion, | 
|  | proc, | 
|  | nelem(proc), | 
|  | }; |