summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2019-01-17 11:51:11 +0100
committerCorinna Vinschen <corinna@vinschen.de>2019-01-17 11:51:11 +0100
commit7f983079d4a62e3f906a97bf091908a1dad29bb6 (patch)
tree0536e550d7c69a40722fc7f3e0df49ca2598ef9b
parent173e067a31bde9812c0f0ad19de082fb5e176427 (diff)
downloadcygnal-7f983079d4a62e3f906a97bf091908a1dad29bb6.tar.gz
cygnal-7f983079d4a62e3f906a97bf091908a1dad29bb6.tar.bz2
cygnal-7f983079d4a62e3f906a97bf091908a1dad29bb6.zip
Cygwin: timerfd/signalfd: return EINVAL from write
Linux returns EINVAL, "fd is attached to an object which is unsuitable for writing". If we don't handle write locally, write returns EBADF. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/fhandler.h2
-rw-r--r--winsup/cygwin/fhandler_signalfd.cc8
-rw-r--r--winsup/cygwin/fhandler_timerfd.cc17
3 files changed, 21 insertions, 6 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index f0c612d8a..497612ae1 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -2650,6 +2650,7 @@ class fhandler_signalfd : public fhandler_base
int signalfd (const sigset_t *mask, int flags);
int __reg2 fstat (struct stat *buf);
void __reg3 read (void *ptr, size_t& len);
+ ssize_t __stdcall write (const void *, size_t);
int poll ();
inline sigset_t get_sigset () const { return sigset; }
@@ -2693,6 +2694,7 @@ class fhandler_timerfd : public fhandler_base
int __reg2 fstat (struct stat *buf);
void __reg3 read (void *ptr, size_t& len);
+ ssize_t __stdcall write (const void *, size_t);
int dup (fhandler_base *child, int);
int ioctl (unsigned int, void *);
int close ();
diff --git a/winsup/cygwin/fhandler_signalfd.cc b/winsup/cygwin/fhandler_signalfd.cc
index d8e17a8fc..6c7da02e9 100644
--- a/winsup/cygwin/fhandler_signalfd.cc
+++ b/winsup/cygwin/fhandler_signalfd.cc
@@ -49,6 +49,7 @@ fhandler_signalfd::signalfd (const sigset_t *mask, int flags)
nohandle (true);
set_unique_id ();
set_ino (get_unique_id ());
+ set_flags (O_RDWR | O_BINARY);
}
return 0;
}
@@ -139,6 +140,13 @@ fhandler_signalfd::read (void *ptr, size_t& len)
return;
}
+ssize_t __stdcall
+fhandler_signalfd::write (const void *, size_t)
+{
+ set_errno (EINVAL);
+ return -1;
+}
+
/* Called from select */
int
fhandler_signalfd::poll ()
diff --git a/winsup/cygwin/fhandler_timerfd.cc b/winsup/cygwin/fhandler_timerfd.cc
index 360731ca1..c7ff9c162 100644
--- a/winsup/cygwin/fhandler_timerfd.cc
+++ b/winsup/cygwin/fhandler_timerfd.cc
@@ -44,12 +44,10 @@ fhandler_timerfd::timerfd (clockid_t clock_id, int flags)
set_nonblocking (true);
if (flags & TFD_CLOEXEC)
set_close_on_exec (true);
- if (get_unique_id () == 0)
- {
- nohandle (true);
- set_unique_id ();
- set_ino (get_unique_id ());
- }
+ nohandle (true);
+ set_unique_id ();
+ set_ino (get_unique_id ());
+ set_flags (O_RDWR | O_BINARY);
return 0;
}
@@ -125,6 +123,13 @@ fhandler_timerfd::read (void *ptr, size_t& len)
return;
}
+ssize_t __stdcall
+fhandler_timerfd::write (const void *, size_t)
+{
+ set_errno (EINVAL);
+ return -1;
+}
+
HANDLE
fhandler_timerfd::get_timerfd_handle ()
{