aboutsummaryrefslogtreecommitdiff
path: root/src/port/noblock.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/port/noblock.c')
-rw-r--r--src/port/noblock.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/port/noblock.c b/src/port/noblock.c
index 7e70319bd4e..673fa8aa3ce 100644
--- a/src/port/noblock.c
+++ b/src/port/noblock.c
@@ -1,7 +1,7 @@
/*-------------------------------------------------------------------------
*
* noblock.c
- * set a file descriptor as non-blocking
+ * set a file descriptor as blocking or non-blocking
*
* Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
@@ -17,11 +17,22 @@
#include <fcntl.h>
+/*
+ * Put socket into nonblock mode.
+ * Returns true on success, false on failure.
+ */
bool
pg_set_noblock(pgsocket sock)
{
#if !defined(WIN32)
- return (fcntl(sock, F_SETFL, O_NONBLOCK) != -1);
+ int flags;
+
+ flags = fcntl(sock, F_GETFL);
+ if (flags < 0)
+ return false;
+ if (fcntl(sock, F_SETFL, (flags | O_NONBLOCK)) == -1)
+ return false;
+ return true;
#else
unsigned long ioctlsocket_ret = 1;
@@ -30,7 +41,10 @@ pg_set_noblock(pgsocket sock)
#endif
}
-
+/*
+ * Put socket into blocking mode.
+ * Returns true on success, false on failure.
+ */
bool
pg_set_block(pgsocket sock)
{
@@ -38,7 +52,9 @@ pg_set_block(pgsocket sock)
int flags;
flags = fcntl(sock, F_GETFL);
- if (flags < 0 || fcntl(sock, F_SETFL, (long) (flags & ~O_NONBLOCK)))
+ if (flags < 0)
+ return false;
+ if (fcntl(sock, F_SETFL, (flags & ~O_NONBLOCK)) == -1)
return false;
return true;
#else