a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill/*
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * This file and its contents are supplied under the terms of the
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * Common Development and Distribution License ("CDDL"), version 1.0.
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * You may only use this file in accordance with the terms of version
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * 1.0 of the CDDL.
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill *
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * A full copy of the text of the CDDL should have accompanied this
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * source. A copy of the CDDL is also available via the Internet at
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * http://www.illumos.org/license/CDDL.
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill */
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill/*
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney * Copyright 2016 Joyent, Inc.
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill */
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#include <sys/types.h>
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#include <sys/epoll.h>
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#include <sys/devpoll.h>
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#include <unistd.h>
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#include <errno.h>
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#include <fcntl.h>
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#include <poll.h>
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill/*
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * Events that match their epoll(7) equivalents.
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill */
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#if EPOLLIN != POLLIN
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#error value of EPOLLIN does not match value of POLLIN
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#endif
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#if EPOLLPRI != POLLPRI
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#error value of EPOLLPRI does not match value of POLLPRI
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#endif
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#if EPOLLOUT != POLLOUT
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#error value of EPOLLOUT does not match value of POLLOUT
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#endif
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#if EPOLLRDNORM != POLLRDNORM
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#error value of EPOLLRDNORM does not match value of POLLRDNORM
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#endif
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#if EPOLLRDBAND != POLLRDBAND
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#error value of EPOLLRDBAND does not match value of POLLRDBAND
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#endif
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#if EPOLLERR != POLLERR
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#error value of EPOLLERR does not match value of POLLERR
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#endif
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#if EPOLLHUP != POLLHUP
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#error value of EPOLLHUP does not match value of POLLHUP
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#endif
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill/*
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * Events that we ignore entirely. They can be set in events, but they will
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * never be returned.
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill */
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#define EPOLLIGNORED (EPOLLMSG | EPOLLWAKEUP)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill/*
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * Events that we swizzle into other bit positions.
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill */
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill#define EPOLLSWIZZLED \
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill (EPOLLRDHUP | EPOLLONESHOT | EPOLLET | EPOLLWRBAND | EPOLLWRNORM)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrillint
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrillepoll_create(int size)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill{
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill int fd;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill /*
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * From the epoll_create() man page: "Since Linux 2.6.8, the size
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * argument is ignored, but must be greater than zero." You keep using
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * that word "ignored"...
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill */
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill if (size <= 0) {
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill errno = EINVAL;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill return (-1);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill }
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill if ((fd = open("/dev/poll", O_RDWR)) == -1)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill return (-1);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill if (ioctl(fd, DP_EPOLLCOMPAT, 0) == -1) {
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill (void) close(fd);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill return (-1);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill }
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill return (fd);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill}
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrillint
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrillepoll_create1(int flags)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill{
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill int fd, oflags = O_RDWR;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a192d1c0eb1d05a03ead3c7f898e864e4bf0399cPatrick Mooney if (flags & EPOLL_CLOEXEC) {
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill oflags |= O_CLOEXEC;
a192d1c0eb1d05a03ead3c7f898e864e4bf0399cPatrick Mooney flags ^= EPOLL_CLOEXEC;
a192d1c0eb1d05a03ead3c7f898e864e4bf0399cPatrick Mooney }
a192d1c0eb1d05a03ead3c7f898e864e4bf0399cPatrick Mooney /* Reject unrecognized flags */
a192d1c0eb1d05a03ead3c7f898e864e4bf0399cPatrick Mooney if (flags != 0) {
a192d1c0eb1d05a03ead3c7f898e864e4bf0399cPatrick Mooney errno = EINVAL;
a192d1c0eb1d05a03ead3c7f898e864e4bf0399cPatrick Mooney return (-1);
a192d1c0eb1d05a03ead3c7f898e864e4bf0399cPatrick Mooney }
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill if ((fd = open("/dev/poll", oflags)) == -1)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill return (-1);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill if (ioctl(fd, DP_EPOLLCOMPAT, 0) == -1) {
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill (void) close(fd);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill return (-1);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill }
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill return (fd);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill}
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrillint
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrillepoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill{
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill dvpoll_epollfd_t epoll[2];
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill uint32_t events, ev = 0;
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney int i = 0, res;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill epoll[i].dpep_pollfd.fd = fd;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill switch (op) {
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill case EPOLL_CTL_DEL:
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill ev = POLLREMOVE;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill break;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill case EPOLL_CTL_MOD:
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill /*
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * In the modify case, we pass down two events: one to
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * remove the event and another to add it back.
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill */
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill epoll[i++].dpep_pollfd.events = POLLREMOVE;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill epoll[i].dpep_pollfd.fd = fd;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill /* FALLTHROUGH */
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill case EPOLL_CTL_ADD:
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill /*
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * Mask off the events that we ignore, and then swizzle the
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * events for which our values differ from their epoll(7)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill * equivalents.
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill */
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill events = event->events;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill ev = events & ~(EPOLLIGNORED | EPOLLSWIZZLED);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill if (events & EPOLLRDHUP)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill ev |= POLLRDHUP;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill if (events & EPOLLET)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill ev |= POLLET;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill if (events & EPOLLONESHOT)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill ev |= POLLONESHOT;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill if (events & EPOLLWRNORM)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill ev |= POLLWRNORM;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill if (events & EPOLLWRBAND)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill ev |= POLLWRBAND;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill epoll[i].dpep_data = event->data.u64;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill break;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill default:
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill errno = EOPNOTSUPP;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill return (-1);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill }
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill epoll[i].dpep_pollfd.events = ev;
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooneyretry:
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney res = write(epfd, epoll, sizeof (epoll[0]) * (i + 1));
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney if (res == -1) {
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney if (errno == EINTR) {
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney /*
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney * Linux does not document EINTR as an allowed error
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney * for epoll_ctl. The write must be retried if it is
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney * not done automatically via SA_RESTART.
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney */
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney goto retry;
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney }
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney if (errno == ELOOP) {
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney /*
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney * Convert the specific /dev/poll error about an fd
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney * loop into what is expected from the Linux epoll
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney * interface.
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney */
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney errno = EINVAL;
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney }
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney return (-1);
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney }
57a0264b71e479ed0dc19299607d662043907cb6Patrick Mooney return (0);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill}
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrillint
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrillepoll_wait(int epfd, struct epoll_event *events,
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill int maxevents, int timeout)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill{
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill struct dvpoll arg;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill if (maxevents <= 0) {
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill errno = EINVAL;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill return (-1);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill }
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill arg.dp_nfds = maxevents;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill arg.dp_timeout = timeout;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill arg.dp_fds = (pollfd_t *)events;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill return (ioctl(epfd, DP_POLL, &arg));
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill}
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrillint
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrillepoll_pwait(int epfd, struct epoll_event *events,
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill int maxevents, int timeout, const sigset_t *sigmask)
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill{
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill struct dvpoll arg;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill if (maxevents <= 0) {
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill errno = EINVAL;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill return (-1);
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill }
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill arg.dp_nfds = maxevents;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill arg.dp_timeout = timeout;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill arg.dp_fds = (pollfd_t *)events;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill arg.dp_setp = (sigset_t *)sigmask;
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill return (ioctl(epfd, DP_PPOLL, &arg));
a5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6Bryan Cantrill}