]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - dccp_send.c
struct http_client: Use a _pointer_ to the chunk_queue.
[paraslash.git] / dccp_send.c
index 4599dd36163b6583db50ab136352195ab8501b3d..bdc7681e1de02469daaa0bc10698514eac563583 100644 (file)
@@ -1,19 +1,7 @@
 /*
  * 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
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Licensed under the GPL v2. For licencing details see COPYING.
  */
 
 /** \file dccp_send.c paraslash's dccp sender */
@@ -91,7 +79,7 @@ static int dccp_open(void)
                return ret;
        listen_fd = ret;
 
-       bzero(&servaddr, sizeof(servaddr));
+       memset(&servaddr, 0, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(conf.dccp_port_arg);
@@ -120,31 +108,26 @@ 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, retries = 0;
-again:
-       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;
+       size_t written = 0;
+       int ret = 0;
+
+       while (written < len) {
+               ret = write(fd, buf + written, PARA_MIN(1024, len - written));
+               /*
+                * Error handling: CCID3 has a sending wait queue which fills up and is
+                * emptied asynchronously. The EAGAIN case means that there is currently
+                * no space in the wait queue, but this can change at any moment and is
+                * thus not an error condition. Keep polling until an entry becomes free.
+                */
+               if (ret < 0 && errno == EAGAIN)
+                       continue;
+               if (ret < 0)
+                       return -E_DCCP_WRITE;
+               written += ret;
        }
-       retries = 0;
-       written += ret;
-       if (written >= len)
-               return written;
-       ret = write_ok(fd);
-       if (ret > 0)
-               goto again;
-err_out:
-       return -E_DCCP_WRITE;
+       return written;
 }
 
 static void dccp_send(long unsigned current_chunk,