From: Timo Sirainen Date: Tue, 28 Jun 2016 20:12:03 +0000 (+0300) Subject: doveadm: Added "service stop" command to stop specific services. X-Git-Tag: 2.3.0.rc1~3379 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=53309922d2ec3321e011966e8f2b210821ecd5e3;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Added "service stop" command to stop specific services. --- diff --git a/src/doveadm/Makefile.am b/src/doveadm/Makefile.am index 4f4da33e40..a60100a233 100644 --- a/src/doveadm/Makefile.am +++ b/src/doveadm/Makefile.am @@ -75,6 +75,7 @@ doveadm_common_cmds = \ doveadm-penalty.c \ doveadm-proxy.c \ doveadm-replicator.c \ + doveadm-service.c \ doveadm-sis.c \ doveadm-stats.c \ doveadm-who.c diff --git a/src/doveadm/doveadm-cmd.c b/src/doveadm/doveadm-cmd.c index f43e67459a..368a58a817 100644 --- a/src/doveadm/doveadm-cmd.c +++ b/src/doveadm/doveadm-cmd.c @@ -19,6 +19,7 @@ static struct doveadm_cmd *doveadm_commands[] = { }; static struct doveadm_cmd_ver2 *doveadm_commands_ver2[] = { + &doveadm_cmd_service_stop_ver2, &doveadm_cmd_stop_ver2, &doveadm_cmd_reload_ver2, &doveadm_cmd_stats_dump_ver2, diff --git a/src/doveadm/doveadm-cmd.h b/src/doveadm/doveadm-cmd.h index 3c677daaa7..19a46cdedf 100644 --- a/src/doveadm/doveadm-cmd.h +++ b/src/doveadm/doveadm-cmd.h @@ -146,6 +146,7 @@ bool doveadm_cmd_param_istream(const struct doveadm_cmd_context *cctx, void doveadm_cmd_params_clean(ARRAY_TYPE(doveadm_cmd_param_arr_t) *pargv); void doveadm_cmd_params_null_terminate_arrays(ARRAY_TYPE(doveadm_cmd_param_arr_t) *pargv); +extern struct doveadm_cmd_ver2 doveadm_cmd_service_stop_ver2; extern struct doveadm_cmd_ver2 doveadm_cmd_stop_ver2; extern struct doveadm_cmd_ver2 doveadm_cmd_reload_ver2; extern struct doveadm_cmd_ver2 doveadm_cmd_stats_reset_ver2; diff --git a/src/doveadm/doveadm-service.c b/src/doveadm/doveadm-service.c new file mode 100644 index 0000000000..58dd76b8a0 --- /dev/null +++ b/src/doveadm/doveadm-service.c @@ -0,0 +1,60 @@ +/* Copyright (c) 2016 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "str.h" +#include "write-full.h" +#include "istream.h" +#include "doveadm.h" + +#include + +static void cmd_service_stop(int argc, char *argv[]) +{ + const char *path, *line; + int fd; + + if (argc == 1) + help_ver2(&doveadm_cmd_service_stop_ver2); + + path = t_strconcat(doveadm_settings->base_dir, "/master", NULL); + fd = net_connect_unix(path); + if (fd == -1) + i_fatal("net_connect_unix(%s) failed: %m", path); + net_set_nonblock(fd, FALSE); + + string_t *cmd = t_str_new(128); + str_append(cmd, "VERSION\tmaster-client\t1\t0\nSTOP"); + for (int i = 1; i < argc; i++) { + str_append_c(cmd, '\t'); + str_append(cmd, argv[i]); + } + str_append_c(cmd, '\n'); + if (write_full(fd, str_data(cmd), str_len(cmd)) < 0) + i_error("write(%s) failed: %m", path); + + alarm(5); + struct istream *input = i_stream_create_fd(fd, IO_BLOCK_SIZE); + if (i_stream_read_next_line(input) == NULL || + (line = i_stream_read_next_line(input)) == NULL) { + i_error("read(%s) failed: %s", path, i_stream_get_error(input)); + doveadm_exit_code = EX_TEMPFAIL; + } else if (line[0] == '-') { + doveadm_exit_code = DOVEADM_EX_NOTFOUND; + i_error("%s", line+1); + } else if (line[0] != '+') { + i_error("Unexpected input from %s: %s", path, line); + doveadm_exit_code = EX_TEMPFAIL; + } + alarm(0); + i_stream_destroy(&input); + i_close_fd(&fd); +} + +struct doveadm_cmd_ver2 doveadm_cmd_service_stop_ver2 = { + .old_cmd = cmd_service_stop, + .name = "service stop", + .usage = " [ [...]]", +DOVEADM_CMD_PARAMS_START +DOVEADM_CMD_PARAM('\0', "service", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL) +DOVEADM_CMD_PARAMS_END +};