📄 pcnfsd.c
字号:
#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,};voidmain(int argc, char *argv[]){ server(argc, argv, myport, progmap);}static voidpcinit(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 intpcnull(int n, Rpccall *cmd, Rpccall *reply){ USED(n, cmd, reply); return 0;}static voidscramble(String *x){ int i; for(i=0; i<x->n; i++) x->s[i] = (x->s[i] ^ 0x5b) & 0x7f;}static intpcinfo(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 intpc1auth(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 intpcauth(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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -