banan-os/libc/sys/select.cpp

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);
}