# HG changeset patch # User Jan Dj¸«£rv # Date 1045851233 0 # Node ID 6dc5bfe9589b7a6f413ee586e508216e90dd48cc # Parent 7efa3eeb04ecf53883f33988b3e25ef471b2a6a9 Removed subtty, workaround for when TIOCSIGSEND fails. diff -r 7efa3eeb04ec -r 6dc5bfe9589b src/ChangeLog --- a/src/ChangeLog Fri Feb 21 16:38:34 2003 +0000 +++ b/src/ChangeLog Fri Feb 21 18:13:53 2003 +0000 @@ -1,3 +1,13 @@ +2003-02-21 Jan Dj,Ad(Brv + + * process.h: Removed subtty field from struct Lisp_Process. + + * process.c (create_process): Remove setting of subtty. + (emacs_get_tty_pgrp): New function. + (Fprocess_running_child_p, process_send_signal): Call + emacs_get_tty_pgrp instead of ioctl. + (process_send_signal): Call EMACS_KILLPG if ioctl TIOCSIGSEND fails. + 2003-02-21 Kai Gro,A_(Bjohann * keymap.c (Fdefine_key): Doc fix. diff -r 7efa3eeb04ec -r 6dc5bfe9589b src/process.c --- a/src/process.c Fri Feb 21 16:38:34 2003 +0000 +++ b/src/process.c Fri Feb 21 18:13:53 2003 +0000 @@ -1782,11 +1782,12 @@ chan_process[inchannel] = process; XSETINT (XPROCESS (process)->infd, inchannel); XSETINT (XPROCESS (process)->outfd, outchannel); - /* Record the tty descriptor used in the subprocess. */ - if (forkin < 0) - XPROCESS (process)->subtty = Qnil; - else - XSETFASTINT (XPROCESS (process)->subtty, forkin); + + /* Previously we recorded the tty descriptor used in the subprocess. + It was only used for getting the foreground tty process, so now + we just reopen the device (see emacs_get_tty_pgrp) as this is + more portable (see USG_SUBTTY_WORKS above). */ + XPROCESS (process)->pty_flag = (pty_flag ? Qt : Qnil); XPROCESS (process)->status = Qrun; setup_process_coding_systems (process); @@ -2044,7 +2045,6 @@ EMACS_SET_SECS_USECS (offset, 1, 0); timer = start_atimer (ATIMER_RELATIVE, offset, create_process_1, 0); - XPROCESS (process)->subtty = Qnil; if (forkin >= 0) emacs_close (forkin); @@ -5107,6 +5107,33 @@ return Qnil; } +/* Return the foreground process group for the tty/pty that + the process P uses. */ +static int +emacs_get_tty_pgrp (p) + struct Lisp_Process *p; +{ + int gid = -1; + +#ifdef TIOCGPGRP + if (ioctl (XINT (p->infd), TIOCGPGRP, &gid) == -1 && ! NILP (p->tty_name)) + { + int fd; + /* Some OS:es (Solaris 8/9) does not allow TIOCGPGRP from the + master side. Try the slave side. */ + fd = emacs_open (XSTRING (p->tty_name)->data, O_RDONLY, 0); + + if (fd != -1) + { + ioctl (fd, TIOCGPGRP, &gid); + emacs_close (fd); + } + } +#endif /* defined (TIOCGPGRP ) */ + + return gid; +} + DEFUN ("process-running-child-p", Fprocess_running_child_p, Sprocess_running_child_p, 0, 1, 0, doc: /* Return t if PROCESS has given the terminal to a child. @@ -5117,7 +5144,7 @@ { /* Initialize in case ioctl doesn't exist or gives an error, in a way that will cause returning t. */ - int gid = 0; + int gid; Lisp_Object proc; struct Lisp_Process *p; @@ -5131,12 +5158,7 @@ error ("Process %s is not active", SDATA (p->name)); -#ifdef TIOCGPGRP - if (!NILP (p->subtty)) - ioctl (XFASTINT (p->subtty), TIOCGPGRP, &gid); - else - ioctl (XINT (p->infd), TIOCGPGRP, &gid); -#endif /* defined (TIOCGPGRP ) */ + gid = emacs_get_tty_pgrp (p); if (gid == XFASTINT (p->pid)) return Qnil; @@ -5288,19 +5310,13 @@ But, TIOCGPGRP does not work on E50 ;-P works fine on E60" His patch indicates that if TIOCGPGRP returns an error, then we should just assume that p->pid is also the process group id. */ - { - int err; - - if (!NILP (p->subtty)) - err = ioctl (XFASTINT (p->subtty), TIOCGPGRP, &gid); - else - err = ioctl (XINT (p->infd), TIOCGPGRP, &gid); - - if (err == -1) - /* If we can't get the information, assume - the shell owns the tty. */ - gid = XFASTINT (p->pid); - } + + gid = emacs_get_tty_pgrp (p); + + if (gid == -1) + /* If we can't get the information, assume + the shell owns the tty. */ + gid = XFASTINT (p->pid); /* It is not clear whether anything really can set GID to -1. Perhaps on some system one of those ioctls can or could do so. @@ -5362,7 +5378,10 @@ /* gid may be a pid, or minus a pgrp's number */ #ifdef TIOCSIGSEND if (!NILP (current_group)) - ioctl (XINT (p->infd), TIOCSIGSEND, signo); + { + if (ioctl (XINT (p->infd), TIOCSIGSEND, signo) == -1) + EMACS_KILLPG (gid, signo); + } else { gid = - XFASTINT (p->pid); diff -r 7efa3eeb04ec -r 6dc5bfe9589b src/process.h --- a/src/process.h Fri Feb 21 16:38:34 2003 +0000 +++ b/src/process.h Fri Feb 21 18:13:53 2003 +0000 @@ -33,9 +33,6 @@ Lisp_Object infd; /* Descriptor by which we write to this process */ Lisp_Object outfd; - /* Descriptor for the tty which this process is using. - nil if we didn't record it (on some systems, there's no need). */ - Lisp_Object subtty; /* Name of subprocess terminal. */ Lisp_Object tty_name; /* Name of this process */