Skip to content
Snippets Groups Projects
Commit f5dc5ea6 authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Kirill Yukhin
Browse files

popen: handle sid on macos


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, then initiate a new process group.

Signed-off-by: default avatarCyrill Gorcunov <gorcunov@gmail.com>
parent 86ec3a5c
No related branches found
No related tags found
No related merge requests found
......@@ -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,29 @@ 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);
}
if (setpgrp() == -1) {
say_syserror("child: setpgrp failed");
goto exit_child;
}
#endif
}
if (opts->flags & POPEN_FLAG_CLOSE_FDS) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment