Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog10
-rw-r--r--winsup/cygwin/fhandler_console.cc2
-rw-r--r--winsup/cygwin/fhandler_termios.cc2
-rw-r--r--winsup/cygwin/select.cc2
-rw-r--r--winsup/cygwin/syscalls.cc2
-rw-r--r--winsup/cygwin/termios.cc63
6 files changed, 63 insertions, 18 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 7bdbf329d..3e467ea54 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index c8f085623..4d767daf5 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -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:
diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc
index 778c09651..d631fad9a 100644
--- a/winsup/cygwin/fhandler_termios.cc
+++ b/winsup/cygwin/fhandler_termios.cc
@@ -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:
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc
index 30e082a2e..808882d3f 100644
--- a/winsup/cygwin/select.cc
+++ b/winsup/cygwin/select.cc
@@ -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))
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 7efe14fd1..018f67dc6 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -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)
diff --git a/winsup/cygwin/termios.cc b/winsup/cygwin/termios.cc
index c44ccbdc3..706a31a87 100644
--- a/winsup/cygwin/termios.cc
+++ b/winsup/cygwin/termios.cc
@@ -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);