Branch data Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * noblock.c
4 : : * set a file descriptor as blocking or non-blocking
5 : : *
6 : : * Portions Copyright (c) 1996-2026, 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
25 : 632 : pg_set_noblock(pgsocket sock)
26 : : {
27 : : #if !defined(WIN32)
28 : 632 : int flags;
29 : :
30 : 632 : flags = fcntl(sock, F_GETFL);
31 [ + - ]: 632 : if (flags < 0)
32 : 0 : return false;
33 [ + - ]: 632 : if (fcntl(sock, F_SETFL, (flags | O_NONBLOCK)) == -1)
34 : 0 : return false;
35 : 632 : 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 : 632 : }
43 : :
44 : : /*
45 : : * Put socket into blocking mode.
46 : : * Returns true on success, false on failure.
47 : : */
48 : : bool
49 : 0 : pg_set_block(pgsocket sock)
50 : : {
51 : : #if !defined(WIN32)
52 : 0 : int flags;
53 : :
54 : 0 : flags = fcntl(sock, F_GETFL);
55 [ # # ]: 0 : if (flags < 0)
56 : 0 : return false;
57 [ # # ]: 0 : if (fcntl(sock, F_SETFL, (flags & ~O_NONBLOCK)) == -1)
58 : 0 : return false;
59 : 0 : 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 : 0 : }
|