X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/335a0bc33903ff598cf002524c8ceb4a222e55d9..a43a9e5521440dbb28037646ed4a07125c8823a9:/src/common/socket.cpp diff --git a/src/common/socket.cpp b/src/common/socket.cpp index b3bfc7f782..3227bdb429 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -68,6 +68,7 @@ // 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,7 +88,7 @@ } private: - const sighandler_t m_handler; + const wxSigHandler_t m_handler; const int m_sig; wxDECLARE_NO_COPY_CLASS(IgnoreSignal); @@ -363,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 ) { @@ -941,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 ) @@ -1106,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);