diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2017-12-08 08:36:35 +0100 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2017-12-08 08:36:35 +0100 |
commit | fd026d844d62d575d555b25dc48a1d7ce9a7db42 (patch) | |
tree | 45223400a0f93b94180559e4a7e3897f915dc1ed | |
parent | d573723196f4f0c97e64d5a3a7adbabd3d51a429 (diff) | |
download | dabmux-fd026d844d62d575d555b25dc48a1d7ce9a7db42.tar.gz dabmux-fd026d844d62d575d555b25dc48a1d7ce9a7db42.tar.bz2 dabmux-fd026d844d62d575d555b25dc48a1d7ce9a7db42.zip |
Portability: check for MSG_NOSIGNAL and SO_NOSIGPIPE
-rw-r--r-- | configure.ac | 20 | ||||
-rw-r--r-- | src/TcpSocket.cpp | 19 |
2 files changed, 37 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac index 2c84f8f..1dd7d66 100644 --- a/configure.ac +++ b/configure.ac @@ -159,6 +159,26 @@ AX_CHECK_COMPILE_FLAG([-Wlogical-op], [CXXFLAGS="$CXXFLAGS -Wlogical-op"]) AX_CHECK_COMPILE_FLAG([-Wrestrict], [CXXFLAGS="$CXXFLAGS -Wrestrict"]) AX_CHECK_COMPILE_FLAG([-Wdouble-promotion], [CXXFLAGS="$CXXFLAGS -Wdouble-promotion"]) AX_CHECK_COMPILE_FLAG(["-Wformat=2"], [CXXFLAGS="$CXXFLAGS -Wformat=2"]) + +# Linux defines MSG_NOSIGNAL, some other systems have SO_NOSIGPIPE instead +AC_MSG_CHECKING(for MSG_NOSIGNAL) +AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ + #include <sys/socket.h> + int f = MSG_NOSIGNAL; + ]])], + [ AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Define this symbol if you have MSG_NOSIGNAL]) ], + [ AC_MSG_RESULT(no) ]) + +AC_MSG_CHECKING(for SO_NOSIGPIPE) +AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ + #include <sys/socket.h> + int f = SO_NOSIGPIPE; + ]])], + [ AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_SO_NOSIGPIPE, 1, [Define this symbol if you have SO_NOSIGPIPE]) ], + [ AC_MSG_RESULT(no) ]) + AC_LANG_POP([C++]) # ZeroMQ diff --git a/src/TcpSocket.cpp b/src/TcpSocket.cpp index 40c1c1a..69b6df5 100644 --- a/src/TcpSocket.cpp +++ b/src/TcpSocket.cpp @@ -55,6 +55,14 @@ TcpSocket::TcpSocket(int port, const string& name) : throw std::runtime_error("Can't reuse address"); } +#if defined(HAVE_SO_NOSIGPIPE) + int val = 1; + if (setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, &val, sizeof(val)) + == SOCKET_ERROR) { + throw std::runtime_error("Can't set SO_NOSIGPIPE"); + } +#endif + m_own_address.setAddress(name); m_own_address.setPort(port); @@ -152,8 +160,15 @@ ssize_t TcpSocket::send(const void* data, size_t size, int timeout_ms) } } - /* Without MSG_NOSIGNAL the process would receive a SIGPIPE and die */ - ssize_t ret = ::send(m_sock, (const char*)data, size, MSG_NOSIGNAL); + /* On Linux, the MSG_NOSIGNAL flag ensures that the process would not + * receive a SIGPIPE and die. + * Other systems have SO_NOSIGPIPE set on the socket for the same effect. */ +#if defined(HAVE_MSG_NOSIGNAL) + const int flags = MSG_NOSIGNAL; +#else + const int flags = 0; +#endif + ssize_t ret = ::send(m_sock, (const char*)data, size, flags); if (ret == SOCKET_ERROR) { stringstream ss; |