Index: src/process.c =================================================================== RCS file: /cvsroot/emacs/emacs/src/process.c,v retrieving revision 1.399 diff -c -r1.399 process.c *** src/process.c 10 Feb 2003 13:51:43 -0000 1.399 --- src/process.c 15 Feb 2003 16:57:10 -0000 *************** *** 5104,5109 **** --- 5104,5136 ---- 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. *************** *** 5114,5120 **** { /* Initialize in case ioctl doesn't exist or gives an error, in a way that will cause returning t. */ ! int gid = 0; Lisp_Object proc; struct Lisp_Process *p; --- 5141,5147 ---- { /* Initialize in case ioctl doesn't exist or gives an error, in a way that will cause returning t. */ ! int gid; Lisp_Object proc; struct Lisp_Process *p; *************** *** 5128,5139 **** 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 ) */ if (gid == XFASTINT (p->pid)) return Qnil; --- 5155,5161 ---- error ("Process %s is not active", SDATA (p->name)); ! gid = emacs_get_tty_pgrp (p); if (gid == XFASTINT (p->pid)) return Qnil; *************** *** 5285,5303 **** 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); ! } /* 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. --- 5307,5319 ---- 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. */ ! 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. *************** *** 5359,5365 **** /* gid may be a pid, or minus a pgrp's number */ #ifdef TIOCSIGSEND if (!NILP (current_group)) ! ioctl (XINT (p->infd), TIOCSIGSEND, signo); else { gid = - XFASTINT (p->pid); --- 5375,5384 ---- /* gid may be a pid, or minus a pgrp's number */ #ifdef TIOCSIGSEND if (!NILP (current_group)) ! { ! if (ioctl (XINT (p->infd), TIOCSIGSEND, signo) == -1) ! EMACS_KILLPG (gid, signo); ! } else { gid = - XFASTINT (p->pid);