]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: A bit nicer way to implement doveadm_cmd_param_array() returning C-string...
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 29 Feb 2016 23:34:25 +0000 (01:34 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 29 Feb 2016 23:34:25 +0000 (01:34 +0200)
So replacement of 4afc67eb9, which I accidentally pushed before remembering
about this other way.

src/doveadm/client-connection-http.c
src/doveadm/doveadm-cmd.c
src/doveadm/doveadm-cmd.h

index f4f0c9abdde6238e224177a12a2b82fc101f3b4b..2356de815c0fba55c7f8faaeb80a17e030afbae5 100644 (file)
@@ -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;
index 26901e209a7980fbd8e1e2ff1d8d0dd270137e01..559af1aebdbbebca0dba464730563151538c1ab9 100644 (file)
@@ -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)
 {
@@ -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;
@@ -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)
@@ -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;
 
index 58e91a393121817adee749a33c9de8c38c09e966..974d87ff6eac8a2d389b91118b328a5cc5b85e7f 100644 (file)
@@ -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;
@@ -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;