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
This commit is contained in:
Vadim Zeitlin
2009-02-19 14:17:21 +00:00
parent f6a25e0866
commit 04b2ab1a0c

View File

@@ -63,9 +63,36 @@
#ifdef MSG_NOSIGNAL #ifdef MSG_NOSIGNAL
#define wxSOCKET_MSG_NOSIGNAL MSG_NOSIGNAL #define wxSOCKET_MSG_NOSIGNAL MSG_NOSIGNAL
#else // MSG_NOSIGNAL not available (BSD including OS X) #else // MSG_NOSIGNAL not available (BSD including OS X)
#if defined(__UNIX__) && !defined(SO_NOSIGPIPE) && !defined( __VMS ) // next best possibility is to use SO_NOSIGPIPE socket option, this covers
#error "Writing to socket could generate unhandled SIGPIPE." // BSD systems (including OS X) -- but if we don't have it neither, we have
#error "Please post information about your system to wx-dev." // 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 #endif
#define wxSOCKET_MSG_NOSIGNAL 0 #define wxSOCKET_MSG_NOSIGNAL 0
@@ -613,6 +640,10 @@ int wxSocketImpl::RecvStream(void *buffer, int size)
int wxSocketImpl::SendStream(const 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; int ret;
DO_WHILE_EINTR( ret, send(m_fd, static_cast<const char *>(buffer), size, DO_WHILE_EINTR( ret, send(m_fd, static_cast<const char *>(buffer), size,
wxSOCKET_MSG_NOSIGNAL) ); wxSOCKET_MSG_NOSIGNAL) );