]> sourceware.org Git - newlib-cygwin.git/commitdiff
* fhandler_termios.cc (fhandler_termios::bg_check): Do not return EIO when a
authorChristopher Faylor <me@cgf.cx>
Mon, 30 May 2011 06:58:00 +0000 (06:58 +0000)
committerChristopher Faylor <me@cgf.cx>
Mon, 30 May 2011 06:58:00 +0000 (06:58 +0000)
process group has no leader as this is allowed and does not imply an orphaned
process group.  Add a test for orphaned process groups.
(tty_min::is_orphaned_process_group): Define new function.
* tty.h (tty_min::is_orphaned_process_group): Define new function.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler_termios.cc
winsup/cygwin/tty.h

index 3dcca6997599201ea2be00bddd4cb988f3408789..9cac2cdd41e286339d0d2143a0d871304aff733f 100644 (file)
@@ -1,3 +1,12 @@
+2011-05-30  Tor Perkins  <cygwin@noid.net>
+
+       * fhandler_termios.cc (fhandler_termios::bg_check): Do not return EIO
+       when a process group has no leader as this is allowed and does not
+       imply an orphaned process group.  Add a test for orphaned process
+       groups.
+       (tty_min::is_orphaned_process_group): Define new function.
+       * tty.h (tty_min::is_orphaned_process_group): Define new function.
+
 2011-05-30  Ryan Johnson  <ryan.johnson@cs.utoronto.ca>
 
        * dll_init.cc (dll_list::find_by_modname): New function to search the
index ccf3afcc0e20a75467f169c2e5e1143eb48be826..b3eb46558eba3312ef7eb5ceffd13cf387e19195 100644 (file)
@@ -112,6 +112,26 @@ fhandler_pty_master::tcgetpgrp ()
   return tc->pgid;
 }
 
+int
+tty_min::is_orphaned_process_group (int pgid)
+{
+  /* An orphaned process group is a process group in which the parent
+     of every member is either itself a member of the group or is not
+     a member of the group's session. */
+  winpids pids ((DWORD) PID_MAP_RW);
+  for (unsigned i = 0; i < pids.npids; i++)
+    {
+      _pinfo *p = pids[i];
+      if (!p->exists () || p->pgid != pgid)
+        continue;
+      pinfo ppid (p->ppid);
+      if (ppid->pgid != pgid &&
+          ppid->sid == myself->sid)
+        return 0;
+    }
+  return 1;
+}
+
 void
 tty_min::kill_pgrp (int sig)
 {
@@ -158,36 +178,35 @@ fhandler_termios::bg_check (int sig)
       return bg_eof;
     }
 
-  /* If the process group is no more or if process is ignoring or blocks 'sig',
-     return with error */
-  int pgid_gone = !pid_exists (myself->pgid);
   int sigs_ignored =
     ((void *) global_sigs[sig].sa_handler == (void *) SIG_IGN) ||
     (_main_tls->sigmask & SIGTOMASK (sig));
 
-  if (pgid_gone)
-    goto setEIO;
-  else if (!sigs_ignored)
-    /* nothing */;
-  else if (sig == SIGTTOU)
-    return bg_ok;              /* Just allow the output */
-  else
-    goto setEIO;       /* This is an output error */
-
-  /* Don't raise a SIGTT* signal if we have already been interrupted
-     by another signal. */
-  if (!IsEventSignalled (signal_arrived))
+  /* If the process is ignoring SIGTT*, then background IO is OK.  If
+     the process is not ignoring SIGTT*, then the sig is to be sent to
+     all processes in the process group (unless the process group of the
+     process is orphaned, in which case we return EIO). */
+  if (sigs_ignored)
+    return bg_ok;   /* Just allow the IO */
+  else if ( tc->is_orphaned_process_group (myself->pgid) )
     {
-      siginfo_t si = {0};
-      si.si_signo = sig;
-      si.si_code = SI_KERNEL;
-      kill_pgrp (myself->pgid, si);
+      termios_printf ("process group is orphaned");
+      set_errno (EIO);   /* This is an IO error */
+      return bg_error;
     }
-  return bg_signalled;
-
-setEIO:
-  set_errno (EIO);
-  return bg_error;
+  else
+    {
+      /* Don't raise a SIGTT* signal if we have already been
+        interrupted by another signal. */
+      if (WaitForSingleObject (signal_arrived, 0) != WAIT_OBJECT_0)
+       {
+         siginfo_t si = {0};
+         si.si_signo = sig;
+         si.si_code = SI_KERNEL;
+         kill_pgrp (myself->pgid, si);
+       }
+      return bg_signalled;
+    } 
 }
 
 #define set_input_done(x) input_done = input_done || (x)
index a0bc485a08b7124e25e05471944069b92e760742..09583bd2815e669b7dacbc89a5fc574b8ffacd9d 100644 (file)
@@ -78,7 +78,8 @@ public:
   void setpgid (int pid) {pgid = pid;}
   int getsid () const {return sid;}
   void setsid (pid_t tsid) {sid = tsid;}
-  void kill_pgrp (int sig);
+  void kill_pgrp (int);
+  int is_orphaned_process_group (int);
   HWND gethwnd () const {return hwnd;}
   void sethwnd (HWND wnd) {hwnd = wnd;}
   const char *ttyname () __attribute ((regparm (1)));
This page took 0.039306 seconds and 5 git commands to generate.