annotate lib/select.c @ 14079:97fc9a21a8fb

maint: update almost all copyright ranges to include 2011 Run the new "make update-copyright" rule.
author Jim Meyering <meyering@redhat.com>
date Sat, 01 Jan 2011 20:17:23 +0100
parents 69913822a0f7
children 4a8092c21b94
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Emulation for select(2)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
2 Contributed by Paolo Bonzini.
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3
14079
97fc9a21a8fb maint: update almost all copyright ranges to include 2011
Jim Meyering <meyering@redhat.com>
parents: 13565
diff changeset
4 Copyright 2008-2011 Free Software Foundation, Inc.
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 This file is part of gnulib.
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8 This program is free software; you can redistribute it and/or modify
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9 it under the terms of the GNU General Public License as published by
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 the Free Software Foundation; either version 2, or (at your option)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 any later version.
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13 This program is distributed in the hope that it will be useful,
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
16 GNU General Public License for more details.
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18 You should have received a copy of the GNU General Public License along
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19 with this program; if not, write to the Free Software Foundation,
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22 #include <config.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23 #include <alloca.h>
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
24 #include <assert.h>
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
11398
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
27 /* Native Win32. */
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
28
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29 #include <sys/types.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30 #include <stdbool.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31 #include <errno.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32 #include <limits.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 #include <winsock2.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35 #include <windows.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36 #include <io.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 #include <stdio.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 #include <conio.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 #include <time.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41 struct bitset {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42 unsigned char in[FD_SETSIZE / CHAR_BIT];
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 unsigned char out[FD_SETSIZE / CHAR_BIT];
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 };
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 /* Declare data structures for ntdll functions. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 typedef struct _FILE_PIPE_LOCAL_INFORMATION {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 ULONG NamedPipeType;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49 ULONG NamedPipeConfiguration;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 ULONG MaximumInstances;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 ULONG CurrentInstances;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 ULONG InboundQuota;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 ULONG ReadDataAvailable;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 ULONG OutboundQuota;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 ULONG WriteQuotaAvailable;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56 ULONG NamedPipeState;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57 ULONG NamedPipeEnd;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58 } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60 typedef struct _IO_STATUS_BLOCK
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 union {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 DWORD Status;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
64 PVOID Pointer;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65 } u;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
66 ULONG_PTR Information;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
69 typedef enum _FILE_INFORMATION_CLASS {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
70 FilePipeLocalInformation = 24
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
72
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73 typedef DWORD (WINAPI *PNtQueryInformationFile)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
74 (HANDLE, IO_STATUS_BLOCK *, VOID *, ULONG, FILE_INFORMATION_CLASS);
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76 #ifndef PIPE_BUF
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
77 #define PIPE_BUF 512
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78 #endif
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
80 #define IsConsoleHandle(h) (((long) (h) & 3) == 3)
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
81
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
82 static BOOL
13051
094f6cfdb5c3 Minor formatting changes.
Bruno Haible <bruno@clisp.org>
parents: 12559
diff changeset
83 IsSocketHandle (HANDLE h)
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
84 {
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
85 WSANETWORKEVENTS ev;
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
86
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
87 if (IsConsoleHandle (h))
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
88 return FALSE;
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
89
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
90 /* Under Wine, it seems that getsockopt returns 0 for pipes too.
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
91 WSAEnumNetworkEvents instead distinguishes the two correctly. */
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
92 ev.lNetworkEvents = 0xDEADBEEF;
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
93 WSAEnumNetworkEvents ((SOCKET) h, NULL, &ev);
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
94 return ev.lNetworkEvents != 0xDEADBEEF;
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
95 }
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
96
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
97 /* Compute output fd_sets for libc descriptor FD (whose Win32 handle is H). */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
98
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
99 static int
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
100 win32_poll_handle (HANDLE h, int fd, struct bitset *rbits, struct bitset *wbits,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
101 struct bitset *xbits)
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
102 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
103 BOOL read, write, except;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
104 int i, ret;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
105 INPUT_RECORD *irbuffer;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
106 DWORD avail, nbuffer;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
107 BOOL bRet;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
108 IO_STATUS_BLOCK iosb;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
109 FILE_PIPE_LOCAL_INFORMATION fpli;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
110 static PNtQueryInformationFile NtQueryInformationFile;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
111 static BOOL once_only;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
112
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
113 read = write = except = FALSE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
114 switch (GetFileType (h))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
115 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
116 case FILE_TYPE_DISK:
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
117 read = TRUE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
118 write = TRUE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
119 break;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
120
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
121 case FILE_TYPE_PIPE:
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
122 if (!once_only)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
123 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
124 NtQueryInformationFile = (PNtQueryInformationFile)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
125 GetProcAddress (GetModuleHandle ("ntdll.dll"),
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
126 "NtQueryInformationFile");
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
127 once_only = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
128 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
129
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
130 if (PeekNamedPipe (h, NULL, 0, NULL, &avail, NULL) != 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
131 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
132 if (avail)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
133 read = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
134 }
13565
69913822a0f7 poll, select: handle ERROR_BROKEN_PIPE.
Paolo Bonzini <pbonzini@redhat.com>
parents: 13424
diff changeset
135 else if (GetLastError () == ERROR_BROKEN_PIPE)
69913822a0f7 poll, select: handle ERROR_BROKEN_PIPE.
Paolo Bonzini <pbonzini@redhat.com>
parents: 13424
diff changeset
136 ;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
137
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
138 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
139 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
140 /* It was the write-end of the pipe. Check if it is writable.
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
141 If NtQueryInformationFile fails, optimistically assume the pipe is
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
142 writable. This could happen on Win9x, where NtQueryInformationFile
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
143 is not available, or if we inherit a pipe that doesn't permit
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
144 FILE_READ_ATTRIBUTES access on the write end (I think this should
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
145 not happen since WinXP SP2; WINE seems fine too). Otherwise,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
146 ensure that enough space is available for atomic writes. */
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
147 memset (&iosb, 0, sizeof (iosb));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
148 memset (&fpli, 0, sizeof (fpli));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
149
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
150 if (!NtQueryInformationFile
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
151 || NtQueryInformationFile (h, &iosb, &fpli, sizeof (fpli),
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
152 FilePipeLocalInformation)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
153 || fpli.WriteQuotaAvailable >= PIPE_BUF
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
154 || (fpli.OutboundQuota < PIPE_BUF &&
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
155 fpli.WriteQuotaAvailable == fpli.OutboundQuota))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
156 write = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
157 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
158 break;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
159
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
160 case FILE_TYPE_CHAR:
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
161 write = TRUE;
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
162 if (!(rbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
163 break;
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
164
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
165 ret = WaitForSingleObject (h, 0);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
166 if (ret == WAIT_OBJECT_0)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
167 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
168 if (!IsConsoleHandle (h))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
169 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
170 read = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
171 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
172 }
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
173
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
174 nbuffer = avail = 0;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
175 bRet = GetNumberOfConsoleInputEvents (h, &nbuffer);
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
176
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
177 /* Screen buffers handles are filtered earlier. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
178 assert (bRet);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
179 if (nbuffer == 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
180 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
181 except = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
182 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
183 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
184
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
185 irbuffer = (INPUT_RECORD *) alloca (nbuffer * sizeof (INPUT_RECORD));
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
186 bRet = PeekConsoleInput (h, irbuffer, nbuffer, &avail);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
187 if (!bRet || avail == 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
188 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
189 except = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
190 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
191 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
192
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
193 for (i = 0; i < avail; i++)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
194 if (irbuffer[i].EventType == KEY_EVENT)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
195 read = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
196 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
197 break;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
198
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
199 default:
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
200 ret = WaitForSingleObject (h, 0);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
201 write = TRUE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
202 if (ret == WAIT_OBJECT_0)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
203 read = TRUE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
204
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
205 break;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
206 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
207
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
208 ret = 0;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
209 if (read && (rbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
210 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
211 rbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1)));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
212 ret++;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
213 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
214
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
215 if (write && (wbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
216 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
217 wbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1)));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
218 ret++;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
219 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
220
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
221 if (except && (xbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
222 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
223 xbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1)));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
224 ret++;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
225 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
226
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
227 return ret;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
228 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
229
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
230 int
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
231 rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds,
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
232 struct timeval *timeout)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
233 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
234 static struct timeval tv0;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
235 static HANDLE hEvent;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
236 HANDLE h, handle_array[FD_SETSIZE + 2];
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
237 fd_set handle_rfds, handle_wfds, handle_xfds;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
238 struct bitset rbits, wbits, xbits;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
239 unsigned char anyfds_in[FD_SETSIZE / CHAR_BIT];
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
240 DWORD ret, wait_timeout, nhandles, nsock, nbuffer;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
241 MSG msg;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
242 int i, fd, rc;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
243
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
244 if (nfds > FD_SETSIZE)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
245 nfds = FD_SETSIZE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
246
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
247 if (!timeout)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
248 wait_timeout = INFINITE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
249 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
250 {
13424
4fc9e7002b1b select: Correct timeout.
René Berber <r.berber@computer.org>
parents: 13051
diff changeset
251 wait_timeout = timeout->tv_sec * 1000 + timeout->tv_usec / 1000;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
252
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
253 /* select is also used as a portable usleep. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
254 if (!rfds && !wfds && !xfds)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
255 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
256 Sleep (wait_timeout);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
257 return 0;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
258 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
259 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
260
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
261 if (!hEvent)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
262 hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
263
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
264 handle_array[0] = hEvent;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
265 nhandles = 1;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
266 nsock = 0;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
267
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
268 /* Copy descriptors to bitsets. At the same time, eliminate
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
269 bits in the "wrong" direction for console input buffers
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
270 and screen buffers, because screen buffers are waitable
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
271 and they will block until a character is available. */
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
272 memset (&rbits, 0, sizeof (rbits));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
273 memset (&wbits, 0, sizeof (wbits));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
274 memset (&xbits, 0, sizeof (xbits));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
275 memset (anyfds_in, 0, sizeof (anyfds_in));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
276 if (rfds)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
277 for (i = 0; i < rfds->fd_count; i++)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
278 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
279 fd = rfds->fd_array[i];
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
280 h = (HANDLE) _get_osfhandle (fd);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
281 if (IsConsoleHandle (h)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
282 && !GetNumberOfConsoleInputEvents (h, &nbuffer))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
283 continue;
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
284
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
285 rbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
286 anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
287 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
288 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
289 rfds = (fd_set *) alloca (sizeof (fd_set));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
290
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
291 if (wfds)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
292 for (i = 0; i < wfds->fd_count; i++)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
293 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
294 fd = wfds->fd_array[i];
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
295 h = (HANDLE) _get_osfhandle (fd);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
296 if (IsConsoleHandle (h)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
297 && GetNumberOfConsoleInputEvents (h, &nbuffer))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
298 continue;
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
299
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
300 wbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
301 anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
302 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
303 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
304 wfds = (fd_set *) alloca (sizeof (fd_set));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
305
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
306 if (xfds)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
307 for (i = 0; i < xfds->fd_count; i++)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
308 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
309 fd = xfds->fd_array[i];
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
310 xbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
311 anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
312 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
313 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
314 xfds = (fd_set *) alloca (sizeof (fd_set));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
315
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
316 /* Zero all the fd_sets, including the application's. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
317 FD_ZERO (rfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
318 FD_ZERO (wfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
319 FD_ZERO (xfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
320 FD_ZERO (&handle_rfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
321 FD_ZERO (&handle_wfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
322 FD_ZERO (&handle_xfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
323
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
324 /* Classify handles. Create fd sets for sockets, poll the others. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
325 for (i = 0; i < nfds; i++)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
326 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
327 if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
328 continue;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
329
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
330 h = (HANDLE) _get_osfhandle (i);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
331 if (!h)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
332 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
333 errno = EBADF;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
334 return -1;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
335 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
336
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
337 if (IsSocketHandle (h))
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
338 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
339 int requested = FD_CLOSE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
340
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
341 /* See above; socket handles are mapped onto select, but we
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
342 need to map descriptors to handles. */
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
343 if (rbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
344 {
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
345 requested |= FD_READ | FD_ACCEPT;
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
346 FD_SET ((SOCKET) h, rfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
347 FD_SET ((SOCKET) h, &handle_rfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
348 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
349 if (wbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
350 {
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
351 requested |= FD_WRITE | FD_CONNECT;
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
352 FD_SET ((SOCKET) h, wfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
353 FD_SET ((SOCKET) h, &handle_wfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
354 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
355 if (xbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
356 {
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
357 requested |= FD_OOB;
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
358 FD_SET ((SOCKET) h, xfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
359 FD_SET ((SOCKET) h, &handle_xfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
360 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
361
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
362 WSAEventSelect ((SOCKET) h, hEvent, requested);
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
363 nsock++;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
364 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
365 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
366 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
367 handle_array[nhandles++] = h;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
368
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
369 /* Poll now. If we get an event, do not wait below. */
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
370 if (wait_timeout != 0
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
371 && win32_poll_handle (h, i, &rbits, &wbits, &xbits))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
372 wait_timeout = 0;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
373 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
374 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
375
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
376 if (wait_timeout == 0 || nsock == 0)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
377 rc = 0;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
378 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
379 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
380 /* See if we need to wait in the loop below. If any select is ready,
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
381 do MsgWaitForMultipleObjects anyway to dispatch messages, but
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
382 no need to call select again. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
383 rc = select (0, &handle_rfds, &handle_wfds, &handle_xfds, &tv0);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
384 if (rc == 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
385 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
386 /* Restore the fd_sets for the other select we do below. */
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
387 memcpy (&handle_rfds, rfds, sizeof (fd_set));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
388 memcpy (&handle_wfds, wfds, sizeof (fd_set));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
389 memcpy (&handle_xfds, xfds, sizeof (fd_set));
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
390 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
391 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
392 wait_timeout = 0;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
393 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
394
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
395 for (;;)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
396 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
397 ret = MsgWaitForMultipleObjects (nhandles, handle_array, FALSE,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
398 wait_timeout, QS_ALLINPUT);
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
399
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
400 if (ret == WAIT_OBJECT_0 + nhandles)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
401 {
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
402 /* new input of some other kind */
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
403 BOOL bRet;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
404 while ((bRet = PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) != 0)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
405 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
406 TranslateMessage (&msg);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
407 DispatchMessage (&msg);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
408 }
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
409 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
410 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
411 break;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
412 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
413
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
414 /* If we haven't done it yet, check the status of the sockets. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
415 if (rc == 0 && nsock > 0)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
416 rc = select (0, &handle_rfds, &handle_wfds, &handle_xfds, &tv0);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
417
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
418 /* Now fill in the results. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
419 FD_ZERO (rfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
420 FD_ZERO (wfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
421 FD_ZERO (xfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
422
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
423 /* Place a sentinel at the end of the array. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
424 handle_array[nhandles] = NULL;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
425 nhandles = 1;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
426 for (i = 0; i < nfds; i++)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
427 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
428 if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
429 continue;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
430
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
431 h = (HANDLE) _get_osfhandle (i);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
432 if (h != handle_array[nhandles])
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
433 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
434 /* Perform handle->descriptor mapping. Don't update rc, as these
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
435 results are counted in the return value of Winsock's select. */
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
436 WSAEventSelect ((SOCKET) h, NULL, 0);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
437 if (FD_ISSET (h, &handle_rfds))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
438 FD_SET (i, rfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
439 if (FD_ISSET (h, &handle_wfds))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
440 FD_SET (i, wfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
441 if (FD_ISSET (h, &handle_xfds))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
442 FD_SET (i, xfds);
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
443 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
444 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
445 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
446 /* Not a socket. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
447 nhandles++;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
448 win32_poll_handle (h, i, &rbits, &wbits, &xbits);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
449 if (rbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
450 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
451 rc++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
452 FD_SET (i, rfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
453 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
454 if (wbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
455 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
456 rc++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
457 FD_SET (i, wfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
458 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
459 if (xbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
460 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
461 rc++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
462 FD_SET (i, xfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
463 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
464 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
465 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
466
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
467 return rc;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
468 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
469
11398
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
470 #else /* ! Native Win32. */
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
471
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
472 #include <sys/select.h>
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
473
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
474 #undef select
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
475
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
476 int
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
477 rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds,
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
478 struct timeval *timeout)
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
479 {
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
480 /* Interix 3.5 has a bug: it does not support nfds == 0. */
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
481 if (nfds == 0)
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
482 {
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
483 nfds = 1;
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
484 rfds = NULL;
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
485 wfds = NULL;
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
486 xfds = NULL;
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
487 }
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
488 return select (nfds, rfds, wfds, xfds, timeout);
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
489 }
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
490
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
491 #endif