17dd7cddfSDavid du Colombier #include "all.h" 27dd7cddfSDavid du Colombier 37dd7cddfSDavid du Colombier static void pcinit(int, char**); 47dd7cddfSDavid du Colombier static int pcnull(int, Rpccall*, Rpccall*); 57dd7cddfSDavid du Colombier static int pcinfo(int, Rpccall*, Rpccall*); 67dd7cddfSDavid du Colombier static int pcauth(int, Rpccall*, Rpccall*); 77dd7cddfSDavid du Colombier static int pc1auth(int, Rpccall*, Rpccall*); 87dd7cddfSDavid du Colombier static int pcfacilities[15]; 97dd7cddfSDavid du Colombier static char no_comment[] = "Trust me."; 107dd7cddfSDavid du Colombier static char pc_vers[] = "@(#)pcnfsd_v2.c 1.6 - rpc.pcnfsd V2.0 (c) 1994 P9, GmbH"; 117dd7cddfSDavid du Colombier static char pc_home[] = "merrimack:/"; 127dd7cddfSDavid du Colombier 137dd7cddfSDavid du Colombier static Procmap pcproc[] = { /* pcnfsd v2 */ 147dd7cddfSDavid du Colombier 0, pcnull, 157dd7cddfSDavid du Colombier 1, pcinfo, 167dd7cddfSDavid du Colombier 13, pcauth, 177dd7cddfSDavid du Colombier 0, 0 187dd7cddfSDavid du Colombier }; 197dd7cddfSDavid du Colombier 207dd7cddfSDavid du Colombier static Procmap pc1proc[] = { /* pc-nfsd v1 */ 217dd7cddfSDavid du Colombier 0, pcnull, 227dd7cddfSDavid du Colombier 1, pc1auth, 237dd7cddfSDavid du Colombier 0, 0 247dd7cddfSDavid du Colombier }; 257dd7cddfSDavid du Colombier 267dd7cddfSDavid du Colombier int myport = 1111; 277dd7cddfSDavid du Colombier 287dd7cddfSDavid du Colombier Progmap progmap[] = { 297dd7cddfSDavid du Colombier 150001, 2, pcinit, pcproc, 307dd7cddfSDavid du Colombier 150001, 1, 0, pc1proc, 317dd7cddfSDavid du Colombier 0, 0, 0, 327dd7cddfSDavid du Colombier }; 337dd7cddfSDavid du Colombier 347dd7cddfSDavid du Colombier static void 357dd7cddfSDavid du Colombier pcinit(int argc, char **argv) 367dd7cddfSDavid du Colombier { 377dd7cddfSDavid du Colombier Procmap *p; 387dd7cddfSDavid du Colombier int i; 397dd7cddfSDavid du Colombier char *config = "config"; 407dd7cddfSDavid du Colombier 417dd7cddfSDavid du Colombier ARGBEGIN{ 427dd7cddfSDavid du Colombier case 'c': 437dd7cddfSDavid du Colombier config = ARGF(); 447dd7cddfSDavid du Colombier break; 457dd7cddfSDavid du Colombier }ARGEND; 467dd7cddfSDavid du Colombier clog("pc init\n"); 477dd7cddfSDavid du Colombier 487dd7cddfSDavid du Colombier for(i=0; i<nelem(pcfacilities); i++) 497dd7cddfSDavid du Colombier pcfacilities[i] = -1; 507dd7cddfSDavid du Colombier for(p=pcproc; p->procp; p++) 517dd7cddfSDavid du Colombier pcfacilities[p->procno] = 100; 527dd7cddfSDavid du Colombier readunixidmaps(config); 537dd7cddfSDavid du Colombier } 547dd7cddfSDavid du Colombier 557dd7cddfSDavid du Colombier static int 567dd7cddfSDavid du Colombier pcnull(int n, Rpccall *cmd, Rpccall *reply) 577dd7cddfSDavid du Colombier { 587dd7cddfSDavid du Colombier USED(n, cmd, reply); 597dd7cddfSDavid du Colombier return 0; 607dd7cddfSDavid du Colombier } 617dd7cddfSDavid du Colombier 627dd7cddfSDavid du Colombier static void 637dd7cddfSDavid du Colombier scramble(String *x) 647dd7cddfSDavid du Colombier { 657dd7cddfSDavid du Colombier int i; 667dd7cddfSDavid du Colombier 677dd7cddfSDavid du Colombier for(i=0; i<x->n; i++) 687dd7cddfSDavid du Colombier x->s[i] = (x->s[i] ^ 0x5b) & 0x7f; 697dd7cddfSDavid du Colombier } 707dd7cddfSDavid du Colombier 717dd7cddfSDavid du Colombier static int 727dd7cddfSDavid du Colombier pcinfo(int n, Rpccall *cmd, Rpccall *reply) 737dd7cddfSDavid du Colombier { 747dd7cddfSDavid du Colombier uchar *argptr = cmd->args; 757dd7cddfSDavid du Colombier uchar *dataptr = reply->results; 767dd7cddfSDavid du Colombier String vers, cm; 777dd7cddfSDavid du Colombier int i; 787dd7cddfSDavid du Colombier 797dd7cddfSDavid du Colombier chat("host=%I, port=%d: pcinfo...", 807dd7cddfSDavid du Colombier cmd->host, cmd->port); 817dd7cddfSDavid du Colombier if(n <= 16) 827dd7cddfSDavid du Colombier return garbage(reply, "count too small"); 837dd7cddfSDavid du Colombier argptr += string2S(argptr, &vers); 847dd7cddfSDavid du Colombier argptr += string2S(argptr, &cm); 857dd7cddfSDavid du Colombier if(argptr != &((uchar *)cmd->args)[n]) 867dd7cddfSDavid du Colombier return garbage(reply, "bad count"); 87*59cc4ca5SDavid du Colombier chat("\"%.*s\",\"%.*s\"\n", utfnlen(vers.s, vers.n), vers.s, utfnlen(cm.s, cm.n), cm.s); 887dd7cddfSDavid du Colombier PLONG(sizeof(pc_vers)-1); 897dd7cddfSDavid du Colombier PPTR(pc_vers, sizeof(pc_vers)-1); 907dd7cddfSDavid du Colombier PLONG(sizeof(no_comment)-1); 917dd7cddfSDavid du Colombier PPTR(no_comment, sizeof(no_comment)-1); 927dd7cddfSDavid du Colombier PLONG(nelem(pcfacilities)); 937dd7cddfSDavid du Colombier for(i=0; i<nelem(pcfacilities); i++) 947dd7cddfSDavid du Colombier PLONG(pcfacilities[i]); 957dd7cddfSDavid du Colombier return dataptr - (uchar *)reply->results; 967dd7cddfSDavid du Colombier } 977dd7cddfSDavid du Colombier 987dd7cddfSDavid du Colombier static int 997dd7cddfSDavid du Colombier pc1auth(int n, Rpccall *cmd, Rpccall *reply) 1007dd7cddfSDavid du Colombier { 1017dd7cddfSDavid du Colombier uchar *argptr = cmd->args; 1027dd7cddfSDavid du Colombier uchar *dataptr = reply->results; 1037dd7cddfSDavid du Colombier String id, pw; 1047dd7cddfSDavid du Colombier Unixidmap *m; 1057dd7cddfSDavid du Colombier int uid; 1067dd7cddfSDavid du Colombier 1077dd7cddfSDavid du Colombier chat("host=%I, port=%d: pcauth...", 1087dd7cddfSDavid du Colombier cmd->host, cmd->port); 1097dd7cddfSDavid du Colombier if(n <= 8) 1107dd7cddfSDavid du Colombier return garbage(reply, "count too small"); 1117dd7cddfSDavid du Colombier argptr += string2S(argptr, &id); 1127dd7cddfSDavid du Colombier argptr += string2S(argptr, &pw); 1137dd7cddfSDavid du Colombier if(argptr != &((uchar*)cmd->args)[n]) 1147dd7cddfSDavid du Colombier return garbage(reply, "bad count"); 1157dd7cddfSDavid du Colombier scramble(&id); 1167dd7cddfSDavid du Colombier scramble(&pw); 1177dd7cddfSDavid du Colombier m = pair2idmap("pcnfsd", cmd->host); 1187dd7cddfSDavid du Colombier uid = -1; 1197dd7cddfSDavid du Colombier if(m) 1207dd7cddfSDavid du Colombier uid = name2id(&m->u.ids, id.s); 1217dd7cddfSDavid du Colombier if(uid < 0) 1227dd7cddfSDavid du Colombier uid = 1; 123*59cc4ca5SDavid du Colombier chat("\"%.*s\",\"%.*s\" uid=%d\n", utfnlen(id.s, id.n), id.s, utfnlen(pw.s, pw.n), pw.s, uid); 1247dd7cddfSDavid du Colombier PLONG(0); /* status */ 1257dd7cddfSDavid du Colombier PLONG(uid); /* uid */ 1267dd7cddfSDavid du Colombier PLONG(uid); /* gid */ 1277dd7cddfSDavid du Colombier return dataptr - (uchar*)reply->results; 1287dd7cddfSDavid du Colombier } 1297dd7cddfSDavid du Colombier 1307dd7cddfSDavid du Colombier static int 1317dd7cddfSDavid du Colombier pcauth(int n, Rpccall *cmd, Rpccall *reply) 1327dd7cddfSDavid du Colombier { 1337dd7cddfSDavid du Colombier uchar *argptr = cmd->args; 1347dd7cddfSDavid du Colombier uchar *dataptr = reply->results; 1357dd7cddfSDavid du Colombier String sys, id, pw, cm; 1367dd7cddfSDavid du Colombier Unixidmap *m; 1377dd7cddfSDavid du Colombier int uid; 1387dd7cddfSDavid du Colombier 1397dd7cddfSDavid du Colombier chat("host=%I, port=%d: pcauth...", 1407dd7cddfSDavid du Colombier cmd->host, cmd->port); 1417dd7cddfSDavid du Colombier if(n <= 16) 1427dd7cddfSDavid du Colombier return garbage(reply, "count too small"); 1437dd7cddfSDavid du Colombier argptr += string2S(argptr, &sys); 1447dd7cddfSDavid du Colombier argptr += string2S(argptr, &id); 1457dd7cddfSDavid du Colombier argptr += string2S(argptr, &pw); 1467dd7cddfSDavid du Colombier argptr += string2S(argptr, &cm); 1477dd7cddfSDavid du Colombier if(argptr != &((uchar *)cmd->args)[n]) 1487dd7cddfSDavid du Colombier return garbage(reply, "bad count"); 1497dd7cddfSDavid du Colombier scramble(&id); 1507dd7cddfSDavid du Colombier scramble(&pw); 1517dd7cddfSDavid du Colombier 1527dd7cddfSDavid du Colombier m = pair2idmap("pcnfsd", cmd->host); 1537dd7cddfSDavid du Colombier uid = -1; 1547dd7cddfSDavid du Colombier if(m) 1557dd7cddfSDavid du Colombier uid = name2id(&m->u.ids, id.s); 1567dd7cddfSDavid du Colombier if(uid < 0) 1577dd7cddfSDavid du Colombier uid = 1; 158*59cc4ca5SDavid du Colombier chat("\"%.*s\",\"%.*s\",\"%.*s\",\"%.*s\"\n", utfnlen(sys.s, sys.n), sys.s, 159*59cc4ca5SDavid du Colombier utfnlen(id.s, id.n), id.s, utfnlen(pw.s, pw.n), pw.s, utfnlen(cm.s, cm.n), cm.s); 1607dd7cddfSDavid du Colombier PLONG(0); /* status - OK */ 1617dd7cddfSDavid du Colombier PLONG(uid); 1627dd7cddfSDavid du Colombier PLONG(uid); /* gid */ 1637dd7cddfSDavid du Colombier PLONG(0); /* ngids */ 1647dd7cddfSDavid du Colombier PLONG(sizeof(pc_home)-1); 1657dd7cddfSDavid du Colombier PPTR(pc_home, sizeof(pc_home)-1); 1667dd7cddfSDavid du Colombier PLONG(0); /* umask */ 1677dd7cddfSDavid du Colombier PLONG(sizeof(no_comment)-1); 1687dd7cddfSDavid du Colombier PPTR(no_comment, sizeof(no_comment)-1); 1697dd7cddfSDavid du Colombier return dataptr - (uchar *)reply->results; 1707dd7cddfSDavid du Colombier } 171