projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mapnl option to window
[unix-history]
/
usr
/
src
/
usr.bin
/
window
/
wwspawn.c
diff --git
a/usr/src/usr.bin/window/wwspawn.c
b/usr/src/usr.bin/window/wwspawn.c
index
308a0a2
..
08a0f6a
100644
(file)
--- a/
usr/src/usr.bin/window/wwspawn.c
+++ b/
usr/src/usr.bin/window/wwspawn.c
@@
-1,24
+1,49
@@
#ifndef lint
#ifndef lint
-static char
*sccsid = "@(#)wwspawn.c 3.4 83/10/19
";
+static char
sccsid[] = "@(#)wwspawn.c 3.10 %G%
";
#endif
#include "ww.h"
#endif
#include "ww.h"
+#include <sys/signal.h>
-wwfork(wp)
+/*
+ * There is a dead lock with vfork and closing of pseudo-ports.
+ * So we have to be sneaky about error reporting.
+ */
+wwspawn(wp, file, argv)
register struct ww *wp;
register struct ww *wp;
+char *file;
+char **argv;
{
{
- switch (wp->ww_pid = fork()) {
+ int pid;
+ int ret;
+ char erred = 0;
+ int s;
+
+ s = sigblock(sigmask(SIGCHLD));
+ switch (pid = vfork()) {
case -1:
wwerrno = WWE_SYS;
case -1:
wwerrno = WWE_SYS;
- return -1;
+ ret = -1;
+ break;
case 0:
case 0:
- wp->ww_state = WWS_INCHILD;
- wwenviron(wp);
- return 0;
+ if (wwenviron(wp) >= 0)
+ execvp(file, argv);
+ erred = 1;
+ _exit(1);
default:
default:
- wp->ww_state = WWS_HASPROC;
- (void) close(wp->ww_tty);
- wp->ww_tty = -1;
- return wp->ww_pid;
+ if (erred) {
+ wwerrno = WWE_SYS;
+ ret = -1;
+ } else {
+ wp->ww_pid = pid;
+ wp->ww_state = WWS_HASPROC;
+ ret = pid;
+ }
+ }
+ (void) sigsetmask(s);
+ if (wp->ww_socket >= 0) {
+ (void) close(wp->ww_socket);
+ wp->ww_socket = -1;
}
}
+ return ret;
}
}