]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
tcp: socket writes get interrupted so must be retried 194/head
authorJoakim Plate <elupus@ecce.se>
Sat, 29 Dec 2012 19:37:30 +0000 (20:37 +0100)
committerJoakim Plate <elupus@ecce.se>
Sat, 29 Dec 2012 19:37:30 +0000 (20:37 +0100)
src/tcp.c
src/webui/webui.c

index cab3c5fff3c9bac1e5ba30ae4baac28d71e489ce..88f37a0225298ca7e1c3b02acfea66edb346a45a 100644 (file)
--- a/src/tcp.c
+++ b/src/tcp.c
@@ -181,13 +181,33 @@ int
 tcp_write_queue(int fd, htsbuf_queue_t *q)
 {
   htsbuf_data_t *hd;
-  int l, r = 0;
+  int l, r = 0, l2;
+  uint8_t* p;
 
   while((hd = TAILQ_FIRST(&q->hq_q)) != NULL) {
     TAILQ_REMOVE(&q->hq_q, hd, hd_link);
 
     l = hd->hd_data_len - hd->hd_data_off;
-    r |= !!write(fd, hd->hd_data + hd->hd_data_off, l);
+    p = hd->hd_data + hd->hd_data_off;
+
+    while(l > 0) {
+      l2 = write(fd, p, l);
+      if(l2 < 0) {
+        perror("tcp_write_queue");
+        if(errno == EINTR) {
+          continue;
+        } else {
+          break;
+        }
+      }
+      l -= l2;
+      p += l2;
+    }
+
+    if(l == 0) {
+      r = 1;
+    }
+
     free(hd->hd_data);
     free(hd);
   }
index fbd0416f2fa47d895b86c2ae2f5de4939bbf1249..c6f2b8d5c1a5537b4c53e1441053b09fb6f6f293 100644 (file)
@@ -98,12 +98,12 @@ page_root2(http_connection_t *hc, const char *remain, void *opaque)
 static int
 page_static_file(http_connection_t *hc, const char *remain, void *opaque)
 {
-  int ret = 0;
+  int ret = 0, r;
   const char *base = opaque;
   char path[500];
   ssize_t size;
   const char *content = NULL, *postfix;
-  char buf[4096];
+  char buf[4096], *p;
   const char *gzip;
 
   if(remain == NULL)
@@ -139,7 +139,21 @@ page_static_file(http_connection_t *hc, const char *remain, void *opaque)
       ret = 500;
       break;
     }
-    if (write(hc->hc_fd, buf, c) != c) {
+    p = buf;
+    while(c > 0) {
+      r = write(hc->hc_fd, p, c);
+      if(r < 0) {
+        perror("page_static_file");
+        if(errno == EINTR) {
+          continue;
+        } else {
+          break;
+        }
+      }
+      c -= r;
+      p += r;
+    }
+    if (c != 0) {
       ret = 500;
       break;
     }