]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/socket.cpp
fixed wxXmlResource::Load's detection of filenames to be done as early as possible
[wxWidgets.git] / src / common / socket.cpp
index abe4f838102f6a614217316647d15a38845adc3c..3c4f417e75596fb46ad83049a83e8ca97b95cd55 100644 (file)
 #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<const char *>(buffer), size,
                               wxSOCKET_MSG_NOSIGNAL) );