From 4afc67eb96f8d6b7dc94d63d3c7fe4f556c4fcee Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sun, 28 Feb 2016 18:48:15 +0200 Subject: [PATCH] doveadm: Changed doveadm_cmd_param_array() to return C-string array instead of ARRAY() We could support both with separate functions, but perhaps this one is enough. --- src/doveadm/client-connection-http.c | 2 +- src/doveadm/doveadm-cmd.c | 12 ++++++++---- src/doveadm/doveadm-cmd.h | 4 ++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/doveadm/client-connection-http.c b/src/doveadm/client-connection-http.c index 076116a1a5..f4f0c9abdd 100644 --- a/src/doveadm/client-connection-http.c +++ b/src/doveadm/client-connection-http.c @@ -303,7 +303,7 @@ doveadm_http_server_command_execute(struct client_connection_http *conn) doveadm_print_init(DOVEADM_PRINT_TYPE_JSON); /* then call it */ - cctx.argv = array_get(&conn->pargv, (unsigned int*)&cctx.argc); + cctx.argv = array_get_modifiable(&conn->pargv, (unsigned int*)&cctx.argc); ioloop = io_loop_create(); lib_signals_reset_ioloop(); doveadm_exit_code = 0; diff --git a/src/doveadm/doveadm-cmd.c b/src/doveadm/doveadm-cmd.c index 3ce4507a94..1fc7a54d53 100644 --- a/src/doveadm/doveadm-cmd.c +++ b/src/doveadm/doveadm-cmd.c @@ -181,7 +181,7 @@ void doveadm_cmds_deinit(void) array_free(&doveadm_cmds_ver2); } -static const struct doveadm_cmd_param* +static struct doveadm_cmd_param* doveadm_cmd_param_get(const struct doveadm_cmd_context *cctx, const char *name) { @@ -247,12 +247,16 @@ bool doveadm_cmd_param_ip(const struct doveadm_cmd_context *cctx, } bool doveadm_cmd_param_array(const struct doveadm_cmd_context *cctx, - const char *name, ARRAY_TYPE(const_string) **value_r) + const char *name, const char *const **value_r) { - const struct doveadm_cmd_param *param; + struct doveadm_cmd_param *param; if ((param = doveadm_cmd_param_get(cctx, name))==NULL) return FALSE; if (param->type == CMD_PARAM_ARRAY) { - *value_r = (ARRAY_TYPE(const_string)*)&(param->value.v_array); + /* NULL-terminate the array, but don't leave it there */ + array_append_zero(¶m->value.v_array); + array_delete(¶m->value.v_array, + array_count(¶m->value.v_array)-1, 1); + *value_r = array_idx(¶m->value.v_array, 0); return TRUE; } return FALSE; diff --git a/src/doveadm/doveadm-cmd.h b/src/doveadm/doveadm-cmd.h index ebd84d669f..5e80cd6610 100644 --- a/src/doveadm/doveadm-cmd.h +++ b/src/doveadm/doveadm-cmd.h @@ -72,7 +72,7 @@ struct doveadm_cmd_context { const struct doveadm_cmd_ver2 *cmd; /* for help */ int argc; - const struct doveadm_cmd_param *argv; + struct doveadm_cmd_param *argv; const char *username; bool cli; @@ -137,7 +137,7 @@ bool doveadm_cmd_param_str(const struct doveadm_cmd_context *cctx, bool doveadm_cmd_param_ip(const struct doveadm_cmd_context *cctx, const char *name, struct ip_addr *value_r); bool doveadm_cmd_param_array(const struct doveadm_cmd_context *cctx, - const char *name, ARRAY_TYPE(const_string) **value_r); + const char *name, const char *const **value_r); bool doveadm_cmd_param_istream(const struct doveadm_cmd_context *cctx, const char *name, struct istream **value_r); -- 2.47.3