[or-cvs] Add function to fake a poll call using select

Nick Mathewson nickm at seul.org
Tue Sep 3 18:43:54 UTC 2002


Update of /home/or/cvsroot/src/common
In directory moria.seul.org:/tmp/cvs-serv32386/src/common

Added Files:
	fakepoll.c fakepoll.h 
Log Message:
Add function to fake a poll call using select

--- NEW FILE: fakepoll.c ---
/*
 * fakepoll.c
 *
 * On systems where 'poll' doesn't exist, fake it with 'select'.
 *
 * Nick Mathewson <nickm at freehaven.net>
 */


/*
 * Changes :
 * $Log: fakepoll.c,v $
 * 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

--- NEW FILE: fakepoll.h ---
/*
 * fakepoll.h
 *
 * On systems where 'poll' doesn't exist, fake it with 'select'.
 *
 * Nick Mathewson <nickm at freehaven.net>
 */

/*
 * Changes :
 * $Log: fakepoll.h,v $
 * 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



More information about the tor-commits mailing list