Skip to content

Commit

Permalink
doveadm: A bit nicer way to implement doveadm_cmd_param_array() retur…
Browse files Browse the repository at this point in the history
…ning C-string array

So replacement of 4afc67e, which I accidentally pushed before remembering
about this other way.
  • Loading branch information
sirainen committed Feb 29, 2016
1 parent 6eb1a7a commit 2029c2c
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 9 deletions.
3 changes: 2 additions & 1 deletion src/doveadm/client-connection-http.c
Expand Up @@ -303,7 +303,8 @@ doveadm_http_server_command_execute(struct client_connection_http *conn)

doveadm_print_init(DOVEADM_PRINT_TYPE_JSON);
/* then call it */
cctx.argv = array_get_modifiable(&conn->pargv, (unsigned int*)&cctx.argc);
doveadm_cmd_params_null_terminate_arrays(&conn->pargv);
cctx.argv = array_get(&conn->pargv, (unsigned int*)&cctx.argc);
ioloop = io_loop_create();
lib_signals_reset_ioloop();
doveadm_exit_code = 0;
Expand Down
29 changes: 22 additions & 7 deletions src/doveadm/doveadm-cmd.c
Expand Up @@ -181,7 +181,7 @@ void doveadm_cmds_deinit(void)
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)
{
Expand Down Expand Up @@ -249,14 +249,15 @@ 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, 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(&param->value.v_array);
array_delete(&param->value.v_array,
array_count(&param->value.v_array)-1, 1);
*value_r = array_idx(&param->value.v_array, 0);
*value_r = array_get(&param->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;
Expand Down Expand Up @@ -287,6 +288,19 @@ void doveadm_cmd_params_clean(ARRAY_TYPE(doveadm_cmd_param_arr_t) *pargv)
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(&param->value.v_array)) {
array_append_zero(&param->value.v_array);
array_delete(&param->value.v_array, array_count(&param->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)
Expand Down Expand Up @@ -498,6 +512,7 @@ int doveadm_cmd_run_ver2(int argc, const char **argv,
}
}

doveadm_cmd_params_null_terminate_arrays(&pargv);
cctx->argv = array_get_modifiable(&pargv, &pargc);
cctx->argc = pargc;

Expand Down
3 changes: 2 additions & 1 deletion src/doveadm/doveadm-cmd.h
Expand Up @@ -72,7 +72,7 @@ struct doveadm_cmd_context {
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;
Expand Down Expand Up @@ -140,6 +140,7 @@ bool doveadm_cmd_param_istream(const struct doveadm_cmd_context *cctx,
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;
Expand Down

0 comments on commit 2029c2c

Please sign in to comment.