diff --git a/src/lib-sieve/cmd-stop.c b/src/lib-sieve/cmd-stop.c new file mode 100644 index 0000000000000000000000000000000000000000..0629f6dec4f6dbe51db2b83b000113263837d741 --- /dev/null +++ b/src/lib-sieve/cmd-stop.c @@ -0,0 +1,90 @@ +/* Copyright (c) 2002-2008 Dovecot Sieve authors, see the included COPYING file + */ + +#include "sieve-common.h" +#include "sieve-commands.h" +#include "sieve-code.h" +#include "sieve-generator.h" +#include "sieve-interpreter.h" + +/* + * Stop command + * + * Syntax + * stop + */ + +static bool cmd_stop_generate + (const struct sieve_codegen_env *cgenv, + struct sieve_command_context *ctx ATTR_UNUSED); +static bool cmd_stop_validate + (struct sieve_validator *validator, struct sieve_command_context *ctx); + +const struct sieve_command cmd_stop = { + "stop", + SCT_COMMAND, + 0, 0, FALSE, FALSE, + NULL, NULL, + cmd_stop_validate, + cmd_stop_generate, + NULL +}; + +/* + * Stop operation + */ + +static int opc_stop_execute + (const struct sieve_operation *op, + const struct sieve_runtime_env *renv, sieve_size_t *address); + +const struct sieve_operation cmd_stop_operation = { + "STOP", + NULL, + SIEVE_OPERATION_STOP, + NULL, + opc_stop_execute +}; + +/* + * Command validation + */ + +static bool cmd_stop_validate +(struct sieve_validator *validator ATTR_UNUSED, + struct sieve_command_context *ctx) +{ + sieve_command_exit_block_unconditionally(ctx); + + return TRUE; +} + +/* + * Code generation + */ + +static bool cmd_stop_generate +(const struct sieve_codegen_env *cgenv, + struct sieve_command_context *ctx ATTR_UNUSED) +{ + sieve_operation_emit_code(cgenv->sbin, &cmd_stop_operation); + + return TRUE; +} + +/* + * Code execution + */ + +static int opc_stop_execute +(const struct sieve_operation *op ATTR_UNUSED, + const struct sieve_runtime_env *renv, + sieve_size_t *address ATTR_UNUSED) +{ + sieve_runtime_trace(renv, "STOP"); + + sieve_interpreter_interrupt(renv->interp); + + return SIEVE_EXEC_OK; +} +