"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "src/doveadm/doveadm-instance.c" between
dovecot-2.3.16.tar.gz and dovecot-2.3.17.tar.gz

About: Dovecot is an IMAP and POP3 server, written with security primarily in mind.

doveadm-instance.c  (dovecot-2.3.16):doveadm-instance.c  (dovecot-2.3.17)
skipping to change at line 14 skipping to change at line 14
#include "master-instance.h" #include "master-instance.h"
#include "master-service-settings.h" #include "master-service-settings.h"
#include "doveadm.h" #include "doveadm.h"
#include "doveadm-print.h" #include "doveadm-print.h"
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <signal.h> #include <signal.h>
extern struct doveadm_cmd doveadm_cmd_instance[]; extern struct doveadm_cmd_ver2 doveadm_cmd_instance[];
static void instance_cmd_help(doveadm_command_t *cmd) ATTR_NORETURN; static void instance_cmd_help(const struct doveadm_cmd_ver2 *cmd) ATTR_NORETURN;
static bool pid_file_read(const char *path) static bool pid_file_read(const char *path)
{ {
char buf[32]; char buf[32];
int fd; int fd;
ssize_t ret; ssize_t ret;
pid_t pid; pid_t pid;
bool found = FALSE; bool found = FALSE;
fd = open(path, O_RDONLY); fd = open(path, O_RDONLY);
skipping to change at line 47 skipping to change at line 47
buf[ret-1] = '\0'; buf[ret-1] = '\0';
if (str_to_pid(buf, &pid) == 0) { if (str_to_pid(buf, &pid) == 0) {
found = !(pid == getpid() || found = !(pid == getpid() ||
(kill(pid, 0) < 0 && errno == ESRCH)); (kill(pid, 0) < 0 && errno == ESRCH));
} }
} }
i_close_fd(&fd); i_close_fd(&fd);
return found; return found;
} }
static void cmd_instance_list(int argc, char *argv[]) static void cmd_instance_list(struct doveadm_cmd_context *cctx)
{ {
struct master_instance_list *list; struct master_instance_list *list;
struct master_instance_list_iter *iter; struct master_instance_list_iter *iter;
const struct master_instance *inst; const struct master_instance *inst;
const char *instance_path, *pidfile_path; const char *instance_path, *pidfile_path;
bool show_config = FALSE; bool show_config = FALSE;
int c; const char *name = NULL;
while ((c = getopt(argc, argv, "c")) > 0) { (void)doveadm_cmd_param_bool(cctx, "show-config", &show_config);
switch (c) { (void)doveadm_cmd_param_str(cctx, "name", &name);
case 'c':
show_config = TRUE;
break;
default:
help(&doveadm_cmd_instance[0]);
}
}
argv += optind;
if (!show_config) { if (!show_config) {
doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE); doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
doveadm_print_header("path", "path", DOVEADM_PRINT_HEADER_FLAG_EX PAND); doveadm_print_header("path", "path", DOVEADM_PRINT_HEADER_FLAG_EX PAND);
doveadm_print_header_simple("name"); doveadm_print_header_simple("name");
doveadm_print_header_simple("last used"); doveadm_print_header_simple("last used");
doveadm_print_header_simple("running"); doveadm_print_header_simple("running");
} }
instance_path = t_strconcat(service_set->state_dir, instance_path = t_strconcat(service_set->state_dir,
"/"MASTER_INSTANCE_FNAME, NULL); "/"MASTER_INSTANCE_FNAME, NULL);
list = master_instance_list_init(instance_path); list = master_instance_list_init(instance_path);
iter = master_instance_list_iterate_init(list); iter = master_instance_list_iterate_init(list);
while ((inst = master_instance_iterate_list_next(iter)) != NULL) { while ((inst = master_instance_iterate_list_next(iter)) != NULL) {
if (argv[0] != NULL && strcmp(argv[0], inst->name) != 0) if (name != NULL && strcmp(name, inst->name) != 0)
continue; continue;
if (show_config) { if (show_config) {
printf("%s\n", inst->config_path == NULL ? "" : printf("%s\n", inst->config_path == NULL ? "" :
inst->config_path); inst->config_path);
continue; continue;
} }
doveadm_print(inst->base_dir); doveadm_print(inst->base_dir);
doveadm_print(inst->name); doveadm_print(inst->name);
doveadm_print(unixdate2str(inst->last_used)); doveadm_print(unixdate2str(inst->last_used));
pidfile_path = t_strconcat(inst->base_dir, "/master.pid", NULL); pidfile_path = t_strconcat(inst->base_dir, "/master.pid", NULL);
if (pid_file_read(pidfile_path)) if (pid_file_read(pidfile_path))
doveadm_print("yes"); doveadm_print("yes");
else else
doveadm_print("no"); doveadm_print("no");
} }
master_instance_iterate_list_deinit(&iter); master_instance_iterate_list_deinit(&iter);
master_instance_list_deinit(&list); master_instance_list_deinit(&list);
} }
static void cmd_instance_remove(int argc, char *argv[]) static void cmd_instance_remove(struct doveadm_cmd_context *cctx)
{ {
struct master_instance_list *list; struct master_instance_list *list;
const struct master_instance *inst; const struct master_instance *inst;
const char *base_dir, *instance_path; const char *base_dir, *instance_path, *name;
int ret; int ret;
if (argc != 2) if (!doveadm_cmd_param_str(cctx, "name", &name))
instance_cmd_help(cmd_instance_remove); instance_cmd_help(cctx->cmd);
instance_path = t_strconcat(service_set->state_dir, instance_path = t_strconcat(service_set->state_dir,
"/"MASTER_INSTANCE_FNAME, NULL); "/"MASTER_INSTANCE_FNAME, NULL);
list = master_instance_list_init(instance_path); list = master_instance_list_init(instance_path);
inst = master_instance_list_find_by_name(list, argv[1]); inst = master_instance_list_find_by_name(list, name);
base_dir = inst != NULL ? inst->base_dir : argv[1]; base_dir = inst != NULL ? inst->base_dir : name;
if ((ret = master_instance_list_remove(list, base_dir)) < 0) { if ((ret = master_instance_list_remove(list, base_dir)) < 0) {
i_error("Failed to remove instance"); i_error("Failed to remove instance");
doveadm_exit_code = EX_TEMPFAIL; doveadm_exit_code = EX_TEMPFAIL;
} else if (ret == 0) { } else if (ret == 0) {
i_error("Instance already didn't exist"); i_error("Instance already didn't exist");
doveadm_exit_code = DOVEADM_EX_NOTFOUND; doveadm_exit_code = DOVEADM_EX_NOTFOUND;
} }
master_instance_list_deinit(&list); master_instance_list_deinit(&list);
} }
struct doveadm_cmd doveadm_cmd_instance[] = { struct doveadm_cmd_ver2 doveadm_cmd_instance[] = {
{ cmd_instance_list, "instance list", "[-c] [<name>]" }, {
{ cmd_instance_remove, "instance remove", "<name> | <base dir>" } .name = "instance list",
.cmd = cmd_instance_list,
.usage = "[-c] [<name>]",
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_PARAM('c', "show-config", CMD_PARAM_BOOL, 0)
DOVEADM_CMD_PARAM('\0', "name", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
},
{
.name = "instance remove",
.cmd = cmd_instance_remove,
.usage = "<name> | <base dir>",
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_PARAM('\0', "name", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
}
}; };
static void instance_cmd_help(doveadm_command_t *cmd) static void instance_cmd_help(const struct doveadm_cmd_ver2 *cmd)
{ {
unsigned int i; unsigned int i;
for (i = 0; i < N_ELEMENTS(doveadm_cmd_instance); i++) { for (i = 0; i < N_ELEMENTS(doveadm_cmd_instance); i++) {
if (doveadm_cmd_instance[i].cmd == cmd) if (doveadm_cmd_instance[i].cmd == cmd->cmd)
help(&doveadm_cmd_instance[i]); help_ver2(&doveadm_cmd_instance[i]);
} }
i_unreached(); i_unreached();
} }
void doveadm_register_instance_commands(void) void doveadm_register_instance_commands(void)
{ {
unsigned int i; unsigned int i;
for (i = 0; i < N_ELEMENTS(doveadm_cmd_instance); i++) for (i = 0; i < N_ELEMENTS(doveadm_cmd_instance); i++)
doveadm_register_cmd(&doveadm_cmd_instance[i]); doveadm_cmd_register_ver2(&doveadm_cmd_instance[i]);
} }
 End of changes. 14 change blocks. 
28 lines changed or deleted 35 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)