X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=udp_send.c;h=425118a135edfee7224f40256dc087a803115aaf;hp=3379f98d1dcd2f6b205492f13f4a8bd3e2807ac0;hb=5e8d8a8eea6de9459ebdf4498f9f061c84bfa63a;hpb=f167629b3191c57a6b691cd2a6af04a45a74ccb0 diff --git a/udp_send.c b/udp_send.c index 3379f98d..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) @@ -156,11 +159,6 @@ err: return -ERRNO_TO_PARA_ERROR(errno); } -static void udp_init_session(struct sender_client *sc) -{ - PARA_NOTICE_LOG("sending to udp %s\n", sc->name); -} - static void udp_shutdown_targets(void) { struct sender_client *sc, *tmp; @@ -192,14 +190,14 @@ static int udp_resolve_target(const char *url, struct sender_command_data *scd) static int udp_com_on(__a_unused struct sender_command_data *scd) { - sender_status = SENDER_ON; + sender_status = SENDER_on; return 1; } static int udp_com_off(__a_unused struct sender_command_data *scd) { udp_shutdown_targets(); - sender_status = SENDER_OFF; + sender_status = SENDER_off; return 1; } @@ -237,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; - udp_init_session(sc); + 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; @@ -282,7 +282,7 @@ static void udp_send_fec(struct sender_client *sc, char *buf, size_t len) { int ret; - if (sender_status == SENDER_OFF) + if (sender_status == SENDER_off) return; if (len == 0) return; @@ -371,7 +371,7 @@ static char *udp_status(void) "status: %s\n" "port: %s\n" "targets: %s\n", - (sender_status == SENDER_ON)? "on" : "off", + (sender_status == SENDER_on)? "on" : "off", stringify_port(conf.udp_default_port_arg, "udp"), tgts? tgts : "(none)" ); @@ -430,15 +430,15 @@ void udp_send_init(struct sender *s) s->post_select = NULL; s->shutdown_clients = udp_shutdown_targets; s->resolve_target = udp_resolve_target; - s->client_cmds[SENDER_ON] = udp_com_on; - s->client_cmds[SENDER_OFF] = udp_com_off; - s->client_cmds[SENDER_DENY] = NULL; - s->client_cmds[SENDER_ALLOW] = NULL; - s->client_cmds[SENDER_ADD] = udp_com_add; - s->client_cmds[SENDER_DELETE] = udp_com_delete; - sender_status = SENDER_OFF; + s->client_cmds[SENDER_on] = udp_com_on; + s->client_cmds[SENDER_off] = udp_com_off; + s->client_cmds[SENDER_deny] = NULL; + s->client_cmds[SENDER_allow] = NULL; + s->client_cmds[SENDER_add] = udp_com_add; + s->client_cmds[SENDER_delete] = udp_com_delete; + sender_status = SENDER_off; udp_init_target_list(); if (!conf.udp_no_autostart_given) - sender_status = SENDER_ON; + sender_status = SENDER_on; PARA_DEBUG_LOG("udp sender init complete\n"); }