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