Annotation of coherent/d/lib/libc/sys/execvp.c, revision 1.1.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.