diff options
Diffstat (limited to 'src/libsunrpc/portmap.c')
-rw-r--r-- | src/libsunrpc/portmap.c | 498 |
1 files changed, 498 insertions, 0 deletions
diff --git a/src/libsunrpc/portmap.c b/src/libsunrpc/portmap.c new file mode 100644 index 00000000..4a3069dd --- /dev/null +++ b/src/libsunrpc/portmap.c @@ -0,0 +1,498 @@ +#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), +}; |