diff seobeo/s_network.c @ 226:3fa4bf481f42

[merge] Merge hg-web into default
author MrJuneJune <me@mrjunejune.com>
date Sun, 02 Aug 2026 14:42:01 -0700
parents 0e7b9464248d
children b8aa08503378
line wrap: on
line diff
--- a/seobeo/s_network.c	Sun Aug 02 08:52:13 2026 -0700
+++ b/seobeo/s_network.c	Sun Aug 02 14:42:01 2026 -0700
@@ -1,8 +1,37 @@
 #include "seobeo/seobeo.h"
 
+static pthread_once_t g_sigpipe_once = PTHREAD_ONCE_INIT;
+
+static void Seobeo_Process_Ignore_Sigpipe(void)
+{
+  signal(SIGPIPE, SIG_IGN);
+}
+
+static void Seobeo_Socket_Disable_Sigpipe(int socket_fd)
+{
+#ifdef SO_NOSIGPIPE
+  int enabled = 1;
+  setsockopt(socket_fd, SOL_SOCKET, SO_NOSIGPIPE, &enabled, sizeof(enabled));
+#else
+  (void)socket_fd;
+#endif
+}
+
+static ssize_t Seobeo_Socket_Write(
+    int socket_fd,
+    const void *buffer,
+    size_t length)
+{
+#ifdef MSG_NOSIGNAL
+  return send(socket_fd, buffer, length, MSG_NOSIGNAL);
+#else
+  return send(socket_fd, buffer, length, 0);
+#endif
+}
 
 Seobeo_Handle *Seobeo_Stream_Handle_Server_Create(const char *host,  const char* port)
 {
+  pthread_once(&g_sigpipe_once, Seobeo_Process_Ignore_Sigpipe);
   Seobeo_Handle *p_handle;
   struct addrinfo hints, *server_infos, *free_server_info;
   int32 socket_fd, yes = 1;  // Need this for setsockopt 
@@ -26,6 +55,7 @@
     if((socket_fd = socket(free_server_info->ai_family,
                         free_server_info->ai_socktype, free_server_info->ai_protocol)) == -1)
     { perror("socket"); continue; }
+    Seobeo_Socket_Disable_Sigpipe(socket_fd);
 
      if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == -1)
      { perror("setsockopt SO_REUSEADDR"); continue; }
@@ -81,6 +111,7 @@
 
 Seobeo_Handle *Seobeo_Stream_Handle_Client_Create(const char *host,  const char* port, boolean use_tls)
 {
+  pthread_once(&g_sigpipe_once, Seobeo_Process_Ignore_Sigpipe);
   Seobeo_Handle *p_handle;
   p_handle = malloc(sizeof(*p_handle));
 
@@ -98,6 +129,7 @@
   if((socket_fd = socket(server_infos->ai_family,
                       server_infos->ai_socktype, server_infos->ai_protocol)) == -1)
   { perror("socket"); return NULL; }
+  Seobeo_Socket_Disable_Sigpipe(socket_fd);
 
   if (connect(socket_fd, server_infos->ai_addr, server_infos->ai_addrlen) != 0)
   { perror("connect"); return NULL; }
@@ -154,6 +186,7 @@
       Seobeo_Get_IP4_Or_IP6((struct sockaddr *)&addr),
       client_inet_addr, sizeof client_inet_addr);
   if (client_fd == -1) return NULL;
+  Seobeo_Socket_Disable_Sigpipe(client_fd);
 
   // Set non blocking...
   int flags = fcntl(client_fd, F_GETFL, 0);
@@ -236,7 +269,7 @@
     }else
     {
       Seobeo_Log(SEOBEO_DEBUG, "Flushing socket: %d\n", p_handle->socket);
-      ssize_t n = write(
+      ssize_t n = Seobeo_Socket_Write(
         p_handle->socket,
         p_handle->write_buffer + sent,
         total - sent
@@ -275,9 +308,10 @@
       }
       else
       {
-        n = write(p_handle->socket,
-                  data + offset,
-                  data_size - offset);
+        n = Seobeo_Socket_Write(
+            p_handle->socket,
+            data + offset,
+            data_size - offset);
       }
 
       if (n==0)