diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aux/portmap.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aux/portmap.c')
-rwxr-xr-x | sys/src/cmd/aux/portmap.c | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/sys/src/cmd/aux/portmap.c b/sys/src/cmd/aux/portmap.c new file mode 100755 index 000000000..372b14540 --- /dev/null +++ b/sys/src/cmd/aux/portmap.c @@ -0,0 +1,204 @@ +/* Copyright © 2003 Russ Cox, MIT; see /sys/src/libsunrpc/COPYING */ +#include <u.h> +#include <libc.h> +#include <thread.h> +#include <sunrpc.h> + +int chatty; +SunClient *client; + +void +usage(void) +{ + fprint(2, "usage: portmap address [cmd]\n" + "cmd is one of:\n" + "\tnull\n" + "\tset prog vers proto port\n" + "\tunset prog vers proto port\n" + "\tgetport prog vers proto\n" + "\tdump (default)\n"); + threadexitsall("usage"); +} + +void +portCall(SunCall *c, PortCallType type) +{ + c->rpc.prog = PortProgram; + c->rpc.vers = PortVersion; + c->rpc.proc = type>>1; + c->rpc.iscall = !(type&1); + c->type = type; +} + +void +tnull(char **argv) +{ + PortTNull tx; + PortRNull rx; + + USED(argv); + + memset(&tx, 0, sizeof tx); + portCall(&tx.call, PortCallTNull); + + memset(&rx, 0, sizeof rx); + portCall(&rx.call, PortCallRNull); + + if(sunClientRpc(client, 0, &tx.call, &rx.call, nil) < 0) + sysfatal("rpc: %r"); +} + +void +tset(char **argv) +{ + PortTSet tx; + PortRSet rx; + + memset(&tx, 0, sizeof tx); + portCall(&tx.call, PortCallTSet); + tx.map.prog = strtol(argv[0], 0, 0); + tx.map.vers = strtol(argv[1], 0, 0); + tx.map.prot = strtol(argv[2], 0, 0); + tx.map.port = strtol(argv[3], 0, 0); + + memset(&rx, 0, sizeof rx); + portCall(&rx.call, PortCallRSet); + + if(sunClientRpc(client, 0, &tx.call, &rx.call, nil) < 0) + sysfatal("rpc: %r"); + + if(rx.b == 0) + print("rejected\n"); +} + +void +tunset(char **argv) +{ + PortTUnset tx; + PortRUnset rx; + + memset(&tx, 0, sizeof tx); + portCall(&tx.call, PortCallTUnset); + tx.map.prog = strtol(argv[0], 0, 0); + tx.map.vers = strtol(argv[1], 0, 0); + tx.map.prot = strtol(argv[2], 0, 0); + tx.map.port = strtol(argv[3], 0, 0); + + memset(&rx, 0, sizeof rx); + portCall(&rx.call, PortCallRUnset); + + if(sunClientRpc(client, 0, &tx.call, &rx.call, nil) < 0) + sysfatal("rpc: %r"); + + if(rx.b == 0) + print("rejected\n"); +} + +void +tgetport(char **argv) +{ + PortTGetport tx; + PortRGetport rx; + + memset(&tx, 0, sizeof tx); + portCall(&tx.call, PortCallTGetport); + tx.map.prog = strtol(argv[0], 0, 0); + tx.map.vers = strtol(argv[1], 0, 0); + tx.map.prot = strtol(argv[2], 0, 0); + + memset(&rx, 0, sizeof rx); + portCall(&rx.call, PortCallRGetport); + + if(sunClientRpc(client, 0, &tx.call, &rx.call, nil) < 0) + sysfatal("rpc: %r"); + + print("%d\n", rx.port); +} + +void +tdump(char **argv) +{ + int i; + uchar *p; + PortTDump tx; + PortRDump rx; + PortMap *m; + + USED(argv); + + memset(&tx, 0, sizeof tx); + portCall(&tx.call, PortCallTDump); + + memset(&rx, 0, sizeof rx); + portCall(&rx.call, PortCallRDump); + + if(sunClientRpc(client, 0, &tx.call, &rx.call, &p) < 0) + sysfatal("rpc: %r"); + + for(i=0, m=rx.map; i<rx.nmap; i++, m++) + print("%ud %ud %ud %ud\n", (uint)m->prog, (uint)m->vers, (uint)m->prot, (uint)m->port); + + free(p); +} + +static struct { + char *cmd; + int narg; + void (*fn)(char**); +} tab[] = { + "null", 0, tnull, + "set", 4, tset, + "unset", 4, tunset, + "getport", 3, tgetport, + "dump", 0, tdump, +}; + +void +threadmain(int argc, char **argv) +{ + char *dflt[] = { "dump", }; + char *addr, *cmd; + int i; + + ARGBEGIN{ + case 'R': + chatty++; + break; + }ARGEND + + if(argc < 1) + usage(); + + fmtinstall('B', sunRpcFmt); + fmtinstall('C', sunCallFmt); + fmtinstall('H', encodefmt); + sunFmtInstall(&portProg); + + addr = netmkaddr(argv[0], "udp", "portmap"); + if((client = sunDial(addr)) == nil) + sysfatal("dial %s: %r", addr); + + client->chatty = chatty; + sunClientProg(client, &portProg); + + argv++; + argc--; + + if(argc == 0){ + argc = 1; + argv = dflt; + } + cmd = argv[0]; + argv++; + argc--; + + for(i=0; i<nelem(tab); i++){ + if(strcmp(tab[i].cmd, cmd) == 0){ + if(tab[i].narg != argc) + usage(); + (*tab[i].fn)(argv); + threadexitsall(nil); + } + } + usage(); +} |