Annotation of coherent/d/lib/libc/sys/execvp.c, revision 1.1

1.1     ! root        1: /* libc/sys/execvp.c */
        !             2: 
        !             3: #include <stdio.h>
        !             4: #include <errno.h>
        !             5: #include <path.h>
        !             6: #include <string.h>
        !             7: 
        !             8: extern char    *getenv();
        !             9: 
        !            10: #define        SHELL   "/bin/sh"               /* shell name */
        !            11: 
        !            12: /*
        !            13:  * execvp() is a version of execv()
        !            14:  * which mimics the actions of the shell
        !            15:  * in using PATH search rules and running a shell file.
        !            16:  */
        !            17: execvp(name, argp) char *name; char *argp[];
        !            18: {
        !            19:        register char *p1, *p2, *sp;
        !            20:        char fname[MAXPATH];
        !            21:        int isabs;
        !            22: 
        !            23:        if ((sp = getenv("PATH")) == NULL)              /* find PATH */
        !            24:                sp = DEFPATH;                           /* or take default */
        !            25:        isabs = (strchr(name, PATHSEP) != NULL);        /* iff name is absolute */
        !            26:        for (;;) {
        !            27:                if (isabs)
        !            28:                        strcpy(fname, name);            /* use given name */
        !            29:                else {
        !            30:                        for (p2 = fname; *sp != '\0' && *sp != LISTSEP; )
        !            31:                                *p2++ = *sp++;          /* copy pathname component */
        !            32:                        if (p2 != fname)
        !            33:                                *p2++ = PATHSEP;        /* append PATHSEP if nonempty */
        !            34:                        for (p1 = name; *p1 != '\0'; )
        !            35:                                *p2++ = *p1++;          /* append name */
        !            36:                        *p2 = '\0';                     /* and NUL-terminate */
        !            37:                }
        !            38:                execv(fname, argp);                     /* go for it */
        !            39:                if (isabs && errno != ENOEXEC)
        !            40:                        break;                          /* failed */
        !            41:                if (errno == ENOEXEC) {                 /* try again with sh */
        !            42:                        p1 = argp[-1];
        !            43:                        p2 = argp[0];
        !            44:                        argp[-1] = SHELL;
        !            45:                        argp[0] = fname;
        !            46:                        execv(argp[-1], argp-1);
        !            47:                        argp[-1] = p1;
        !            48:                        argp[0] = p2;
        !            49:                        break;                          /* failed */
        !            50:                }
        !            51:                if (*sp == '\0')
        !            52:                        break;                          /* end of PATH, failed */
        !            53:                if (*sp == LISTSEP)
        !            54:                        sp++;
        !            55:        }
        !            56:        return -1;                                      /* failed */
        !            57: }
        !            58: 
        !            59: /* end of execvp.c */

unix.superglobalmegacorp.com

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