Ignore -w flag so can get passed to rlogin
[unix-history] / usr / src / usr.bin / window / wwspawn.c
CommitLineData
2dd7d7a6 1#ifndef lint
7edc52ec 2static 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 12wwspawn(wp, file, argv)
2dd7d7a6 13register struct ww *wp;
7ecf4dca
EW
14char *file;
15char **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}