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>
This commit is contained in:
Corinna Vinschen 2019-01-17 11:51:11 +01:00
parent 173e067a31
commit 7f983079d4
3 changed files with 21 additions and 6 deletions

View File

@ -2650,6 +2650,7 @@ class fhandler_signalfd : public fhandler_base
int signalfd (const sigset_t *mask, int flags); int signalfd (const sigset_t *mask, int flags);
int __reg2 fstat (struct stat *buf); int __reg2 fstat (struct stat *buf);
void __reg3 read (void *ptr, size_t& len); void __reg3 read (void *ptr, size_t& len);
ssize_t __stdcall write (const void *, size_t);
int poll (); int poll ();
inline sigset_t get_sigset () const { return sigset; } inline sigset_t get_sigset () const { return sigset; }
@ -2693,6 +2694,7 @@ class fhandler_timerfd : public fhandler_base
int __reg2 fstat (struct stat *buf); int __reg2 fstat (struct stat *buf);
void __reg3 read (void *ptr, size_t& len); void __reg3 read (void *ptr, size_t& len);
ssize_t __stdcall write (const void *, size_t);
int dup (fhandler_base *child, int); int dup (fhandler_base *child, int);
int ioctl (unsigned int, void *); int ioctl (unsigned int, void *);
int close (); int close ();

View File

@ -49,6 +49,7 @@ fhandler_signalfd::signalfd (const sigset_t *mask, int flags)
nohandle (true); nohandle (true);
set_unique_id (); set_unique_id ();
set_ino (get_unique_id ()); set_ino (get_unique_id ());
set_flags (O_RDWR | O_BINARY);
} }
return 0; return 0;
} }
@ -139,6 +140,13 @@ fhandler_signalfd::read (void *ptr, size_t& len)
return; return;
} }
ssize_t __stdcall
fhandler_signalfd::write (const void *, size_t)
{
set_errno (EINVAL);
return -1;
}
/* Called from select */ /* Called from select */
int int
fhandler_signalfd::poll () fhandler_signalfd::poll ()

View File

@ -44,12 +44,10 @@ fhandler_timerfd::timerfd (clockid_t clock_id, int flags)
set_nonblocking (true); set_nonblocking (true);
if (flags & TFD_CLOEXEC) if (flags & TFD_CLOEXEC)
set_close_on_exec (true); set_close_on_exec (true);
if (get_unique_id () == 0) nohandle (true);
{ set_unique_id ();
nohandle (true); set_ino (get_unique_id ());
set_unique_id (); set_flags (O_RDWR | O_BINARY);
set_ino (get_unique_id ());
}
return 0; return 0;
} }
@ -125,6 +123,13 @@ fhandler_timerfd::read (void *ptr, size_t& len)
return; return;
} }
ssize_t __stdcall
fhandler_timerfd::write (const void *, size_t)
{
set_errno (EINVAL);
return -1;
}
HANDLE HANDLE
fhandler_timerfd::get_timerfd_handle () fhandler_timerfd::get_timerfd_handle ()
{ {