dovecot-2.0-sieve: Sieve-filter: made tool compile with Dovecot ...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Fri Jan 8 00:58:46 EET 2010


details:   http://hg.rename-it.nl/dovecot-2.0-sieve/rev/475cbc92aacd
changeset: 1190:475cbc92aacd
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Thu Jan 07 23:57:16 2010 +0100
description:
Sieve-filter: made tool compile with Dovecot v2.0 (not working).

diffstat:

 src/sieve-tools/sieve-filter.c |  220 +++++++++++++++++++++++++++----------------
 src/sieve-tools/sieve-test.c   |    2 +-
 2 files changed, 140 insertions(+), 82 deletions(-)

diffs (truncated from 326 to 300 lines):

diff -r e3d3d82febe3 -r 475cbc92aacd src/sieve-tools/sieve-filter.c
--- a/src/sieve-tools/sieve-filter.c	Thu Jan 07 23:04:23 2010 +0100
+++ b/src/sieve-tools/sieve-filter.c	Thu Jan 07 23:57:16 2010 +0100
@@ -2,12 +2,18 @@
  */
 
 #include "lib.h"
+#include "lib-signals.h"
+#include "ioloop.h"
+#include "env-util.h"
+#include "str.h"
 #include "ostream.h"
 #include "array.h"
 #include "mail-namespace.h"
 #include "mail-storage.h"
 #include "mail-search-build.h"
-#include "env-util.h"
+#include "master-service.h"
+#include "master-service-settings.h"
+#include "mail-storage-service.h"
 
 #include "sieve.h"
 #include "sieve-extensions.h"
@@ -23,6 +29,8 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <pwd.h>
+#include <sysexits.h>
+
 
 /*
  * Print help
@@ -213,70 +221,103 @@
 
 int main(int argc, char **argv) 
 {
+    enum mail_storage_service_flags service_flags = 0;
+    struct mail_storage_service_ctx *storage_service;
+    struct mail_storage_service_user *service_user;
+    struct mail_storage_service_input service_input;
+    struct mail_user *mail_user_dovecot = NULL;
+	struct mail_user *mail_user = NULL;
+    ARRAY_TYPE (const_string) plugins;
 	const char *scriptfile, *recipient, *sender, *extensions,
 		*src_mailbox, *dst_mailbox, *src_mailstore, *dst_mailstore; 
-	bool force_compile;
+    const char *user, *home, *errstr;
+    struct mail_namespace_settings ns_set;
 	struct mail_namespace *src_ns = NULL, *dst_ns = NULL;
-	struct mail_user *mail_user = NULL;
-	struct sieve_binary *main_sbin;
-	struct sieve_script_env scriptenv;
-	struct sieve_error_handler *ehandler;
 	struct mail_storage *dst_storage, *src_storage;
+    struct sieve_binary *main_sbin;
+    struct sieve_script_env scriptenv;
+    struct sieve_error_handler *ehandler;
+    bool force_compile = FALSE;
+    enum mailbox_flags open_flags =
+		MAILBOX_FLAG_KEEP_RECENT | MAILBOX_FLAG_IGNORE_ACLS;
+	enum mail_error error;
 	struct discard_action discard_action = 
 		{ DISCARD_ACTION_KEEP, "Trash" };
 	struct mailbox *src_box;
-	enum mail_error error;
-	enum mailbox_open_flags open_flags = 
-		MAILBOX_OPEN_KEEP_RECENT | MAILBOX_OPEN_IGNORE_ACLS;
-	const char *user, *home, *folder;
-	int i;
+    int c;
 
-	sieve_tool_init();
-	
+    master_service = master_service_init("sieve-test",
+        MASTER_SERVICE_FLAG_STANDALONE, &argc, &argv, "m:x:cP:");
+
+    sieve_tool_init(FALSE);
+
+    t_array_init(&plugins, 4);
+
+    user = getenv("USER");
+
 	/* Parse arguments */
 	scriptfile = recipient = sender = extensions = src_mailstore = dst_mailstore 
 		= NULL;
 	src_mailbox = dst_mailbox = "INBOX";
 	force_compile = FALSE;
