exec.c - vx32 - Local 9vx git repository for patches.
(HTM) git clone git://r-36.net/vx32
(DIR) Log
(DIR) Files
(DIR) Refs
---
exec.c (1185B)
---
1 #include <unistd.h>
2 #include <stdlib.h>
3 #include <errno.h>
4 #include <sys/stat.h>
5 #include <string.h>
6 #include <stdio.h>
7 #include "syscall.h"
8
9 int execl(const char *path, const char *arg, ...)
10 {
11 return execv(path, (char *const*)&arg);
12 }
13
14 int execv(const char *path, char *const arg[])
15 {
16 return execve(path, arg, environ);
17 }
18
19 int execve(const char *path, char *const arg[], char *const env[])
20 {
21 return syscall(VXSYSEXEC, (int)path, (int)arg, (int)env, 0, 0);
22 }
23
24 int execlp(const char *path, const char *arg, ...)
25 {
26 return execvp(path, (char*const*)&arg);
27 }
28
29 int execvp(const char *file, char *const arg[])
30 {
31 struct stat st;
32
33 if(file[0] == '/' || (file[0] == '.' && file[1] == '/'))
34 return execv(file, arg);
35
36 char buf[1024];
37 char *path = getenv("PATH");
38 if(path == NULL){
39 errno = ENOENT;
40 return -1;
41 }
42 char *p, *ep;
43 int n;
44 for(p=path; p; p=ep){
45 ep = strchr(p, ':');
46 if(ep)
47 n = ep++ - p;
48 else
49 n = strlen(p);
50 if(n+1+strlen(file)+1 > sizeof buf)
51 continue;
52 if(n == 0)
53 strcpy(buf, file);
54 else{
55 memmove(buf, p, n);
56 buf[n] = '/';
57 strcpy(buf+n+1, file);
58 }
59 if(stat(buf, &st) >= 0)
60 return execv(buf, arg);
61 }
62 errno = ENOENT;
63 return -1;
64 }