annotate lib/nonblocking.c @ 18029:e4a13d95b503

mgetgroups: port to strict OS X * doc/glibc-functions/getgrouplist.texi (getgrouplist): Document the getgrouplist problem. * lib/mgetgroups.c (getgrouplist_gids) [HAVE_GETGROUPLIST]: New macro. (mgetgroups): Use it. * m4/mgetgroups.m4 (gl_MGETGROUPS): Check for OS X signature for getgrouplist.
author Paul Eggert <eggert@cs.ucla.edu>
date Sun, 28 Jun 2015 23:43:35 -0700
parents ab58d4870664
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14513
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
1 /* Non-blocking I/O for pipe or socket descriptors.
17848
ab58d4870664 version-etc: new year
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
2 Copyright (C) 2011-2015 Free Software Foundation, Inc.
14513
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
3
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
4 This program is free software: you can redistribute it and/or modify
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
6 the Free Software Foundation; either version 3 of the License, or
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
7 (at your option) any later version.
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
8
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
12 GNU General Public License for more details.
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
13
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
16
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
17 #include <config.h>
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
18
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
19 /* Specification. */
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
20 #include "nonblocking.h"
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
21
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
22 #include <errno.h>
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
23
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
24 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
16214
ec738d6aeef5 Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
25 /* Native Windows API. */
14513
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
26
14516
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
27 # include <sys/ioctl.h>
14513
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
28 # include <sys/socket.h>
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
29 # include <unistd.h>
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
30
16214
ec738d6aeef5 Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
31 /* Get declarations of the native Windows API functions. */
14513
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
32 # define WIN32_LEAN_AND_MEAN
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
33 # include <windows.h>
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
34
15752
b86e9061a6d0 New module 'msvc-nothrow'. Makes _get_osfhandle safe on MSVC 9.
Bruno Haible <bruno@clisp.org>
parents: 14532
diff changeset
35 # include "msvc-nothrow.h"
b86e9061a6d0 New module 'msvc-nothrow'. Makes _get_osfhandle safe on MSVC 9.
Bruno Haible <bruno@clisp.org>
parents: 14532
diff changeset
36
14513
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
37 int
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
38 get_nonblocking_flag (int desc)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
39 {
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
40 HANDLE h = (HANDLE) _get_osfhandle (desc);
14516
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
41 if (h == INVALID_HANDLE_VALUE)
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
42 {
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
43 errno = EBADF;
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
44 return -1;
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
45 }
14513
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
46 if (GetFileType (h) == FILE_TYPE_PIPE)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
47 {
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
48 /* h is a pipe or socket. */
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
49 DWORD state;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
50 if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, NULL, 0))
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
51 /* h is a pipe. */
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
52 return (state & PIPE_NOWAIT) != 0;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
53 else
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
54 /* h is a socket. */
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
55 errno = ENOSYS;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
56 return -1;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
57 }
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
58 else
16214
ec738d6aeef5 Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
59 /* The native Windows API does not support non-blocking on regular
ec738d6aeef5 Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
60 files. */
14513
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
61 return 0;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
62 }
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
63
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
64 int
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
65 set_nonblocking_flag (int desc, bool value)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
66 {
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
67 HANDLE h = (HANDLE) _get_osfhandle (desc);
14516
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
68 if (h == INVALID_HANDLE_VALUE)
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
69 {
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
70 errno = EBADF;
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
71 return -1;
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
72 }
14513
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
73 if (GetFileType (h) == FILE_TYPE_PIPE)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
74 {
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
75 /* h is a pipe or socket. */
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
76 DWORD state;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
77 if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, NULL, 0))
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
78 {
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
79 /* h is a pipe. */
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
80 if ((state & PIPE_NOWAIT) != 0)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
81 {
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
82 if (value)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
83 return 0;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
84 state &= ~PIPE_NOWAIT;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
85 }
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
86 else
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
87 {
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
88 if (!value)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
89 return 0;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
90 state |= PIPE_NOWAIT;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
91 }
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
92 if (SetNamedPipeHandleState (h, &state, NULL, NULL))
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
93 return 0;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
94 errno = EINVAL;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
95 return -1;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
96 }
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
97 else
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
98 {
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
99 /* h is a socket. */
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
100 int v = value;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
101 return ioctl (desc, FIONBIO, &v);
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
102 }
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
103 }
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
104 else
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
105 {
16214
ec738d6aeef5 Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
106 /* The native Windows API does not support non-blocking on regular
ec738d6aeef5 Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
107 files. */
14516
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
108 if (!value)
8b5a7d072ac7 nonblocking: fix mingw test failures
Eric Blake <eblake@redhat.com>
parents: 14513
diff changeset
109 return 0;
14513
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
110 errno = ENOTSUP;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
111 return -1;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
112 }
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
113 }
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
114
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
115 #else
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
116 /* Unix API. */
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
117
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
118 # include <fcntl.h>
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
119
14532
0b3f0c54fbc8 nonblocking: provide O_NONBLOCK for mingw
Eric Blake <eblake@redhat.com>
parents: 14516
diff changeset
120 # if GNULIB_defined_O_NONBLOCK
14513
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
121 # error Please port nonblocking to your platform
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
122 # endif
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
123
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
124 /* We don't need the gnulib replacement of fcntl() here. */
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
125 # undef fcntl
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
126
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
127 int
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
128 get_nonblocking_flag (int desc)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
129 {
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
130 int fcntl_flags;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
131
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
132 fcntl_flags = fcntl (desc, F_GETFL, 0);
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
133 if (fcntl_flags < 0)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
134 return -1;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
135 return (fcntl_flags & O_NONBLOCK) != 0;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
136 }
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
137
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
138 int
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
139 set_nonblocking_flag (int desc, bool value)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
140 {
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
141 int fcntl_flags;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
142
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
143 fcntl_flags = fcntl (desc, F_GETFL, 0);
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
144 if (fcntl_flags < 0)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
145 return -1;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
146 if (((fcntl_flags & O_NONBLOCK) != 0) == value)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
147 return 0;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
148 if (value)
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
149 fcntl_flags |= O_NONBLOCK;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
150 else
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
151 fcntl_flags &= ~O_NONBLOCK;
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
152 return fcntl (desc, F_SETFL, fcntl_flags);
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
153 }
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
154
d6c2edffe836 nonblocking: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
155 #endif