]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/socket.cpp
PCH-less build fix
[wxWidgets.git] / src / common / socket.cpp
index 9da07423a367d996f44edbb2f8aa68b729553be0..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
@@ -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) );