diff options
author | dchagin <dchagin@FreeBSD.org> | 2016-04-02 06:15:14 +0000 |
---|---|---|
committer | dchagin <dchagin@FreeBSD.org> | 2016-04-02 06:15:14 +0000 |
commit | 63a98b35e794424aa8319138b025955acf776027 (patch) | |
tree | e74fc693a929ee0eeabed235e4e1ab088e76b66a | |
parent | ca4f2c5a4d9532f5c4c854b775f1d6a70665231a (diff) | |
download | FreeBSD-src-63a98b35e794424aa8319138b025955acf776027.zip FreeBSD-src-63a98b35e794424aa8319138b025955acf776027.tar.gz |
MFC r297296:
Implement O_NONBLOCK flag via fcntl(F_SETFL) for eventfd object.
-rw-r--r-- | sys/compat/linux/linux_event.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/sys/compat/linux/linux_event.c b/sys/compat/linux/linux_event.c index 1fe3445..a089d43 100644 --- a/sys/compat/linux/linux_event.c +++ b/sys/compat/linux/linux_event.c @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include <sys/types.h> #include <sys/file.h> #include <sys/filedesc.h> +#include <sys/filio.h> #include <sys/errno.h> #include <sys/event.h> #include <sys/poll.h> @@ -868,8 +869,24 @@ static int eventfd_ioctl(struct file *fp, u_long cmd, void *data, struct ucred *active_cred, struct thread *td) { + struct eventfd *efd; - return (ENXIO); + efd = fp->f_data; + if (fp->f_type != DTYPE_LINUXEFD || efd == NULL) + return (EINVAL); + + switch (cmd) + { + case FIONBIO: + if (*(int *)data) + efd->efd_flags |= LINUX_O_NONBLOCK; + else + efd->efd_flags &= ~LINUX_O_NONBLOCK; + case FIOASYNC: + return (0); + default: + return (ENXIO); + } } /*ARGSUSED*/ |