Annotation of researchv10no/cmd/learn/mysys.c, revision 1.1

1.1     ! root        1: #include "stdio.h"
        !             2: #include "signal.h"
        !             3: 
        !             4: #define        EASY    1
        !             5: #define        MEDIUM  2
        !             6: #define        HARD    3
        !             7: 
        !             8: mysys(s)
        !             9: char *s;
        !            10: {
        !            11:        /* like "system" but rips off "mv", etc.*/
        !            12:        /* also tries to guess if can get away with exec cmd */
        !            13:        /* instead of sh cmd */
        !            14:        char p[300];
        !            15:        char *np[40];
        !            16:        register char *t;
        !            17:        int nv, type, stat;
        !            18: 
        !            19:        type = EASY;    /* we hope */
        !            20:        for (t = s; *t && type != HARD; t++) {
        !            21:                switch (*t) {
        !            22:                case '*': 
        !            23:                case '[': 
        !            24:                case '?': 
        !            25:                case '>': 
        !            26:                case '<': 
        !            27:                case '$':
        !            28:                case '\'':
        !            29:                case '"':
        !            30:                        type = MEDIUM;
        !            31:                        break;
        !            32:                case '|': 
        !            33:                case ';': 
        !            34:                case '&':
        !            35:                        type = HARD;
        !            36:                        break;
        !            37:                }
        !            38:        }
        !            39:        switch (type) {
        !            40:        case HARD:
        !            41:                return(system(s));
        !            42:        case MEDIUM:
        !            43:                strcpy(p, "exec ");
        !            44:                strcat(p, s);
        !            45:                return(system(p));
        !            46:        case EASY:
        !            47:                strcpy(p,s);
        !            48:                nv = getargs(p, np);
        !            49:                t=np[0];
        !            50:                if ((strcmp(t, "mv") == 0)||
        !            51:                    (strcmp(t, "cp") == 0)||
        !            52:                    (strcmp(t, "rm") == 0)||
        !            53:                    (strcmp(t, "ls") == 0) ) {
        !            54:                        if (fork() == 0) {
        !            55:                                char b[100];
        !            56:                                signal(SIGINT, SIG_DFL);
        !            57:                                strcpy(b, "/bin/");
        !            58:                                strcat(b, t);
        !            59:                                np[nv] = 0;
        !            60:                                execv(b, np);
        !            61:                                fprintf(stderr, "Execv failed\n");
        !            62:                                exit(1);
        !            63:                        }
        !            64:                        wait(&stat);
        !            65:                        return(stat);
        !            66:                }
        !            67:                return(system(s));
        !            68:        }
        !            69: }
        !            70: 
        !            71: /*
        !            72:  * system():
        !            73:  *     same as library version, except that resets
        !            74:  *     default handling of signals in child, so that
        !            75:  *     user gets the behavior he expects.
        !            76:  */
        !            77: 
        !            78: system(s)
        !            79: char *s;
        !            80: {
        !            81:        int status, pid, w;
        !            82:        register int (*istat)(), (*qstat)();
        !            83: 
        !            84:        istat = signal(SIGINT, SIG_IGN);
        !            85:        qstat = signal(SIGQUIT, SIG_IGN);
        !            86:        if ((pid = fork()) == 0) {
        !            87:                signal(SIGINT, SIG_DFL);
        !            88:                signal(SIGQUIT, SIG_DFL);
        !            89:                execl("/bin/sh", "sh", "-c", s, 0);
        !            90:                _exit(127);
        !            91:        }
        !            92:        while ((w = wait(&status)) != pid && w != -1)
        !            93:                ;
        !            94:        if (w == -1)
        !            95:                status = -1;
        !            96:        signal(SIGINT, istat);
        !            97:        signal(SIGQUIT, qstat);
        !            98:        return(status);
        !            99: }
        !           100: 
        !           101: getargs(s, v)
        !           102: char *s, **v;
        !           103: {
        !           104:        int i;
        !           105: 
        !           106:        i = 0;
        !           107:        for (;;) {
        !           108:                v[i++]=s;
        !           109:                while (*s != 0 && *s!=' '&& *s != '\t')
        !           110:                        s++;
        !           111:                if (*s == 0)
        !           112:                        break;
        !           113:                *s++ =0;
        !           114:                while (*s == ' ' || *s == '\t')
        !           115:                        s++;
        !           116:                if (*s == 0)
        !           117:                        break;
        !           118:        }
        !           119:        return(i);
        !           120: }

unix.superglobalmegacorp.com

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