1 /* Non-blocking I/O for pipe or socket descriptors.
2 Copyright (C) 2011-2019 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
20 #include "nonblocking.h"
24 #if defined _WIN32 && ! defined __CYGWIN__
25 /* Native Windows API. */
27 # include <sys/ioctl.h>
28 # include <sys/socket.h>
31 /* Get declarations of the native Windows API functions. */
32 # define WIN32_LEAN_AND_MEAN
35 # if GNULIB_MSVC_NOTHROW
36 # include "msvc-nothrow.h"
42 get_nonblocking_flag (int desc
)
44 HANDLE h
= (HANDLE
) _get_osfhandle (desc
);
45 if (h
== INVALID_HANDLE_VALUE
)
50 if (GetFileType (h
) == FILE_TYPE_PIPE
)
52 /* h is a pipe or socket. */
54 if (GetNamedPipeHandleState (h
, &state
, NULL
, NULL
, NULL
, NULL
, 0))
56 return (state
& PIPE_NOWAIT
) != 0;
63 /* The native Windows API does not support non-blocking on regular
69 set_nonblocking_flag (int desc
, bool value
)
71 HANDLE h
= (HANDLE
) _get_osfhandle (desc
);
72 if (h
== INVALID_HANDLE_VALUE
)
77 if (GetFileType (h
) == FILE_TYPE_PIPE
)
79 /* h is a pipe or socket. */
81 if (GetNamedPipeHandleState (h
, &state
, NULL
, NULL
, NULL
, NULL
, 0))
84 if ((state
& PIPE_NOWAIT
) != 0)
88 state
&= ~PIPE_NOWAIT
;
96 if (SetNamedPipeHandleState (h
, &state
, NULL
, NULL
))
105 return ioctl (desc
, FIONBIO
, &v
);
110 /* The native Windows API does not support non-blocking on regular
124 # if GNULIB_defined_O_NONBLOCK
125 # error Please port nonblocking to your platform
128 /* We don't need the gnulib replacement of fcntl() here. */
132 get_nonblocking_flag (int desc
)
136 fcntl_flags
= fcntl (desc
, F_GETFL
, 0);
139 return (fcntl_flags
& O_NONBLOCK
) != 0;
143 set_nonblocking_flag (int desc
, bool value
)
147 fcntl_flags
= fcntl (desc
, F_GETFL
, 0);
150 if (((fcntl_flags
& O_NONBLOCK
) != 0) == value
)
153 fcntl_flags
|= O_NONBLOCK
;
155 fcntl_flags
&= ~O_NONBLOCK
;
156 return fcntl (desc
, F_SETFL
, fcntl_flags
);