diff -rNU3 gnulib/lib/poll.c gnulib-poll/lib/poll.c --- gnulib/lib/poll.c Thu Jan 1 01:00:00 1970 +++ gnulib-poll/lib/poll.c Wed Feb 19 09:39:26 2003 @@ -0,0 +1,182 @@ +/* Emulation for poll(2) + Contributed by Paolo Bonzini. + + Copyright 2001, 2002, 2003 Free Software Foundation, Inc. + + This file is part of gnulib. + + gnulib is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1, or (at your option) + any later version. + + gnulib is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with gnulib; see the file COPYING.LIB. If not, write to the Free + Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "poll.h" +#include +#include +#include +#include +#include + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#ifndef INFTIM +#define INFTIM (-1) +#endif + +int +poll (pfd, nfd, timeout) + struct pollfd *pfd; + nfds_t nfd; + int timeout; +{ + fd_set rfds, wfds, efds; + struct timeval tv, *ptv; + int maxfd, rc, happened; + nfds_t i; + char data[64]; + +#ifdef _SC_OPEN_MAX + if (nfd > sysconf (_SC_OPEN_MAX)) + { + errno = EINVAL; + return -1; + } +#else /* !_SC_OPEN_MAX */ +#ifdef OPEN_MAX + if (nfd > OPEN_MAX) + { + errno = EINVAL; + return -1; + } +#endif /* OPEN_MAX -- else, no check is needed */ +#endif /* !_SC_OPEN_MAX */ + + /* EFAULT is not necessary to implement, but let's do it in the + simplest case. */ + if (!pfd) + { + errno = EFAULT; + return -1; + } + + /* convert timeout number into a timeval structure */ + ptv = &tv; + if (timeout >= 0) + { + /* return immediately or after timeout */ + ptv->tv_sec = timeout / 1000; + ptv->tv_usec = (timeout % 1000) * 1000; + } + else if (timeout == INFTIM) + /* wait forever */ + ptv = NULL; + else + { + errno = EINVAL; + return -1; + } + + /* create fd sets and determine max fd */ + maxfd = -1; + FD_ZERO (&rfds); + FD_ZERO (&wfds); + FD_ZERO (&efds); + for (i = 0; i < nfd; i++) + { + if (pfd[i].fd < 0) + continue; + + if (pfd[i].events & (POLLIN | POLLRDNORM)) + FD_SET (pfd[i].fd, &rfds); + + /* see select(2): "the only exceptional condition detectable + is out-of-band data received on a socket", hence we push + POLLWRBAND events onto wfds instead of efds. */ + if (pfd[i].events & (POLLOUT | POLLWRNORM | POLLWRBAND)) + FD_SET (pfd[i].fd, &wfds); + if (pfd[i].events & (POLLPRI | POLLRDBAND)) + FD_SET (pfd[i].fd, &efds); + if (pfd[i].fd >= maxfd && + (pfd[i].events & (POLLIN | POLLOUT | POLLPRI | + POLLRDNORM | POLLRDBAND | + POLLWRNORM | POLLWRBAND))) + { + maxfd = pfd[i].fd; + if (maxfd > FD_SETSIZE) + { +#ifdef EOVERFLOW + errno = EOVERFLOW; +#else + errno = EINVAL; +#endif + return -1; + } + } + } + + /* examine fd sets */ + rc = select (maxfd + 1, &rfds, &wfds, &efds, ptv); + + /* establish results */ + if (rc > 0) + { + rc = 0; + for (i = 0; i < nfd; i++) + { + pfd[i].revents = 0; + if (pfd[i].fd < 0) + continue; + + happened = 0; + if (FD_ISSET (pfd[i].fd, &rfds)) + { + /* support for POLLHUP. An hung up descriptor does not + increase the return value! */ + if (recv (pfd[i].fd, data, 64, MSG_PEEK) == -1) + { + if (errno == ESHUTDOWN || errno == ECONNRESET || + errno == ECONNABORTED || errno == ENETRESET) + pfd[i].revents |= POLLHUP; + } + else + happened |= POLLIN | POLLRDNORM; + } + + if (FD_ISSET (pfd[i].fd, &wfds)) + happened |= POLLOUT | POLLWRNORM | POLLWRBAND; + + if (FD_ISSET (pfd[i].fd, &efds)) + happened |= POLLPRI | POLLRDBAND; + + pfd[i].revents |= pfd[i].events & happened; + rc += (happened > 0); + } + } + + return rc; +} diff -rNU3 gnulib/lib/poll_.h gnulib-poll/lib/poll_.h --- gnulib/lib/poll_.h Thu Jan 1 01:00:00 1970 +++ gnulib-poll/lib/poll_.h Wed Feb 19 09:43:19 2003 @@ -0,0 +1,55 @@ +/* Header for poll(2) emulation + Contributed by Paolo Bonzini. + + Copyright 2001, 2002, 2003 Free Software Foundation, Inc. + + This file is part of gnulib. + + gnulib is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1, or (at your option) + any later version. + + gnulib is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with gnulib; see the file COPYING.LIB. If not, write to the Free + Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. + */ + +#ifndef GNULIB_POLL_H +#define GNULIB_POLL_H + +/* fake a poll(2) environment */ +#define POLLIN 0x0001 /* any readable data available */ +#define POLLPRI 0x0002 /* OOB/Urgent readable data */ +#define POLLOUT 0x0004 /* file descriptor is writeable */ +#define POLLERR 0x0008 /* some poll error occurred */ +#define POLLHUP 0x0010 /* file descriptor was "hung up" */ +#define POLLNVAL 0x0020 /* requested events "invalid" */ +#define POLLRDNORM 0x0040 +#define POLLRDBAND 0x0080 +#define POLLWRNORM 0x0100 +#define POLLWRBAND 0x0200 + +struct pollfd +{ + int fd; /* which file descriptor to poll */ + short events; /* events we are interested in */ + short revents; /* events found on return */ +}; + +typedef unsigned long nfds_t; + +int poll(struct pollfd *pfd, nfds_t nfd, int timeout); + +/* Define INFTIM only if doing so conforms to POSIX. */ +#if !defined (_POSIX_C_SOURCE) && !defined (_XOPEN_SOURCE) +#define INFTIM (-1) +#endif + +#endif diff -rNU3 gnulib/m4/poll.m4 gnulib-poll/m4/poll.m4 --- gnulib/m4/poll.m4 Thu Jan 1 01:00:00 1970 +++ gnulib-poll/m4/poll.m4 Wed Feb 19 09:52:30 2003 @@ -0,0 +1,21 @@ +# poll.m4 serial 1 +dnl Copyright (c) 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of the program. + +AC_DEFUN([gl_FUNC_POLL], +[ + AC_CHECK_HEADERS(poll.h) + if test x$ac_cv_header_poll_h = xno; then + AC_CONFIG_LINKS([lib/poll.h:lib/poll_.h]) + fi + + AC_REPLACE_FUNCS(poll) + if test x$ac_cv_func_poll = xno; then + AC_HEADER_TIME + fi +]) + diff -rNU3 gnulib/modules/poll gnulib-poll/modules/poll --- gnulib/modules/poll Thu Jan 1 01:00:00 1970 +++ gnulib-poll/modules/poll Tue Feb 18 16:16:00 2003 @@ -0,0 +1,21 @@ +Description: +Emulation of poll(2) using select(2). + +Files: +lib/poll.c +lib/poll_.h + +Depends-on: + +configure.ac: +gl_FUNC_POLL + +Makefile.am: +noinst_HEADERS += poll_.h + +Include: +"poll.h" + +Maintainer: +Paolo Bonzini +