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