#endif
unblock_child_signal (&oldset);
-
-#ifdef DARWIN_OS
- /* Darwin doesn't let us run setsid after a vfork, so use
- TIOCNOTTY when necessary. */
- int j = emacs_open (DEV_TTY, O_RDWR, 0);
- if (j >= 0)
- {
- ioctl (j, TIOCNOTTY, 0);
- emacs_close (j);
- }
-#else
- setsid ();
-#endif
+ dissociate_controlling_tty ();
/* Emacs ignores SIGPIPE, but the child should not. */
signal (SIGPIPE, SIG_DFL);
}
}
+void
+dissociate_controlling_tty (void)
+{
+ if (setsid () < 0)
+ {
+#ifdef TIOCNOTTY
+ /* Needed on Darwin after vfork, since setsid fails in a vforked
+ child that has not execed.
+ I wonder: would just ioctl (fd, TIOCNOTTY, 0) work here, for
+ some fd that the caller already has? */
+ int ttyfd = emacs_open (DEV_TTY, O_RDWR, 0);
+ if (0 <= ttyfd)
+ {
+ ioctl (ttyfd, TIOCNOTTY, 0);
+ emacs_close (ttyfd);
+ }
+#endif
+ }
+}
+
/* Indexes of file descriptors in open_fds. */
enum
{
{
/* Make the pty be the controlling terminal of the process. */
#ifdef HAVE_PTYS
- /* First, disconnect its current controlling terminal.
- Do this even if !PTY_FLAG; see Bug#30762. */
- setsid ();
+ dissociate_controlling_tty ();
+
/* Make the pty's terminal the controlling terminal. */
if (pty_flag && forkin >= 0)
{
}
#endif
#endif
-#ifdef TIOCNOTTY
- /* In 4.3BSD, the TIOCSPGRP bug has been fixed, and now you
- can do TIOCSPGRP only to the process's controlling tty. */
- if (pty_flag)
- {
- /* I wonder: would just ioctl (0, TIOCNOTTY, 0) work here?
- I can't test it since I don't have 4.3. */
- int j = emacs_open (DEV_TTY, O_RDWR, 0);
- if (j >= 0)
- {
- ioctl (j, TIOCNOTTY, 0);
- emacs_close (j);
- }
- }
-#endif /* TIOCNOTTY */
#if !defined (DONT_REOPEN_PTY)
/*** There is a suggestion that this ought to be a