From cc20940626bb4563de37feec958a2c5037946e63 Mon Sep 17 00:00:00 2001
From: Marco Bettini <marco.bettini@open-xchange.com>
Date: Mon, 16 May 2022 13:35:16 +0000
Subject: [PATCH] plugins: Remove doveadm_mail_cmd_context::getopt_args

---
 .../doveadm-sieve-cmd-activate.c              | 12 +++----
 .../doveadm-sieve/doveadm-sieve-cmd-delete.c  | 35 ++++---------------
 .../doveadm-sieve/doveadm-sieve-cmd-get.c     | 11 +++---
 .../doveadm-sieve/doveadm-sieve-cmd-list.c    |  4 +--
 .../doveadm-sieve/doveadm-sieve-cmd-put.c     | 34 ++++--------------
 .../doveadm-sieve/doveadm-sieve-cmd-rename.c  | 14 ++++----
 src/plugins/doveadm-sieve/doveadm-sieve-cmd.c | 34 +++++++-----------
 src/plugins/doveadm-sieve/doveadm-sieve-cmd.h |  3 +-
 8 files changed, 44 insertions(+), 103 deletions(-)

diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-activate.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-activate.c
index e729b8f5c..2246d0ef6 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-activate.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-activate.c
@@ -88,18 +88,16 @@ static int cmd_sieve_deactivate_run(struct doveadm_sieve_cmd_context *_ctx)
 	return 0;
 }
 
-static void
-cmd_sieve_activate_init(struct doveadm_mail_cmd_context *_ctx,
-			const char *const args[])
+
+static void cmd_sieve_activate_init(struct doveadm_mail_cmd_context *_ctx)
 {
 	struct doveadm_sieve_activate_cmd_context *ctx =
 		(struct doveadm_sieve_activate_cmd_context *)_ctx;
+	struct doveadm_cmd_context *cctx = _ctx->cctx;
 
-	if (str_array_length(args) != 1)
+	if (!doveadm_cmd_param_str(cctx, "scriptname", &ctx->scriptname))
 		doveadm_mail_help_name("sieve activate");
-	doveadm_sieve_cmd_scriptnames_check(args);
-
-	ctx->scriptname = p_strdup(ctx->ctx.ctx.pool, args[0]);
+	doveadm_sieve_cmd_scriptname_check(ctx->scriptname);
 }
 
 static struct doveadm_mail_cmd_context *cmd_sieve_activate_alloc(void)
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c
index 1dd058e6f..96ccada5b 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c
@@ -55,39 +55,18 @@ static int cmd_sieve_delete_run(struct doveadm_sieve_cmd_context *_ctx)
 	return ret;
 }
 
-static void
-cmd_sieve_delete_init(struct doveadm_mail_cmd_context *_ctx,
-		      const char *const args[])
+static void cmd_sieve_delete_init(struct doveadm_mail_cmd_context *_ctx)
 {
 	struct doveadm_sieve_delete_cmd_context *ctx =
 		(struct doveadm_sieve_delete_cmd_context *)_ctx;
-	const char *name;
-	unsigned int i;
+	struct doveadm_cmd_context *cctx = _ctx->cctx;
 
-	if (args[0] == NULL)
-		doveadm_mail_help_name("sieve delete");
-	doveadm_sieve_cmd_scriptnames_check(args);
+	ctx->ignore_active = doveadm_cmd_param_flag(cctx, "ignore-active");
 
-	for (i = 0; args[i] != NULL; i++) {
-		name = p_strdup(ctx->ctx.ctx.pool, args[i]);
-		array_append(&ctx->scriptnames, &name, 1);
-	}
-}
-
-static bool
-cmd_sieve_delete_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
-{
-	struct doveadm_sieve_delete_cmd_context *ctx =
-		(struct doveadm_sieve_delete_cmd_context *)_ctx;
+	if (!doveadm_cmd_param_array_append(cctx, "scriptname", &ctx->scriptnames))
+		doveadm_mail_help_name("sieve delete");
 
-	switch (c) {
-	case 'a':
-		ctx->ignore_active = TRUE;
-		break;
-	default:
-		return FALSE;
-	}
-	return TRUE;
+	doveadm_sieve_cmd_scriptnames_check(&ctx->scriptnames);
 }
 
 static struct doveadm_mail_cmd_context *cmd_sieve_delete_alloc(void)
@@ -95,8 +74,6 @@ static struct doveadm_mail_cmd_context *cmd_sieve_delete_alloc(void)
 	struct doveadm_sieve_delete_cmd_context *ctx;
 
 	ctx = doveadm_sieve_cmd_alloc(struct doveadm_sieve_delete_cmd_context);
