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
date and time created 84/05/06 18:00:10 by edward
[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
914c1b1
..
c036b12
100644
(file)
--- a/
usr/src/usr.bin/window/wwspawn.c
+++ b/
usr/src/usr.bin/window/wwspawn.c
@@
-1,25
+1,49
@@
#ifndef lint
#ifndef lint
-static char *sccsid = "@(#)wwspawn.c 3.
3 83/08/2
6";
+static char *sccsid = "@(#)wwspawn.c 3.
9 84/04/1
6";
#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:
- moncontrol(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;
}
}