afs: Shutdown signals on exit.
[paraslash.git] / udp_send.c
index eea1c93355c1461ada446942ef4d2d91f71cef46..52947b20610a6b26280755cf0ddb5125ac5ae8a2 100644 (file)
@@ -72,8 +72,11 @@ 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);
+       /* command handlers already called close_listed_fds() */
+       if (!process_is_command_handler()) {
+               close(sc->fd);
+               del_close_on_fork_list(sc->fd);
+       }
        vss_del_fec_client(ut->fc);
        list_del(&sc->node);
        free(sc->name);
@@ -164,6 +167,13 @@ static void udp_shutdown_targets(void)
                udp_close_target(sc);
 }
 
+static void udp_shutdown(void)
+{
+       struct sender_client *sc, *tmp;
+       list_for_each_entry_safe(sc, tmp, &targets, node)
+               udp_delete_target(sc, "shutdown");
+}
+
 static int udp_resolve_target(const char *url, struct sender_command_data *scd)
 {
        const char *result;
@@ -435,6 +445,7 @@ static void udp_send_init(void)
 const struct sender udp_sender = {
        .name = "udp",
        .init = udp_send_init,
+       .shutdown = udp_shutdown,
        .shutdown_clients = udp_shutdown_targets,
        .resolve_target = udp_resolve_target,
        .client_cmds = {