1 /*-------------------------------------------------------------------------
2 *
3 * noblock.c
4 * set a file descriptor as blocking or non-blocking
5 *
6 * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 * IDENTIFICATION
10 * src/port/noblock.c
11 *
12 *-------------------------------------------------------------------------
13 */
14
15 #include "c.h"
16
17 #include <fcntl.h>
18
19
20 /*
21 * Put socket into nonblock mode.
22 * Returns true on success, false on failure.
23 */
24 bool
pg_set_noblock(pgsocket sock)25 pg_set_noblock(pgsocket sock)
26 {
27 #if !defined(WIN32)
28 int flags;
29
30 flags = fcntl(sock, F_GETFL);
31 if (flags < 0)
32 return false;
33 if (fcntl(sock, F_SETFL, (flags | O_NONBLOCK)) == -1)
34 return false;
35 return true;
36 #else
37 unsigned long ioctlsocket_ret = 1;
38
39 /* Returns non-0 on failure, while fcntl() returns -1 on failure */
40 return (ioctlsocket(sock, FIONBIO, &ioctlsocket_ret) == 0);
41 #endif
42 }
43
44 /*
45 * Put socket into blocking mode.
46 * Returns true on success, false on failure.
47 */
48 bool
pg_set_block(pgsocket sock)49 pg_set_block(pgsocket sock)
50 {
51 #if !defined(WIN32)
52 int flags;
53
54 flags = fcntl(sock, F_GETFL);
55 if (flags < 0)
56 return false;
57 if (fcntl(sock, F_SETFL, (flags & ~O_NONBLOCK)) == -1)
58 return false;
59 return true;
60 #else
61 unsigned long ioctlsocket_ret = 0;
62
63 /* Returns non-0 on failure, while fcntl() returns -1 on failure */
64 return (ioctlsocket(sock, FIONBIO, &ioctlsocket_ret) == 0);
65 #endif
66 }
67