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:
parent
173e067a31
commit
7f983079d4
@ -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 ();
|
||||||
|
@ -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 ()
|
||||||
|
@ -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 ()
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user