date and time created 82/09/12 17:31:57 by mckusick
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Mon, 13 Sep 1982 08:31:57 +0000 (00:31 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Mon, 13 Sep 1982 08:31:57 +0000 (00:31 -0800)
SCCS-vsn: old/berknet/nsh.c 4.1

usr/src/old/berknet/nsh.c [new file with mode: 0644]

diff --git a/usr/src/old/berknet/nsh.c b/usr/src/old/berknet/nsh.c
new file mode 100644 (file)
index 0000000..37510d9
--- /dev/null
@@ -0,0 +1,107 @@
+static char sccsid[] = "@(#)nsh.c      4.1     (Berkeley)      %G%";
+
+# include "defs.h"
+# define FREELPR
+/*
+       nsh -c "comand to be executed"
+
+       This pseudo-shell is executed over the network
+       as the login shell of an acount "network", no passwd.
+       It will only execute certain allowed commands.
+
+       has these exit codes:
+               EX_USAGE =      wrong # arguments to nsh
+               9 =             command you execute may not take arguments
+               10=             the execl failed
+               EX_UNAVAILABLE= could not find full path name for the command
+
+       count is the # of arguments (= argc) allowed.
+       a count of 0 turns off the command
+*/
+
+struct {
+       char *app;
+       char count;
+       char *full;
+       char *full1;
+       } st[] = {
+/* I assume these are the same for RAND */
+       "mmail",        20,     "/usr/net/bin/mmail",   "/usr/net/bin/mmail",
+       "mwrite",       20,     "/usr/net/bin/mwrite",  "/usr/net/bin/mwrite",
+       "prmail",       20,     "/usr/net/bin/prmail",  "/usr/net/bin/prmail",
+# ifndef NFREECMD
+       "bpq",          20,     "/usr/bin/bpq",         "/bin/bpq",
+       "epq",          20,     "/usr/bin/epq",         "/bin/epq",
+       "finger",       20,     "/usr/ucb/finger",      "/usr/bin/finger",
+       "help",         20,     "/bin/help",    "/usr/bin/help",
+       "lpq",          20,     "/usr/bin/lpq",         "/bin/lpq",
+# ifdef FREELPR
+       "lpr",          20,     "/usr/bin/lpr",         "/bin/lpr",
+# endif
+       "netlog",       20,     "/usr/bin/netlog",      "/usr/ucb/netlog",
+       "vpr",          20,     "/usr/ucb/vpr",         "/usr/ucb/vpr",
+       "netq",         20,     "/usr/bin/netq",        "/usr/ucb/netq",
+       "news",         20,     "/usr/bin/news",        "/usr/ucb/news",
+       "ps",           20,     "/bin/ps",              "/usr/bin/ps",
+       "pstat",        20,     "/usr/bin/pstat",       "/bin/pstat",
+       "rcs",          20,     "/usr/bin/rcs",         "/bin/rcs",
+       "rcslog",       1,      "/usr/bin/rcslog",      "/bin/rcslog",
+       "rcsq",         20,     "/usr/bin/rcsq",        "/bin/rcsq",
+       "trq",          20,     "/usr/bin/trq",         "/bin/trq",
+       "vpq",          20,     "/usr/ucb/vpq",         "/usr/bin/vpq",
+       "w",            20,     "/usr/ucb/w",           "/usr/bin/w",
+       "wc",           20,     "/usr/bin/wc",          "/bin/wc",
+       "where",        20,     "/usr/bin/where",       "/bin/where",
+       "who",          20,     "/bin/who",             "/usr/bin/who",
+       "whom",         20,     "/usr/ucb/whom",        "/usr/bin/whom",
+       "write",        20,     "/usr/bin/write",       "/bin/write",
+       "yank",         20,     "/usr/ucb/yank",        "/usr/bin/yank",
+# endif
+       0,              0,              0,              0
+       };
+/* nsh -c cmd */
+main(argc,argv)
+  char **argv; {
+       char *s, buf[500];
+       int i, flg = 0;
+       if(argc != 3){
+               fprintf(stderr,"Wrong number of arguments to nsh.\n");
+               exit(EX_USAGE);
+       }
+       s = argv[2];
+       while(*s && *s != ' ')s++;
+       if(*s == ' ')flg++;
+       *s = 0;
+       if((i = mlookup(argv[2])) < 0){
+               fprintf(stderr,
+               "Command '%s' is not allowed if logged in as 'network'.\n",
+                       argv[2]);
+               exit(11);
+       }
+       if(st[i].count == 0){
+               fprintf(stderr,
+               "The command '%s' is not allowed to have arguments.\n",argv[2]);
+               exit(9);
+               }
+       if(stat(st[i].full,buf) >= 0)
+               strcpy(buf,st[i].full);
+       else strcpy(buf,st[i].full1);
+       if(flg && st[i].count > 1){  /* some cmds don't allow parms */
+               *s = ' ';
+               strcat(buf,s);
+               }
+       /*
+       fprintf(stderr,"%s\n",buf);
+       */
+       execl("/bin/sh","sh","-c",buf,0);
+       fprintf(stderr,"Execute of shell failed.\n");
+       exit(EX_UNAVAILABLE);
+       }
+mlookup(s)
+  char *s; {
+       int i;
+       for(i = 0; st[i].app; i++)
+               if(strcmp(st[i].app,s) == 0 || strcmp(st[i].full,s) == 0
+                || strcmp(st[i].full1,s) == 0)return(i);
+       return(-1);
+       }