| #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), |
| }; |