]> andersk Git - moira.git/blobdiff - lib/mr_connect.c
watch out for EINTR when accept()ing
[moira.git] / lib / mr_connect.c
index b47280cbe3c8769836e241e8f2e36f85b0b4dcfc..3dcd4af40c528db1fbc11df1154042fea3ca7a88 100644 (file)
@@ -270,12 +270,15 @@ int mr_listen(char *port)
 
 int mr_accept(int s, struct sockaddr_in *sin)
 {
-  int conn, addrlen = sizeof(struct sockaddr_in), nread, status;
-  char *buf;
+  int conn = -1, addrlen = sizeof(struct sockaddr_in), nread, status;
+  char *buf = NULL;
 
-  conn = accept(s, (struct sockaddr *)sin, &addrlen);
-  if (conn < 0)
-    return -1;
+  while (conn < 0)
+    {
+      conn = accept(s, (struct sockaddr *)sin, &addrlen);
+      if (conn < 0 && errno != EINTR)
+       return -1;
+    }
 
   do
     status = mr_cont_accept(conn, &buf, &nread);
@@ -284,6 +287,9 @@ int mr_accept(int s, struct sockaddr_in *sin)
   return status;
 }
 
+/* mr_cont_accept returns 0 if it has failed, an fd if it has succeeded,
+   or -1 if it is still making progress */
+
 int mr_cont_accept(int conn, char **buf, int *nread)
 {
   long len, more;
@@ -294,7 +300,7 @@ int mr_cont_accept(int conn, char **buf, int *nread)
       if (read(conn, lbuf, 4) != 4)
        {
          close(conn);
-         return -1;
+         return 0;
        }
       getlong(lbuf, len);
       len += 4;
@@ -303,7 +309,7 @@ int mr_cont_accept(int conn, char **buf, int *nread)
       if (!*buf || len < 58)
        {
          close(conn);
-         free(buf);
+         free(*buf);
          return 0;
        }
       putlong(*buf, len);
This page took 0.049842 seconds and 4 git commands to generate.