Commit | Line | Data |
---|---|---|
2dd7d7a6 | 1 | #ifndef lint |
7edc52ec | 2 | static char sccsid[] = "@(#)wwspawn.c 3.10 %G%"; |
2dd7d7a6 EW |
3 | #endif |
4 | ||
5 | #include "ww.h" | |
7c38ad4d | 6 | #include <sys/signal.h> |
2dd7d7a6 | 7 | |
eec72f58 EW |
8 | /* |
9 | * There is a dead lock with vfork and closing of pseudo-ports. | |
7ecf4dca | 10 | * So we have to be sneaky about error reporting. |
eec72f58 | 11 | */ |
7ecf4dca | 12 | wwspawn(wp, file, argv) |
2dd7d7a6 | 13 | register struct ww *wp; |
7ecf4dca EW |
14 | char *file; |
15 | char **argv; | |
2dd7d7a6 | 16 | { |
ac62cc78 | 17 | int pid; |
7ecf4dca EW |
18 | int ret; |
19 | char erred = 0; | |
7c38ad4d | 20 | int s; |
ac62cc78 | 21 | |
7c38ad4d | 22 | s = sigblock(sigmask(SIGCHLD)); |
ac62cc78 | 23 | switch (pid = vfork()) { |
2dd7d7a6 | 24 | case -1: |
03e75950 | 25 | wwerrno = WWE_SYS; |
7ecf4dca EW |
26 | ret = -1; |
27 | break; | |
2dd7d7a6 | 28 | case 0: |
7ecf4dca EW |
29 | if (wwenviron(wp) >= 0) |
30 | execvp(file, argv); | |
31 | erred = 1; | |
eec72f58 | 32 | _exit(1); |
2dd7d7a6 | 33 | default: |
7ecf4dca | 34 | if (erred) { |
eec72f58 | 35 | wwerrno = WWE_SYS; |
7ecf4dca | 36 | ret = -1; |
eec72f58 EW |
37 | } else { |
38 | wp->ww_pid = pid; | |
39 | wp->ww_state = WWS_HASPROC; | |
7ecf4dca | 40 | ret = pid; |
eec72f58 | 41 | } |
2dd7d7a6 | 42 | } |
7c38ad4d | 43 | (void) sigsetmask(s); |
7ecf4dca EW |
44 | if (wp->ww_socket >= 0) { |
45 | (void) close(wp->ww_socket); | |
46 | wp->ww_socket = -1; | |
47 | } | |
7ecf4dca | 48 | return ret; |
2dd7d7a6 | 49 | } |