diff options
author | Mattias Andrée <maandree@operamail.com> | 2015-10-11 04:13:13 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2015-10-11 04:13:13 +0200 |
commit | 0a85228ff762b77de2d47119d1379e7ca6f48eb8 (patch) | |
tree | e2e936730368062cbafb42e6be6e8b57d5b192ce | |
parent | whoops (diff) | |
download | mds-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.c | 7 | ||||
-rw-r--r-- | src/libmdsserver/macros.h | 24 |
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 |