Annotation of 41BSD/cmd/berknet/nsh.c, revision 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.