55 lines
1.0 KiB
C
55 lines
1.0 KiB
C
|
#include <sys/unistd.h>
|
||
|
#include <errno.h>
|
||
|
|
||
|
extern char **environ;
|
||
|
|
||
|
int
|
||
|
execv (const char *path, char * const *args) {
|
||
|
extern int execve (const char *, char * const *, char * const*);
|
||
|
return execve (path, args, environ);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
execl(const char *path, const char *arg1, ...) {
|
||
|
return execv (path, &arg1);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Copy string, until c or <nul> is encountered.
|
||
|
* NUL-terminate the destination string (s1).
|
||
|
*/
|
||
|
|
||
|
static char *
|
||
|
strccpy (char *s1, char *s2, char c) {
|
||
|
char *dest = s1;
|
||
|
while (*s2 && *s2 != c) {
|
||
|
*s1++ = *s2++;
|
||
|
}
|
||
|
*s1 = 0;
|
||
|
return dest;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
execvp(const char *file, char * const *args) {
|
||
|
extern char *getenv (const char *);
|
||
|
char *path = getenv ("PATH");
|
||
|
char buf[MAXNAMLEN];
|
||
|
|
||
|
if (file[0] == '/') { /* absolute pathname -- easy out */
|
||
|
return execv (file, args);
|
||
|
}
|
||
|
|
||
|
buf[0] = 0; /* lots of initialization here 8-) */
|
||
|
while (*path) {
|
||
|
strccpy (buf, path, ':');
|
||
|
strcat (buf, "/");
|
||
|
strcat (buf, file);
|
||
|
execv (buf, args);
|
||
|
if (errno != ENOENT)
|
||
|
return -1;
|
||
|
while (*path && *path != ':')
|
||
|
path++;
|
||
|
}
|
||
|
return -1;
|
||
|
}
|