dovecot-2.0-pigeonhole: Improved runtime trace debugging output ...
pigeonhole at rename-it.nl
pigeonhole at rename-it.nl
Sat Jul 17 13:12:04 EEST 2010
details: http://hg.rename-it.nl/dovecot-2.0-pigeonhole/rev/fdec4e5304e2
changeset: 1336:fdec4e5304e2
user: Stephan Bosch <stephan at rename-it.nl>
date: Sat Jul 17 12:11:58 2010 +0200
description:
Improved runtime trace debugging output for core Sieve language.
diffstat:
TODO | 2 -
src/lib-sieve/cmd-discard.c | 2 +-
src/lib-sieve/cmd-keep.c | 3 +-
src/lib-sieve/cmd-redirect.c | 3 +-
src/lib-sieve/cmd-stop.c | 2 +-
src/lib-sieve/ext-envelope.c | 3 +
src/lib-sieve/ext-fileinto.c | 2 +-
src/lib-sieve/ext-reject.c | 4 +-
src/lib-sieve/sieve-address-parts.c | 5 ++
src/lib-sieve/sieve-code.c | 6 +--
src/lib-sieve/sieve-interpreter.c | 19 ++++++++-
src/lib-sieve/sieve-match.c | 45 ++++++++++++----------
src/lib-sieve/sieve-match.h | 2 +-
src/lib-sieve/sieve-runtime-trace.c | 11 +++--
src/lib-sieve/tst-address.c | 3 +
src/lib-sieve/tst-exists.c | 11 ++++-
src/lib-sieve/tst-header.c | 6 +++
src/sieve-tools/sieve-test.c | 4 +-
18 files changed, 86 insertions(+), 47 deletions(-)
diffs (truncated from 427 to 300 lines):
diff -r 50dc4c2ae28f -r fdec4e5304e2 TODO
--- a/TODO Fri Jul 16 21:31:46 2010 +0200
+++ b/TODO Sat Jul 17 12:11:58 2010 +0200
@@ -2,8 +2,6 @@
* Improve debugging support in the sieve-test tool:
- Improve trace debugging towards something more intuitively readable.
- - Give trace debugging multiple levels of verbosity (e.g. to include more
- messy output like value matching).
Next (in order of descending priority/precedence):
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/cmd-discard.c
--- a/src/lib-sieve/cmd-discard.c Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/cmd-discard.c Sat Jul 17 12:11:58 2010 +0200
@@ -110,7 +110,7 @@
/* Source line */
source_line = sieve_runtime_get_command_location(renv);
- sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS, "discard action");
+ sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS, "discard action; cancel implicit keep");
return ( sieve_result_add_action
(renv, NULL, &act_discard, NULL, source_line, NULL, 0) >= 0 );
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/cmd-keep.c
--- a/src/lib-sieve/cmd-keep.c Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/cmd-keep.c Sat Jul 17 12:11:58 2010 +0200
@@ -102,7 +102,8 @@
* Perform operation
*/
- sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS, "keep action");
+ sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS,
+ "keep action; store message in default mailbox");
/* Add keep action to result.
*/
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/cmd-redirect.c
--- a/src/lib-sieve/cmd-redirect.c Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/cmd-redirect.c Sat Jul 17 12:11:58 2010 +0200
@@ -219,7 +219,8 @@
/* FIXME: perform address normalization if the string is not a string literal
*/
- sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS, "redirect action (\"%s\")",
+ sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS,
+ "redirect action; forward message to address `%s'",
str_sanitize(str_c(redirect), 64));
/* Add redirect action to the result */
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/cmd-stop.c
--- a/src/lib-sieve/cmd-stop.c Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/cmd-stop.c Sat Jul 17 12:11:58 2010 +0200
@@ -77,7 +77,7 @@
static int opc_stop_execute
(const struct sieve_runtime_env *renv, sieve_size_t *address ATTR_UNUSED)
{
- sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "STOP");
+ sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "stop");
sieve_interpreter_interrupt(renv->interp);
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/ext-envelope.c
--- a/src/lib-sieve/ext-envelope.c Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/ext-envelope.c Sat Jul 17 12:11:58 2010 +0200
@@ -458,6 +458,9 @@
(result=sieve_coded_stringlist_next_item(envp_list, &envp_item))
&& envp_item != NULL ) {
const struct sieve_envelope_part *epart;
+
+ sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
+ " matching envelope part `%s'", str_sanitize(str_c(envp_item), 80));
if ( (epart=_envelope_part_find(str_c(envp_item))) != NULL ) {
const struct sieve_address * const *addresses = NULL;
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/ext-fileinto.c
--- a/src/lib-sieve/ext-fileinto.c Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/ext-fileinto.c Sat Jul 17 12:11:58 2010 +0200
@@ -179,7 +179,7 @@
mailbox = str_sanitize(str_c(folder), 64);
sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS,
- "fileinto action (\"%s\")", mailbox);
+ "fileinto action; store message in mailbox `%s'", mailbox);
/* Add action to result */
ret = sieve_act_store_add_to_result
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/ext-reject.c
--- a/src/lib-sieve/ext-reject.c Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/ext-reject.c Sat Jul 17 12:11:58 2010 +0200
@@ -292,10 +292,10 @@
if ( sieve_operation_is(oprtn, ereject_operation) )
sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS,
- "ereject action (\"%s\")", str_sanitize(str_c(reason), 64));
+ "ereject action; reject message with reason `%s'", str_sanitize(str_c(reason), 64));
else
sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS,
- "reject action (\"%s\")", str_sanitize(str_c(reason), 64));
+ "reject action; reject message with reason `%s'", str_sanitize(str_c(reason), 64));
/* Add reject action to the result */
pool = sieve_result_pool(renv->result);
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/sieve-address-parts.c
--- a/src/lib-sieve/sieve-address-parts.c Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/sieve-address-parts.c Sat Jul 17 12:11:58 2010 +0200
@@ -7,6 +7,7 @@
#include "hash.h"
#include "array.h"
#include "message-address.h"
+#include "str-sanitize.h"
#include "sieve-extensions.h"
#include "sieve-code.h"
@@ -234,9 +235,13 @@
(const struct sieve_address_part *addrp, struct sieve_match_context *mctx,
const char *data)
{
+ const struct sieve_runtime_env *renv = mctx->runenv;
int result = FALSE;
const struct message_address *addr;
+ sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
+ " matching addresses `%s'", str_sanitize(data, 80));
+
T_BEGIN {
bool valid = TRUE;
const struct message_address *aitem;
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/sieve-code.c
--- a/src/lib-sieve/sieve-code.c Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/sieve-code.c Sat Jul 17 12:11:58 2010 +0200
@@ -1058,8 +1058,7 @@
{
bool result = sieve_interpreter_get_test_result(renv->interp);
- sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "jump if true (%s)",
- result ? "true" : "false");
+ sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "jump if result is true");
return sieve_interpreter_program_jump(renv->interp, result);
}
@@ -1069,8 +1068,7 @@
{
bool result = sieve_interpreter_get_test_result(renv->interp);
- sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "jump if false (%s)",
- result ? "true" : "false" );
+ sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "jump if result is false");
return sieve_interpreter_program_jump(renv->interp, !result);
}
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/sieve-interpreter.c
--- a/src/lib-sieve/sieve-interpreter.c Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/sieve-interpreter.c Sat Jul 17 12:11:58 2010 +0200
@@ -425,10 +425,23 @@
jmp_start + jmp_offset > 0 )
{
if ( jump ) {
- sieve_runtime_trace_here(renv, SIEVE_TRLVL_COMMANDS, "jump to #%08llx",
- (long long unsigned int) jmp_start + jmp_offset);
+ sieve_size_t jmp_addr = jmp_start + jmp_offset;
- *address = jmp_start + jmp_offset;
+ if ( sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS) ) {
+ unsigned int jmp_line =
+ sieve_runtime_get_source_location(renv, jmp_addr);
+
+ if ( (renv->trace_config.flags & SIEVE_TRFLG_ADDRESSES) > 0 ) {
+ sieve_runtime_trace(renv, 0, "jumping to line %d [%08llx]",
+ jmp_line, (long long unsigned int) jmp_addr);
+ } else {
+ sieve_runtime_trace(renv, 0, "jumping to line %d", jmp_line);
+ }
+ }
+
+ *address = jmp_addr;
+ } else {
+ sieve_runtime_trace(renv, 0, "not jumping");
}
return SIEVE_EXEC_OK;
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/sieve-match.c
--- a/src/lib-sieve/sieve-match.c Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/sieve-match.c Sat Jul 17 12:11:58 2010 +0200
@@ -61,20 +61,25 @@
const struct sieve_runtime_env *renv = mctx->runenv;
const struct sieve_match_type *mcht = mctx->match_type;
sieve_coded_stringlist_reset(mctx->key_list);
+ bool trace = sieve_runtime_trace_active(renv, SIEVE_TRLVL_MATCHING);
bool ok = TRUE;
+ int ret = 0;
/* Reject unimplemented match-type */
- if ( mcht->def == NULL || mcht->def->match == NULL )
+ if ( mcht->def == NULL || mcht->def->match == NULL ) {
+ mctx->status = FALSE;
return FALSE;
+ }
- sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
- " matching value `%s'", str_sanitize(value, 80));
+ if ( trace ) {
+ sieve_runtime_trace(renv, 0,
+ " matching value `%s'", str_sanitize(value, 80));
+ }
/* Match to all key values */
if ( mcht->def->is_iterative ) {
unsigned int key_index = 0;
string_t *key_item = NULL;
- int ret = 0;
while ( (ok=sieve_coded_stringlist_next_item(mctx->key_list, &key_item))
&& key_item != NULL ) {
@@ -91,8 +96,10 @@
ret = mcht->def->match
(mctx, value, val_size, key, key_size, key_index);
- sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
- " with key `%s' => %d", str_sanitize(key, 80), ret);
+ if ( trace ) {
+ sieve_runtime_trace(renv, 0,
+ " with key `%s' => %d", str_sanitize(key, 80), ret);
+ }
if ( ret != 0 ) break;
}
@@ -101,8 +108,10 @@
ret = mcht->def->match(mctx, value, val_size, str_c(key_item),
str_len(key_item), key_index);
- sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
- " with key `%s' => %d", str_sanitize(str_c(key_item), 80), ret);
+ if ( trace ) {
+ sieve_runtime_trace(renv, 0,
+ " with key `%s' => %d", str_sanitize(str_c(key_item), 80), ret);
+ }
}
} T_END;
@@ -112,31 +121,23 @@
key_index++;
}
- if ( !ok )
- return -1;
-
- if ( ret < 0 )
- return ret;
- if ( ret > 0 )
- return TRUE;
+ if ( !ok ) ret = -1;
} else {
- int ret;
-
T_BEGIN {
ret = mcht->def->match(mctx, value, val_size, NULL, 0, -1);
} T_END;
-
- return ret;
}
- return FALSE;
+ mctx->status = ret;
+ return ret;
}
int sieve_match_end(struct sieve_match_context **mctx)
{
const struct sieve_runtime_env *renv = (*mctx)->runenv;
const struct sieve_match_type *mcht = (*mctx)->match_type;
+ int status = (*mctx)->status;
int ret = FALSE;
if ( mcht->def != NULL && mcht->def->match_deinit != NULL ) {
@@ -146,9 +147,11 @@
pool_unref(&(*mctx)->pool);
*mctx = NULL;
+ if ( ret < 0 ) status = ret;
+
sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
" finishing match with result: %s",
- ( ret > 0 ? "true" : ( ret < 0 ? "error" : "false" ) ));
+ ( status > 0 ? "true" : ( status < 0 ? "error" : "false" ) ));
return ret;
}
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/sieve-match.h
--- a/src/lib-sieve/sieve-match.h Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/sieve-match.h Sat Jul 17 12:11:58 2010 +0200
@@ -25,7 +25,7 @@
struct sieve_coded_stringlist *key_list;
-
+ int status;
void *data;
};
More information about the dovecot-cvs
mailing list