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
349a747e4fSDavid du Colombier void
main(int argc,char * argv[])359a747e4fSDavid du Colombier main(int argc, char *argv[])
369a747e4fSDavid du Colombier {
379a747e4fSDavid du Colombier server(argc, argv, myport, progmap);
389a747e4fSDavid du Colombier }
399a747e4fSDavid du Colombier
407dd7cddfSDavid du Colombier static void
pcinit(int argc,char ** argv)417dd7cddfSDavid du Colombier pcinit(int argc, char **argv)
427dd7cddfSDavid du Colombier {
437dd7cddfSDavid du Colombier Procmap *p;
447dd7cddfSDavid du Colombier int i;
457dd7cddfSDavid du Colombier char *config = "config";
467dd7cddfSDavid du Colombier
477dd7cddfSDavid du Colombier ARGBEGIN{
487dd7cddfSDavid du Colombier case 'c':
497dd7cddfSDavid du Colombier config = ARGF();
507dd7cddfSDavid du Colombier break;
51*363b328dSDavid du Colombier default:
52*363b328dSDavid du Colombier if(argopt(ARGC()) < 0)
53*363b328dSDavid du Colombier sysfatal("usage: %s %s [-c config]", argv0, commonopts);
54*363b328dSDavid du Colombier break;
557dd7cddfSDavid du Colombier }ARGEND;
567dd7cddfSDavid du Colombier clog("pc init\n");
577dd7cddfSDavid du Colombier
587dd7cddfSDavid du Colombier for(i=0; i<nelem(pcfacilities); i++)
597dd7cddfSDavid du Colombier pcfacilities[i] = -1;
607dd7cddfSDavid du Colombier for(p=pcproc; p->procp; p++)
617dd7cddfSDavid du Colombier pcfacilities[p->procno] = 100;
627dd7cddfSDavid du Colombier readunixidmaps(config);
637dd7cddfSDavid du Colombier }
647dd7cddfSDavid du Colombier
657dd7cddfSDavid du Colombier static int
pcnull(int n,Rpccall * cmd,Rpccall * reply)667dd7cddfSDavid du Colombier pcnull(int n, Rpccall *cmd, Rpccall *reply)
677dd7cddfSDavid du Colombier {
687dd7cddfSDavid du Colombier USED(n, cmd, reply);
697dd7cddfSDavid du Colombier return 0;
707dd7cddfSDavid du Colombier }
717dd7cddfSDavid du Colombier
727dd7cddfSDavid du Colombier static void
scramble(String * x)737dd7cddfSDavid du Colombier scramble(String *x)
747dd7cddfSDavid du Colombier {
757dd7cddfSDavid du Colombier int i;
767dd7cddfSDavid du Colombier
777dd7cddfSDavid du Colombier for(i=0; i<x->n; i++)
787dd7cddfSDavid du Colombier x->s[i] = (x->s[i] ^ 0x5b) & 0x7f;
797dd7cddfSDavid du Colombier }
807dd7cddfSDavid du Colombier
817dd7cddfSDavid du Colombier static int
pcinfo(int n,Rpccall * cmd,Rpccall * reply)827dd7cddfSDavid du Colombier pcinfo(int n, Rpccall *cmd, Rpccall *reply)
837dd7cddfSDavid du Colombier {
847dd7cddfSDavid du Colombier uchar *argptr = cmd->args;
857dd7cddfSDavid du Colombier uchar *dataptr = reply->results;
867dd7cddfSDavid du Colombier String vers, cm;
877dd7cddfSDavid du Colombier int i;
887dd7cddfSDavid du Colombier
899a747e4fSDavid du Colombier chat("host=%I, port=%ld: pcinfo...",
907dd7cddfSDavid du Colombier cmd->host, cmd->port);
917dd7cddfSDavid du Colombier if(n <= 16)
927dd7cddfSDavid du Colombier return garbage(reply, "count too small");
937dd7cddfSDavid du Colombier argptr += string2S(argptr, &vers);
947dd7cddfSDavid du Colombier argptr += string2S(argptr, &cm);
957dd7cddfSDavid du Colombier if(argptr != &((uchar *)cmd->args)[n])
967dd7cddfSDavid du Colombier return garbage(reply, "bad count");
9759cc4ca5SDavid du Colombier chat("\"%.*s\",\"%.*s\"\n", utfnlen(vers.s, vers.n), vers.s, utfnlen(cm.s, cm.n), cm.s);
987dd7cddfSDavid du Colombier PLONG(sizeof(pc_vers)-1);
997dd7cddfSDavid du Colombier PPTR(pc_vers, sizeof(pc_vers)-1);
1007dd7cddfSDavid du Colombier PLONG(sizeof(no_comment)-1);
1017dd7cddfSDavid du Colombier PPTR(no_comment, sizeof(no_comment)-1);
1027dd7cddfSDavid du Colombier PLONG(nelem(pcfacilities));
1037dd7cddfSDavid du Colombier for(i=0; i<nelem(pcfacilities); i++)
1047dd7cddfSDavid du Colombier PLONG(pcfacilities[i]);
1057dd7cddfSDavid du Colombier return dataptr - (uchar *)reply->results;
1067dd7cddfSDavid du Colombier }
1077dd7cddfSDavid du Colombier
1087dd7cddfSDavid du Colombier static int
pc1auth(int n,Rpccall * cmd,Rpccall * reply)1097dd7cddfSDavid du Colombier pc1auth(int n, Rpccall *cmd, Rpccall *reply)
1107dd7cddfSDavid du Colombier {
1117dd7cddfSDavid du Colombier uchar *argptr = cmd->args;
1127dd7cddfSDavid du Colombier uchar *dataptr = reply->results;
1137dd7cddfSDavid du Colombier String id, pw;
1147dd7cddfSDavid du Colombier Unixidmap *m;
1157dd7cddfSDavid du Colombier int uid;
1167dd7cddfSDavid du Colombier
1179a747e4fSDavid du Colombier chat("host=%I, port=%ld: pcauth...",
1187dd7cddfSDavid du Colombier cmd->host, cmd->port);
1197dd7cddfSDavid du Colombier if(n <= 8)
1207dd7cddfSDavid du Colombier return garbage(reply, "count too small");
1217dd7cddfSDavid du Colombier argptr += string2S(argptr, &id);
1227dd7cddfSDavid du Colombier argptr += string2S(argptr, &pw);
1237dd7cddfSDavid du Colombier if(argptr != &((uchar*)cmd->args)[n])
1247dd7cddfSDavid du Colombier return garbage(reply, "bad count");
1257dd7cddfSDavid du Colombier scramble(&id);
1267dd7cddfSDavid du Colombier scramble(&pw);
1277dd7cddfSDavid du Colombier m = pair2idmap("pcnfsd", cmd->host);
1287dd7cddfSDavid du Colombier uid = -1;
1297dd7cddfSDavid du Colombier if(m)
1307dd7cddfSDavid du Colombier uid = name2id(&m->u.ids, id.s);
1317dd7cddfSDavid du Colombier if(uid < 0)
1327dd7cddfSDavid du Colombier uid = 1;
13359cc4ca5SDavid du Colombier chat("\"%.*s\",\"%.*s\" uid=%d\n", utfnlen(id.s, id.n), id.s, utfnlen(pw.s, pw.n), pw.s, uid);
1347dd7cddfSDavid du Colombier PLONG(0); /* status */
1357dd7cddfSDavid du Colombier PLONG(uid); /* uid */
1367dd7cddfSDavid du Colombier PLONG(uid); /* gid */
1377dd7cddfSDavid du Colombier return dataptr - (uchar*)reply->results;
1387dd7cddfSDavid du Colombier }
1397dd7cddfSDavid du Colombier
1407dd7cddfSDavid du Colombier static int
pcauth(int n,Rpccall * cmd,Rpccall * reply)1417dd7cddfSDavid du Colombier pcauth(int n, Rpccall *cmd, Rpccall *reply)
1427dd7cddfSDavid du Colombier {
1437dd7cddfSDavid du Colombier uchar *argptr = cmd->args;
1447dd7cddfSDavid du Colombier uchar *dataptr = reply->results;
1457dd7cddfSDavid du Colombier String sys, id, pw, cm;
1467dd7cddfSDavid du Colombier Unixidmap *m;
1477dd7cddfSDavid du Colombier int uid;
1487dd7cddfSDavid du Colombier
1499a747e4fSDavid du Colombier chat("host=%I, port=%ld: pcauth...",
1507dd7cddfSDavid du Colombier cmd->host, cmd->port);
1517dd7cddfSDavid du Colombier if(n <= 16)
1527dd7cddfSDavid du Colombier return garbage(reply, "count too small");
1537dd7cddfSDavid du Colombier argptr += string2S(argptr, &sys);
1547dd7cddfSDavid du Colombier argptr += string2S(argptr, &id);
1557dd7cddfSDavid du Colombier argptr += string2S(argptr, &pw);
1567dd7cddfSDavid du Colombier argptr += string2S(argptr, &cm);
1577dd7cddfSDavid du Colombier if(argptr != &((uchar *)cmd->args)[n])
1587dd7cddfSDavid du Colombier return garbage(reply, "bad count");
1597dd7cddfSDavid du Colombier scramble(&id);
1607dd7cddfSDavid du Colombier scramble(&pw);
1617dd7cddfSDavid du Colombier
1627dd7cddfSDavid du Colombier m = pair2idmap("pcnfsd", cmd->host);
1637dd7cddfSDavid du Colombier uid = -1;
1647dd7cddfSDavid du Colombier if(m)
1657dd7cddfSDavid du Colombier uid = name2id(&m->u.ids, id.s);
1667dd7cddfSDavid du Colombier if(uid < 0)
1677dd7cddfSDavid du Colombier uid = 1;
16859cc4ca5SDavid du Colombier chat("\"%.*s\",\"%.*s\",\"%.*s\",\"%.*s\"\n", utfnlen(sys.s, sys.n), sys.s,
16959cc4ca5SDavid du Colombier utfnlen(id.s, id.n), id.s, utfnlen(pw.s, pw.n), pw.s, utfnlen(cm.s, cm.n), cm.s);
1707dd7cddfSDavid du Colombier PLONG(0); /* status - OK */
1717dd7cddfSDavid du Colombier PLONG(uid);
1727dd7cddfSDavid du Colombier PLONG(uid); /* gid */
1737dd7cddfSDavid du Colombier PLONG(0); /* ngids */
1747dd7cddfSDavid du Colombier PLONG(sizeof(pc_home)-1);
1757dd7cddfSDavid du Colombier PPTR(pc_home, sizeof(pc_home)-1);
1767dd7cddfSDavid du Colombier PLONG(0); /* umask */
1777dd7cddfSDavid du Colombier PLONG(sizeof(no_comment)-1);
1787dd7cddfSDavid du Colombier PPTR(no_comment, sizeof(no_comment)-1);
1797dd7cddfSDavid du Colombier return dataptr - (uchar *)reply->results;
1807dd7cddfSDavid du Colombier }
181