annotate lib/select.c @ 16040:b8acd8099b25

New module 'fmaf'. * lib/math.in.h (fmaf): New declaration. * lib/fmaf.c: New file. * m4/fmaf.m4: New file. * m4/math_h.m4 (gl_MATH_H): Test whethern fmaf is declared. (gl_MATH_H_DEFAULTS): Initialize GNULIB_FMAF, HAVE_FMAF, REPLACE_FMAF. * modules/math (Makefile.am): Substitute GNULIB_FMAF, HAVE_FMAF, REPLACE_FMAF. * modules/fmaf: New file. * doc/posix-functions/fmaf.texi: Mention the new module and the various bugs.
author Bruno Haible <bruno@clisp.org>
date Mon, 17 Oct 2011 23:51:21 +0200
parents b86e9061a6d0
children 8250f2777afc
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 <errno.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31 #include <limits.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 #include <winsock2.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 #include <windows.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35 #include <io.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36 #include <stdio.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 #include <conio.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 #include <time.h>
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39
15752
b86e9061a6d0 New module 'msvc-nothrow'. Makes _get_osfhandle safe on MSVC 9.
Bruno Haible <bruno@clisp.org>
parents: 15741
diff changeset
40 #include "msvc-nothrow.h"
b86e9061a6d0 New module 'msvc-nothrow'. Makes _get_osfhandle safe on MSVC 9.
Bruno Haible <bruno@clisp.org>
parents: 15741
diff changeset
41
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42 struct bitset {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 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
44 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
45 };
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 /* Declare data structures for ntdll functions. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 typedef struct _FILE_PIPE_LOCAL_INFORMATION {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49 ULONG NamedPipeType;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 ULONG NamedPipeConfiguration;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 ULONG MaximumInstances;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 ULONG CurrentInstances;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 ULONG InboundQuota;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 ULONG ReadDataAvailable;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 ULONG OutboundQuota;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56 ULONG WriteQuotaAvailable;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57 ULONG NamedPipeState;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58 ULONG NamedPipeEnd;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59 } 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
60
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 typedef struct _IO_STATUS_BLOCK
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 union {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
64 DWORD Status;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65 PVOID Pointer;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
66 } u;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 ULONG_PTR Information;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
69
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
70 typedef enum _FILE_INFORMATION_CLASS {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71 FilePipeLocalInformation = 24
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
72 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
74 typedef DWORD (WINAPI *PNtQueryInformationFile)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
75 (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
76
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
77 #ifndef PIPE_BUF
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
78 #define PIPE_BUF 512
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 #endif
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
81 #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
82
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
83 static BOOL
13051
094f6cfdb5c3 Minor formatting changes.
Bruno Haible <bruno@clisp.org>
parents: 12559
diff changeset
84 IsSocketHandle (HANDLE h)
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
85 {
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
86 WSANETWORKEVENTS ev;
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
87
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
88 if (IsConsoleHandle (h))
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
89 return FALSE;
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
90
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
91 /* 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
92 WSAEnumNetworkEvents instead distinguishes the two correctly. */
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
93 ev.lNetworkEvents = 0xDEADBEEF;
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
94 WSAEnumNetworkEvents ((SOCKET) h, NULL, &ev);
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
95 return ev.lNetworkEvents != 0xDEADBEEF;
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
96 }
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
97
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
98 /* 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
99
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
100 static int
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
101 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
102 struct bitset *xbits)
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
103 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
104 BOOL read, write, except;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
105 int i, ret;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
106 INPUT_RECORD *irbuffer;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
107 DWORD avail, nbuffer;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
108 BOOL bRet;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
109 IO_STATUS_BLOCK iosb;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
110 FILE_PIPE_LOCAL_INFORMATION fpli;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
111 static PNtQueryInformationFile NtQueryInformationFile;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
112 static BOOL once_only;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
113
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
114 read = write = except = FALSE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
115 switch (GetFileType (h))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
116 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
117 case FILE_TYPE_DISK:
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
118 read = TRUE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
119 write = TRUE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
120 break;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
121
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
122 case FILE_TYPE_PIPE:
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
123 if (!once_only)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
124 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
125 NtQueryInformationFile = (PNtQueryInformationFile)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
126 GetProcAddress (GetModuleHandle ("ntdll.dll"),
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
127 "NtQueryInformationFile");
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
128 once_only = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
129 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
130
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
131 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
132 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
133 if (avail)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
134 read = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
135 }
13565
69913822a0f7 poll, select: handle ERROR_BROKEN_PIPE.
Paolo Bonzini <pbonzini@redhat.com>
parents: 13424
diff changeset
136 else if (GetLastError () == ERROR_BROKEN_PIPE)
69913822a0f7 poll, select: handle ERROR_BROKEN_PIPE.
Paolo Bonzini <pbonzini@redhat.com>
parents: 13424
diff changeset
137 ;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
138
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
139 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
140 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
141 /* 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
142 If NtQueryInformationFile fails, optimistically assume the pipe is
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
143 writable. This could happen on Win9x, where NtQueryInformationFile
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
144 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
145 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
146 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
147 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
148 memset (&iosb, 0, sizeof (iosb));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
149 memset (&fpli, 0, sizeof (fpli));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
150
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
151 if (!NtQueryInformationFile
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
152 || NtQueryInformationFile (h, &iosb, &fpli, sizeof (fpli),
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
153 FilePipeLocalInformation)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
154 || fpli.WriteQuotaAvailable >= PIPE_BUF
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
155 || (fpli.OutboundQuota < PIPE_BUF &&
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
156 fpli.WriteQuotaAvailable == fpli.OutboundQuota))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
157 write = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
158 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
159 break;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
160
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
161 case FILE_TYPE_CHAR:
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
162 write = TRUE;
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
163 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
164 break;
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
165
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
166 ret = WaitForSingleObject (h, 0);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
167 if (ret == WAIT_OBJECT_0)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
168 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
169 if (!IsConsoleHandle (h))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
170 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
171 read = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
172 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
173 }
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
174
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
175 nbuffer = avail = 0;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
176 bRet = GetNumberOfConsoleInputEvents (h, &nbuffer);
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
177
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
178 /* Screen buffers handles are filtered earlier. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
179 assert (bRet);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
180 if (nbuffer == 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
181 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
182 except = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
183 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
184 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
185
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
186 irbuffer = (INPUT_RECORD *) alloca (nbuffer * sizeof (INPUT_RECORD));
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
187 bRet = PeekConsoleInput (h, irbuffer, nbuffer, &avail);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
188 if (!bRet || avail == 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
189 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
190 except = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
191 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
192 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
193
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
194 for (i = 0; i < avail; i++)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
195 if (irbuffer[i].EventType == KEY_EVENT)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
196 read = TRUE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
197 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
198 break;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
199
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
200 default:
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
201 ret = WaitForSingleObject (h, 0);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
202 write = TRUE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
203 if (ret == WAIT_OBJECT_0)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
204 read = TRUE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
205
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
206 break;
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
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
209 ret = 0;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
210 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
211 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
212 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
213 ret++;
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
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
216 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
217 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
218 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
219 ret++;
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
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
222 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
223 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
224 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
225 ret++;
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
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
228 return ret;
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
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
231 int
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
232 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
233 struct timeval *timeout)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
234 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
235 static struct timeval tv0;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
236 static HANDLE hEvent;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
237 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
238 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
239 struct bitset rbits, wbits, xbits;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
240 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
241 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
242 MSG msg;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
243 int i, fd, rc;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
244
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
245 if (nfds > FD_SETSIZE)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
246 nfds = FD_SETSIZE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
247
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
248 if (!timeout)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
249 wait_timeout = INFINITE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
250 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
251 {
13424
4fc9e7002b1b select: Correct timeout.
René Berber <r.berber@computer.org>
parents: 13051
diff changeset
252 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
253
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
254 /* 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
255 if (!rfds && !wfds && !xfds)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
256 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
257 Sleep (wait_timeout);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
258 return 0;
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
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
262 if (!hEvent)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
263 hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
264
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
265 handle_array[0] = hEvent;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
266 nhandles = 1;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
267 nsock = 0;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
268
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
269 /* 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
270 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
271 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
272 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
273 memset (&rbits, 0, sizeof (rbits));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
274 memset (&wbits, 0, sizeof (wbits));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
275 memset (&xbits, 0, sizeof (xbits));
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
276 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
277 if (rfds)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
278 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
279 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
280 fd = rfds->fd_array[i];
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
281 h = (HANDLE) _get_osfhandle (fd);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
282 if (IsConsoleHandle (h)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
283 && !GetNumberOfConsoleInputEvents (h, &nbuffer))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
284 continue;
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
285
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
286 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
287 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
288 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
289 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
290 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
291
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
292 if (wfds)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
293 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
294 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
295 fd = wfds->fd_array[i];
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
296 h = (HANDLE) _get_osfhandle (fd);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
297 if (IsConsoleHandle (h)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
298 && GetNumberOfConsoleInputEvents (h, &nbuffer))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
299 continue;
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
300
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
301 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
302 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
303 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
304 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
305 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
306
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
307 if (xfds)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
308 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
309 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
310 fd = xfds->fd_array[i];
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
311 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
312 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
313 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
314 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
315 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
316
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
317 /* 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
318 FD_ZERO (rfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
319 FD_ZERO (wfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
320 FD_ZERO (xfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
321 FD_ZERO (&handle_rfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
322 FD_ZERO (&handle_wfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
323 FD_ZERO (&handle_xfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
324
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
325 /* 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
326 for (i = 0; i < nfds; i++)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
327 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
328 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
329 continue;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
330
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
331 h = (HANDLE) _get_osfhandle (i);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
332 if (!h)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
333 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
334 errno = EBADF;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
335 return -1;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
336 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
337
11852
c9032834d889 Fix polling for writeability of a screen buffer.
Paolo Bonzini <bonzini@gnu.org>
parents: 11398
diff changeset
338 if (IsSocketHandle (h))
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
339 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
340 int requested = FD_CLOSE;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
341
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
342 /* 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
343 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
344 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
345 {
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
346 requested |= FD_READ | FD_ACCEPT;
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
347 FD_SET ((SOCKET) h, rfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
348 FD_SET ((SOCKET) h, &handle_rfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
349 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
350 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
351 {
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
352 requested |= FD_WRITE | FD_CONNECT;
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
353 FD_SET ((SOCKET) h, wfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
354 FD_SET ((SOCKET) h, &handle_wfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
355 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
356 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
357 {
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
358 requested |= FD_OOB;
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
359 FD_SET ((SOCKET) h, xfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
360 FD_SET ((SOCKET) h, &handle_xfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
361 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
362
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
363 WSAEventSelect ((SOCKET) h, hEvent, requested);
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
364 nsock++;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
365 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
366 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
367 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
368 handle_array[nhandles++] = h;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
369
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
370 /* 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
371 if (wait_timeout != 0
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
372 && win32_poll_handle (h, i, &rbits, &wbits, &xbits))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
373 wait_timeout = 0;
11397
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
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
377 if (wait_timeout == 0 || nsock == 0)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
378 rc = 0;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
379 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
380 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
381 /* 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
382 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
383 no need to call select again. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
384 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
385 if (rc == 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
386 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
387 /* 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
388 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
389 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
390 memcpy (&handle_xfds, xfds, sizeof (fd_set));
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
391 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
392 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
393 wait_timeout = 0;
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
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
396 for (;;)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
397 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
398 ret = MsgWaitForMultipleObjects (nhandles, handle_array, FALSE,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
399 wait_timeout, QS_ALLINPUT);
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
400
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
401 if (ret == WAIT_OBJECT_0 + nhandles)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
402 {
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
403 /* new input of some other kind */
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
404 BOOL bRet;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
405 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
406 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
407 TranslateMessage (&msg);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
408 DispatchMessage (&msg);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
409 }
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
410 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
411 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
412 break;
11397
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
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
415 /* 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
416 if (rc == 0 && nsock > 0)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
417 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
418
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
419 /* Now fill in the results. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
420 FD_ZERO (rfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
421 FD_ZERO (wfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
422 FD_ZERO (xfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
423
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
424 /* 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
425 handle_array[nhandles] = NULL;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
426 nhandles = 1;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
427 for (i = 0; i < nfds; i++)
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
428 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
429 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
430 continue;
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
431
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
432 h = (HANDLE) _get_osfhandle (i);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
433 if (h != handle_array[nhandles])
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
434 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
435 /* 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
436 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
437 WSAEventSelect ((SOCKET) h, NULL, 0);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
438 if (FD_ISSET (h, &handle_rfds))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
439 FD_SET (i, rfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
440 if (FD_ISSET (h, &handle_wfds))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
441 FD_SET (i, wfds);
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
442 if (FD_ISSET (h, &handle_xfds))
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
443 FD_SET (i, xfds);
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
444 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
445 else
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
446 {
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
447 /* Not a socket. */
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
448 nhandles++;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
449 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
450 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
451 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
452 rc++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
453 FD_SET (i, rfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
454 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
455 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
456 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
457 rc++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
458 FD_SET (i, wfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
459 }
11397
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
460 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
461 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
462 rc++;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
463 FD_SET (i, xfds);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12319
diff changeset
464 }
11397
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
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
468 return rc;
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
469 }
bbd55a939862 Rename lib/winsock-select.c to lib/select.c.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
470
11398
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
471 #else /* ! Native Win32. */
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
472
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
473 #include <sys/select.h>
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
474
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
475 #undef select
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
476
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
477 int
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
478 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
479 struct timeval *timeout)
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
480 {
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
481 /* 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
482 if (nfds == 0)
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
483 {
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
484 nfds = 1;
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
485 rfds = NULL;
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
486 wfds = NULL;
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
487 xfds = NULL;
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
488 }
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
489 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
490 }
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
491
2de4c4d41f01 Work around select() bug on Interix 3.5.
Bruno Haible <bruno@clisp.org>
parents: 11397
diff changeset
492 #endif