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-2017, 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 218 : pg_set_noblock(pgsocket sock)
26 : {
27 : #if !defined(WIN32)
28 : int flags;
29 :
30 218 : flags = fcntl(sock, F_GETFL);
31 218 : if (flags < 0)
32 0 : return false;
33 218 : if (fcntl(sock, F_SETFL, (flags | O_NONBLOCK)) == -1)
34 0 : return false;
35 218 : 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
49 0 : pg_set_block(pgsocket sock)
50 : {
51 : #if !defined(WIN32)
52 : 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 : }
|