Add sunrpc.
This commit is contained in:
parent
fa256eecfa
commit
551445b92c
16 changed files with 7163 additions and 0 deletions
498
src/libsunrpc/portmap.c
Normal file
498
src/libsunrpc/portmap.c
Normal file
|
|
@ -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),
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue