diff --git a/README b/README index 140e9767767ba7cdd8739bd2aeefab84ab631d78..2ce4454ba98807e0f8160db58cb02c31bdd72d61 100644 --- a/README +++ b/README @@ -15,13 +15,14 @@ sievec <sieve-file> Compiles the script and produces various dumps of intermittent compilation results. This already works pretty good for all supported features. -sieve_test <sieve-file> +sieve-test <sieve-file> [<mailfile>/-] -Reads mail message from standard input and executes the sieve script to -produce a verdict. Currently only prints an execution dump with the -instructions encountered during execution. +Reads mail message from the specified mailfile (- = stdin) and executes the +sieve script to produce a verdict. This prints an execution dump with the +instructions encountered during execution and finally it prints a list of +actions that would have been performed on this message. -In the directory ./sieve various example scripts are bundled. +Various example scripts are bundled in the directory 'sieve'. Features -------- diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index b01d4a3448b0620394d7a360aeb9093c1af33eaa..691fb7f4cd5913acada452e1528bc57d85336cff 100644 --- a/src/lib-sieve/sieve-interpreter.c +++ b/src/lib-sieve/sieve-interpreter.c @@ -241,7 +241,6 @@ bool sieve_interpreter_run *result = sieve_result_create(); else { sieve_result_ref(*result); - printf("REF\n"); } interp->runenv.msgdata = msgdata; interp->runenv.result = *result; diff --git a/src/sieve-bin/sieve-exec.c b/src/sieve-bin/sieve-exec.c index 20ef24afe128ad730a2f4d1db80d1c49dc82d91c..a4e8b910802b5e7ef03d3ebccfb0e9cf5b1fef8f 100644 --- a/src/sieve-bin/sieve-exec.c +++ b/src/sieve-bin/sieve-exec.c @@ -31,7 +31,7 @@ static int sieve_send_forward int main(int argc, char **argv) { - int fd; + int sfd, mfd; struct mail_raw *mailr; struct sieve_binary *sbin; struct sieve_message_data msgdata; @@ -40,17 +40,34 @@ int main(int argc, char **argv) bin_init(); if ( argc < 2 ) { - printf( "Usage: sieve_test <filename>\n"); + printf( "Usage: sieve-exec <sieve-file> [<mailfile>/-]\n"); exit(1); } - /* Compile sieve script */ + /* Open sieve script */ - if ( (fd = open(argv[1], O_RDONLY)) < 0 ) { + if ( (sfd = open(argv[1], O_RDONLY)) < 0 ) { perror("open()"); exit(1); } + /* Open mail file */ + + if ( argc > 2 ) + { + if ( *(argv[2]) == '-' && *(argv[2]+1) == '\0' ) + mfd = 0; + else { + if ( (mfd = open(argv[2], O_RDONLY)) < 0 ) { + perror("Failed to open mail file"); + exit(1); + } + } + } else + mfd = 0; + + /* Compile sieve script */ + printf("Parsing sieve script '%s'...\n", argv[1]); if ( !sieve_init("") ) { @@ -58,18 +75,18 @@ int main(int argc, char **argv) exit(1); } - if ( (sbin = sieve_compile(fd, FALSE)) == NULL ) { + if ( (sbin = sieve_compile(sfd, FALSE)) == NULL ) { printf("Failed to compile sieve script\n"); exit(1); } (void) sieve_dump(sbin); - close(fd); + close(sfd); mail_raw_init(); - mailr = mail_raw_open(0); + mailr = mail_raw_open(mfd); /* Collect necessary message data */ memset(&msgdata, 0, sizeof(msgdata)); @@ -89,6 +106,7 @@ int main(int argc, char **argv) sieve_deinit(); mail_raw_close(mailr); + close(mfd); mail_raw_deinit(); bin_deinit(); diff --git a/src/sieve-bin/sieve-test.c b/src/sieve-bin/sieve-test.c index e4c67ca51eb5b6c4f8ffd80be177348df432bd70..1b35a543e9ffdfaa56ba7a724600eec9930fa671 100644 --- a/src/sieve-bin/sieve-test.c +++ b/src/sieve-bin/sieve-test.c @@ -14,7 +14,7 @@ int main(int argc, char **argv) { - int fd; + int sfd, mfd; struct mail_raw *mailr; struct sieve_binary *sbin; struct sieve_message_data msgdata; @@ -22,17 +22,33 @@ int main(int argc, char **argv) bin_init(); if ( argc < 2 ) { - printf( "Usage: sieve_test <filename>\n"); + printf( "Usage: sieve-test <sieve-file> [<mailfile>/-]\n"); exit(1); } - /* Compile sieve script */ + /* Open sieve script */ - if ( (fd = open(argv[1], O_RDONLY)) < 0 ) { - perror("open()"); + if ( (sfd = open(argv[1], O_RDONLY)) < 0 ) { + perror("Failed to open sieve script"); exit(1); } + /* Open mail file */ + if ( argc > 2 ) + { + if ( *(argv[2]) == '-' && *(argv[2]+1) == '\0' ) + mfd = 0; + else { + if ( (mfd = open(argv[2], O_RDONLY)) < 0 ) { + perror("Failed to open mail file"); + exit(1); + } + } + } else + mfd = 0; + + /* Compile sieve script */ + printf("Parsing sieve script '%s'...\n", argv[1]); if ( !sieve_init("") ) { @@ -40,18 +56,18 @@ int main(int argc, char **argv) exit(1); } - if ( (sbin = sieve_compile(fd, TRUE)) == NULL ) { + if ( (sbin = sieve_compile(sfd, TRUE)) == NULL ) { printf("Failed to compile sieve script\n"); exit(1); } (void) sieve_dump(sbin); - close(fd); + close(sfd); mail_raw_init(); - mailr = mail_raw_open(0); + mailr = mail_raw_open(mfd); /* Collect necessary message data */ memset(&msgdata, 0, sizeof(msgdata)); @@ -67,6 +83,8 @@ int main(int argc, char **argv) sieve_deinit(); mail_raw_close(mailr); + if ( mfd > 0 ) + close(mfd); mail_raw_deinit(); bin_deinit();