-	for (i = 1; i < argc; i++) {
-		if (strcmp(argv[i], "-m") == 0) {
+	while ((c = master_getopt(master_service)) > 0) {
+		switch (c) {
+		case 'm':
 			/* default mailbox (keep box) */
-			i++;
-			if (i == argc) 
-				i_fatal("Missing -m argument");
-			dst_mailbox = argv[i];
-		} else if (strcmp(argv[i], "-x") == 0) {
+			dst_mailbox = optarg;
+			break;
+		case 'x':
 			/* extensions */
-			i++;
-			if (i == argc)
-				i_fatal("Missing -x argument");
-			extensions = argv[i];
-		} else if (strcmp(argv[i], "-c") == 0) {
-			/* force compile */
+			extensions = optarg;
+			break;
+		case 'c':
 			force_compile = TRUE;
-		} else if ( scriptfile == NULL ) {
-			scriptfile = argv[i];
-		} else if ( src_mailstore == NULL ) {
-			src_mailstore = argv[i];
-		} else if ( dst_mailstore == NULL ) {
-			dst_mailstore = argv[i];
-		} else {
+			break;
+		case 'P':
+			/* Plugin */
+			{
+				const char *plugin;
+
+				plugin = t_strdup(optarg);
+				array_append(&plugins, &plugin, 1);
+			}
+			break;
+
+		default:
 			print_help();
-			i_fatal("Unknown argument: %s", argv[i]);
+			i_fatal_status(EX_USAGE, "Unknown argument: %c", c);
+			break;
 		}
 	}
 	
-	if ( scriptfile == NULL ) {
+	if ( optind < argc ) {
+		scriptfile = t_strdup(argv[optind++]);
+	} else {
 		print_help();
-		i_fatal("Missing <scriptfile> argument");
-	}
-	
-	if ( src_mailstore == NULL ) {
-		print_help();
-		i_fatal("Missing <mailstore> argument");
+		i_fatal_status(EX_USAGE, "Missing <script-file> argument");
 	}
 
-	sieve_tool_sieve_init(NULL, FALSE);
+	if ( optind < argc ) {
+		src_mailstore = t_strdup(argv[optind++]);
+	} else {
+		print_help();
+		i_fatal_status(EX_USAGE, "Missing <mailstore> argument");
+	}
+
+	if ( optind < argc ) {
+		dst_mailstore = t_strdup(argv[optind++]);
+	}
+
+	if ( optind != argc ) {
+		print_help();
+		i_fatal_status(EX_USAGE, "Unknown argument: %s", argv[optind]);
+	}
+
+	sieve_tool_sieve_init(NULL);
+
+	if ( array_count(&plugins) > 0 ) {
+		sieve_tool_load_plugins(&plugins);
+	}
 
 	if ( extensions != NULL ) {
 		sieve_set_extensions(sieve_instance, extensions);
@@ -297,39 +338,53 @@
 	} else {
 		main_sbin = sieve_tool_script_open(scriptfile);
 	}
-	
+
 	user = sieve_tool_get_user();
 	home = getenv("HOME");
 
 	/* Initialize mail storages */
-	mail_users_init(getenv("AUTH_SOCKET_PATH"), getenv("DEBUG") != NULL);
-	mail_storage_init();
-	mail_storage_register_all();
-	mailbox_list_register_all();
+	env_put("DOVECONF_ENV=1");
+	env_put(t_strdup_printf("MAIL=maildir:/tmp/dovecot-test-%s", user));
 
-	/* Build namespaces environment (ugly!) */
-	env_put(t_strdup_printf("NAMESPACE_1=%s", src_mailstore));
-	env_put("NAMESPACE_1_INBOX=1");
-	env_put("NAMESPACE_1_LIST=1");
-	env_put("NAMESPACE_1_SEP=/");
-	env_put("NAMESPACE_1_SUBSCRIPTIONS=1");
+	master_service_init_finish(master_service);
 
-	if ( dst_mailstore != NULL ) {
-		env_put(t_strdup_printf("NAMESPACE_2=%s", dst_mailstore));
-		env_put("NAMESPACE_2_LIST=1");
-		env_put("NAMESPACE_2_SEP=/");
-		env_put("NAMESPACE_2_SUBSCRIPTIONS=1");
+	memset(&service_input, 0, sizeof(service_input));
+	service_input.module = "sieve-test";
+	service_input.service = "sieve-test";
+	service_input.username = user;
 
-		env_put("NAMESPACE_1_PREFIX=#src/");
-	}
+ 	storage_service = mail_storage_service_init
+		(master_service, NULL, service_flags);
+	if (mail_storage_service_lookup_next(storage_service, &service_input,
+		                 &service_user, &mail_user_dovecot, &errstr) <= 0)
+		i_fatal("%s", errstr);
 
 	/* Initialize namespaces */
-	mail_user = mail_user_init(user);
+	mail_user = mail_user_alloc
+		(user, mail_user_dovecot->set_info, mail_user_dovecot->unexpanded_set);
 	mail_user_set_home(mail_user, home);
-	if (mail_namespaces_init(mail_user) < 0)
-		i_fatal("Namespace initialization failed");	
+	if ( mail_user_init(mail_user, &errstr) < 0 )
+		i_fatal("Test user initialization failed: %s", errstr);
 
-	if ( dst_mailstore != NULL ) {
+
+ 	memset(&ns_set, 0, sizeof(ns_set));
+	ns_set.location = src_mailstore;
+
+	/*if ( dst_mailstore != NULL ) {
+	}*/
+
+	src_ns = mail_namespaces_init_empty(mail_user);
+	src_ns->flags |= NAMESPACE_FLAG_NOQUOTA | NAMESPACE_FLAG_NOACL;
+	src_ns->set = &ns_set;
+
+	if ( mail_storage_create(src_ns, NULL, 0, &errstr) < 0 )
+		i_fatal("Test storage creation failed: %s", errstr);
+
+	if ( master_service_set
+		(master_service, "mail_full_filesystem_access=yes") < 0 )
+		i_unreached();	
+
+/*	if ( dst_mailstore != NULL ) {
 		folder = "#src/";
 		src_ns = mail_namespace_find(mail_user->namespaces, &folder);
 
@@ -337,20 +392,20 @@
 		dst_ns = mail_namespace_find(mail_user->namespaces, &folder);	
 
 		discard_action.type = DISCARD_ACTION_KEEP;	
-	} else {
-		dst_ns = src_ns = mail_user->namespaces;
+	} else {*/
+		dst_ns = src_ns;
 		discard_action.type = DISCARD_ACTION_DELETE;	
-	}
+/*	}*/
 
 	src_storage = src_ns->storage;
 	dst_storage = dst_ns->storage;
 
 	/* Open the source mailbox */	
-	src_box = mailbox_open(&src_storage, src_mailbox, NULL, open_flags);
-	if ( src_box == NULL ) {
+	src_box = mailbox_alloc(src_ns->list, src_mailbox, NULL, open_flags);
+    if ( mailbox_open(src_box) < 0 ) {
 		i_fatal("Couldn't open mailbox '%s': %s", 
 			src_mailbox, mail_storage_get_last_error(src_storage, &error));
-	}
+    }
 
 	/* Compose script environment */
 	memset(&scriptenv, 0, sizeof(scriptenv));
@@ -374,19 +429,22 @@
 	if ( src_box != NULL )
 		mailbox_close(&src_box);
 
-	/* Cleanup error handler */
-	sieve_error_handler_unref(&ehandler);
-	sieve_system_ehandler_reset();	
-
-	/* De-initialize mail user object */
+	/* De-initialize mail user objects */
 	if ( mail_user != NULL )
 		mail_user_unref(&mail_user);
 
-	/* De-initialize mail storages */
-	mail_storage_deinit();
-	mail_users_deinit();	
-	
-	sieve_tool_deinit();
-	
+	if ( mail_user_dovecot != NULL )


More information about the dovecot-cvs mailing list