Annotation of 43BSDReno/old/berknet/nsh.c, revision 1.1

1.1     ! root        1: static char sccsid[] = "@(#)nsh.c      4.3     (Berkeley)      5/20/83";
        !             2: 
        !             3: # include "defs.h"
        !             4: /*
        !             5:        nsh -c "comand to be executed"
        !             6: 
        !             7:        This pseudo-shell is executed over the network
        !             8:        as the login shell of an acount "network", no passwd.
        !             9:        It will only execute certain allowed commands.
        !            10: 
        !            11:        has these exit codes:
        !            12:                EX_USAGE =      wrong # arguments to nsh
        !            13:                9 =             command you execute may not take arguments
        !            14:                10=             the execl failed
        !            15:                EX_UNAVAILABLE= could not find full path name for the command
        !            16: 
        !            17:        count is the # of arguments (= argc) allowed.
        !            18:        a count of 0 turns off the command
        !            19: */
        !            20: 
        !            21: struct {
        !            22:        char *app;
        !            23:        char count;
        !            24:        char *full;
        !            25:        char *full1;
        !            26:        } st[] = {
        !            27: /* I assume these are the same for RAND */
        !            28:        "mmail",        20,     "/usr/net/bin/mmail",   "/usr/net/bin/mmail",
        !            29:        "mwrite",       20,     "/usr/net/bin/mwrite",  "/usr/net/bin/mwrite",
        !            30:        "prmail",       20,     "/usr/net/bin/prmail",  "/usr/net/bin/prmail",
        !            31: # ifndef NFREECMD
        !            32:        "finger",       20,     "/usr/ucb/finger",      "/usr/bin/finger",
        !            33:        "lpq",          20,     "/usr/ucb/lpq",         "/usr/bin/lpq",
        !            34: # ifdef FREELPR
        !            35:        "lpr",          20,     "/usr/ucb/lpr",         "/usr/bin/lpr",
        !            36: # endif
        !            37:        "netlog",       20,     "/usr/bin/netlog",      "/usr/ucb/netlog",
        !            38:        "netq",         20,     "/usr/bin/netq",        "/usr/ucb/netq",
        !            39:        "ps",           20,     "/bin/ps",              "/usr/bin/ps",
        !            40:        "pstat",        20,     "/etc/pstat",           "/usr/bin/pstat",
        !            41:        "vpq",          20,     "/usr/ucb/vpq",         "/usr/bin/vpq",
        !            42:        "w",            20,     "/usr/ucb/w",           "/usr/bin/w",
        !            43:        "wc",           20,     "/usr/bin/wc",          "/bin/wc",
        !            44:        "who",          20,     "/bin/who",             "/usr/bin/who",
        !            45:        "whom",         20,     "/usr/ucb/whom",        "/usr/bin/whom",
        !            46:        "yank",         20,     "/usr/ucb/yank",        "/usr/bin/yank",
        !            47: # endif
        !            48:        0,              0,              0,              0
        !            49:        };
        !            50: /* nsh -c cmd */
        !            51: main(argc,argv)
        !            52:   char **argv; {
        !            53:        char *s, buf[500];
        !            54:        int i, flg = 0;
        !            55:        if(argc != 3){
        !            56:                fprintf(stderr,"Wrong number of arguments to nsh.\n");
        !            57:                exit(EX_USAGE);
        !            58:        }
        !            59:        s = argv[2];
        !            60:        while (*s)
        !            61:                if (*s == ';'
        !            62:                 || *s == '|'
        !            63:                 || *s == '&'
        !            64:                 || *s == '?'
        !            65:                 || *s == '*'
        !            66:                 || *s == '['
        !            67:                 || *s == '~'
        !            68:                 || *s == '{'
        !            69:                 || *s == '<'
        !            70:                 || *s == '>'
        !            71:                 || *s == '$'
        !            72:                 || *s == '`') {
        !            73:                        fprintf(stderr, "Illegal shell metacharacter in command.\n");
        !            74:                        exit(9);
        !            75:                } else
        !            76:                        ++s;
        !            77:        s = argv[2];
        !            78:        while(*s && *s != ' ')s++;
        !            79:        if(*s == ' ')flg++;
        !            80:        *s = 0;
        !            81:        if((i = mlookup(argv[2])) < 0){
        !            82:                fprintf(stderr,
        !            83:                "Command '%s' is not allowed if logged in as 'network'.\n",
        !            84:                        argv[2]);
        !            85:                exit(11);
        !            86:        }
        !            87:        if(st[i].count == 0){
        !            88:                fprintf(stderr,
        !            89:                "The command '%s' is not allowed to have arguments.\n",argv[2]);
        !            90:                exit(9);
        !            91:                }
        !            92:        if(stat(st[i].full,buf) >= 0)
        !            93:                strcpy(buf,st[i].full);
        !            94:        else strcpy(buf,st[i].full1);
        !            95:        if(flg && st[i].count > 1){  /* some cmds don't allow parms */
        !            96:                *s = ' ';
        !            97:                strcat(buf,s);
        !            98:                }
        !            99:        /*
        !           100:        fprintf(stderr,"%s\n",buf);
        !           101:        */
        !           102:        execl(Bsh,"sh","-c",buf,0);
        !           103:        fprintf(stderr,"Execute of shell failed.\n");
        !           104:        exit(EX_UNAVAILABLE);
        !           105:        }
        !           106: mlookup(s)
        !           107:   char *s; {
        !           108:        int i;
        !           109:        for(i = 0; st[i].app; i++)
        !           110:                if(strcmp(st[i].app,s) == 0 || strcmp(st[i].full,s) == 0
        !           111:                 || strcmp(st[i].full1,s) == 0)return(i);
        !           112:        return(-1);
        !           113:        }

unix.superglobalmegacorp.com

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