aboutsummaryrefslogtreecommitdiff
path: root/src/libsunrpc/portmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libsunrpc/portmap.c')
-rw-r--r--src/libsunrpc/portmap.c498
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),
+};