udp_send: Add/remove the udp socket fd only once.
authorAndre Noll <maan@systemlinux.org>
Wed, 6 Oct 2010 20:56:23 +0000 (22:56 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 31 Oct 2010 11:18:24 +0000 (12:18 +0100)
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.

udp_send.c

index 4957725..ba7163a 100644 (file)
@@ -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)