Ignore SIGPIPE when using GSocket
authorDan Winship <danw@gnome.org>
Mon, 18 May 2009 00:44:54 +0000 (20:44 -0400)
committerAlexander Larsson <alexl@redhat.com>
Wed, 20 May 2009 10:32:58 +0000 (12:32 +0200)
http://bugzilla.gnome.org/show_bug.cgi?id=583001

gio/gsocket.c

index 4d33394..03944d6 100644 (file)
@@ -28,6 +28,7 @@
 #include "config.h"
 
 #include <errno.h>
+#include <signal.h>
 #include <string.h>
 #include <stdlib.h>
 
  *
  * All socket file descriptors are set to be close-on-exec.
  *
+ * Note that creating a #GSocket causes the signal %SIGPIPE to be
+ * ignored for the remainder of the program. If you are writing a
+ * command-line utility that uses #GSocket, you may need to take into
+ * account the fact that your program will not automatically be killed
+ * if it tries to write to %stdout after it has been closed.
+ *
  * Since: 2.22
  **/
 
@@ -616,6 +623,14 @@ g_socket_class_init (GSocketClass *klass)
   /* Make sure winsock has been initialized */
   type = g_inet_address_get_type ();
 
+#ifdef SIGPIPE
+  /* There is no portable, thread-safe way to avoid having the process
+   * be killed by SIGPIPE when calling send() or sendmsg(), so we are
+   * forced to simply ignore the signal process-wide.
+   */
+  signal (SIGPIPE, SIG_IGN);
+#endif
+
   g_type_class_add_private (klass, sizeof (GSocketPrivate));
 
   gobject_class->finalize = g_socket_finalize;