]> sourceware.org Git - newlib-cygwin.git/commitdiff
* fhandler_console.cc (fhandler_console::read): Use appropriate kill_pgrp
authorChristopher Faylor <me@cgf.cx>
Mon, 29 Jul 2002 03:18:41 +0000 (03:18 +0000)
committerChristopher Faylor <me@cgf.cx>
Mon, 29 Jul 2002 03:18:41 +0000 (03:18 +0000)
method.
* select.cc (peek_console): Ditto.
* fhandler_termios.cc (fhandler_termios::bg_check): Send "stopped" signal to
entire process group as dictated by SUSv3.
* termios.cc (tcsetattr): Detect when stopped signal sent and force a stop
before setting anything.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler_console.cc
winsup/cygwin/fhandler_termios.cc
winsup/cygwin/select.cc
winsup/cygwin/syscalls.cc
winsup/cygwin/termios.cc

index 7bdbf329d4ecf8dae8403c62e3b6cbe0aaa0f464..3e467ea545d5c4b8e2ec466a99419892c0d283dc 100644 (file)
@@ -1,3 +1,13 @@
+2002-07-28  Christopher Faylor  <cgf@redhat.com>
+
+       * fhandler_console.cc (fhandler_console::read): Use appropriate
+       kill_pgrp method.
+       * select.cc (peek_console): Ditto.
+       * fhandler_termios.cc (fhandler_termios::bg_check): Send "stopped"
+       signal to entire process group as dictated by SUSv3.
+       * termios.cc (tcsetattr): Detect when stopped signal sent and force a
+       stop before setting anything.
+
 2002-07-26  Christopher Faylor  <cgf@redhat.com>
 
        * include/cygwin/version.h: Bump API version to indicate that ntsec is
index c8f085623c37063fb79331bdc001edcdbc1c4528..4d767daf5a97871e248475828bb267d25516a083 100644 (file)
@@ -416,7 +416,7 @@ fhandler_console::read (void *pv, size_t buflen)
          break;
 
        case WINDOW_BUFFER_SIZE_EVENT:
-         kill_pgrp (tc->getpgid (), SIGWINCH);
+         tc->kill_pgrp (SIGWINCH);
          continue;
 
        default:
index 778c0965132ddd3393a41bf8b4307afebd9c9d27..d631fad9acccc0aca1d1d1765d478fab67f96d61 100644 (file)
@@ -169,7 +169,7 @@ fhandler_termios::bg_check (int sig)
   /* Don't raise a SIGTT* signal if we have already been interrupted
      by another signal. */
   if (WaitForSingleObject (signal_arrived, 0) != WAIT_OBJECT_0)
-    _raise (sig);
+    kill_pgrp (myself->pgid, sig);
   return bg_signalled;
 
 setEIO:
index 30e082a2e215f43a969d3e598efc3ba33837a244..808882d3fd7e06813ce92676c0b55553b6d12e71 100644 (file)
@@ -661,7 +661,7 @@ peek_console (select_record *me, bool)
     else
       {
        if (irec.EventType == WINDOW_BUFFER_SIZE_EVENT)
-         kill_pgrp (fh->tc->getpgid (), SIGWINCH);
+         fh->tc->kill_pgrp (SIGWINCH);
        else if (irec.EventType == MOUSE_EVENT &&
                 (irec.Event.MouseEvent.dwEventFlags == 0 ||
                  irec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK))
index 7efe14fd1ab337c5113f10835766df517f38e8d2..018f67dc6006cb4c06bfc2bb59c4bbbecea4ce3f 100644 (file)
@@ -325,7 +325,7 @@ _read (int fd, void *ptr, size_t len)
         sending a SIGTTIN, if appropriate */
       res = cfd->bg_check (SIGTTIN);
 
-      if (!cfd.isopen())
+      if (!cfd.isopen ())
        return -1;
 
       if (res > bg_eof)
index c44ccbdc393de26c67470fc0260832ae02066d75..706a31a87d4f3fd45bcbb0bdec39dc0dd8fa4514 100644 (file)
@@ -23,6 +23,7 @@ details. */
 #include "cygheap.h"
 #include "cygwin/version.h"
 #include "perprocess.h"
+#include "sigproc.h"
 #include <sys/termios.h>
 
 /* tcsendbreak: POSIX 7.2.2.1 */
@@ -111,21 +112,55 @@ out:
 extern "C" int
 tcsetattr (int fd, int a, const struct termios *t)
 {
-  int res = -1;
-
-  cygheap_fdget cfd (fd);
-  if (cfd < 0)
-    goto out;
-
+  int res;
   t = __tonew_termios (t);
-
-  if (!cfd->is_tty ())
-    set_errno (ENOTTY);
-  else if ((res = cfd->bg_check (-SIGTTOU)) > bg_eof)
-    res = cfd->tcsetattr (a, t);
-
-out:
-  termios_printf ("iflag %x, oflag %x, cflag %x, lflag %x, VMIN %d, VTIME %d",
+  int e = get_errno ();
+
+  while (1)
+    {
+      sigframe thisframe (mainthread);
+
+      res = -1;
+      cygheap_fdget cfd (fd);
+      if (cfd < 0)
+       {
+         e = get_errno ();
+         break;
+       }
+
+      if (!cfd->is_tty ())
+       {
+         e = ENOTTY;
+         break;
+       }
+
+      res = cfd->bg_check (-SIGTTOU);
+
+      switch (res)
+       {
+       case bg_eof:
+         e = get_errno ();
+         break;
+       case bg_ok:
+         if (cfd.isopen ())
+           res = cfd->tcsetattr (a, t);
+         else
+           e = get_errno ();
+         break;
+       case bg_signalled:
+         if (thisframe.call_signal_handler ())
+           continue;
+         res = -1;
+         /* fall through intentionally */
+       default:
+         e = get_errno ();
+         break;
+       }
+      break;
+    }
+
+  set_errno (e);
+  termios_printf ("iflag %p, oflag %p, cflag %p, lflag %p, VMIN %d, VTIME %d",
        t->c_iflag, t->c_oflag, t->c_cflag, t->c_lflag, t->c_cc[VMIN],
        t->c_cc[VTIME]);
   termios_printf ("%d = tcsetattr (%d, %d, %x)", res, fd, a, t);
This page took 0.040538 seconds and 5 git commands to generate.