-	ctx->ctx.ctx.getopt_args = "a";
-	ctx->ctx.ctx.v.parse_arg = cmd_sieve_delete_parse_arg;
 	ctx->ctx.ctx.v.init = cmd_sieve_delete_init;
 	ctx->ctx.v.run = cmd_sieve_delete_run;
 	p_array_init(&ctx->scriptnames, ctx->ctx.ctx.pool, 16);
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c
index 2ccdba1fd..b7f7eac90 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c
@@ -43,19 +43,16 @@ static int cmd_sieve_get_run(struct doveadm_sieve_cmd_context *_ctx)
 	return ret;
 }
 
-static void
-cmd_sieve_get_init(struct doveadm_mail_cmd_context *_ctx,
-		   const char *const args[])
+static void cmd_sieve_get_init(struct doveadm_mail_cmd_context *_ctx)
 {
 	struct doveadm_sieve_get_cmd_context *ctx =
 		(struct doveadm_sieve_get_cmd_context *)_ctx;
+	struct doveadm_cmd_context *cctx = _ctx->cctx;
 
-	if (str_array_length(args) != 1)
+	if (!doveadm_cmd_param_str(cctx, "scriptname", &ctx->scriptname))
 		doveadm_mail_help_name("sieve get");
-	doveadm_sieve_cmd_scriptnames_check(args);
-
-	ctx->scriptname = p_strdup(ctx->ctx.ctx.pool, args[0]);
 
+	doveadm_sieve_cmd_scriptname_check(ctx->scriptname);
 	doveadm_print_header_simple("sieve script");
 }
 
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-list.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-list.c
index 0071270ca..1b2224aa9 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-list.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-list.c
@@ -44,8 +44,7 @@ static int cmd_sieve_list_run(struct doveadm_sieve_cmd_context *_ctx)
 }
 
 static void
