summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c')
-rw-r--r--pigeonhole/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/pigeonhole/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c b/pigeonhole/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c
new file mode 100644
index 0000000..e1bf7e3
--- /dev/null
+++ b/pigeonhole/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c
@@ -0,0 +1,83 @@
+/* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
+ */
+
+#include "lib.h"
+#include "doveadm-print.h"
+#include "doveadm-mail.h"
+
+#include "sieve.h"
+#include "sieve-script.h"
+#include "sieve-storage.h"
+
+#include "doveadm-sieve-cmd.h"
+
+struct doveadm_sieve_get_cmd_context {
+ struct doveadm_sieve_cmd_context ctx;
+
+ const char *scriptname;
+};
+
+static int
+cmd_sieve_get_run(struct doveadm_sieve_cmd_context *_ctx)
+{
+ struct doveadm_sieve_get_cmd_context *ctx =
+ (struct doveadm_sieve_get_cmd_context *)_ctx;
+ struct sieve_script *script;
+ struct istream *input;
+ enum sieve_error error;
+ int ret;
+
+ script = sieve_storage_open_script
+ (_ctx->storage, ctx->scriptname, &error);
+ if ( script == NULL || sieve_script_get_stream
+ (script, &input, &error) < 0 ) {
+ i_error("Failed to open Sieve script: %s",
+ sieve_storage_get_last_error(_ctx->storage, &error));
+ doveadm_sieve_cmd_failed_error(_ctx, error);
+ if (script != NULL)
+ sieve_script_unref(&script);
+ return -1;
+ }
+
+ ret = doveadm_print_istream(input);
+ sieve_script_unref(&script);
+ return ret;
+}
+
+static void cmd_sieve_get_init
+(struct doveadm_mail_cmd_context *_ctx,
+ const char *const args[])
+{
+ struct doveadm_sieve_get_cmd_context *ctx =
+ (struct doveadm_sieve_get_cmd_context *)_ctx;
+
+ if ( str_array_length(args) != 1 )
+ doveadm_mail_help_name("sieve get");
+ doveadm_sieve_cmd_scriptnames_check(args);
+
+ ctx->scriptname = p_strdup(ctx->ctx.ctx.pool, args[0]);
+
+ doveadm_print_header_simple("sieve script");
+}
+
+static struct doveadm_mail_cmd_context *
+cmd_sieve_get_alloc(void)
+{
+ struct doveadm_sieve_get_cmd_context *ctx;
+
+ ctx = doveadm_sieve_cmd_alloc(struct doveadm_sieve_get_cmd_context);
+ ctx->ctx.ctx.v.init = cmd_sieve_get_init;
+ ctx->ctx.v.run = cmd_sieve_get_run;
+ doveadm_print_init("pager");
+ return &ctx->ctx.ctx;
+}
+
+struct doveadm_cmd_ver2 doveadm_sieve_cmd_get = {
+ .name = "sieve get",
+ .mail_cmd = cmd_sieve_get_alloc,
+ .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<scriptname>",
+DOVEADM_CMD_PARAMS_START
+DOVEADM_CMD_MAIL_COMMON
+DOVEADM_CMD_PARAM('\0',"scriptname",CMD_PARAM_STR,CMD_PARAM_FLAG_POSITIONAL)
+DOVEADM_CMD_PARAMS_END
+};