]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-program-client: Simplify disconnect handling.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Mon, 26 Feb 2018 17:01:23 +0000 (18:01 +0100)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Sun, 18 Mar 2018 10:53:18 +0000 (12:53 +0200)
Perform all of the cleanups in a separate shared function.
Always close all fds, since there is nothing left to be read or written at
disconnect.

src/lib-program-client/program-client.c

index 7f7592d8e262c3e9b87bd1ae5fdaa56f912db939..5418fa667e429e534f20e7c4d547796e7a228230 100644 (file)
@@ -89,9 +89,12 @@ program_client_disconnect_extra_fds(struct program_client *pclient)
                if (efds[i].parent_fd != -1 && close(efds[i].parent_fd) < 0)
                        i_error("close(fd=%d) failed: %m", efds[i].parent_fd);
        }
+
+       array_clear(&pclient->extra_fds);
 }
 
-void program_client_disconnected(struct program_client *pclient)
+static void
+program_client_do_disconnect(struct program_client *pclient)
 {
        i_stream_destroy(&pclient->program_input);
        o_stream_destroy(&pclient->program_output);
@@ -110,7 +113,14 @@ void program_client_disconnected(struct program_client *pclient)
                i_error("close(%s/out) failed: %m", pclient->path);
        pclient->fd_in = pclient->fd_out = -1;
 
+       program_client_disconnect_extra_fds(pclient);
+
        pclient->disconnected = TRUE;
+}
+
+void program_client_disconnected(struct program_client *pclient)
+{
+       program_client_do_disconnect(pclient);
 
        if (pclient->other_error &&
            pclient->error == PROGRAM_CLIENT_ERROR_NONE) {
@@ -126,22 +136,10 @@ void program_client_disconnected(struct program_client *pclient)
 static void
 program_client_disconnect(struct program_client *pclient, bool force)
 {
-       int ret;
-
        if (pclient->disconnected)
                return;
-       pclient->disconnected = TRUE;
-
-       timeout_remove(&pclient->to);
-       io_remove(&pclient->io);
-       iostream_pump_destroy(&pclient->pump_in);
-       iostream_pump_destroy(&pclient->pump_out);
-
-       if ((ret = program_client_close_output(pclient)) < 0)
-               pclient->other_error = TRUE;
-
-       program_client_disconnect_extra_fds(pclient);
 
+       program_client_do_disconnect(pclient);
        pclient->disconnect(pclient, force);
 }