unistd: add execvp()
[neatlibc.git] / unistd.c
blobf80cc982fba14fceef8938470fe04f7e746d403d
1 #include <time.h>
2 #include <stdarg.h>
3 #include <string.h>
4 #include <unistd.h>
6 int sleep(int n)
8 struct timespec req = {n, 0};
9 struct timespec rem;
10 if (nanosleep(&req, &rem))
11 return rem.tv_sec;
12 return 0;
15 #define EXECARGS (1 << 7)
17 int execle(char *path, ...)
19 va_list ap;
20 char *argv[EXECARGS];
21 char **envp;
22 int argc = 0;
23 va_start(ap, path);
24 while (argc + 1 < EXECARGS && (argv[argc] = va_arg(ap, char *)))
25 argc++;
26 envp = va_arg(ap, char **);
27 va_end(ap);
28 argv[argc] = NULL;
29 execve(path, argv, envp);
30 return -1;
33 int execvp(char *cmd, char *argv[])
35 char path[512];
36 char *p = getenv("PATH");
37 if (strchr(cmd, '/'))
38 return execve(cmd, argv, environ);
39 if (!p)
40 p = "/bin";
41 while (*p) {
42 char *s = path;
43 while (*p && *p != ':')
44 *s++ = *p++;
45 if (s != path)
46 *s++ = '/';
47 strcpy(s, cmd);
48 execve(path, argv, environ);
49 if (*p == ':')
50 p++;
52 return -1;
55 int wait(int *status)
57 return waitpid(-1, status, 0);