Skip to content
Snippets Groups Projects
Commit 8878d8cc authored by Nick Mathewson's avatar Nick Mathewson :game_die:
Browse files

Add function to fake a poll call using select

svn:r87
parent 27adc0f2
Branches
Tags
No related merge requests found
/*
* fakepoll.c
*
* On systems where 'poll' doesn't exist, fake it with 'select'.
*
* Nick Mathewson <nickm@freehaven.net>
*/
/*
* Changes :
* $Log$
* Revision 1.1 2002/09/03 18:43:50 nickm
* Add function to fake a poll call using select
*
*/
#include "fakepoll.h"
#ifdef USE_FAKE_POLL
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int
poll(struct pollfd *ufds, unsigned int nfds, int timeout)
{
int idx, maxfd, fd, r;
fd_set readfds, writefds, exceptfds;
struct timeval _timeout;
_timeout.tv_sec = timeout/1000;
_timeout.tv_usec = (timeout%1000)*1000;
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_ZERO(&exceptfds);
maxfd = -1;
for (idx = 0; idx < nfds; ++idx) {
fd = ufds[idx].fd;
if (fd > maxfd && ufds[idx].events)
maxfd = fd;
if (ufds[idx].events & (POLLIN))
FD_SET(fd, &readfds);
if (ufds[idx].events & POLLOUT)
FD_SET(fd, &writefds);
if (ufds[idx].events & (POLLERR))
FD_SET(fd, &exceptfds);
}
r = select(maxfd+1, &readfds, &writefds, &exceptfds,
timeout == -1 ? NULL : &_timeout);
if (r <= 0)
return r;
r = 0;
for (idx = 0; idx < nfds; ++idx) {
fd = ufds[idx].fd;
ufds[idx].revents = 0;
if (FD_ISSET(fd, &readfds))
ufds[idx].revents |= POLLIN;
if (FD_ISSET(fd, &writefds))
ufds[idx].revents |= POLLOUT;
if (FD_ISSET(fd, &exceptfds))
ufds[idx].revents |= POLLERR;
if (ufds[idx].revents)
++r;
}
return r;
}
#endif
/*
* fakepoll.h
*
* On systems where 'poll' doesn't exist, fake it with 'select'.
*
* Nick Mathewson <nickm@freehaven.net>
*/
/*
* Changes :
* $Log$
* Revision 1.1 2002/09/03 18:43:50 nickm
* Add function to fake a poll call using select
*
*/
#ifndef __FAKEPOLL_H
#define __FAKEPOLL_H
#include "orconfig.h"
#undef VERSION
#ifndef HAVE_POLL_H
#ifndef HAVE_SYS_POLL_H
#define USE_FAKE_POLL
struct pollfd {
int fd;
short events;
short revents;
};
#define POLLIN 0x0001
#define POLLPRI 0x0002
#define POLLOUT 0x0004
#define POLLERR 0x0008
#define POLLHUP 0x0010
#define POLLNVAL 0x0020
int poll(struct pollfd *ufds, unsigned int nfds, int timeout);
#endif
#endif
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment