blob: 4e9d6dee364e40211443af2a6d02d9af889b3928 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
/* See LICENSE file for copyright and license details. */
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <stdarg.h>
#include <stdlib.h>
#include <unistd.h>
#include "util.h"
int
spawnvp(char *dir, char *file, char *argv[])
{
pid_t pid;
int status, r;
pid = fork();
switch (pid) {
case -1:
return -1;
case 0:
if (dir != NULL && chdir(dir) == -1)
exit(1);
execvp(file, argv);
_exit(1);
default:
while ((r = waitpid(pid, &status, 0)) == -1 && errno == EINTR)
continue;
if (r == -1)
return -1;
if (WIFEXITED(status) && WEXITSTATUS(status) != 0)
return -1;
}
return 0;
}
int
spawnlp(char *dir, char *file, char *argv0, ...)
{
char *argv[NR_ARGS];
va_list ap;
int argc;
va_start(ap, argv0);
argv[0] = argv0;
for (argc = 1; (argv[argc] = va_arg(ap, char *)) != (void *)0; argc++)
;
argv[argc] = NULL;
va_end(ap);
return spawnvp(dir, file, argv);
}
|