32 lines
872 B
C++
32 lines
872 B
C++
#include <sys/select.h>
|
|
#include <sys/syscall.h>
|
|
#include <unistd.h>
|
|
|
|
int pselect(int nfds, fd_set* __restrict readfds, fd_set* __restrict writefds, fd_set* __restrict errorfds, const struct timespec* __restrict timeout, const sigset_t* __restrict sigmask)
|
|
{
|
|
sys_pselect_t arguments {
|
|
.nfds = nfds,
|
|
.readfds = readfds,
|
|
.writefds = writefds,
|
|
.errorfds = errorfds,
|
|
.timeout = timeout,
|
|
.sigmask = sigmask
|
|
};
|
|
return syscall(SYS_PSELECT, &arguments);
|
|
}
|
|
|
|
int select(int nfds, fd_set* __restrict readfds, fd_set* __restrict writefds, fd_set* __restrict errorfds, struct timeval* __restrict timeout)
|
|
{
|
|
timespec* pts = nullptr;
|
|
timespec ts;
|
|
if (timeout)
|
|
{
|
|
ts.tv_sec = timeout->tv_sec;
|
|
ts.tv_nsec = timeout->tv_usec * 1000;
|
|
pts = &ts;
|
|
}
|
|
|
|
// TODO: "select may update timeout", should we?
|
|
return pselect(nfds, readfds, writefds, errorfds, pts, nullptr);
|
|
}
|