static void
doveadm_http_server_command_execute(struct client_connection_http *conn)
{
- const struct doveadm_cmd_param *cpar;
+ const struct doveadm_cmd_param *cpar;
+ struct doveadm_cmd_attributes attrs;
/* final preflight check */
if (!doveadm_client_is_allowed_command(conn->client.set, conn->cmd->name))
ioloop = io_loop_create();
lib_signals_reset_ioloop();
doveadm_exit_code = 0;
+ memset(&attrs, 0, sizeof(attrs));
+ attrs.local_ip = conn->client.local_ip;
+ attrs.local_port = conn->client.local_port;
+ attrs.remote_ip = conn->client.remote_ip;
+ attrs.remote_port = conn->client.remote_port;
+
conn->cmd->cmd(conn->cmd,pargc, cpar);
io_loop_set_current(prev_ioloop);
static int
doveadm_mail_cmd_server_parse(const struct doveadm_mail_cmd *cmd,
const struct doveadm_settings *set,
- const struct mail_storage_service_input *input,
const struct doveadm_cmd_attributes *attrs,
struct doveadm_mail_cmd_context **ctx_r)
{
doveadm_print_header("username", "Username",
DOVEADM_PRINT_HEADER_FLAG_STICKY |
DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
- doveadm_print_sticky("username", input->username);
+ doveadm_print_sticky("username", attrs->username);
}
*ctx_r = ctx;
return 0;
static void
doveadm_mail_cmd_server_run(struct client_connection *conn,
struct doveadm_mail_cmd_context *ctx,
- const struct mail_storage_service_input *input)
+ const struct doveadm_cmd_attributes *attrs)
{
const char *error;
int ret;
if (ctx->v.preinit != NULL)
ctx->v.preinit(ctx);
- ret = doveadm_mail_single_user(ctx, input, &error);
+ ret = doveadm_mail_single_user(ctx, attrs, &error);
doveadm_mail_server_flush();
ctx->v.deinit(ctx);
doveadm_print_flush();
static int doveadm_cmd_handle(struct client_connection *conn,
const char *cmd_name,
- const struct mail_storage_service_input *input,
const struct doveadm_cmd_attributes *attrs)
{
struct ioloop *ioloop, *prev_ioloop = current_ioloop;
return -1;
}
if (doveadm_mail_cmd_server_parse(mail_cmd, conn->set,
- input, attrs, &ctx) < 0)
+ attrs, &ctx) < 0)
return -1;
} else {
attrs = &cmd_attrs;
else if (cmd != NULL)
doveadm_cmd_server_run(conn, cmd, attrs);
else
- doveadm_mail_cmd_server_run(conn, ctx, input);
+ doveadm_mail_cmd_server_run(conn, ctx, attrs);
io_loop_set_current(prev_ioloop);
lib_signals_reset_ioloop();
static bool client_handle_command(struct client_connection *conn, char **args)
{
struct doveadm_cmd_attributes attrs;
- struct mail_storage_service_input input;
const char *flags, *cmd_name;
unsigned int argc;
- memset(&input, 0, sizeof(input));
- input.service = "doveadm";
- input.local_ip = conn->local_ip;
- input.remote_ip = conn->remote_ip;
- input.local_port = conn->local_port;
- input.remote_port = conn->remote_port;
-
for (argc = 0; args[argc] != NULL; argc++)
args[argc] = str_tabunescape(args[argc]);
attrs.argv = (const char **)args;
attrs.argc = argc;
+ attrs.local_ip = conn->local_ip;
+ attrs.remote_ip = conn->remote_ip;
+ attrs.local_port = conn->local_port;
+ attrs.remote_port = conn->remote_port;
+
flags = args[0];
- input.username = args[1];
+ attrs.username = args[1];
+
cmd_name = args[2];
/* leave the command name as args[0] so getopt() works */
args += 2;
}
o_stream_cork(conn->output);
- if (doveadm_cmd_handle(conn, cmd_name, &input, &attrs) < 0)
+ if (doveadm_cmd_handle(conn, cmd_name, &attrs) < 0)
o_stream_nsend(conn->output, "\n-\n", 3);
o_stream_uncork(conn->output);
#ifndef DOVEADM_CMD_H
#define DOVEADM_CMD_H
+#include "net.h"
+
#define DOVEADM_CMD_PARAMS_START .parameters = (const struct doveadm_cmd_param[]){
#define DOVEADM_CMD_PARAM(optP, nameP, typeP, flagP ) { .short_opt = optP, .name = nameP, .type = typeP, .flags = flagP },
#define DOVEADM_CMD_PARAMS_END { .short_opt = '\0', .name = NULL, .type = CMD_PARAM_BOOL, .flags = CMD_PARAM_FLAG_NONE } }
struct doveadm_cmd_attributes {
int argc;
const char **argv;
+
+ const char *username;
+ struct ip_addr local_ip, remote_ip;
+ in_port_t local_port, remote_port;
};
ARRAY_DEFINE_TYPE(doveadm_cmd, struct doveadm_cmd);
return ctx;
}
+static void
+doveadm_attrs_to_storage_service_input(const struct doveadm_cmd_attributes *attrs,
+ struct mail_storage_service_input *input_r)
+{
+ memset(input_r, 0, sizeof(*input_r));
+ input_r->service = "doveadm";
+ input_r->remote_ip = attrs->remote_ip;
+ input_r->remote_port = attrs->remote_port;
+ input_r->local_ip = attrs->local_ip;
+ input_r->local_port = attrs->local_port;
+ input_r->username = attrs->username;
+}
+
static int
doveadm_mail_next_user(struct doveadm_mail_cmd_context *ctx,
- const struct mail_storage_service_input *input,
+ const struct doveadm_cmd_attributes *attrs,
const char **error_r)
{
+ struct mail_storage_service_input input;
const char *error, *ip;
int ret;
- ip = net_ip2addr(&input->remote_ip);
+ ip = net_ip2addr(&attrs->remote_ip);
if (ip[0] == '\0')
- i_set_failure_prefix("doveadm(%s): ", input->username);
+ i_set_failure_prefix("doveadm(%s): ", attrs->username);
else
- i_set_failure_prefix("doveadm(%s,%s): ", ip, input->username);
+ i_set_failure_prefix("doveadm(%s,%s): ", ip, attrs->username);
+ doveadm_attrs_to_storage_service_input(attrs, &input);
/* see if we want to execute this command via (another)
doveadm server */
- ret = doveadm_mail_server_user(ctx, input, error_r);
+ ret = doveadm_mail_server_user(ctx, &input, error_r);
if (ret != 0)
return ret;
- ret = mail_storage_service_lookup(ctx->storage_service, input,
+ ret = mail_storage_service_lookup(ctx->storage_service, &input,
&ctx->cur_service_user, &error);
if (ret <= 0) {
if (ret < 0) {
}
int doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
- const struct mail_storage_service_input *input,
+ const struct doveadm_cmd_attributes *attrs,
const char **error_r)
{
- i_assert(input->username != NULL);
+ i_assert(attrs->username != NULL);
- ctx->cur_client_ip = input->remote_ip;
- ctx->cur_username = input->username;
- ctx->storage_service_input = *input;
+ doveadm_attrs_to_storage_service_input(attrs, &ctx->storage_service_input);
+ ctx->cur_client_ip = attrs->remote_ip;
+ ctx->cur_username = attrs->username;
ctx->storage_service = mail_storage_service_init(master_service, NULL,
ctx->service_flags);
ctx->v.init(ctx, ctx->args);
lib_signals_set_handler(SIGINT, 0, sig_die, NULL);
lib_signals_set_handler(SIGTERM, 0, sig_die, NULL);
- return doveadm_mail_next_user(ctx, input, error_r);
+ return doveadm_mail_next_user(ctx, attrs, error_r);
}
static void
doveadm_mail_all_users(struct doveadm_mail_cmd_context *ctx,
const char *wildcard_user)
{
- struct mail_storage_service_input input;
+ struct doveadm_cmd_attributes attrs;
unsigned int user_idx;
const char *ip, *user, *error;
int ret;
ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
- memset(&input, 0, sizeof(input));
- input.service = "doveadm";
+ memset(&attrs, 0, sizeof(attrs));
- ctx->storage_service_input = input;
+ doveadm_attrs_to_storage_service_input(&attrs, &ctx->storage_service_input);
ctx->storage_service = mail_storage_service_init(master_service, NULL,
ctx->service_flags);
lib_signals_set_handler(SIGINT, 0, sig_die, NULL);
if (!wildcard_match_icase(user, wildcard_user))
continue;
}
- input.username = user;
+ attrs.username = user;
ctx->cur_username = user;
doveadm_print_sticky("username", user);
T_BEGIN {
- ret = doveadm_mail_next_user(ctx, &input, &error);
+ ret = doveadm_mail_next_user(ctx, &attrs, &error);
if (ret < 0)
i_error("%s", error);
else if (ret == 0)
}
if (ctx->iterate_single_user) {
- struct mail_storage_service_input input;
+ struct doveadm_cmd_attributes attrs;
if (ctx->cur_username == NULL)
i_fatal_status(EX_USAGE, "USER environment is missing and -u option not used");
- memset(&input, 0, sizeof(input));
- input.service = "doveadm";
- input.username = ctx->cur_username;
- ret = doveadm_mail_single_user(ctx, &input, &error);
+ memset(&attrs, 0, sizeof(attrs));
+ attrs.username = ctx->cur_username;
+ ret = doveadm_mail_single_user(ctx, &attrs, &error);
if (ret < 0) {
/* user lookup/init failed somehow */
doveadm_exit_code = EX_TEMPFAIL;
doveadm_mail_cmd_init(const struct doveadm_mail_cmd *cmd,
const struct doveadm_settings *set);
int doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
- const struct mail_storage_service_input *input,
+ const struct doveadm_cmd_attributes *attrs,
const char **error_r);
int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
const struct mail_storage_service_input *input,