1
/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file
4
#include "sieve-extensions.h"
5
#include "sieve-commands.h"
6
#include "sieve-code.h"
8
#include "sieve-validator.h"
9
#include "sieve-generator.h"
10
#include "sieve-binary.h"
11
#include "sieve-interpreter.h"
12
#include "sieve-dump.h"
14
#include "ext-debug-common.h"
20
* debug_print <message: string>
23
static bool cmd_debug_print_validate
24
(struct sieve_validator *validator, struct sieve_command_context *tst);
25
static bool cmd_debug_print_generate
26
(const struct sieve_codegen_env *cgenv, struct sieve_command_context *ctx);
28
const struct sieve_command debug_print_command = {
33
cmd_debug_print_validate,
34
cmd_debug_print_generate,
42
static bool cmd_debug_print_operation_dump
43
(const struct sieve_operation *op,
44
const struct sieve_dumptime_env *denv, sieve_size_t *address);
45
static int cmd_debug_print_operation_execute
46
(const struct sieve_operation *op,
47
const struct sieve_runtime_env *renv, sieve_size_t *address);
49
const struct sieve_operation debug_print_operation = {
53
cmd_debug_print_operation_dump,
54
cmd_debug_print_operation_execute
61
static bool cmd_debug_print_validate
62
(struct sieve_validator *validator, struct sieve_command_context *tst)
64
struct sieve_ast_argument *arg = tst->first_positional;
66
if ( !sieve_validate_positional_argument
67
(validator, tst, arg, "message", 1, SAAT_STRING) ) {
71
return sieve_validator_argument_activate(validator, tst, arg, FALSE);
78
static bool cmd_debug_print_generate
79
(const struct sieve_codegen_env *cgenv, struct sieve_command_context *ctx)
81
(void)sieve_operation_emit_code(cgenv->sbin, &debug_print_operation);
83
/* Generate arguments */
84
return sieve_generate_arguments(cgenv, ctx, NULL);
91
static bool cmd_debug_print_operation_dump
92
(const struct sieve_operation *op ATTR_UNUSED,
93
const struct sieve_dumptime_env *denv, sieve_size_t *address)
95
sieve_code_dumpf(denv, "DEBUG_PRINT");
96
sieve_code_descend(denv);
98
return sieve_opr_string_dump(denv, address, "key list");
105
static int cmd_debug_print_operation_execute
106
(const struct sieve_operation *op ATTR_UNUSED,
107
const struct sieve_runtime_env *renv, sieve_size_t *address)
110
int ret = SIEVE_EXEC_OK;
118
if ( sieve_opr_string_read(renv, address, &message) < 0 ) {
119
sieve_runtime_trace_error(renv, "invalid message operand");
120
return SIEVE_EXEC_BIN_CORRUPT;
127
sieve_runtime_trace(renv, "DEBUG_PRINT");
129
/* FIXME: give this proper source location */
130
sieve_runtime_log(renv, "DEBUG", "%s", str_c(message));