select-0.2.1: src/System/Posix/IO/Select/select_wrapper.c
#include <unistd.h>
#include <sys/time.h>
#include <sys/select.h>
#ifndef NDEBUG
#include <stdio.h>
#include <errno.h>
#include <string.h>
#endif
#include "select_wrapper.h"
int select_wrapper(const int* readfds, int num_readfds,
const int* writefds, int num_writefds,
const int* exceptfds, int num_exceptfds,
char timeout, long secs, long usecs)
{
struct timeval tv;
tv.tv_sec = secs;
tv.tv_usec = usecs;
int nfds = -1;
fd_set rfds;
FD_ZERO(&rfds);
for (int i = 0; i < num_readfds; i++)
{
#ifndef NDEBUG
printf("select_wrapper.c: Registering read FD %d.\n", readfds[i]);
#endif
FD_SET(readfds[i], &rfds);
if (readfds[i] > nfds)
nfds = readfds[i];
}
fd_set wfds;
FD_ZERO(&wfds);
for (int i = 0; i < num_writefds; i++)
{
#ifndef NDEBUG
printf("select_wrapper.c: Registering write FD %d.\n", writefds[i]);
#endif
FD_SET(writefds[i], &wfds);
if (writefds[i] > nfds)
nfds = writefds[i];
}
fd_set efds;
FD_ZERO(&efds);
for (int i = 0; i < num_exceptfds; i++)
{
#ifndef NDEBUG
printf("select_wrapper.c: Registering exception FD %d.\n", exceptfds[i]);
#endif
FD_SET(exceptfds[i], &efds);
if (exceptfds[i] > nfds)
nfds = exceptfds[i];
}
nfds++;
int ret = -1;
if (timeout)
ret = select(nfds, &rfds, &wfds, &efds, &tv);
else
ret = select(nfds, &rfds, &wfds, &efds, NULL);
#ifndef NDEBUG
printf("select_wrapper.c: Returning %d.\n", ret);
if (ret == -1)
printf("select_wrapper.c: Error code %d: %s\n", errno, strerror(errno));
#endif
return ret;
}