1 /* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
2 */
3
4 #include "lib.h"
5
6 #include "sieve-common.h"
7 #include "sieve-commands.h"
8 #include "sieve-code.h"
9 #include "sieve-dump.h"
10 #include "sieve-message.h"
11 #include "sieve-actions.h"
12 #include "sieve-validator.h"
13 #include "sieve-generator.h"
14 #include "sieve-interpreter.h"
15 #include "sieve-result.h"
16
17 /*
18 * Keep command
19 *
20 * Syntax:
21 * keep
22 */
23
24 static bool cmd_keep_generate
25 (const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
26
27 const struct sieve_command_def cmd_keep = {
28 .identifier = "keep",
29 .type = SCT_COMMAND,
30 .positional_args = 0,
31 .subtests = 0,
32 .block_allowed = FALSE,
33 .block_required = FALSE,
34 .generate = cmd_keep_generate
35 };
36
37 /*
38 * Keep operation
39 */
40
41 static bool cmd_keep_operation_dump
42 (const struct sieve_dumptime_env *denv, sieve_size_t *address);
43 static int cmd_keep_operation_execute
44 (const struct sieve_runtime_env *renv, sieve_size_t *address);
45
46 const struct sieve_operation_def cmd_keep_operation = {
47 .mnemonic = "KEEP",
48 .code = SIEVE_OPERATION_KEEP,
49 .dump = cmd_keep_operation_dump,
50 .execute = cmd_keep_operation_execute
51 };
52
53 /*
54 * Code generation
55 */
56
cmd_keep_generate(const struct sieve_codegen_env * cgenv,struct sieve_command * cmd)57 static bool cmd_keep_generate
58 (const struct sieve_codegen_env *cgenv, struct sieve_command *cmd)
59 {
60 /* Emit opcode */
61 sieve_operation_emit(cgenv->sblock, NULL, &cmd_keep_operation);
62
63 /* Generate arguments */
64 return sieve_generate_arguments(cgenv, cmd, NULL);
65 }
66
67 /*
68 * Code dump
69 */
70
cmd_keep_operation_dump(const struct sieve_dumptime_env * denv,sieve_size_t * address)71 static bool cmd_keep_operation_dump
72 (const struct sieve_dumptime_env *denv, sieve_size_t *address)
73 {
74 sieve_code_dumpf(denv, "KEEP");
75 sieve_code_descend(denv);
76
77 return ( sieve_action_opr_optional_dump(denv, address, NULL) == 0 );
78 }
79
80 /*
81 * Interpretation
82 */
83
cmd_keep_operation_execute(const struct sieve_runtime_env * renv,sieve_size_t * address)84 static int cmd_keep_operation_execute
85 (const struct sieve_runtime_env *renv, sieve_size_t *address)
86 {
87 struct sieve_side_effects_list *slist = NULL;
88 int ret = 0;
89
90 /*
91 * Read data
92 */
93
94 /* Optional operands (side effects only) */
95 if ( sieve_action_opr_optional_read(renv, address, NULL, &ret, &slist) != 0 )
96 return ret;
97
98 /*
99 * Perform operation
100 */
101
102 sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS,
103 "keep action; store message in default mailbox");
104
105 /* Add keep action to result.
106 */
107 if ( sieve_result_add_keep(renv, slist) < 0 )
108 return SIEVE_EXEC_FAILURE;
109
110 return SIEVE_EXEC_OK;
111 }
112
113
114