Annotation of 3BSD/cmd/net/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:                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:        }

unix.superglobalmegacorp.com

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