Commit | Line | Data |
---|---|---|
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 | ||
19 | struct { | |
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 */ | |
52 | main(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 | } | |
89 | mlookup(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 | } |