Mail Archives: djgpp-workers/1996/06/03/08:36:28
Here is a implementation of poll() via select(). It slightly
incompatible with SysV one, but works in most cases.
It never returns POLLNVAL, POLLERR and POLLHUP because of
select limitations. Instead of marking a file descriptor with
POLLNVAL it returns -1 and sets errno to EBADF, just as select does.
#!/bin/sh
# This is a shell archive (produced by GNU shar 4.0).
# To extract the files from this archive, save it to some FILE, remove
# everything before the `!/bin/sh' line above, then type `sh FILE'.
#
# Made on 1996-06-03 13:54 MSK by <lav AT video>.
# Source directory was `/home/lav/le/poll'.
#
# Existing files will *not* be overwritten unless `-c' is specified.
#
# This shar contains:
# length mode name
# ------ ---------- ------------------------------------------
# 848 -rw-r--r-- poll.c
# 1502 -rw-r--r-- poll.h
#
touch -am 1231235999 $$.touch >/dev/null 2>&1
if test ! -f 1231235999 && test -f $$.touch; then
shar_touch=touch
else
shar_touch=:
echo 'WARNING: not restoring timestamps'
fi
rm -f 1231235999 $$.touch
#
# ============= poll.c ==============
if test -f 'poll.c' && test X"$1" != X"-c"; then
echo 'x - skipping poll.c (File already exists)'
else
echo 'x - extracting poll.c (text)'
sed 's/^X//' << 'SHAR_EOF' > 'poll.c' &&
#include "poll.h"
#include <sys/types.h>
#include <time.h>
#include <sys/time.h>
X
int poll(struct pollfd *pfd,unsigned long nfd,int timeout)
{
X fd_set in,out,pri;
X struct timeval tv;
X int n=0;
X int i;
X
X FD_ZERO(&in);
X FD_ZERO(&out);
X FD_ZERO(&pri);
X
X for(i=0; i<nfd; i++)
X {
X if(pfd[i].events&POLLIN)
X FD_SET(pfd[i].fd,&in);
X if(pfd[i].events&POLLOUT)
X FD_SET(pfd[i].fd,&out);
X if(pfd[i].events&POLLPRI)
X FD_SET(pfd[i].fd,&pri);
X if(pfd[i].fd>=n)
X n++;
X }
X tv.tv_sec=timeout/1000;
X tv.tv_usec=(timeout%1000)*1000;
X
X n=select(n,&in,&out,&pri,timeout==-1?NULL:&tv);
X
X if(n==-1)
X return(-1);
X
X for(i=0; i<nfd; i++)
X {
X pfd[i].revents=0;
X if(FD_ISSET(pfd[i].fd,&in))
X pfd[i].revents|=POLLIN;
X if(FD_ISSET(pfd[i].fd,&out))
X pfd[i].revents|=POLLOUT;
X if(FD_ISSET(pfd[i].fd,&pri))
X pfd[i].revents|=POLLPRI;
X }
X
X return(n);
}
SHAR_EOF
$shar_touch -am 1108193295 'poll.c' &&
chmod 0644 'poll.c' ||
echo 'restore of poll.c failed'
shar_count="`wc -c < 'poll.c'`"
test 848 -eq "$shar_count" ||
echo "poll.c: original size 848, current size $shar_count"
fi
# ============= poll.h ==============
if test -f 'poll.h' && test X"$1" != X"-c"; then
echo 'x - skipping poll.h (File already exists)'
else
echo 'x - extracting poll.h (text)'
sed 's/^X//' << 'SHAR_EOF' > 'poll.h' &&
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
X
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
/* The copyright notice above does not evidence any */
/* actual or intended publication of such source code. */
X
#ifndef _SYS_POLL_H
#define _SYS_POLL_H
X
#pragma ident "@(#)poll.h 1.18 94/06/07 SMI" /* SVr4.0 11.9 */
X
#ifdef __cplusplus
extern "C" {
#endif
X
/*
X * Structure of file descriptor/event pairs supplied in
X * the poll arrays.
X */
typedef struct pollfd {
X int fd; /* file desc to poll */
X short events; /* events of interest on fd */
X short revents; /* events that occurred on fd */
} pollfd_t;
X
/*
X * Testable select events
X */
#define POLLIN 0x0001 /* fd is readable */
#define POLLPRI 0x0002 /* high priority info at fd */
#define POLLOUT 0x0004 /* fd is writeable (won't block) */
#define POLLRDNORM 0x0040 /* normal data is readable */
#define POLLWRNORM POLLOUT
#define POLLRDBAND 0x0080 /* out-of-band data is readable */
#define POLLWRBAND 0x0100 /* out-of-band data is writeable */
X
#define POLLNORM POLLRDNORM
X
/*
X * Non-testable poll events (may not be specified in events field,
X * but may be returned in revents field).
X */
#define POLLERR 0x0008 /* fd has error condition */
#define POLLHUP 0x0010 /* fd has been hung up on */
#define POLLNVAL 0x0020 /* invalid pollfd entry */
X
#if defined(__STDC__)
int poll(struct pollfd *, unsigned long, int);
#endif
X
#ifdef __cplusplus
}
#endif
X
#endif /* _SYS_POLL_H */
SHAR_EOF
$shar_touch -am 1108140795 'poll.h' &&
chmod 0644 'poll.h' ||
echo 'restore of poll.h failed'
shar_count="`wc -c < 'poll.h'`"
test 1502 -eq "$shar_count" ||
echo "poll.h: original size 1502, current size $shar_count"
fi
exit 0
- Raw text -