[comp.os.minix] execlp

tholm@uvicctr.UUCP (Terrence W. Holm) (08/26/88)

EFTH MINIX report #28  - August 1988 -  execlp(3) & execvp(3)


There follows an implementation of execlp(3) and execvp(3)
for Minix. Please consider this public domain software.

A "man" page is included.


----------------------------------------------------------
echo x - execl.3
gres '^X' '' > execl.3 << '/'
XSUBROUTINES
X    execl(3)    	- load a process image from a file
X
XINVOCATION
X    execl( path, arg0, arg1, ..., argn, (char *) 0 )
X      char *path, *arg0, *arg1, ..., *argn;
X
X    execle( path, arg0, arg1, ..., argn, (char *) 0, envp )
X      char *path, *arg0, *arg1, ..., *argn, *envp[];
X
X    execlp( file, arg0, arg1, ..., argn, (char *) 0 )
X      char *file, *arg0, *arg1, ..., *argn;
X
X    execv( path, argv )
X      char *path, *argv[];
X
X    execvp( file, argv )
X      char *file, *argv[];
X
X    execn( name )
X      char *name;
X
XEXPLANATION
X    These calls are simpler calls to execve(2). The subroutines
X    execl(3), execle(3) and execlp(3) allow the "argv" vector to
X    be given as a list of strings, terminated by a (char *) 0.
X    This differentiates them from execv(3), execve(2) and execvp(3).
X
X    Execle(3) and execve(2) allow an environment parameter, all 
X    of the other calls pass the current environment.
X
X    Execlp(3) and execvp(3) are like execl(3) and execv(3), except
X    that they use the environment variable $PATH as a search list
X    of possible locations for the executable file, but only if <file>
X    does not start with a '/'.
X
X    The path search list is a list of directory names separated by
X    ':'s. If a colon appears at the beginning or end of the list,
X    or two appear together, then an empty prefix is tried. If $PATH
X    is not in the environment, it defaults to ":/bin:/usr/bin".
X
X    For example, with the default $PATH and the file "sh", the
X    attempts will be: "sh", "/bin/sh" and "/usr/bin/sh".
X
X    For the special case of no argument list and no environment
X    the execn(3) call is available, though this should not be used
X    by applications.
X
XRESULTS
X    o/w : Will not return.
X     -1 : Error. If <file> is not an executable file in the search
X          path, then errno is set to ENOENT.
X
XREFERENCES
X    execve(2), fork(2), environ(4)
/
echo x - execlp.c
gres '^X' '' > execlp.c << '/'
X/*  execlp(3) and execvp(3)
X *
X *  Author: Terrence W. Holm          July 1988
X *
X *
X *  Execlp(3) and execvp(3) are like execl(3) and execv(3),
X *  except that they use the environment variable $PATH as
X *  a search list of possible locations for the executable
X *  file, if <file> does not start with a '/'.
X *
X *  The path search list is a list of directory names separated
X *  by ':'s. If a colon appears at the beginning or end of the
X *  list, or two appear together, then an empty prefix is
X *  tried. If $PATH is not in the environment, it defaults to
X *  ":/bin:/usr/bin".
X *
X *  For example, if <file> is "sh", and the $PATH is
X *  ":/bin:/usr/local:/usr/bin", then the attempts will be:
X *  "sh", "/bin/sh", "/usr/local/sh" and "/usr/bin/sh".
X *
X *  If the <file> is not an executable file in one of the
X *  directories, then -1 is returned.
X */
X
X#include <errno.h>
X#include <string.h>
X#include <unistd.h>
X
X#ifndef X_OK
X#define X_OK 1
X#endif
X
X#define  NULL  (char *) 0
X
Xextern char *getenv();
X
Xextern char **environ;
Xextern int    errno;
X
X
Xexeclp( file, arg0 )
X  char *file;
X  char *arg0;
X
X  {
X  return( execvp( file, &arg0 ) );
X  }
X
X
Xexecvp( file, argv )
X  char *file;
X  char *argv[];
X
X  {
X  char path_name[100];
X  char *next;
X  char *path = getenv( "PATH" );
X
X  if ( path == NULL )
X    path = ":/bin:/usr/bin";
X
X  if ( file[0] == '/' )
X    path = "";
X
X  do  {
X      next = strchr( path, ':' );
X
X      if ( next == NULL )
X	  strcpy( path_name, path );
X      else
X	  {
X	  *path_name = '\0';
X	  strncat( path_name, path, next - path );
X	  path = next + 1;
X	  }
X
X      if ( *path_name != '\0' )
X          strcat( path_name, "/" );
X
X      strcat( path_name, file );
X
X      if ( access( path_name, X_OK ) == 0 )
X	  execve( path_name, argv, environ );
X      } while ( next != NULL );
X
X  errno = ENOENT;
X  return( -1 );
X  }
/
----------------------------------------------------------

		Edwin L. Froese
		  uw-beaver!ubc-cs!mprg!handel!froese

		Terrence W. Holm
		  uw-beaver!uvicctr!tholm