dccp_send.c: Fix type of "header_len" on x86_64
[paraslash.git] / dccp_send.c
index aba21a6db1d2e92aa997a964a053d8000df9b2f1..4599dd36163b6583db50ab136352195ab8501b3d 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 size, written = 0;
-       int ret;
+       int ret, retries = 0;
 again:
        size = PARA_MIN(1024, len - written);
        ret = write(fd, buf + written, size);
-       if (ret < 0)
-               goto err_out;
+       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;
@@ -143,8 +151,9 @@ static void dccp_send(long unsigned current_chunk,
                __a_unused long unsigned chunks_sent, const char *buf, size_t len)
 {
        struct dccp_client *dc, *tmp;
-       int ret, header_len;
+       int ret;
        char *header_buf;
+       unsigned header_len;
 
        if (listen_fd < 0 || !len)
                return;
@@ -158,12 +167,12 @@ 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) {
                                        int err = errno;
-                                       PARA_ERROR_LOG("header write: %d/%d (%s)\n",
+                                       PARA_ERROR_LOG("header write: %d/%u (%s)\n",
                                                ret, header_len, ret < 0?
                                                strerror(err) : "");
                                        dccp_shutdown_client(dc);