]> git.eshelyaron.com Git - emacs.git/commitdiff
Removed subtty, workaround for when TIOCSIGSEND fails.
authorJan Djärv <jan.h.d@swipnet.se>
Fri, 21 Feb 2003 18:13:53 +0000 (18:13 +0000)
committerJan Djärv <jan.h.d@swipnet.se>
Fri, 21 Feb 2003 18:13:53 +0000 (18:13 +0000)
src/ChangeLog
src/process.c
src/process.h

index 9d9d40a26df04073f777579bf7c96aec7539b735..0491a7d4bd2ff3299d306b1fdaa8ea2e00c4658e 100644 (file)
@@ -1,3 +1,13 @@
+2003-02-21  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * 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\e,A_\e(Bjohann  <kai.grossjohann@uni-duisburg.de>
 
        * keymap.c (Fdefine_key): Doc fix.
index 59512bf944126cc877ce3724a447374cecc8a958..9790b7d29a691391321cbeca0bce95f13e3dac0c 100644 (file)
@@ -1782,11 +1782,12 @@ create_process (process, new_argv, current_dir)
   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 @@ create_process (process, new_argv, current_dir)
        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 @@ Output from processes can arrive in between bunches.  */)
   return Qnil;
 }
 \f
+/* 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 @@ return t unconditionally.  */)
 {
   /* 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 @@ return t unconditionally.  */)
     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 @@ process_send_signal (process, signo, current_group, nomsg)
         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 @@ process_send_signal (process, signo, current_group, nomsg)
   /* 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);
index 06dbb30fc03d5a8a99218631987b035ab9546502..6ad7f7ddf5ed32213c49224c3dee7b3974c9daea 100644 (file)
@@ -33,9 +33,6 @@ struct Lisp_Process
     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 */