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