From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-f194.google.com (mail-lj1-f194.google.com [209.85.208.194]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 59559469719 for ; Tue, 10 Mar 2020 11:02:12 +0300 (MSK) Received: by mail-lj1-f194.google.com with SMTP id g12so716886ljj.3 for ; Tue, 10 Mar 2020 01:02:12 -0700 (PDT) Date: Tue, 10 Mar 2020 11:02:09 +0300 From: Cyrill Gorcunov Message-ID: <20200310080209.GE27301@uranus> References: <20200302201227.31785-1-gorcunov@gmail.com> <20200302201227.31785-7-gorcunov@gmail.com> <20200306143047.GA27301@uranus> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200306143047.GA27301@uranus> Subject: [Tarantool-patches] [PATCH v3 6/7] popen: use ioctl on macos List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tml , Alexander Turenko 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 --- 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 +#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