Mercurial > emacs
changeset 83086:347ce3d5d79c
Fix dropping of the controlling tty on Solaris (Dan Nicolaescu).
src/term.c (dissociate_if_controlling_tty): New function for dropping
the controlling terminal. Added POSIX-compatible method beside BSD
ioctl. (Reported by Dan Nicolaescu).
(term_init, Fresume_tty): Use the new function.
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-126
author | Karoly Lorentey <lorentey@elte.hu> |
---|---|
date | Sun, 28 Mar 2004 06:17:38 +0000 |
parents | c0e839b60d0b |
children | efd88b526bdb |
files | src/term.c |
diffstat | 1 files changed, 47 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/src/term.c Sun Mar 28 06:08:38 2004 +0000 +++ b/src/term.c Sun Mar 28 06:17:38 2004 +0000 @@ -29,7 +29,9 @@ #include <sys/file.h> #include <unistd.h> /* For isatty. */ -#include <sys/ioctl.h> /* For TIOCNOTTY. */ +#include <termio.h> /* For TIOCNOTTY. */ + +#include <signal.h> #include "lisp.h" #include "termchar.h" @@ -43,6 +45,8 @@ #include "dispextern.h" #include "window.h" #include "keymap.h" +#include "syssignal.h" +#include "systty.h" /* For now, don't try to include termcap.h. On some systems, configure finds a non-standard termcap.h that the main build @@ -2306,6 +2310,33 @@ initial_display = NULL; } +/* Drop the controlling terminal if fd is the same device. */ +void +dissociate_if_controlling_tty (int fd) +{ +#if defined (USG) && !defined (BSD_PGRPS) + int pgid; + EMACS_GET_TTY_PGRP (fd, &pgid); + if (pgid != -1) + { + setpgrp (); + no_controlling_tty = 1; + } +#else +#ifdef TIOCNOTTY /* Try BSD ioctls. */ + sigblock (sigmask (SIGTTOU)); + if (ioctl (fd, TIOCNOTTY, 0) != -1) + { + no_controlling_tty = 1; + } + sigunblock (sigmask (SIGTTOU)); +#else + /* Unknown system. */ + croak (); +#endif /* ! TIOCNOTTY */ +#endif /* ! USG */ +} + /* Create a termcap display on the tty device with the given name and type. @@ -2413,18 +2444,10 @@ /* Alas, O_IGNORE_CTTY is a GNU extension that seems to be only defined on Hurd. On other systems, we need to dissociate ourselves from the controlling tty when we want to open a - frame on the same terminal. The function setsid should be - used for this, but it didn't work for me. */ + frame on the same terminal. */ fd = emacs_open (name, O_RDWR | O_NOCTTY, 0); - -#ifdef TIOCNOTTY - /* Drop our controlling tty if it is the same device. */ - if (ioctl (fd, TIOCNOTTY, 0) != -1) - { - no_controlling_tty = 1; - } -#endif + #endif /* O_IGNORE_CTTY */ if (fd < 0) @@ -2438,6 +2461,8 @@ error ("Not a tty device: %s", name); } + dissociate_if_controlling_tty (fd); + file = fdopen (fd, "w+"); tty->name = xstrdup (name); tty->input = file; @@ -2495,7 +2520,13 @@ Wcm_clear (tty); buffer = (char *) xmalloc (buffer_size); + + /* On some systems, tgetent tries to access the controlling + terminal. */ + sigblock (sigmask (SIGTTOU)); status = tgetent (buffer, terminal_type); + sigunblock (sigmask (SIGTTOU)); + if (status < 0) { #ifdef TERMINFO @@ -3265,15 +3296,11 @@ if (!d->display_info.tty->input) { fd = emacs_open (d->display_info.tty->name, O_RDWR | O_NOCTTY, 0); - -#ifdef TIOCNOTTY - /* Drop our controlling tty if it is the same device. */ - if (ioctl (fd, TIOCNOTTY, 0) != -1) - { - no_controlling_tty = 1; - } -#endif - + + /* XXX What if open fails? */ + + dissociate_if_controlling_tty (fd); + d->display_info.tty->output = fdopen (fd, "w+"); d->display_info.tty->input = d->display_info.tty->output;