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