Age Owner 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-2023, 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
4837 magnus 25 CBC 8773 : pg_set_noblock(pgsocket sock)
26 : {
27 : #if !defined(WIN32)
28 : int flags;
29 :
2179 tgl 30 8773 : flags = fcntl(sock, F_GETFL);
31 8773 : if (flags < 0)
2179 tgl 32 UBC 0 : return false;
2179 tgl 33 CBC 8773 : if (fcntl(sock, F_SETFL, (flags | O_NONBLOCK)) == -1)
2179 tgl 34 UBC 0 : return false;
2179 tgl 35 CBC 8773 : 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
4837 magnus 49 UBC 0 : pg_set_block(pgsocket sock)
50 : {
51 : #if !defined(WIN32)
52 : int flags;
53 :
6589 tgl 54 0 : flags = fcntl(sock, F_GETFL);
2179 55 0 : if (flags < 0)
56 0 : return false;
57 0 : if (fcntl(sock, F_SETFL, (flags & ~O_NONBLOCK)) == -1)
6589 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 : }
|