X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/04b2ab1a0cfe39c98617a6c961e5ae715987c52f..85284ca4b226d9a1ab6bed26c5eaa480543649d5:/src/common/socket.cpp diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 5d7eb3ad4f..3227bdb429 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -64,10 +64,11 @@ #define wxSOCKET_MSG_NOSIGNAL MSG_NOSIGNAL #else // MSG_NOSIGNAL not available (BSD including OS X) // 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 + // 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 @@ -87,13 +88,15 @@ } private: - const sighandler_t m_handler; + const wxSigHandler_t m_handler; const int m_sig; wxDECLARE_NO_COPY_CLASS(IgnoreSignal); }; } // anonymous namespace - #endif + + #define wxNEEDS_IGNORE_SIGPIPE + #endif // Unix without SO_NOSIGPIPE #define wxSOCKET_MSG_NOSIGNAL 0 #endif @@ -361,6 +364,14 @@ void wxSocketImpl::PostCreation() wxSocketError wxSocketImpl::UpdateLocalAddress() { + if ( !m_local.IsOk() ) + { + // ensure that we have a valid object using the correct family: correct + // being the same one as our peer uses as we have no other way to + // determine it + m_local.Create(m_peer.GetFamily()); + } + WX_SOCKLEN_T lenAddr = m_local.GetLen(); if ( getsockname(m_fd, m_local.GetWritableAddr(), &lenAddr) != 0 ) { @@ -640,7 +651,7 @@ int wxSocketImpl::RecvStream(void *buffer, int size) int wxSocketImpl::SendStream(const void *buffer, int size) { -#if !defined(MSG_NOSIGNAL) && !defined(SO_NOSIGPIPE) +#ifdef wxNEEDS_IGNORE_SIGPIPE IgnoreSignal ignore(SIGPIPE); #endif @@ -939,7 +950,9 @@ wxUint32 wxSocketBase::DoRead(void* buffer_, wxUint32 nbytes) // events and, even more importantly, we must do this under Windows // where we're not going to get notifications about socket being ready // for reading before we read all the existing data from it - const int ret = m_connected ? m_impl->Read(buffer, nbytes) : 0; + const int ret = !m_impl->m_stream || m_connected + ? m_impl->Read(buffer, nbytes) + : 0; if ( ret == -1 ) { if ( m_impl->GetLastError() == wxSOCKET_WOULDBLOCK ) @@ -1104,7 +1117,7 @@ wxUint32 wxSocketBase::DoWrite(const void *buffer_, wxUint32 nbytes) wxUint32 total = 0; while ( nbytes ) { - if ( !m_connected ) + if ( m_impl->m_stream && !m_connected ) { if ( (m_flags & wxSOCKET_WAITALL) || !total ) SetError(wxSOCKET_IOERR);