X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=udp_send.c;h=1408ae7f251bc4fe0c4e79e67e00dc7914d0b91b;hb=3bd3f7a83d4685ca18f5eeb3aafc73b615698016;hp=7704b0a1a8f01b1580bae58c59a2817ca324371e;hpb=b0cfbd054cba9add14976decab4b6f43dd5f6267;p=paraslash.git diff --git a/udp_send.c b/udp_send.c index 7704b0a1..1408ae7f 100644 --- a/udp_send.c +++ b/udp_send.c @@ -76,13 +76,32 @@ static void udp_send_buf(char *buf, size_t len) list_for_each_entry_safe(ut, tmp, &targets, node) { if (ut->fd < 0) continue; - ret = write_nonblock(ut->fd, buf, len, len); + ret = send_queued_chunks(ut->fd, ut->cq, 0); if (ret < 0) { udp_delete_target(ut, para_strerror(-ret)); continue; } - if (ret != len) - PARA_WARNING_LOG("short write %zu/%zu\n", ret, len); + if (!len) + continue; + if (!ret) { /* still data left in the queue */ + ret = cq_enqueue(ut->cq, buf, len); + if (ret < 0) { + udp_delete_target(ut, para_strerror(-ret)); + continue; + } + } + ret = write_nonblock(ut->fd, buf, len, 0); + if (ret < 0) { + udp_delete_target(ut, para_strerror(-ret)); + continue; + } + if (ret != len) { + ret = cq_enqueue(ut->cq, buf + ret, len - ret); + if (ret < 0) { + udp_delete_target(ut, para_strerror(-ret)); + continue; + } + } } }