summaryrefslogtreecommitdiff
path: root/system/bicon/1e7128710f49ca1c53a892b9db3a364ec038f931.patch
diff options
context:
space:
mode:
Diffstat (limited to 'system/bicon/1e7128710f49ca1c53a892b9db3a364ec038f931.patch')
-rw-r--r--system/bicon/1e7128710f49ca1c53a892b9db3a364ec038f931.patch114
1 files changed, 114 insertions, 0 deletions
diff --git a/system/bicon/1e7128710f49ca1c53a892b9db3a364ec038f931.patch b/system/bicon/1e7128710f49ca1c53a892b9db3a364ec038f931.patch
new file mode 100644
index 0000000000..2ea806c5b2
--- /dev/null
+++ b/system/bicon/1e7128710f49ca1c53a892b9db3a364ec038f931.patch
@@ -0,0 +1,114 @@
+# From 1e7128710f49ca1c53a892b9db3a364ec038f931 Mon Sep 17 00:00:00 2001
+# From: Behdad Esfahbod <behdad@behdad.org>
+# Date: Tue, 14 Oct 2014 17:36:50 -0700
+# Subject: [PATCH] Properly exit if child exited but didn't die
+#
+# Happens, if for example you have a subprocess running in a shell but
+# exit the shell...
+# ---
+ bicon/pty_spawn.c | 29 ++++++++++++++++++++++-------
+ 1 file changed, 22 insertions(+), 7 deletions(-)
+
+diff --git a/bicon/pty_spawn.c b/bicon/pty_spawn.c
+index ad1da96..21ab737 100644
+--- a/bicon/pty_spawn.c
++++ b/bicon/pty_spawn.c
+@@ -10,6 +10,7 @@ namely the PSF License Agreement For Python 2.2.3
+ */
+ #include <stdlib.h>
+ #include <stdio.h>
++#include <string.h>
+ #include <unistd.h>
+ #include <errno.h>
+ #include <pty.h>
+@@ -21,6 +22,8 @@ namely the PSF License Agreement For Python 2.2.3
+ #include <signal.h>
+ #include "pty_spawn.h"
+
++static volatile int done;
++
+ static pid_t
+ _fork (int *master_fd, int *slave_fd)
+ {
+@@ -66,7 +69,7 @@ _xread (
+ int ret;
+ do {
+ ret = read (fd, buf, count);
+- } while (ret == -1 && errno == EINTR);
++ } while (ret == -1 && errno == EINTR && !done);
+ return ret;
+ }
+
+@@ -81,7 +84,7 @@ _xwrite (
+ {
+ do {
+ ret = write (fd, buf, count);
+- } while (ret == -1 && errno == EINTR);
++ } while (ret == -1 && errno == EINTR && !done);
+ if (ret == -1)
+ {
+ fprintf (stderr, "bicon: write() failed.\n");
+@@ -105,7 +108,7 @@ _copy (
+ ino_t cwd = -1;
+ char _proc_child_cwd[32];
+ snprintf (_proc_child_cwd, sizeof (_proc_child_cwd), "/proc/%u/cwd", pid);
+- for (;;)
++ for (;!done;)
+ {
+
+ FD_ZERO (&rfds);
+@@ -114,9 +117,9 @@ _copy (
+ ret = select (master_fd + 1, &rfds, NULL, NULL, ptimeout);
+ if (-1 == ret)
+ {
+- if (errno == EINTR)
++ if (errno == EINTR && !done)
+ continue;
+- return -1;
++ return;
+ }
+ if (0 == ret)
+ {
+@@ -147,14 +150,14 @@ _copy (
+ {
+ count = _xread (master_read, master_fd, buf, sizeof (buf));
+ if (count == -1)
+- return -1;
++ return;
+ _xwrite (1, buf, count);
+ }
+ if (FD_ISSET (0, &rfds))
+ {
+ count = _xread (stdin_read, 0, buf, sizeof (buf));
+ if (count == -1)
+- return -1;
++ return;
+ _xwrite (master_fd, buf, count);
+ }
+ /* Set timeout, such that if things are steady, we update cwd
+@@ -180,6 +183,13 @@ resize(int dummy)
+ kill(pid, SIGWINCH);
+ }
+
++static void
++child(int dummy)
++{
++ done = 1;
++ fprintf (stderr, "done\n");
++}
++
+ int
+ bicon_spawn (
+ const char *file,
+@@ -206,6 +216,11 @@ bicon_spawn (
+ sa.sa_handler = resize;
+ if (sigaction(SIGWINCH, &sa, NULL) == -1)
+ fprintf (stderr, "bicon: sigaction() failed.\n");
++ sigemptyset (&sa.sa_mask);
++ sa.sa_flags = 0;
++ sa.sa_handler = child;
++ if (sigaction(SIGCHLD, &sa, NULL) == -1)
++ fprintf (stderr, "bicon: sigaction() failed.\n");
+
+ tcgetattr (1, &ts);
+ newts = ts;