X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c0c133e13b36a923c65f94499554e432bc3a0daa..a95f37bc57cd0318ee2ae5cc94ac447cce47a5cf:/src/common/socket.cpp diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 9da07423a3..3c4f417e75 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -63,10 +63,40 @@ #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." - #endif + // 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 (AIX and + // old HP-UX do not), we have to fall back to the old way of simply + // disabling SIGPIPE temporarily, so define a class to do it in a safe way + #if defined(__UNIX__) && !defined(SO_NOSIGPIPE) + extern "C" { typedef void (*wxSigHandler_t)(int); } + 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 wxSigHandler_t m_handler; + const int m_sig; + + wxDECLARE_NO_COPY_CLASS(IgnoreSignal); + }; + } // anonymous namespace + + #define wxNEEDS_IGNORE_SIGPIPE + #endif // Unix without SO_NOSIGPIPE #define wxSOCKET_MSG_NOSIGNAL 0 #endif @@ -613,6 +643,10 @@ int wxSocketImpl::RecvStream(void *buffer, int size) int wxSocketImpl::SendStream(const void *buffer, int size) { +#ifdef wxNEEDS_IGNORE_SIGPIPE + IgnoreSignal ignore(SIGPIPE); +#endif + int ret; DO_WHILE_EINTR( ret, send(m_fd, static_cast(buffer), size, wxSOCKET_MSG_NOSIGNAL) );