|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Edward Wang at The University of California, Berkeley.
7: *
8: * Redistribution and use in source and binary forms are permitted provided
9: * that: (1) source distributions retain this entire copyright notice and
10: * comment, and (2) distributions including binaries display the following
11: * acknowledgement: ``This product includes software developed by the
12: * University of California, Berkeley and its contributors'' in the
13: * documentation or other materials provided with the distribution and in
14: * all advertising materials mentioning features or use of this software.
15: * Neither the name of the University nor the names of its contributors may
16: * be used to endorse or promote products derived from this software without
17: * specific prior written permission.
18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21: */
22:
23: #ifndef lint
24: static char sccsid[] = "@(#)wwspawn.c 3.15 (Berkeley) 6/6/90";
25: #endif /* not lint */
26:
27: #include "ww.h"
28: #include <sys/signal.h>
29:
30: /*
31: * There is a dead lock with vfork and closing of pseudo-ports.
32: * So we have to be sneaky about error reporting.
33: */
34: wwspawn(wp, file, argv)
35: register struct ww *wp;
36: char *file;
37: char **argv;
38: {
39: int pid;
40: int ret;
41: char erred = 0;
42: int s;
43:
44: s = sigblock(sigmask(SIGCHLD));
45: switch (pid = vfork()) {
46: case -1:
47: wwerrno = WWE_SYS;
48: ret = -1;
49: break;
50: case 0:
51: if (wwenviron(wp) >= 0)
52: execvp(file, argv);
53: erred = 1;
54: _exit(1);
55: default:
56: if (erred) {
57: wwerrno = WWE_SYS;
58: ret = -1;
59: } else {
60: wp->ww_pid = pid;
61: wp->ww_state = WWS_HASPROC;
62: ret = pid;
63: }
64: }
65: (void) sigsetmask(s);
66: if (wp->ww_socket >= 0) {
67: (void) close(wp->ww_socket);
68: wp->ww_socket = -1;
69: }
70: return ret;
71: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.