]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
anvil: Add admin_cmd_send()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 3 Jan 2022 17:38:54 +0000 (19:38 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 8 Feb 2022 09:48:24 +0000 (10:48 +0100)
This can use either incoming or outgoing connections for sending the
command.

src/anvil/common.h
src/anvil/main.c

index f9a44bd576d2c265e046025cb6004cd57e856d1c..4768ab14a46d23298a1bc9e261234be0d233ef9a 100644 (file)
@@ -3,8 +3,22 @@
 
 #include "lib.h"
 
+/* Error is set and reply=NULL on internal errors. */
+typedef void
+admin_cmd_callback_t(const char *reply, const char *error, void *context);
+
 extern struct connect_limit *connect_limit;
 extern struct penalty *penalty;
 extern bool anvil_restarted;
 
+void admin_cmd_send(const char *service, pid_t pid, const char *cmd,
+                   admin_cmd_callback_t *callback, void *context);
+#define admin_cmd_send(service, pid, cmd, callback, context) \
+       admin_cmd_send(service, pid, cmd, \
+               (admin_cmd_callback_t *)callback, \
+               TRUE ? context : CALLBACK_TYPECHECK(callback, \
+                               void (*)(const char *, const char *, \
+                                        typeof(context))))
+
+
 #endif
index c49602c32f1217269798168dd4031c3a55328d23..4169027c38376708783c2214cd07bff1a2ad0cfe 100644 (file)
@@ -25,6 +25,19 @@ bool anvil_restarted;
 static struct io *log_fdpass_io;
 static struct admin_client_pool *admin_pool;
 
+#undef admin_cmd_send
+void admin_cmd_send(const char *service, pid_t pid, const char *cmd,
+                   admin_cmd_callback_t *callback, void *context)
+{
+       struct anvil_connection *conn = anvil_connection_find(service, pid);
+       if (conn != NULL) {
+               anvil_connection_send_cmd(conn, cmd, callback, context);
+               return;
+       }
+       admin_client_pool_send_cmd(admin_pool, service, pid, cmd,
+                                  callback, context);
+}
+
 static void client_connected(struct master_service_connection *conn)
 {
        bool master = conn->listen_fd == MASTER_LISTEN_FD_FIRST;