ogg_afh.c: Kill tunetable()
[paraslash.git] / dccp_send.c
index 08930ad1852321f877fac474b839ea71bc5ee5d8..e4b508799f8bafe0b8d09aeed03fb9c80841441e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2006-2007 Andre Noll <maan@systemlinux.org>
  *
  *     This program is free software; you can redistribute it and/or modify
  *     it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 #include "server.h"
 #include "net.h"
 #include "list.h"
-#include "afs.h"
+#include "vss.h"
 #include "send.h"
 #include "dccp.h"
 #include "error.h"
@@ -76,7 +76,7 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds)
        }
        PARA_NOTICE_LOG("connection from %s\n", inet_ntoa(dc->addr.sin_addr));
        dc->fd = ret;
-       list_add(&dc->node, &clients);
+       para_list_add(&dc->node, &clients);
        add_close_on_fork_list(dc->fd);
        mark_fd_nonblock(dc->fd);
 }
@@ -120,15 +120,23 @@ static void dccp_shutdown_client(struct dccp_client *dc)
        free(dc);
 }
 
+/** give up if write would block that many times */
+#define DCCP_WRITE_RETRIES 100
+
 static int dccp_write(int fd, const char *buf, size_t len)
 {
-       size_t send, written = 0;
-       int ret;
+       size_t size, written = 0;
+       int ret, retries = 0;
 again:
-       send = PARA_MIN(1024, len - written);
-       ret = write(fd, buf + written, send);
-       if (ret < 0)
-               goto err_out;
+       size = PARA_MIN(1024, len - written);
+       ret = write(fd, buf + written, size);
+       if (ret < 0) {
+               if (errno != EAGAIN || retries++ > DCCP_WRITE_RETRIES)
+                       goto err_out;
+               PARA_DEBUG_LOG("EAGAIN #%d@%zd/%zd\n", retries, written, len);
+               goto again;
+       }
+       retries = 0;
        written += ret;
        if (written >= len)
                return written;
@@ -158,7 +166,7 @@ static void dccp_send(long unsigned current_chunk,
                if (!ret)
                        continue;
                if (!dc->header_sent && current_chunk) {
-                       header_buf = afs_get_header(&header_len);
+                       header_buf = vss_get_header(&header_len);
                        if (header_buf && header_len > 0) {
                                ret = dccp_write(dc->fd, header_buf, header_len);
                                if (ret != header_len) {