aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2015-10-11 04:13:13 +0200
committerMattias Andrée <maandree@operamail.com>2015-10-11 04:13:13 +0200
commit0a85228ff762b77de2d47119d1379e7ca6f48eb8 (patch)
treee2e936730368062cbafb42e6be6e8b57d5b192ce
parentwhoops (diff)
downloadmds-0a85228ff762b77de2d47119d1379e7ca6f48eb8.tar.gz
mds-0a85228ff762b77de2d47119d1379e7ca6f48eb8.tar.bz2
mds-0a85228ff762b77de2d47119d1379e7ca6f48eb8.tar.xz
Whilst POSIX leaves it explicitly unspecify whether close(2) closes the fildes on interruption, Linux (and possibly some other kernels) specify that it does close.
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rw-r--r--src/libmdsclient/comm.c7
-rw-r--r--src/libmdsserver/macros.h24
2 files changed, 17 insertions, 14 deletions
diff --git a/src/libmdsclient/comm.c b/src/libmdsclient/comm.c
index 6c72e9f..7a3ba20 100644
--- a/src/libmdsclient/comm.c
+++ b/src/libmdsclient/comm.c
@@ -86,12 +86,7 @@ void libmds_connection_destroy(libmds_connection_t* restrict this)
if (this->socket_fd >= 0)
{
- while (close(this->socket_fd))
- {
- if (errno == EINTR)
- continue;
- break; /* errno may be EBADF or EIO. */
- }
+ close(this->socket_fd); /* TODO Linux closes the filedescriptor on EINTR, but POSIX does not require that. */
this->socket_fd = -1;
}
diff --git a/src/libmdsserver/macros.h b/src/libmdsserver/macros.h
index c42ef21..71d26f1 100644
--- a/src/libmdsserver/macros.h
+++ b/src/libmdsserver/macros.h
@@ -396,12 +396,16 @@
*
* @param fd:int The file descriptor
*/
-#ifdef MDS_LIBMDSSERVER_MACROS_DEFINED_TEMP_FAILURE_RETRY
-# define xclose(fd) \
+#if 1 /* For kernels that ensure that close(2) always closes valid file descriptors. */
+# define xclose(fd) close(fd)
+#else /* For kernels that ensure that close(2) never closes valid file descriptors on interruption. */
+# ifdef MDS_LIBMDSSERVER_MACROS_DEFINED_TEMP_FAILURE_RETRY
+# define xclose(fd) \
TEMP_FAILURE_RETRY(close(fd))
-#else
-# define xclose(fd) \
+# else
+# define xclose(fd) \
(TEMP_FAILURE_RETRY(close(fd)) < 0 ? 0 : (errno = 0))
+# endif
#endif
@@ -411,12 +415,16 @@
*
* @param f:FILE* The stream
*/
-#ifdef MDS_LIBMDSSERVER_MACROS_DEFINED_TEMP_FAILURE_RETRY
-# define xfclose(f) \
+#if 1 /* For kernels that ensure that close(2) always closes valid file descriptors. */
+# define xfclose(f) fclose(f)
+#else /* For kernels that ensure that close(2) never closes valid file descriptors on interruption. */
+# ifdef MDS_LIBMDSSERVER_MACROS_DEFINED_TEMP_FAILURE_RETRY
+# define xfclose(f) \
TEMP_FAILURE_RETRY(fclose(f))
-#else
-# define xfclose(f) \
+# else
+# define xfclose(f) \
(TEMP_FAILURE_RETRY(fclose(f)) < 0 ? 0 : (errno = 0))
+# endif
#endif