summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c')
-rw-r--r--pigeonhole/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/pigeonhole/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c b/pigeonhole/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c
new file mode 100644
index 0000000..8517abd
--- /dev/null
+++ b/pigeonhole/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c
@@ -0,0 +1,116 @@
+/* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
+ */
+
+#include "lib.h"
+#include "array.h"
+#include "doveadm-mail.h"
+
+#include "sieve.h"
+#include "sieve-script.h"
+#include "sieve-storage.h"
+
+#include "doveadm-sieve-cmd.h"
+
+struct doveadm_sieve_delete_cmd_context {
+ struct doveadm_sieve_cmd_context ctx;
+
+ ARRAY_TYPE(const_string) scriptnames;
+ bool ignore_active:1;
+};
+
+static int
+cmd_sieve_delete_run(struct doveadm_sieve_cmd_context *_ctx)
+{
+ struct doveadm_sieve_delete_cmd_context *ctx =
+ (struct doveadm_sieve_delete_cmd_context *)_ctx;
+ struct sieve_storage *storage = _ctx->storage;
+ const ARRAY_TYPE(const_string) *scriptnames = &ctx->scriptnames;
+ const char *scriptname;
+ struct sieve_script *script;
+ enum sieve_error error;
+ int ret = 0;
+
+ array_foreach_elem(scriptnames, scriptname) {
+ int sret = 0;
+
+ script = sieve_storage_open_script
+ (storage, scriptname, NULL);
+ if (script == NULL) {
+ sret = -1;
+ } else {
+ if (sieve_script_delete(script, ctx->ignore_active) < 0) {
+ (void)sieve_storage_get_last_error(storage, &error);
+ sret = -1;
+ }
+ sieve_script_unref(&script);
+ }
+
+ if (sret < 0) {
+ i_error("Failed to delete Sieve script: %s",
+ sieve_storage_get_last_error(storage, &error));
+ doveadm_sieve_cmd_failed_error(_ctx, error);
+ ret = -1;
+ }
+ }
+ return ret;
+}
+
+static void cmd_sieve_delete_init
+(struct doveadm_mail_cmd_context *_ctx,
+ const char *const args[])
+{
+ struct doveadm_sieve_delete_cmd_context *ctx =
+ (struct doveadm_sieve_delete_cmd_context *)_ctx;
+ const char *name;
+ unsigned int i;
+
+ if (args[0] == NULL)
+ doveadm_mail_help_name("sieve delete");
+ doveadm_sieve_cmd_scriptnames_check(args);
+
+ 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;
+
+ switch ( c ) {
+ case 'a':
+ ctx->ignore_active = TRUE;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+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);
+ return &ctx->ctx.ctx;
+}
+
+struct doveadm_cmd_ver2 doveadm_sieve_cmd_delete = {
+ .name = "sieve delete",
+ .mail_cmd = cmd_sieve_delete_alloc,
+ .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"[-a] <scriptname> [...]",
+DOVEADM_CMD_PARAMS_START
+DOVEADM_CMD_MAIL_COMMON
+DOVEADM_CMD_PARAM('a',"ignore-active",CMD_PARAM_BOOL,0)
+DOVEADM_CMD_PARAM('\0',"scriptname",CMD_PARAM_ARRAY,CMD_PARAM_FLAG_POSITIONAL)
+DOVEADM_CMD_PARAMS_END
+};