chiark / gitweb /
*** empty log message ***
[sympathy.git] / src / symsocket.c
index 061ff6d3f7329376fdef4d08b73079db5be4490c..ee5869a23c3220c4d95f637789ac91717074a695 100644 (file)
@@ -11,6 +11,12 @@ static char rcsid[] =
 
 /*
  * $Log$
+ * Revision 1.5  2008/02/20 22:54:22  staffcvs
+ * *** empty log message ***
+ *
+ * Revision 1.4  2008/02/20 18:31:53  james
+ * *** empty log message ***
+ *
  * Revision 1.3  2008/02/14 02:46:44  james
  * *** empty log message ***
  *
@@ -29,6 +35,38 @@ static char rcsid[] =
 #define BUF_SIZE 16384
 #define MAX_TXN 4096
 
+int
+wrap_recv (int fd, void *buf, int len)
+{
+  int red;
+
+  red = recv (fd, buf, len, 0);
+  if (!red)
+    return -1;
+
+  if ((red < 0) && (errno == EAGAIN))
+    red = 0;
+
+  return red;
+}
+
+int
+wrap_send (int fd, void *buf, int len)
+{
+  int writ;
+
+  errno = 0;
+
+  writ = send (fd, buf, len, MSG_NOSIGNAL);
+
+  if (!writ)
+    return -1;
+
+  if ((writ < 0) && (errno == EAGAIN))
+    writ = 0;
+
+  return writ;
+}
 
 void
 socket_free (Socket * s)
@@ -39,7 +77,29 @@ socket_free (Socket * s)
     slide_free (s->read_buf);
   if (s->write_buf)
     slide_free (s->write_buf);
+  if (s->path_to_unlink)
+    {
+      unlink (s->path_to_unlink);
+      free (s->path_to_unlink);
+    }
   close (s->fd);
+  free (s);
+}
+
+void
+socket_free_parent (Socket * s)
+{
+  if (!s)
+    return;
+  if (s->read_buf)
+    slide_free (s->read_buf);
+  if (s->write_buf)
+    slide_free (s->write_buf);
+  if (s->path_to_unlink)
+    free (s->path_to_unlink);
+  close (s->fd);
+
+  free (s);
 }
 
 
@@ -89,6 +149,7 @@ socket_listen (char *path)
   ret->write_buf = NULL;
 
   ret->fd = fd;
+  ret->path_to_unlink = strdup (path);
 
 
   return ret;
@@ -215,7 +276,7 @@ socket_post_select (Socket * s, fd_set * rfds, fd_set * wfds)
       n =
         (SLIDE_BYTES (s->write_buf) >
          MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
-      n = wrap_write (s->fd, SLIDE_RPTR (s->write_buf), n);
+      n = wrap_send (s->fd, SLIDE_RPTR (s->write_buf), n);
       if (n > 0)
         slide_consume (s->write_buf, n);
       if (n < 0)
@@ -227,7 +288,7 @@ socket_post_select (Socket * s, fd_set * rfds, fd_set * wfds)
       n =
         (SLIDE_SPACE (s->read_buf) >
          MAX_TXN) ? MAX_TXN : SLIDE_SPACE (s->read_buf);
-      n = wrap_read (s->fd, SLIDE_WPTR (s->read_buf), n);
+      n = wrap_recv (s->fd, SLIDE_WPTR (s->read_buf), n);
       if (n > 0)
         slide_added (s->read_buf, n);
       if (n < 0)
@@ -253,7 +314,7 @@ socket_write (Socket * s, void *buf, int len)
   n =
     (SLIDE_BYTES (s->write_buf) >
      MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
-  n = wrap_write (s->fd, SLIDE_RPTR (s->write_buf), n);
+  n = wrap_send (s->fd, SLIDE_RPTR (s->write_buf), n);
   {
     uint8_t *c = SLIDE_RPTR (s->write_buf);
   }