[Tarantool-patches] [PATCH v3 6/7] popen: use ioctl on macos
Cyrill Gorcunov
gorcunov at gmail.com
Tue Mar 10 11:02:09 MSK 2020
Due to os specifics we can't call setsid after
vfork on macos (vfork is not longer a part of
posix btw). Instead we can use ioctl to clear
the session.
Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>
---
branch gorcunov/gh-4031-popen-fixup-3
Sasha, I do not send the whole series since the only
this particular patch is changed. Thus if needed we
can merge from the branch above.
src/lib/core/popen.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/src/lib/core/popen.c b/src/lib/core/popen.c
index 6e5ca21bd..cc3d2d946 100644
--- a/src/lib/core/popen.c
+++ b/src/lib/core/popen.c
@@ -16,6 +16,10 @@
#include "coio.h"
#include "say.h"
+#ifdef TARGET_OS_DARWIN
+# include <sys/ioctl.h>
+#endif
+
/* A mapping to find popens by their pids in a signal handler */
static struct mh_i32ptr_t *popen_pids_map = NULL;
@@ -833,15 +837,24 @@ popen_new(struct popen_opts *opts)
if (opts->flags & POPEN_FLAG_RESTORE_SIGNALS)
signal_reset();
- /*
- * We have to be a session leader otherwise
- * won't be able to kill a group of children.
- */
if (opts->flags & POPEN_FLAG_SETSID) {
+#ifndef TARGET_OS_DARWIN
if (setsid() == -1) {
say_syserror("child: setsid failed");
goto exit_child;
}
+#else
+ /*
+ * Note that on MacOS we're not allowed to
+ * set sid after vfork (it is OS specific)
+ * thus use ioctl instead.
+ */
+ int ttyfd = open("/dev/tty", O_RDWR, 0);
+ if (ttyfd >= 0) {
+ ioctl(ttyfd, TIOCNOTTY, 0);
+ close(ttyfd);
+ }
+#endif
}
if (opts->flags & POPEN_FLAG_CLOSE_FDS) {
--
2.20.1
More information about the Tarantool-patches
mailing list