]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master, login-common: anvil_client_init() - Change callback to struct of callbacks
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 13 Jan 2022 15:17:28 +0000 (17:17 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 8 Feb 2022 09:48:24 +0000 (10:48 +0100)
src/lib-master/anvil-client.c
src/lib-master/anvil-client.h
src/login-common/main.c

index e16e3706ec35b1670b6ac20adb22a82e66299dbd..d6a95e306e2c5919f5ab03dfebab77708d974666 100644 (file)
@@ -30,7 +30,7 @@ struct anvil_client {
        ARRAY(struct anvil_query *) queries_arr;
        struct aqueue *queries;
 
-       bool (*reconnect_callback)(void);
+       struct anvil_client_callbacks callbacks;
        enum anvil_client_flags flags;
        bool deinitializing;
 };
@@ -62,7 +62,8 @@ static struct connection_vfuncs anvil_connections_vfuncs = {
 };
 
 struct anvil_client *
-anvil_client_init(const char *path, bool (*reconnect_callback)(void),
+anvil_client_init(const char *path,
+                 const struct anvil_client_callbacks *callbacks,
                  enum anvil_client_flags flags)
 {
        struct anvil_client *client;
@@ -74,7 +75,8 @@ anvil_client_init(const char *path, bool (*reconnect_callback)(void),
 
        client = i_new(struct anvil_client, 1);
        connection_init_client_unix(anvil_connections, &client->conn, path);
-       client->reconnect_callback = reconnect_callback;
+       if (callbacks != NULL)
+               client->callbacks = *callbacks;
        client->flags = flags;
        i_array_init(&client->queries_arr, 32);
        client->queries = aqueue_init(&client->queries_arr.arr);
@@ -120,8 +122,8 @@ anvil_client_start_multiplex_output(struct anvil_client *client)
 
 static void anvil_client_reconnect(struct anvil_client *client)
 {
-       if (client->reconnect_callback != NULL) {
-               if (!client->reconnect_callback()) {
+       if (client->callbacks.reconnect != NULL) {
+               if (!client->callbacks.reconnect()) {
                        /* no reconnection */
                        return;
                }
index 3433041701d59479e6f23270ad0709a8d026a92d..997791ffdf97481aae8a1785ec88cb0c2335f3a0 100644 (file)
@@ -6,13 +6,20 @@ enum anvil_client_flags {
        ANVIL_CLIENT_FLAG_HIDE_ENOENT   = 0x01
 };
 
+struct anvil_client_callbacks {
+       /* Called when connection is lost. If it returns FALSE, reconnection
+          isn't attempted. */
+       bool (*reconnect)(void);
+};
+
 /* reply=NULL if query failed */
 typedef void anvil_callback_t(const char *reply, void *context);
 
 /* If reconnect_callback is specified, it's called when connection is lost.
    If the callback returns FALSE, reconnection isn't attempted. */
 struct anvil_client *
-anvil_client_init(const char *path, bool (*reconnect_callback)(void),
+anvil_client_init(const char *path,
+                 const struct anvil_client_callbacks *callbacks,
                  enum anvil_client_flags flags) ATTR_NULL(2);
 void anvil_client_deinit(struct anvil_client **client);
 
index 7d3a76087866d132082539c68be6e3feeeaa2ee8..d291c886d1e246451f98cdaf61a93e6a18434df9 100644 (file)
@@ -327,7 +327,10 @@ void login_anvil_init(void)
        if (anvil != NULL)
                return;
 
-       anvil = anvil_client_init("anvil", anvil_reconnect_callback, 0);
+       const struct anvil_client_callbacks callbacks = {
+               .reconnect = anvil_reconnect_callback,
+       };
+       anvil = anvil_client_init("anvil", &callbacks, 0);
        if (anvil_client_connect(anvil, TRUE) < 0)
                i_fatal("Couldn't connect to anvil");
 }