From: Timo Sirainen Date: Thu, 20 Oct 2016 10:09:09 +0000 (+0300) Subject: doveadm service stop: Moved command handling to doveadm-master.c X-Git-Tag: 2.2.26~79 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a96aaf10c1af81cbfbed16eef2abd66ed78e43b8;p=thirdparty%2Fdovecot%2Fcore.git doveadm service stop: Moved command handling to doveadm-master.c It's talking to master process, and there will be other non-service commands that talk to the master process in the same way. --- diff --git a/src/doveadm/Makefile.am b/src/doveadm/Makefile.am index c7f025613c..c644646116 100644 --- a/src/doveadm/Makefile.am +++ b/src/doveadm/Makefile.am @@ -77,7 +77,6 @@ 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-master.c b/src/doveadm/doveadm-master.c index 41a28c8137..9d644cc78b 100644 --- a/src/doveadm/doveadm-master.c +++ b/src/doveadm/doveadm-master.c @@ -1,6 +1,9 @@ /* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */ #include "lib.h" +#include "str.h" +#include "istream.h" +#include "write-full.h" #include "doveadm.h" #include @@ -84,6 +87,48 @@ static void cmd_reload(int argc ATTR_UNUSED, char *argv[] ATTR_UNUSED) doveadm_master_send_signal(SIGHUP); } +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, FALSE); + 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_stop_ver2 = { .old_cmd = cmd_stop, .name = "stop", @@ -99,3 +144,12 @@ struct doveadm_cmd_ver2 doveadm_cmd_reload_ver2 = { DOVEADM_CMD_PARAMS_START DOVEADM_CMD_PARAMS_END }; + +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 +}; diff --git a/src/doveadm/doveadm-service.c b/src/doveadm/doveadm-service.c deleted file mode 100644 index 95d97188e8..0000000000 --- a/src/doveadm/doveadm-service.c +++ /dev/null @@ -1,60 +0,0 @@ -/* 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, FALSE); - 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 -};