From ab51fc9c72dc51e76ccabbc150413c8031751436 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 22 Dec 2015 23:52:18 +0000 Subject: [PATCH] udp_send.c: Send EOF packet only once. Currently this can be sent many times, which is pointless and might confuse clients. This patch adds a bool member to struct udp_target to keep track whether the EOF packet has been sent. --- udp_send.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/udp_send.c b/udp_send.c index bbc38f01..425118a1 100644 --- a/udp_send.c +++ b/udp_send.c @@ -46,6 +46,8 @@ struct udp_target { struct fec_client *fc; /** The FEC parameters for this target. */ struct fec_client_parms fcp; + /** Whether we already sent the FEC eof packet to this target. */ + bool sent_fec_eof; }; static struct list_head targets; @@ -54,15 +56,16 @@ static int sender_status; static void udp_close_target(struct sender_client *sc) { const char *buf; - size_t len = vss_get_fec_eof_packet(&buf); - - /* - * Ignore the return value of write() since we are closing the target - * anyway. The sole purpose of the "do_nothing" statement is to silence - * gcc. - */ - if (write(sc->fd, buf, len)) - do_nothing; + size_t len; + struct udp_target *ut = sc->private_data; + + if (ut->sent_fec_eof) + return; + PARA_NOTICE_LOG("sending FEC EOF\n"); + len = vss_get_fec_eof_packet(&buf); + /* Ignore write() errors since we are closing the target anyway. */ + if (write(sc->fd, buf, len) == len) + ut->sent_fec_eof = true; } static void udp_delete_target(struct sender_client *sc, const char *msg) @@ -232,9 +235,11 @@ static int udp_com_delete(struct sender_command_data *scd) /** Initialize UDP session and set maximum payload size. */ static int udp_init_fec(struct sender_client *sc) { + struct udp_target *ut = sc->private_data; int mps; PARA_NOTICE_LOG("sending to udp %s\n", sc->name); + ut->sent_fec_eof = false; mps = generic_max_transport_msg_size(sc->fd) - sizeof(struct udphdr); PARA_INFO_LOG("current MPS = %d bytes\n", mps); return mps; -- 2.39.5