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