Annotation of 41BSD/cmd/berknet/nsh.c, revision 1.1.1.1

1.1       root        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:                EX_USAGE =      wrong # arguments to nsh
                     11:                9 =             command you execute may not take arguments
                     12:                10=             the execl failed
                     13:                EX_UNAVAILABLE= 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: /* I assume these are the same for RAND */
                     26:        "mmail",        20,     "/usr/net/bin/mmail",   "/usr/net/bin/mmail",
                     27:        "mwrite",       20,     "/usr/net/bin/mwrite",  "/usr/net/bin/mwrite",
                     28:        "prmail",       20,     "/usr/net/bin/prmail",  "/usr/net/bin/prmail",
                     29: # ifndef NFREECMD
                     30:        "bpq",          20,     "/usr/bin/bpq",         "/bin/bpq",
                     31:        "epq",          20,     "/usr/bin/epq",         "/bin/epq",
                     32:        "finger",       20,     "/usr/ucb/finger",      "/usr/bin/finger",
                     33:        "help",         20,     "/bin/help",    "/usr/bin/help",
                     34:        "lpq",          20,     "/usr/bin/lpq",         "/bin/lpq",
                     35: # ifdef FREELPR
                     36:        "lpr",          20,     "/usr/bin/lpr",         "/bin/lpr",
                     37: # endif
                     38:        "netlog",       20,     "/usr/bin/netlog",      "/usr/ucb/netlog",
                     39:        "netq",         20,     "/usr/bin/netq",        "/usr/ucb/netq",
                     40:        "news",         20,     "/usr/bin/news",        "/usr/ucb/news",
                     41:        "ps",           20,     "/bin/ps",              "/usr/bin/ps",
                     42:        "pstat",        20,     "/usr/bin/pstat",       "/bin/pstat",
                     43:        "rcs",          20,     "/usr/bin/rcs",         "/bin/rcs",
                     44:        "rcslog",       1,      "/usr/bin/rcslog",      "/bin/rcslog",
                     45:        "rcsq",         20,     "/usr/bin/rcsq",        "/bin/rcsq",
                     46:        "trq",          20,     "/usr/bin/trq",         "/bin/trq",
                     47:        "vpq",          20,     "/usr/ucb/vpq",         "/usr/bin/vpq",
                     48:        "w",            20,     "/usr/ucb/w",           "/usr/bin/w",
                     49:        "wc",           20,     "/usr/bin/wc",          "/bin/wc",
                     50:        "where",        20,     "/usr/bin/where",       "/bin/where",
                     51:        "who",          20,     "/bin/who",             "/usr/bin/who",
                     52:        "whom",         20,     "/usr/ucb/whom",        "/usr/bin/whom",
                     53:        "write",        20,     "/usr/bin/write",       "/bin/write",
                     54:        "yank",         20,     "/usr/ucb/yank",        "/usr/bin/yank",
                     55: # endif
                     56:        0,              0,              0,              0
                     57:        };
                     58: /* nsh -c cmd */
                     59: main(argc,argv)
                     60:   char **argv; {
                     61:        char *s, buf[500];
                     62:        int i, flg = 0;
                     63:        if(argc != 3){
                     64:                fprintf(stderr,"Wrong number of arguments to nsh.\n");
                     65:                exit(EX_USAGE);
                     66:        }
                     67:        s = argv[2];
                     68:        while(*s && *s != ' ')s++;
                     69:        if(*s == ' ')flg++;
                     70:        *s = 0;
                     71:        if((i = mlookup(argv[2])) < 0){
                     72:                fprintf(stderr,
                     73:                "Command '%s' is not allowed if logged in as 'network'.\n",
                     74:                        argv[2]);
                     75:                exit(11);
                     76:        }
                     77:        if(st[i].count == 0){
                     78:                fprintf(stderr,
                     79:                "The command '%s' is not allowed to have arguments.\n",argv[2]);
                     80:                exit(9);
                     81:                }
                     82:        if(stat(st[i].full,buf) >= 0)
                     83:                strcpy(buf,st[i].full);
                     84:        else strcpy(buf,st[i].full1);
                     85:        if(flg && st[i].count > 1){  /* some cmds don't allow parms */
                     86:                *s = ' ';
                     87:                strcat(buf,s);
                     88:                }
                     89:        /*
                     90:        fprintf(stderr,"%s\n",buf);
                     91:        */
                     92:        execl(Bsh,"sh","-c",buf,0);
                     93:        fprintf(stderr,"Execute of shell failed.\n");
                     94:        exit(EX_UNAVAILABLE);
                     95:        }
                     96: mlookup(s)
                     97:   char *s; {
                     98:        int i;
                     99:        for(i = 0; st[i].app; i++)
                    100:                if(strcmp(st[i].app,s) == 0 || strcmp(st[i].full,s) == 0
                    101:                 || strcmp(st[i].full1,s) == 0)return(i);
                    102:        return(-1);
                    103:        }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.