From 04b2ab1a0cfe39c98617a6c961e5ae715987c52f Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin <vadim@wxwidgets.org> Date: Thu, 19 Feb 2009 14:17:21 +0000 Subject: [PATCH] compilation fix for systems without neither MSG_NOSIGNAL nor SO_NOSIGPIPE (such as AIX and old HP-UX): disable SIGPIPE manually in this case git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59024 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/socket.cpp | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 9da07423a3..5d7eb3ad4f 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -63,9 +63,36 @@ #ifdef MSG_NOSIGNAL #define wxSOCKET_MSG_NOSIGNAL MSG_NOSIGNAL #else // MSG_NOSIGNAL not available (BSD including OS X) - #if defined(__UNIX__) && !defined(SO_NOSIGPIPE) && !defined( __VMS ) - #error "Writing to socket could generate unhandled SIGPIPE." - #error "Please post information about your system to wx-dev." + // next best possibility is to use SO_NOSIGPIPE socket option, this covers + // BSD systems (including OS X) -- but if we don't have it neither, we have + // to fall back to the old way of simply disabling SIGPIPE temporarily, so + // define a class to do it in a simple way + #if defined(__UNIX__) && !defined(SO_NOSIGPIPE) + namespace + { + class IgnoreSignal + { + public: + // ctor disables the given signal + IgnoreSignal(int sig) + : m_handler(signal(sig, SIG_IGN)), + m_sig(sig) + { + } + + // dtor restores the old handler + ~IgnoreSignal() + { + signal(m_sig, m_handler); + } + + private: + const sighandler_t m_handler; + const int m_sig; + + wxDECLARE_NO_COPY_CLASS(IgnoreSignal); + }; + } // anonymous namespace #endif #define wxSOCKET_MSG_NOSIGNAL 0 @@ -613,6 +640,10 @@ int wxSocketImpl::RecvStream(void *buffer, int size) int wxSocketImpl::SendStream(const void *buffer, int size) { +#if !defined(MSG_NOSIGNAL) && !defined(SO_NOSIGPIPE) + IgnoreSignal ignore(SIGPIPE); +#endif + int ret; DO_WHILE_EINTR( ret, send(m_fd, static_cast<const char *>(buffer), size, wxSOCKET_MSG_NOSIGNAL) ); -- 2.47.2