array_free(&doveadm_cmds_ver2);
}
-static struct doveadm_cmd_param*
+static const struct doveadm_cmd_param*
doveadm_cmd_param_get(const struct doveadm_cmd_context *cctx,
const char *name)
{
bool doveadm_cmd_param_array(const struct doveadm_cmd_context *cctx,
const char *name, const char *const **value_r)
{
- struct doveadm_cmd_param *param;
+ const struct doveadm_cmd_param *param;
+ unsigned int count;
+
if ((param = doveadm_cmd_param_get(cctx, name))==NULL) return FALSE;
if (param->type == CMD_PARAM_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);
+ *value_r = array_get(¶m->value.v_array, &count);
+ /* doveadm_cmd_params_null_terminate_arrays() should have been
+ called, which guarantees that we're NULL-terminated */
+ i_assert((*value_r)[count] == NULL);
return TRUE;
}
return FALSE;
array_clear(pargv);
}
+void doveadm_cmd_params_null_terminate_arrays(ARRAY_TYPE(doveadm_cmd_param_arr_t) *pargv)
+{
+ struct doveadm_cmd_param *param;
+
+ array_foreach_modifiable(pargv, param) {
+ if (param->type == CMD_PARAM_ARRAY &&
+ array_is_created(¶m->value.v_array)) {
+ array_append_zero(¶m->value.v_array);
+ array_delete(¶m->value.v_array, array_count(¶m->value.v_array)-1, 1);
+ }
+ }
+}
+
static void
doveadm_cmd_params_to_argv(const char *name, int pargc, const struct doveadm_cmd_param* params,
ARRAY_TYPE(const_string) *argv)
}
}
+ doveadm_cmd_params_null_terminate_arrays(&pargv);
cctx->argv = array_get_modifiable(&pargv, &pargc);
cctx->argc = pargc;
const struct doveadm_cmd_ver2 *cmd; /* for help */
int argc;
- struct doveadm_cmd_param *argv;
+ const struct doveadm_cmd_param *argv;
const char *username;
bool cli;
const char *name, struct istream **value_r);
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_stop_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_reload_ver2;