diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2001-11-08 17:49:52 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2001-11-08 17:49:52 +0000 |
commit | 80a429d20a345f222a4151d8f162fd8542244bb5 (patch) | |
tree | 26cdb5481b1fc093d2aaff3d598398c9687915c1 | |
parent | 036fd823dcf4cf161304a894258477d175b1c3f0 (diff) | |
download | newlib-80a429d20a345f222a4151d8f162fd8542244bb5.zip newlib-80a429d20a345f222a4151d8f162fd8542244bb5.tar.gz newlib-80a429d20a345f222a4151d8f162fd8542244bb5.tar.bz2 |
* select.cc: Set errno using set_sig_errno() throughout.
* signal.cc (signal): Always set SA_RESTART flag.
* syscalls.cc (_read): Revert previous patch.
-rw-r--r-- | winsup/cygwin/ChangeLog | 6 | ||||
-rw-r--r-- | winsup/cygwin/select.cc | 18 | ||||
-rw-r--r-- | winsup/cygwin/signal.cc | 3 | ||||
-rw-r--r-- | winsup/cygwin/syscalls.cc | 1 |
4 files changed, 18 insertions, 10 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 12a6578..8e5170f 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,11 @@ 2001-11-08 Corinna Vinschen <corinna@vinschen.de> + * select.cc: Set errno using set_sig_errno() throughout. + * signal.cc (signal): Always set SA_RESTART flag. + * syscalls.cc (_read): Revert previous patch. + +2001-11-08 Corinna Vinschen <corinna@vinschen.de> + * select.cc (fhandler_tty_slave::ready_for_read): Return 0 on EBADF. * syscalls.cc (_read): If ready_for_read() failed, save errno from being overwritten by signal handler call. diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index 6639974..d3d64ed 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -89,7 +89,7 @@ typedef long fd_mask; if (cygheap->fdtab.not_open ((s)->fd)) \ { \ (s)->saw_error = true; \ - set_errno (EBADF); \ + set_sig_errno (EBADF); \ return -1; \ } \ @@ -238,7 +238,7 @@ select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, { if (m > MAXIMUM_WAIT_OBJECTS) { - set_errno (EINVAL); + set_sig_errno (EINVAL); return -1; } if (!s->startup (s, this)) @@ -780,7 +780,7 @@ fhandler_tty_slave::ready_for_read (int fd, DWORD howlong) HANDLE w4[2]; if (cygheap->fdtab.not_open (fd)) { - set_errno (EBADF); + set_sig_errno (EBADF); return 0; } if (get_readahead_valid ()) @@ -793,17 +793,17 @@ fhandler_tty_slave::ready_for_read (int fd, DWORD howlong) switch (WaitForMultipleObjects (2, w4, FALSE, howlong)) { case WAIT_OBJECT_0: - set_errno (EINTR); + set_sig_errno (EINTR); return 0; case WAIT_OBJECT_0 + 1: return 1; case WAIT_FAILED: select_printf ("wait failed %E"); - set_errno (EINVAL); /* FIXME: correct errno? */ + set_sig_errno (EINVAL); /* FIXME: correct errno? */ return 0; default: if (!howlong) - set_errno (EAGAIN); + set_sig_errno (EAGAIN); return 0; } } @@ -1089,7 +1089,7 @@ fhandler_base::ready_for_read (int fd, DWORD howlong) if (fd >= 0 && cygheap->fdtab.not_open (fd)) { - set_errno (EBADF); + set_sig_errno (EBADF); avail = 0; break; } @@ -1097,13 +1097,13 @@ fhandler_base::ready_for_read (int fd, DWORD howlong) if (howlong != INFINITE) { if (!avail) - set_errno (EAGAIN); + set_sig_errno (EAGAIN); break; } if (WaitForSingleObject (signal_arrived, avail ? 0 : 10) == WAIT_OBJECT_0) { - set_errno (EINTR); + set_sig_errno (EINTR); avail = 0; break; } diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc index 70671b8..6523483 100644 --- a/winsup/cygwin/signal.cc +++ b/winsup/cygwin/signal.cc @@ -56,6 +56,9 @@ signal (int sig, _sig_func_ptr func) prev = myself->getsig (sig).sa_handler; myself->getsig (sig).sa_handler = func; myself->getsig (sig).sa_mask = 0; + /* SA_RESTART is set to maintain BSD compatible signal behaviour by default. + This is also compatible to the behaviour of signal(2) in Linux. */ + myself->getsig (sig).sa_flags |= SA_RESTART; set_sigcatchers (prev, func); syscall_printf ("%p = signal (%d, %p)", prev, sig, func); diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index fc069ca..3b2104d 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -314,7 +314,6 @@ _read (int fd, void *ptr, size_t len) debug_printf ("non-interruptible read\n"); else if (!cfd->ready_for_read (fd, wait)) { - set_sig_errno (get_errno ()); res = -1; goto out; } |