xref: /csrg-svn/old/berknet/nsh.c (revision 8202)
1*8202Smckusick static char sccsid[] = "@(#)nsh.c	4.1	(Berkeley)	09/12/82";
2*8202Smckusick 
3*8202Smckusick # include "defs.h"
4*8202Smckusick # define FREELPR
5*8202Smckusick /*
6*8202Smckusick 	nsh -c "comand to be executed"
7*8202Smckusick 
8*8202Smckusick 	This pseudo-shell is executed over the network
9*8202Smckusick 	as the login shell of an acount "network", no passwd.
10*8202Smckusick 	It will only execute certain allowed commands.
11*8202Smckusick 
12*8202Smckusick 	has these exit codes:
13*8202Smckusick 		EX_USAGE = 	wrong # arguments to nsh
14*8202Smckusick 		9 = 		command you execute may not take arguments
15*8202Smckusick 		10= 		the execl failed
16*8202Smckusick 		EX_UNAVAILABLE= could not find full path name for the command
17*8202Smckusick 
18*8202Smckusick 	count is the # of arguments (= argc) allowed.
19*8202Smckusick 	a count of 0 turns off the command
20*8202Smckusick */
21*8202Smckusick 
22*8202Smckusick struct {
23*8202Smckusick 	char *app;
24*8202Smckusick 	char count;
25*8202Smckusick 	char *full;
26*8202Smckusick 	char *full1;
27*8202Smckusick 	} st[] = {
28*8202Smckusick /* I assume these are the same for RAND */
29*8202Smckusick 	"mmail",	20,	"/usr/net/bin/mmail",	"/usr/net/bin/mmail",
30*8202Smckusick 	"mwrite",	20,	"/usr/net/bin/mwrite",	"/usr/net/bin/mwrite",
31*8202Smckusick 	"prmail",	20,	"/usr/net/bin/prmail",	"/usr/net/bin/prmail",
32*8202Smckusick # ifndef NFREECMD
33*8202Smckusick 	"bpq",		20,	"/usr/bin/bpq",		"/bin/bpq",
34*8202Smckusick 	"epq",		20,	"/usr/bin/epq",		"/bin/epq",
35*8202Smckusick 	"finger",	20,	"/usr/ucb/finger",	"/usr/bin/finger",
36*8202Smckusick 	"help",		20,	"/bin/help",	"/usr/bin/help",
37*8202Smckusick 	"lpq",		20,	"/usr/bin/lpq",		"/bin/lpq",
38*8202Smckusick # ifdef FREELPR
39*8202Smckusick 	"lpr",		20,	"/usr/bin/lpr",		"/bin/lpr",
40*8202Smckusick # endif
41*8202Smckusick 	"netlog",	20,	"/usr/bin/netlog",	"/usr/ucb/netlog",
42*8202Smckusick 	"vpr",		20,	"/usr/ucb/vpr",		"/usr/ucb/vpr",
43*8202Smckusick 	"netq",		20,	"/usr/bin/netq",	"/usr/ucb/netq",
44*8202Smckusick 	"news",		20,	"/usr/bin/news",	"/usr/ucb/news",
45*8202Smckusick 	"ps",		20,	"/bin/ps",		"/usr/bin/ps",
46*8202Smckusick 	"pstat",	20,	"/usr/bin/pstat",	"/bin/pstat",
47*8202Smckusick 	"rcs",		20,	"/usr/bin/rcs",		"/bin/rcs",
48*8202Smckusick 	"rcslog",	1,	"/usr/bin/rcslog",	"/bin/rcslog",
49*8202Smckusick 	"rcsq",		20,	"/usr/bin/rcsq",	"/bin/rcsq",
50*8202Smckusick 	"trq",		20,	"/usr/bin/trq",		"/bin/trq",
51*8202Smckusick 	"vpq",		20,	"/usr/ucb/vpq",		"/usr/bin/vpq",
52*8202Smckusick 	"w",		20,	"/usr/ucb/w",		"/usr/bin/w",
53*8202Smckusick 	"wc",		20,	"/usr/bin/wc",		"/bin/wc",
54*8202Smckusick 	"where",	20,	"/usr/bin/where",	"/bin/where",
55*8202Smckusick 	"who",		20,	"/bin/who",		"/usr/bin/who",
56*8202Smckusick 	"whom",		20,	"/usr/ucb/whom",	"/usr/bin/whom",
57*8202Smckusick 	"write",	20,	"/usr/bin/write",	"/bin/write",
58*8202Smckusick 	"yank",		20,	"/usr/ucb/yank",	"/usr/bin/yank",
59*8202Smckusick # endif
60*8202Smckusick 	0, 		0,		0,		0
61*8202Smckusick 	};
62*8202Smckusick /* nsh -c cmd */
63*8202Smckusick main(argc,argv)
64*8202Smckusick   char **argv; {
65*8202Smckusick 	char *s, buf[500];
66*8202Smckusick 	int i, flg = 0;
67*8202Smckusick 	if(argc != 3){
68*8202Smckusick 		fprintf(stderr,"Wrong number of arguments to nsh.\n");
69*8202Smckusick 		exit(EX_USAGE);
70*8202Smckusick 	}
71*8202Smckusick 	s = argv[2];
72*8202Smckusick 	while(*s && *s != ' ')s++;
73*8202Smckusick 	if(*s == ' ')flg++;
74*8202Smckusick 	*s = 0;
75*8202Smckusick 	if((i = mlookup(argv[2])) < 0){
76*8202Smckusick 		fprintf(stderr,
77*8202Smckusick 		"Command '%s' is not allowed if logged in as 'network'.\n",
78*8202Smckusick 			argv[2]);
79*8202Smckusick 		exit(11);
80*8202Smckusick 	}
81*8202Smckusick 	if(st[i].count == 0){
82*8202Smckusick 		fprintf(stderr,
83*8202Smckusick 		"The command '%s' is not allowed to have arguments.\n",argv[2]);
84*8202Smckusick 		exit(9);
85*8202Smckusick 		}
86*8202Smckusick 	if(stat(st[i].full,buf) >= 0)
87*8202Smckusick 		strcpy(buf,st[i].full);
88*8202Smckusick 	else strcpy(buf,st[i].full1);
89*8202Smckusick 	if(flg && st[i].count > 1){  /* some cmds don't allow parms */
90*8202Smckusick 		*s = ' ';
91*8202Smckusick 		strcat(buf,s);
92*8202Smckusick 		}
93*8202Smckusick 	/*
94*8202Smckusick 	fprintf(stderr,"%s\n",buf);
95*8202Smckusick 	*/
96*8202Smckusick 	execl("/bin/sh","sh","-c",buf,0);
97*8202Smckusick 	fprintf(stderr,"Execute of shell failed.\n");
98*8202Smckusick 	exit(EX_UNAVAILABLE);
99*8202Smckusick 	}
100*8202Smckusick mlookup(s)
101*8202Smckusick   char *s; {
102*8202Smckusick 	int i;
103*8202Smckusick 	for(i = 0; st[i].app; i++)
104*8202Smckusick 		if(strcmp(st[i].app,s) == 0 || strcmp(st[i].full,s) == 0
105*8202Smckusick 		 || strcmp(st[i].full1,s) == 0)return(i);
106*8202Smckusick 	return(-1);
107*8202Smckusick 	}
108