Age Owner Branch data TLA 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-2024, 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
5208 magnus@hagander.net 25 :CBC 11570 : pg_set_noblock(pgsocket sock)
26 : : {
27 : : #if !defined(WIN32)
28 : : int flags;
29 : :
2550 tgl@sss.pgh.pa.us 30 : 11570 : flags = fcntl(sock, F_GETFL);
31 [ - + ]: 11570 : if (flags < 0)
2550 tgl@sss.pgh.pa.us 32 :UBC 0 : return false;
2550 tgl@sss.pgh.pa.us 33 [ - + ]:CBC 11570 : if (fcntl(sock, F_SETFL, (flags | O_NONBLOCK)) == -1)
2550 tgl@sss.pgh.pa.us 34 :UBC 0 : return false;
2550 tgl@sss.pgh.pa.us 35 :CBC 11570 : 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
5208 magnus@hagander.net 49 :UBC 0 : pg_set_block(pgsocket sock)
50 : : {
51 : : #if !defined(WIN32)
52 : : int flags;
53 : :
6960 tgl@sss.pgh.pa.us 54 : 0 : flags = fcntl(sock, F_GETFL);
2550 55 [ # # ]: 0 : if (flags < 0)
56 : 0 : return false;
57 [ # # ]: 0 : if (fcntl(sock, F_SETFL, (flags & ~O_NONBLOCK)) == -1)
6960 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 : : }
|