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