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/pcnfsd.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/9nfs/pcnfsd.c')
-rwxr-xr-x | sys/src/cmd/9nfs/pcnfsd.c | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/sys/src/cmd/9nfs/pcnfsd.c b/sys/src/cmd/9nfs/pcnfsd.c new file mode 100755 index 000000000..cfb947dd6 --- /dev/null +++ b/sys/src/cmd/9nfs/pcnfsd.c @@ -0,0 +1,180 @@ +#include "all.h" + +static void pcinit(int, char**); +static int pcnull(int, Rpccall*, Rpccall*); +static int pcinfo(int, Rpccall*, Rpccall*); +static int pcauth(int, Rpccall*, Rpccall*); +static int pc1auth(int, Rpccall*, Rpccall*); +static int pcfacilities[15]; +static char no_comment[] = "Trust me."; +static char pc_vers[] = "@(#)pcnfsd_v2.c 1.6 - rpc.pcnfsd V2.0 (c) 1994 P9, GmbH"; +static char pc_home[] = "merrimack:/"; + +static Procmap pcproc[] = { /* pcnfsd v2 */ + 0, pcnull, + 1, pcinfo, + 13, pcauth, + 0, 0 +}; + +static Procmap pc1proc[] = { /* pc-nfsd v1 */ + 0, pcnull, + 1, pc1auth, + 0, 0 +}; + +int myport = 1111; + +Progmap progmap[] = { + 150001, 2, pcinit, pcproc, + 150001, 1, 0, pc1proc, + 0, 0, 0, +}; + +void +main(int argc, char *argv[]) +{ + server(argc, argv, myport, progmap); +} + +static void +pcinit(int argc, char **argv) +{ + Procmap *p; + int i; + char *config = "config"; + + ARGBEGIN{ + case 'c': + config = ARGF(); + break; + default: + if(argopt(ARGC()) < 0) + sysfatal("usage: %s %s [-c config]", argv0, commonopts); + break; + }ARGEND; + clog("pc init\n"); + + for(i=0; i<nelem(pcfacilities); i++) + pcfacilities[i] = -1; + for(p=pcproc; p->procp; p++) + pcfacilities[p->procno] = 100; + readunixidmaps(config); +} + +static int +pcnull(int n, Rpccall *cmd, Rpccall *reply) +{ + USED(n, cmd, reply); + return 0; +} + +static void +scramble(String *x) +{ + int i; + + for(i=0; i<x->n; i++) + x->s[i] = (x->s[i] ^ 0x5b) & 0x7f; +} + +static int +pcinfo(int n, Rpccall *cmd, Rpccall *reply) +{ + uchar *argptr = cmd->args; + uchar *dataptr = reply->results; + String vers, cm; + int i; + + chat("host=%I, port=%ld: pcinfo...", + cmd->host, cmd->port); + if(n <= 16) + return garbage(reply, "count too small"); + argptr += string2S(argptr, &vers); + argptr += string2S(argptr, &cm); + if(argptr != &((uchar *)cmd->args)[n]) + return garbage(reply, "bad count"); + chat("\"%.*s\",\"%.*s\"\n", utfnlen(vers.s, vers.n), vers.s, utfnlen(cm.s, cm.n), cm.s); + PLONG(sizeof(pc_vers)-1); + PPTR(pc_vers, sizeof(pc_vers)-1); + PLONG(sizeof(no_comment)-1); + PPTR(no_comment, sizeof(no_comment)-1); + PLONG(nelem(pcfacilities)); + for(i=0; i<nelem(pcfacilities); i++) + PLONG(pcfacilities[i]); + return dataptr - (uchar *)reply->results; +} + +static int +pc1auth(int n, Rpccall *cmd, Rpccall *reply) +{ + uchar *argptr = cmd->args; + uchar *dataptr = reply->results; + String id, pw; + Unixidmap *m; + int uid; + + chat("host=%I, port=%ld: pcauth...", + cmd->host, cmd->port); + if(n <= 8) + return garbage(reply, "count too small"); + argptr += string2S(argptr, &id); + argptr += string2S(argptr, &pw); + if(argptr != &((uchar*)cmd->args)[n]) + return garbage(reply, "bad count"); + scramble(&id); + scramble(&pw); + m = pair2idmap("pcnfsd", cmd->host); + uid = -1; + if(m) + uid = name2id(&m->u.ids, id.s); + if(uid < 0) + uid = 1; + chat("\"%.*s\",\"%.*s\" uid=%d\n", utfnlen(id.s, id.n), id.s, utfnlen(pw.s, pw.n), pw.s, uid); + PLONG(0); /* status */ + PLONG(uid); /* uid */ + PLONG(uid); /* gid */ + return dataptr - (uchar*)reply->results; +} + +static int +pcauth(int n, Rpccall *cmd, Rpccall *reply) +{ + uchar *argptr = cmd->args; + uchar *dataptr = reply->results; + String sys, id, pw, cm; + Unixidmap *m; + int uid; + + chat("host=%I, port=%ld: pcauth...", + cmd->host, cmd->port); + if(n <= 16) + return garbage(reply, "count too small"); + argptr += string2S(argptr, &sys); + argptr += string2S(argptr, &id); + argptr += string2S(argptr, &pw); + argptr += string2S(argptr, &cm); + if(argptr != &((uchar *)cmd->args)[n]) + return garbage(reply, "bad count"); + scramble(&id); + scramble(&pw); + + m = pair2idmap("pcnfsd", cmd->host); + uid = -1; + if(m) + uid = name2id(&m->u.ids, id.s); + if(uid < 0) + uid = 1; + chat("\"%.*s\",\"%.*s\",\"%.*s\",\"%.*s\"\n", utfnlen(sys.s, sys.n), sys.s, + utfnlen(id.s, id.n), id.s, utfnlen(pw.s, pw.n), pw.s, utfnlen(cm.s, cm.n), cm.s); + PLONG(0); /* status - OK */ + PLONG(uid); + PLONG(uid); /* gid */ + PLONG(0); /* ngids */ + PLONG(sizeof(pc_home)-1); + PPTR(pc_home, sizeof(pc_home)-1); + PLONG(0); /* umask */ + PLONG(sizeof(no_comment)-1); + PPTR(no_comment, sizeof(no_comment)-1); + return dataptr - (uchar *)reply->results; +} |