X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5ab2f2575d0066dfd8beaf8901a252e346a2f8dc..acd32ffcdb319f162633c20e0202db3f8542998a:/src/common/socket.cpp?ds=sidebyside diff --git a/src/common/socket.cpp b/src/common/socket.cpp index abe4f83810..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 @@ -127,7 +157,7 @@ public: public: wxSocketState() : wxObject() {} - DECLARE_NO_COPY_CLASS(wxSocketState) + wxDECLARE_NO_COPY_CLASS(wxSocketState); }; // wxSocketWaitModeChanger: temporarily change the socket flags affecting its @@ -163,7 +193,7 @@ private: wxSocketBase * const m_socket; const int m_oldflags; - DECLARE_NO_COPY_CLASS(wxSocketWaitModeChanger) + wxDECLARE_NO_COPY_CLASS(wxSocketWaitModeChanger); }; // wxSocketRead/WriteGuard are instantiated before starting reading @@ -189,7 +219,7 @@ public: private: wxSocketBase * const m_socket; - DECLARE_NO_COPY_CLASS(wxSocketReadGuard) + wxDECLARE_NO_COPY_CLASS(wxSocketReadGuard); }; class wxSocketWriteGuard @@ -213,7 +243,7 @@ public: private: wxSocketBase * const m_socket; - DECLARE_NO_COPY_CLASS(wxSocketWriteGuard) + wxDECLARE_NO_COPY_CLASS(wxSocketWriteGuard); }; // ============================================================================ @@ -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) );