annotate lib/poll.c @ 7908:d41d48e822b4

* lib/poll.c: Include sys/time.h and time.h unconditionally, since we now assume the sys_time module. * m4/poll.m4 (gl_PREREQ_POLL): Don't require AC_HEADER_TIME or check for sys/time.h; no longer needed. * modules/poll (Depends-on): Depend on sys_time.
author Paul Eggert <eggert@cs.ucla.edu>
date Sat, 20 Jan 2007 08:32:33 +0000
parents 35d644ee8b48
children 3456eea85728
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4242
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Emulation for poll(2)
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
2 Contributed by Paolo Bonzini.
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
4 Copyright 2001, 2002, 2003, 2006, 2007 Free Software Foundation, Inc.
4242
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 This file is part of gnulib.
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7
4435
d4efdb886b2a Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4242
diff changeset
8 This program is free software; you can redistribute it and/or modify
d4efdb886b2a Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4242
diff changeset
9 it under the terms of the GNU General Public License as published by
d4efdb886b2a Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4242
diff changeset
10 the Free Software Foundation; either version 2, or (at your option)
4242
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 any later version.
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12
4435
d4efdb886b2a Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4242
diff changeset
13 This program is distributed in the hope that it will be useful,
d4efdb886b2a Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4242
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
d4efdb886b2a Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4242
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d4efdb886b2a Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4242
diff changeset
16 GNU General Public License for more details.
4242
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17
4435
d4efdb886b2a Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4242
diff changeset
18 You should have received a copy of the GNU General Public License along
d4efdb886b2a Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4242
diff changeset
19 with this program; if not, write to the Free Software Foundation,
5848
a48fb0e98c8c *** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents: 4435
diff changeset
20 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
4242
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21
7382
8eedfb060b79 2006-09-28 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 6259
diff changeset
22 #include "config.h"
4242
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 #include <sys/types.h>
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 #include "poll.h"
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 #include <errno.h>
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27 #include <limits.h>
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28 #include <sys/socket.h>
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29 #include <sys/select.h>
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30 #include <unistd.h>
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31
7382
8eedfb060b79 2006-09-28 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 6259
diff changeset
32 #ifdef HAVE_SYS_IOCTL_H
8eedfb060b79 2006-09-28 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 6259
diff changeset
33 #include <sys/ioctl.h>
8eedfb060b79 2006-09-28 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 6259
diff changeset
34 #endif
8eedfb060b79 2006-09-28 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 6259
diff changeset
35 #ifdef HAVE_SYS_FILIO_H
8eedfb060b79 2006-09-28 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 6259
diff changeset
36 #include <sys/filio.h>
8eedfb060b79 2006-09-28 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 6259
diff changeset
37 #endif
8eedfb060b79 2006-09-28 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 6259
diff changeset
38
7908
d41d48e822b4 * lib/poll.c: Include sys/time.h and time.h unconditionally,
Paul Eggert <eggert@cs.ucla.edu>
parents: 7776
diff changeset
39 #include <sys/time.h>
d41d48e822b4 * lib/poll.c: Include sys/time.h and time.h unconditionally,
Paul Eggert <eggert@cs.ucla.edu>
parents: 7776
diff changeset
40 #include <time.h>
4242
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42 #ifndef INFTIM
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 #define INFTIM (-1)
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 #endif
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 #ifndef EOVERFLOW
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 #define EOVERFLOW EINVAL
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 #endif
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 int
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 poll (pfd, nfd, timeout)
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 struct pollfd *pfd;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 nfds_t nfd;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 int timeout;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 {
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56 fd_set rfds, wfds, efds;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57 struct timeval tv, *ptv;
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
58 int maxfd, rc;
4242
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59 nfds_t i;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 #ifdef _SC_OPEN_MAX
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 if (nfd > sysconf (_SC_OPEN_MAX))
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 {
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
64 errno = EINVAL;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65 return -1;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
66 }
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 #else /* !_SC_OPEN_MAX */
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68 #ifdef OPEN_MAX
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
69 if (nfd > OPEN_MAX)
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
70 {
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71 errno = EINVAL;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
72 return -1;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73 }
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
74 #endif /* OPEN_MAX -- else, no check is needed */
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75 #endif /* !_SC_OPEN_MAX */
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
77 /* EFAULT is not necessary to implement, but let's do it in the
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78 simplest case. */
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 if (!pfd)
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80 {
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
81 errno = EFAULT;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82 return -1;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
83 }
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
84
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
85 /* convert timeout number into a timeval structure */
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
86 ptv = &tv;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
87 if (timeout >= 0)
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
88 {
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
89 /* return immediately or after timeout */
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
90 ptv->tv_sec = timeout / 1000;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
91 ptv->tv_usec = (timeout % 1000) * 1000;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
92 }
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
93 else if (timeout == INFTIM)
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
94 /* wait forever */
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
95 ptv = NULL;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
96 else
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
97 {
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
98 errno = EINVAL;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
99 return -1;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
100 }
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
101
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
102 /* create fd sets and determine max fd */
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
103 maxfd = -1;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
104 FD_ZERO (&rfds);
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
105 FD_ZERO (&wfds);
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
106 FD_ZERO (&efds);
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
107 for (i = 0; i < nfd; i++)
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
108 {
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
109 if (pfd[i].fd < 0)
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
110 continue;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
111
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
112 if (pfd[i].events & (POLLIN | POLLRDNORM))
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
113 FD_SET (pfd[i].fd, &rfds);
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
114
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
115 /* see select(2): "the only exceptional condition detectable
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
116 is out-of-band data received on a socket", hence we push
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
117 POLLWRBAND events onto wfds instead of efds. */
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
118 if (pfd[i].events & (POLLOUT | POLLWRNORM | POLLWRBAND))
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
119 FD_SET (pfd[i].fd, &wfds);
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
120 if (pfd[i].events & (POLLPRI | POLLRDBAND))
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
121 FD_SET (pfd[i].fd, &efds);
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
122 if (pfd[i].fd >= maxfd
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
123 && (pfd[i].events & (POLLIN | POLLOUT | POLLPRI
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
124 | POLLRDNORM | POLLRDBAND
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
125 | POLLWRNORM | POLLWRBAND)))
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
126 {
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
127 maxfd = pfd[i].fd;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
128 if (maxfd > FD_SETSIZE)
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
129 {
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
130 errno = EOVERFLOW;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
131 return -1;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
132 }
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
133 }
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
134 }
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
135
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
136 /* examine fd sets */
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
137 rc = select (maxfd + 1, &rfds, &wfds, &efds, ptv);
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
138 if (rc < 0)
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
139 return rc;
4242
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
140
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
141 /* establish results */
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
142 rc = 0;
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
143 for (i = 0; i < nfd; i++)
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
144 if (pfd[i].fd < 0)
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
145 pfd[i].revents = 0;
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
146 else
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
147 {
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
148 int happened = 0, sought = pfd[i].events;
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
149 if (FD_ISSET (pfd[i].fd, &rfds))
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
150 {
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
151 int r;
7908
d41d48e822b4 * lib/poll.c: Include sys/time.h and time.h unconditionally,
Paul Eggert <eggert@cs.ucla.edu>
parents: 7776
diff changeset
152
7382
8eedfb060b79 2006-09-28 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 6259
diff changeset
153 #if defined __MACH__ && defined __APPLE__
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
154 /* There is a bug in Mac OS X that causes it to ignore MSG_PEEK
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
155 for some kinds of descriptors. Detect if this descriptor is a
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
156 connected socket, a server socket, or something else using a
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
157 0-byte recv, and use ioctl(2) to detect POLLHUP. */
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
158 r = recv (pfd[i].fd, NULL, 0, MSG_PEEK);
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
159 if (r == 0 || errno == ENOTSOCK)
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
160 ioctl(pfd[i].fd, FIONREAD, &r);
7382
8eedfb060b79 2006-09-28 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 6259
diff changeset
161 #else
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
162 char data[64];
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
163 r = recv (pfd[i].fd, data, sizeof (data), MSG_PEEK);
7382
8eedfb060b79 2006-09-28 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 6259
diff changeset
164 #endif
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
165 if (r == 0)
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
166 happened |= POLLHUP;
7908
d41d48e822b4 * lib/poll.c: Include sys/time.h and time.h unconditionally,
Paul Eggert <eggert@cs.ucla.edu>
parents: 7776
diff changeset
167
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
168 /* If the event happened on an unconnected server socket,
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
169 that's fine. */
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
170 else if (r > 0 || ( /* (r == -1) && */ errno == ENOTCONN))
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
171 happened |= (POLLIN | POLLRDNORM) & sought;
7908
d41d48e822b4 * lib/poll.c: Include sys/time.h and time.h unconditionally,
Paul Eggert <eggert@cs.ucla.edu>
parents: 7776
diff changeset
172
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
173 /* Distinguish hung-up sockets from other errors. */
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
174 else if (errno == ESHUTDOWN || errno == ECONNRESET
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
175 || errno == ECONNABORTED || errno == ENETRESET)
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
176 happened |= POLLHUP;
7908
d41d48e822b4 * lib/poll.c: Include sys/time.h and time.h unconditionally,
Paul Eggert <eggert@cs.ucla.edu>
parents: 7776
diff changeset
177
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
178 else
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
179 happened |= POLLERR;
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
180 }
7908
d41d48e822b4 * lib/poll.c: Include sys/time.h and time.h unconditionally,
Paul Eggert <eggert@cs.ucla.edu>
parents: 7776
diff changeset
181
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
182 if (FD_ISSET (pfd[i].fd, &wfds))
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
183 happened |= (POLLOUT | POLLWRNORM | POLLWRBAND) & sought;
7908
d41d48e822b4 * lib/poll.c: Include sys/time.h and time.h unconditionally,
Paul Eggert <eggert@cs.ucla.edu>
parents: 7776
diff changeset
184
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
185 if (FD_ISSET (pfd[i].fd, &efds))
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
186 happened |= (POLLPRI | POLLRDBAND) & sought;
7908
d41d48e822b4 * lib/poll.c: Include sys/time.h and time.h unconditionally,
Paul Eggert <eggert@cs.ucla.edu>
parents: 7776
diff changeset
187
7776
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
188 if (happened)
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
189 {
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
190 pfd[i].revents = happened;
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
191 rc++;
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
192 }
35d644ee8b48 2007-01-03 Paolo Bonzini <bonzini@gnu.org>
Paolo Bonzini <bonzini@gnu.org>
parents: 7382
diff changeset
193 }
4242
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
194
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
195 return rc;
eec6ba9ed532 New module poll, from Paolo Bonzini <bonzini@gnu.org>.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
196 }