]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Split off master_service_send_cmd()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Sat, 14 Jan 2023 21:41:56 +0000 (23:41 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 23 Jan 2023 07:04:36 +0000 (07:04 +0000)
src/doveadm/doveadm-master.c
src/doveadm/doveadm.h

index 221c6bb77f5a953057722114b2f207aa0c99216a..1ad9fe9457dccca4b53a4edc2e1eced550a6685e 100644 (file)
@@ -92,7 +92,8 @@ static void cmd_reload(struct doveadm_cmd_context *cctx)
        doveadm_master_send_signal(SIGHUP, cctx->event);
 }
 
-static struct istream *master_service_send_cmd(const char *cmd)
+int master_service_send_cmd(const char *cmd, struct istream **input_r,
+                           const char **error_r)
 {
        const char *path =
                t_strconcat(doveadm_settings->base_dir, "/master", NULL);
@@ -104,13 +105,26 @@ static struct istream *master_service_send_cmd(const char *cmd)
        };
        struct istream *input;
        struct ostream *output;
-       const char *error;
-       if (doveadm_blocking_connect(path, &set, &input, &output, &error) < 0)
-               i_fatal("%s", error);
+
+       if (doveadm_blocking_connect(path, &set, &input, &output, error_r) < 0)
+               return -1;
        o_stream_nsend_str(output, t_strconcat(cmd, "\n", NULL));
-       if (o_stream_flush(output) < 0)
-               i_fatal("%s", o_stream_get_error(output));
+       if (o_stream_flush(output) < 0) {
+               *error_r = t_strdup(o_stream_get_error(output));
+               i_stream_unref(&input);
+       }
        o_stream_unref(&output);
+       *input_r = input;
+       return input == NULL ? -1 : 0;
+}
+
+static struct istream *master_service_send_cmd_or_fatal(const char *cmd)
+{
+       struct istream *input;
+       const char *error;
+
+       if (master_service_send_cmd(cmd, &input, &error) < 0)
+               i_fatal("%s", error);
        return input;
 }
 
@@ -126,7 +140,7 @@ master_service_send_cmd_with_args(const char *cmd, const char *const *args)
                        str_append_tabescaped(str, args[i]);
                }
        }
-       return master_service_send_cmd(str_c(str));
+       return master_service_send_cmd_or_fatal(str_c(str));
 }
 
 static void cmd_service_stop(struct doveadm_cmd_context *cctx)
@@ -164,7 +178,8 @@ static void cmd_service_status(struct doveadm_cmd_context *cctx)
        if (!doveadm_cmd_param_array(cctx, "service", &services))
                services = NULL;
 
-       struct istream *input = master_service_send_cmd("SERVICE-STATUS");
+       struct istream *input =
+               master_service_send_cmd_or_fatal("SERVICE-STATUS");
 
        doveadm_print_init(DOVEADM_PRINT_TYPE_PAGER);
        doveadm_print_header_simple("name");
index f9037871aa04fb198be7960168840fc7fe1c100d..5ed6eaf3523f2b4aae51f340ccb227b1036d35b2 100644 (file)
@@ -22,5 +22,7 @@ extern int doveadm_exit_code;
 void usage(void) ATTR_NORETURN;
 void help_ver2(const struct doveadm_cmd_ver2 *cmd) ATTR_NORETURN;
 void doveadm_master_send_signal(int signo, struct event *event);
+int master_service_send_cmd(const char *cmd, struct istream **input_r,
+                           const char **error_r);
 
 #endif