home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / libc / gen / execvp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  1.3 KB  |  84 lines

  1. /*
  2.  *    execlp(name, arg,...,0)    (like execl, but does path search)
  3.  *    execvp(name, argv)    (like execv, but does path search)
  4.  */
  5. #include <errno.h>
  6. #define    NULL    0
  7.  
  8. static    char shell[] =    "/bin/sh";
  9. char    *execat(), *getenv();
  10. extern    errno;
  11.  
  12. execlp(name, argv)
  13. char *name, *argv;
  14. {
  15.     return(execvp(name, &argv));
  16. }
  17.  
  18. execvp(name, argv)
  19. char *name, **argv;
  20. {
  21.     char *pathstr;
  22.     register char *cp;
  23.     char fname[128];
  24.     char *newargs[256];
  25.     int i;
  26.     register unsigned etxtbsy = 1;
  27.     register eacces = 0;
  28.  
  29.     if ((pathstr = getenv("PATH")) == NULL)
  30.         pathstr = ":/bin:/usr/bin";
  31.     cp = index(name, '/')? "": pathstr;
  32.  
  33.     do {
  34.         cp = execat(cp, name, fname);
  35.     retry:
  36.         execv(fname, argv);
  37.         switch(errno) {
  38.         case ENOEXEC:
  39.             newargs[0] = "sh";
  40.             newargs[1] = fname;
  41.             for (i=1; newargs[i+1]=argv[i]; i++) {
  42.                 if (i>=254) {
  43.                     errno = E2BIG;
  44.                     return(-1);
  45.                 }
  46.             }
  47.             execv(shell, newargs);
  48.             return(-1);
  49.         case ETXTBSY:
  50.             if (++etxtbsy > 5)
  51.                 return(-1);
  52.             sleep(etxtbsy);
  53.             goto retry;
  54.         case EACCES:
  55.             eacces++;
  56.             break;
  57.         case ENOMEM:
  58.         case E2BIG:
  59.             return(-1);
  60.         }
  61.     } while (cp);
  62.     if (eacces)
  63.         errno = EACCES;
  64.     return(-1);
  65. }
  66.  
  67. static char *
  68. execat(s1, s2, si)
  69. register char *s1, *s2;
  70. char *si;
  71. {
  72.     register char *s;
  73.  
  74.     s = si;
  75.     while (*s1 && *s1 != ':' && *s1 != '-')
  76.         *s++ = *s1++;
  77.     if (si != s)
  78.         *s++ = '/';
  79.     while (*s2)
  80.         *s++ = *s2++;
  81.     *s = '\0';
  82.     return(*s1? ++s1: 0);
  83. }
  84.