jpoll.c 1.52 KB
Newer Older
Niels Möller's avatar
Niels Möller committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
/*
 * AUTHOR:     Sean Reifschneider <jafo@tummy.com>
 * DATE:       1998-10-10
 * Copyright (c) 1998 Sean Reifschneider
 *
 * This code emulates a minimal poll() function, and can be used as a drop-in
 * replacement for the SVID3 implementation.  Note that at this time it only
 * emulates the POLLIN and POLLOUT events.
 */

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include "jpoll.h"


int poll(struct pollfd *fdlist, nfds_t count, int timeoutInMS)
{
struct timeval timeout, *to;
fd_set readfdset, writefdset;
nfds_t i;
int ret, fdcount = 0;
int tsize = getdtablesize();


if (timeoutInMS < 0)
	to = NULL;
else {
	to = &timeout;
	timeout.tv_sec = timeoutInMS / 1000;
	timeout.tv_usec = (timeoutInMS % 1000) * 1000;
	}

FD_ZERO(&readfdset);
FD_ZERO(&writefdset);
for (i = 0; i < count; i++) {
	if (fdlist[i].fd < 0) continue;
	if (fdlist[i].events & POLLIN) FD_SET(fdlist[i].fd, &readfdset);
	if (fdlist[i].events & POLLOUT) FD_SET(fdlist[i].fd, &writefdset);
	fdcount++;
	}

/*  spec says that if all FDs are negative, then *ONLY* return zero  */
if (fdcount == 0)
	return(0);

/*  clear all events  */
for (i = 0; i < count; i++) fdlist[i].revents = 0;

if ((ret = select(tsize, &readfdset, &writefdset, NULL, &timeout)) == -1)
	return(-1);

for (i = 0; i < count; i++) {
	if (FD_ISSET(fdlist[i].fd, &readfdset)) fdlist[i].revents |= POLLIN;
	if (FD_ISSET(fdlist[i].fd, &writefdset)) fdlist[i].revents |= POLLOUT;
	printf("Set FD %d = %d\n", fdlist[i].revents);
	}
printf("Returning %d\n", ret);
return(ret);
}