From: Andre Noll Date: Wed, 6 Oct 2010 20:56:23 +0000 (+0200) Subject: udp_send: Add/remove the udp socket fd only once. X-Git-Tag: v0.4.5~2^2~4 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=939ece34a0c1ae2f8c32436d31ed18de6b3c24b5;hp=0eb1ce203c17c920ea9a0f1565f68db20b3edb1f udp_send: Add/remove the udp socket fd only once. Currently, we remove this fd from the close-on-fork list in udp_close_target() and re-add it in udp_init_session(). This is wrong because we want the fd being closed in the command handlers also if the child process for the command is spawned while the udp sender is inactive. So add/delete the fd when the udp target is added/removed rather than on a per session basis. --- diff --git a/udp_send.c b/udp_send.c index 4957725d..ba7163a8 100644 --- a/udp_send.c +++ b/udp_send.c @@ -57,7 +57,6 @@ static int sender_status; static void udp_close_target(struct sender_client *sc) { if (sc->cq != NULL) { - del_close_on_fork_list(sc->fd); cq_destroy(sc->cq); sc->cq = NULL; } @@ -70,6 +69,7 @@ static void udp_delete_target(struct sender_client *sc, const char *msg) PARA_NOTICE_LOG("deleting %s (%s) from list\n", sc->name, msg); udp_close_target(sc); close(sc->fd); + del_close_on_fork_list(sc->fd); vss_del_fec_client(ut->fc); list_del(&sc->node); free(sc->name); @@ -160,7 +160,6 @@ static void udp_init_session(struct sender_client *sc) { if (sc->cq == NULL) { sc->cq = cq_new(UDP_CQ_BYTES); - add_close_on_fork_list(sc->fd); PARA_NOTICE_LOG("sending to udp %s\n", sc->name); } } @@ -363,6 +362,7 @@ static int udp_com_add(struct sender_command_data *scd) PARA_INFO_LOG("adding to target list (%s)\n", sc->name); ut->fc = vss_add_fec_client(sc, &ut->fcp); para_list_add(&sc->node, &targets); + add_close_on_fork_list(sc->fd); return 1; err: if (sc->fd >= 0)