X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=udp_send.c;h=9e8bc0482cdf79153ded26ad08777bff044f938b;hb=b74c8941e36860a34483782cf91e449212401664;hp=50161c1333642d2021b47c3b0a05ff4bd43f10f6;hpb=8cf6f0ecf5a3ed9c51ad72bc1c0b02a5b20e5345;p=paraslash.git diff --git a/udp_send.c b/udp_send.c index 50161c13..9e8bc048 100644 --- a/udp_send.c +++ b/udp_send.c @@ -25,6 +25,7 @@ #include "net.h" #include "fd.h" #include "sched.h" +#include "close_on_fork.h" /** Convert in_addr to ascii. */ @@ -49,8 +50,10 @@ static void udp_delete_target(struct udp_target *ut, const char *msg) { PARA_NOTICE_LOG("deleting %s:%d (%s) from list\n", TARGET_ADDR(ut), ut->port, msg); - if (ut->fd >= 0) + if (ut->fd >= 0) { close(ut->fd); + del_close_on_fork_list(ut->fd); + } list_del(&ut->node); free(ut); } @@ -61,14 +64,13 @@ static void udp_send_buf(char *buf, size_t len) int ret; list_for_each_entry_safe(ut, tmp, &targets, node) { - size_t written = len; if (ut->fd < 0) continue; - ret = write_all(ut->fd, buf, &written); + ret = write_nonblock(ut->fd, buf, len, len); if (ret < 0) /* TODO: Use chunk queueing */ return udp_delete_target(ut, "send error"); - if (written != len) - PARA_WARNING_LOG("short write %zu/%zu\n", written, len); + if (ret != len) + PARA_WARNING_LOG("short write %zu/%zu\n", ret, len); } } @@ -85,9 +87,12 @@ static int udp_init_session(struct udp_target *ut) return ret; ut->fd = ret; ret = mark_fd_nonblocking(ut->fd); - if (ret < 0) + if (ret < 0) { close(ut->fd); - return ret; + return ret; + } + add_close_on_fork_list(ut->fd); + return 1; } static void udp_shutdown_targets(void) @@ -102,6 +107,7 @@ static void udp_shutdown_targets(void) continue; write(ut->fd, buf, UDP_AUDIO_HEADER_LEN); close(ut->fd); + del_close_on_fork_list(ut->fd); ut->fd = -1; } }