packages feed

select-0.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>
#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);
  #endif

  return ret;
}