-cmd_sieve_list_init(struct doveadm_mail_cmd_context *_ctx ATTR_UNUSED,
-		    const char *const args[] ATTR_UNUSED)
+cmd_sieve_list_init(struct doveadm_mail_cmd_context *_ctx ATTR_UNUSED)
 {
 	doveadm_print_header("script", "script",
 			     DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
@@ -59,7 +58,6 @@ static struct doveadm_mail_cmd_context *cmd_sieve_list_alloc(void)
 
 	ctx = doveadm_sieve_cmd_alloc(struct doveadm_sieve_cmd_context);
 	ctx->ctx.v.init = cmd_sieve_list_init;
-	ctx->ctx.getopt_args = "s";
 	ctx->v.run = cmd_sieve_list_run;
 	doveadm_print_init(DOVEADM_PRINT_TYPE_FLOW);
 	return &ctx->ctx;
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-put.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-put.c
index d8cdb531f..0d43e6930 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-put.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-put.c
@@ -139,45 +139,25 @@ static int cmd_sieve_put_run(struct doveadm_sieve_cmd_context *_ctx)
 	return ret < 0 ? -1 : 0;
 }
 
-static void
-cmd_sieve_put_init(struct doveadm_mail_cmd_context *_ctx,
-		    const char *const args[])
+static void cmd_sieve_put_init(struct doveadm_mail_cmd_context *_ctx)
 {
 	struct doveadm_sieve_put_cmd_context *ctx =
 		(struct doveadm_sieve_put_cmd_context *)_ctx;
+	struct doveadm_cmd_context *cctx = _ctx->cctx;
 
-	if (str_array_length(args) != 1)
+	ctx->activate = doveadm_cmd_param_flag(cctx, "activate");
+	if (!doveadm_cmd_param_str(cctx, "scriptname", &ctx->scriptname))
 		doveadm_mail_help_name("sieve put");
-	doveadm_sieve_cmd_scriptnames_check(args);
-
-	ctx->scriptname = p_strdup(ctx->ctx.ctx.pool, args[0]);
-
+	doveadm_sieve_cmd_scriptname_check(ctx->scriptname);
 	doveadm_mail_get_input(_ctx);
 }
 
-static bool
-cmd_sieve_put_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
-{
-	struct doveadm_sieve_put_cmd_context *ctx =
-		(struct doveadm_sieve_put_cmd_context *)_ctx;
-
-	switch (c) {
-	case 'a':
-		ctx->activate = TRUE;
-		break;
-	default:
-		return FALSE;
-	}
-	return TRUE;
-}
-
-static struct doveadm_mail_cmd_context *cmd_sieve_put_alloc(void)
+static struct doveadm_mail_cmd_context *
+cmd_sieve_put_alloc(void)
 {
 	struct doveadm_sieve_put_cmd_context *ctx;
 
 	ctx = doveadm_sieve_cmd_alloc(struct doveadm_sieve_put_cmd_context);
-	ctx->ctx.ctx.getopt_args = "a";
-	ctx->ctx.ctx.v.parse_arg = cmd_sieve_put_parse_arg;
 	ctx->ctx.ctx.v.init = cmd_sieve_put_init;
 	ctx->ctx.v.run = cmd_sieve_put_run;
 	return &ctx->ctx.ctx;
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-rename.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-rename.c
index ba127f28f..4ec9c0222 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-rename.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-rename.c
@@ -43,19 +43,17 @@ static int cmd_sieve_rename_run(struct doveadm_sieve_cmd_context *_ctx)
 	return ret;
 }
 
-static void
-cmd_sieve_rename_init(struct doveadm_mail_cmd_context *_ctx,
-		      const char *const args[])
+static void cmd_sieve_rename_init(struct doveadm_mail_cmd_context *_ctx)
 {
 	struct doveadm_sieve_rename_cmd_context *ctx =
 		(struct doveadm_sieve_rename_cmd_context *)_ctx;
+	struct doveadm_cmd_context *cctx = _ctx->cctx;
 
-	if (str_array_length(args) != 2)
+	if (!doveadm_cmd_param_str(cctx, "oldname", &ctx->oldname) ||
+	    !doveadm_cmd_param_str(cctx, "newname", &ctx->newname))
 		doveadm_mail_help_name("sieve rename");
-	doveadm_sieve_cmd_scriptnames_check(args);
-
-	ctx->oldname = p_strdup(ctx->ctx.ctx.pool, args[0]);
-	ctx->newname = p_strdup(ctx->ctx.ctx.pool, args[1]);
+	doveadm_sieve_cmd_scriptname_check(ctx->oldname);
+	doveadm_sieve_cmd_scriptname_check(ctx->newname);
 }
 
 static struct doveadm_mail_cmd_context *cmd_sieve_rename_alloc(void)
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
index 5190fd034..e0c36fd78 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
@@ -75,29 +75,23 @@ static const struct sieve_callbacks sieve_callbacks = {
 	doveadm_sieve_cmd_get_setting,
 };
 
-static bool
-doveadm_sieve_cmd_parse_arg(struct doveadm_mail_cmd_context *_ctx ATTR_UNUSED,
-			    int c ATTR_UNUSED)
+void doveadm_sieve_cmd_scriptname_check(const char *arg)
 {
-	return FALSE;
+	if (!uni_utf8_str_is_valid(arg))
+		i_fatal_status(EX_DATAERR,
+			"Sieve script name not valid UTF-8: %s", arg);
+
+	if (!sieve_script_name_is_valid(arg) )
+		i_fatal_status(EX_DATAERR,
+			"Sieve script name not valid: %s", arg);
+
 }
 
-void doveadm_sieve_cmd_scriptnames_check(const char *const args[])
+void doveadm_sieve_cmd_scriptnames_check(ARRAY_TYPE(const_string) *args)
 {
-	unsigned int i;
-
-	for (i = 0; args[i] != NULL; i++) {
-		if (!uni_utf8_str_is_valid(args[i])) {
-			i_fatal_status(EX_DATAERR,
-				       "Sieve script name not valid UTF-8: %s",
-				       args[i]);
-		}
-		if (!sieve_script_name_is_valid(args[i])) {
-			i_fatal_status(EX_DATAERR,
-				       "Sieve script name not valid: %s",
-				       args[i]);
-		}
-	}
+	const char *const *arg;
+	array_foreach(args, arg)
+		doveadm_sieve_cmd_scriptname_check(*arg);
 }
 
 static int
@@ -153,8 +147,6 @@ struct doveadm_sieve_cmd_context *doveadm_sieve_cmd_alloc_size(size_t size)
 
 	ctx = (struct doveadm_sieve_cmd_context *)
 		doveadm_mail_cmd_alloc_size(size);
-	ctx->ctx.getopt_args = "s";
-	ctx->ctx.v.parse_arg = doveadm_sieve_cmd_parse_arg;
 	ctx->ctx.v.run = doveadm_sieve_cmd_run;
 	return ctx;
 }
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.h b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.h
index ef8b757bc..3aa2dd446 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.h
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.h
@@ -27,7 +27,8 @@ void doveadm_sieve_cmd_failed_storage(struct doveadm_sieve_cmd_context *ctx,
 	(type *)doveadm_sieve_cmd_alloc_size(sizeof(type))
 struct doveadm_sieve_cmd_context *doveadm_sieve_cmd_alloc_size(size_t size);
 
-void doveadm_sieve_cmd_scriptnames_check(const char *const args[]);
+void doveadm_sieve_cmd_scriptname_check(const char *arg);
+void doveadm_sieve_cmd_scriptnames_check(ARRAY_TYPE(const_string) *args);
 
 extern struct doveadm_cmd_ver2 doveadm_sieve_cmd_list;
 extern struct doveadm_cmd_ver2 doveadm_sieve_cmd_get;
-- 
GitLab