Skip to content

Commit

Permalink
[libc] add pselect
Browse files Browse the repository at this point in the history
  • Loading branch information
panantoni01 committed Nov 28, 2023
1 parent 84a561c commit e341afa
Showing 1 changed file with 26 additions and 17 deletions.
43 changes: 26 additions & 17 deletions lib/libc/sys/select.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,22 @@
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>

int pselect(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, const struct timespec *timeout,
const sigset_t *sigmask) {
return 0;
}

int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
fd_set *restrict exceptfds, struct timeval *restrict timeout) {
int kq;
int ret;
struct timespec timeout_ts;
struct kevent *events;
int nevents = 0;
sigset_t sigs;

if (nfds < 0) {
errno = EINVAL;
return -1;
}

if (timeout != NULL) {
if (timeout->tv_sec < 0 || timeout->tv_usec < 0 || timeout->tv_usec >= 1000000) {
errno = EINVAL;
return -1;
}

tv2ts(timeout, &timeout_ts);
}

kq = kqueue1(O_CLOEXEC);
if (kq < 0)
return -1;
Expand All @@ -56,8 +43,11 @@ int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
FD_ZERO(readfds);
if (writefds != NULL)
FD_ZERO(writefds);

ret = kevent(kq, events, nevents, events, nevents, timeout == NULL ? NULL : &timeout_ts);

if (sigmask && sigprocmask(SIG_SETMASK, sigmask, &sigs))
return -1;

ret = kevent(kq, events, nevents, events, nevents, timeout);
if (ret == -1)
goto end;

Expand All @@ -75,7 +65,26 @@ int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,

end:
free(events);
if (sigmask && sigprocmask(SIG_SETMASK, &sigs, NULL))
ret = -1;
close_kq:
close(kq);
return ret;
}

int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
fd_set *restrict exceptfds, struct timeval *restrict timeout) {
struct timespec timeout_ts;

if (timeout != NULL) {
if (timeout->tv_sec < 0 || timeout->tv_usec < 0 || timeout->tv_usec >= 1000000) {
errno = EINVAL;
return -1;
}

tv2ts(timeout, &timeout_ts);
}

return pselect(nfds, readfds, writefds, exceptfds,
timeout == NULL ? NULL : &timeout_ts , NULL);
}

0 comments on commit e341afa

Please sign in to comment.