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/9nfs/portmapper.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/9nfs/portmapper.c')
-rwxr-xr-x | sys/src/cmd/9nfs/portmapper.c | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/sys/src/cmd/9nfs/portmapper.c b/sys/src/cmd/9nfs/portmapper.c new file mode 100755 index 000000000..ef3d7cfdd --- /dev/null +++ b/sys/src/cmd/9nfs/portmapper.c @@ -0,0 +1,172 @@ +/* + * sunrpc portmapper + */ +#include "all.h" + +typedef struct Portmap Portmap; +struct Portmap +{ + int prog; + int vers; + int protocol; + int port; +}; + +Portmap map[] = { + 100003, 2, IPPROTO_UDP, 2049, /* nfs v2 */ +// 100003, 3, IPPROTO_UDP, 2049, /* nfs v3 */ + 100005, 1, IPPROTO_UDP, 2049, /* mount */ + 150001, 2, IPPROTO_UDP, 1111, /* pcnfsd v2 */ + 150001, 1, IPPROTO_UDP, 1111, /* pcnfsd v1 */ + 0, 0, 0, 0, +}; + +static void pmapinit(int, char**); +static int pmapnull(int, Rpccall*, Rpccall*); +static int pmapset(int, Rpccall*, Rpccall*); +static int pmapunset(int, Rpccall*, Rpccall*); +static int pmapgetport(int, Rpccall*, Rpccall*); +static int pmapdump(int, Rpccall*, Rpccall*); +static int pmapcallit(int, Rpccall*, Rpccall*); + +static Procmap pmapproc[] = { + 0, pmapnull, + 1, pmapset, + 2, pmapunset, + 3, pmapgetport, + 4, pmapdump, + 5, pmapcallit, + 0, 0 +}; + +int myport = 111; + +Progmap progmap[] = { + 100000, 2, pmapinit, pmapproc, + 0, 0, 0, +}; + +void +main(int argc, char *argv[]) +{ + server(argc, argv, myport, progmap); +} + +static +void +pmapinit(int argc, char **argv) +{ + ARGBEGIN{ + default: + if(argopt(ARGC()) < 0) + sysfatal("usage: %s %s", argv0, commonopts); + break; + }ARGEND; + clog("portmapper init\n"); +} + +static int +pmapnull(int n, Rpccall *cmd, Rpccall *reply) +{ + USED(n, cmd, reply); + return 0; +} + +static int +pmapset(int n, Rpccall *cmd, Rpccall *reply) +{ + uchar *dataptr = reply->results; + + if(n != 16) + return garbage(reply, "bad count"); + USED(cmd); + PLONG(FALSE); + return dataptr - (uchar *)reply->results; +} + +static int +pmapunset(int n, Rpccall *cmd, Rpccall *reply) +{ + uchar *dataptr = reply->results; + + if(n != 16) + return garbage(reply, "bad count"); + USED(cmd); + PLONG(TRUE); + return dataptr - (uchar *)reply->results; +} + +static int +pmapgetport(int n, Rpccall *cmd, Rpccall *reply) +{ + int prog, vers, prot; + uchar *argptr = cmd->args; + uchar *dataptr = reply->results; + Portmap *mp; + + clog("get port\n"); + + if(n != 16) + return garbage(reply, "bad count"); + prog = GLONG(); + vers = GLONG(); + prot = GLONG(); + chat("host=%I, port=%ld: ", cmd->host, cmd->port); + chat("getport: %d, %d, %d...", prog, vers, prot); + for(mp=map; mp->prog>0; mp++) + if(prog == mp->prog && vers == mp->vers && + prot == mp->protocol) + break; + chat("%d\n", mp->port); + PLONG(mp->port); + return dataptr - (uchar *)reply->results; +} + +static int +pmapdump(int n, Rpccall *cmd, Rpccall *reply) +{ + uchar *dataptr = reply->results; + Portmap *mp; + + if(n != 0) + return garbage(reply, "bad count"); + USED(cmd); + for(mp=map; mp->prog>0; mp++){ + PLONG(1); + PLONG(mp->prog); + PLONG(mp->vers); + PLONG(mp->protocol); + PLONG(mp->port); + } + PLONG(0); + return dataptr - (uchar *)reply->results; +} + +static int +pmapcallit(int n, Rpccall *cmd, Rpccall *reply) +{ + int prog, vers, proc; + uchar *argptr = cmd->args; + uchar *dataptr = reply->results; + Portmap *mp; + + if(n < 12) + return garbage(reply, "bad count"); + prog = GLONG(); + vers = GLONG(); + proc = GLONG(); + chat("host=%I, port=%ld: ", cmd->host, cmd->port); + chat("callit: %d, %d, %d...", prog, vers, proc); + for(mp=map; mp->prog>0; mp++) + if(prog == mp->prog && vers == mp->vers && + proc == 0) + break; + if(mp->port == 0){ + chat("ignored\n"); + return -1; + } + chat("%d\n", mp->port); + PLONG(mp->port); + PLONG(0); + return dataptr - (uchar *)reply->results; +} |