Skip to content

Commit

Permalink
doveadm: Added "service stop" command to stop specific services.
Browse files Browse the repository at this point in the history
  • Loading branch information
sirainen committed Jun 29, 2016
1 parent e296bf5 commit c32f2e2
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/doveadm/Makefile.am
Expand Up @@ -76,6 +76,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
Expand Down
1 change: 1 addition & 0 deletions src/doveadm/doveadm-cmd.c
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions src/doveadm/doveadm-cmd.h
Expand Up @@ -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;
Expand Down
60 changes: 60 additions & 0 deletions 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 <unistd.h>

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 = "<service> [<service> [...]]",
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_PARAM('\0', "service", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
};

0 comments on commit c32f2e2

Please sign in to comment.