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: }

Defined functions

execat defined in line 67; used 2 times
  • in line 9, 34
execlp defined in line 12; used 1 times
execvp defined in line 18; used 5 times

Defined variables

shell defined in line 8; used 1 times
  • in line 47

Defined macros

NULL defined in line 6; used 1 times
  • in line 29
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 450
Valid CSS Valid XHTML 1.0 Strict