xref: /plan9/sys/src/cmd/9nfs/pcnfsd.c (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
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