dovecot-2.0-pigeonhole: Restructured and cleaned up the Sieve to...
pigeonhole at rename-it.nl
pigeonhole at rename-it.nl
Sat Jul 10 14:15:15 EEST 2010
details: http://hg.rename-it.nl/dovecot-2.0-pigeonhole/rev/714ca8de07fe
changeset: 1322:714ca8de07fe
user: Stephan Bosch <stephan at rename-it.nl>
date: Sat Jul 10 13:14:53 2010 +0200
description:
Restructured and cleaned up the Sieve tools and the Sieve tool library.
diffstat:
src/lib-sieve-tool/mail-raw.c | 112 +++++----
src/lib-sieve-tool/mail-raw.h | 14 +-
src/lib-sieve-tool/sieve-tool.c | 436 ++++++++++++++++++++++++++++++++------
src/lib-sieve-tool/sieve-tool.h | 72 ++++-
src/sieve-tools/sieve-filter.c | 155 ++-----------
src/sieve-tools/sieve-test.c | 161 ++-----------
src/sieve-tools/sievec.c | 79 +------
src/sieve-tools/sieved.c | 91 +------
src/testsuite/testsuite-binary.c | 4 +-
src/testsuite/testsuite-common.c | 8 +-
src/testsuite/testsuite-common.h | 5 +-
src/testsuite/testsuite-mailstore.c | 47 +---
src/testsuite/testsuite-mailstore.h | 8 +-
src/testsuite/testsuite-message.c | 55 +---
src/testsuite/testsuite-message.h | 4 +-
src/testsuite/testsuite-result.c | 10 +-
src/testsuite/testsuite-script.c | 9 +-
src/testsuite/testsuite-settings.c | 7 +-
src/testsuite/testsuite-settings.h | 1 -
src/testsuite/testsuite.c | 120 +---------
20 files changed, 637 insertions(+), 761 deletions(-)
diffs (truncated from 2345 to 300 lines):
diff -r 94ff6b42c1bd -r 714ca8de07fe src/lib-sieve-tool/mail-raw.c
--- a/src/lib-sieve-tool/mail-raw.c Thu Jul 08 00:47:26 2010 +0200
+++ b/src/lib-sieve-tool/mail-raw.c Sat Jul 10 13:14:53 2010 +0200
@@ -16,6 +16,7 @@
#include "safe-mkstemp.h"
#include "close-keep-errno.h"
#include "mkdir-parents.h"
+#include "abspath.h"
#include "message-address.h"
#include "mbox-from.h"
#include "raw-storage.h"
@@ -50,11 +51,12 @@
* Global data
*/
-static struct mail_namespace *raw_ns;
-static struct mail_namespace_settings raw_ns_set;
-static struct mail_user *raw_mail_user;
+struct mail_raw_user {
+ struct mail_namespace *ns;;
+ struct mail_user *mail_user;
-char *raw_tmp_prefix;
+ char *tmp_prefix;
+};
/*
* Raw mail implementation
@@ -148,7 +150,7 @@
input_list[0] = input2; input_list[1] = NULL;
input = i_stream_create_seekable(input_list, MAIL_MAX_MEMORY_BUFFER,
- seekable_fd_callback, raw_mail_user);
+ seekable_fd_callback, NULL);
i_stream_unref(&input2);
return input;
}
@@ -157,39 +159,50 @@
* Init/Deinit
*/
-void mail_raw_init
-(struct master_service *service, const char *user,
+struct mail_raw_user *mail_raw_user_init
+(struct master_service *service, const char *username,
struct mail_user *mail_user)
{
+ struct mail_raw_user *ruser;
+ struct mail_namespace_settings ns_set;
const char *errstr;
void **sets;
+
+ ruser = i_new(struct mail_raw_user, 1);
sets = master_service_settings_get_others(service);
- raw_mail_user = mail_user_alloc(user, mail_user->set_info, sets[0]);
- mail_user_set_home(raw_mail_user, "/");
+ ruser->mail_user = mail_user_alloc(username, mail_user->set_info, sets[0]);
+ mail_user_set_home(ruser->mail_user, "/");
- if (mail_user_init(raw_mail_user, &errstr) < 0)
+ if (mail_user_init(ruser->mail_user, &errstr) < 0)
i_fatal("Raw user initialization failed: %s", errstr);
- memset(&raw_ns_set, 0, sizeof(raw_ns_set));
- raw_ns_set.location = ":LAYOUT=none";
+ memset(&ns_set, 0, sizeof(ns_set));
+ ns_set.location = ":LAYOUT=none";
- raw_ns = mail_namespaces_init_empty(raw_mail_user);
- raw_ns->flags |= NAMESPACE_FLAG_NOQUOTA | NAMESPACE_FLAG_NOACL;
- raw_ns->set = &raw_ns_set;
+ ruser->ns = mail_namespaces_init_empty(ruser->mail_user);
+ ruser->ns->flags |= NAMESPACE_FLAG_NOQUOTA | NAMESPACE_FLAG_NOACL;
+ ruser->ns->set = &ns_set;
- if (mail_storage_create(raw_ns, "raw", 0, &errstr) < 0)
+ if (mail_storage_create(ruser->ns, "raw", 0, &errstr) < 0)
i_fatal("Couldn't create internal raw storage: %s", errstr);
- raw_tmp_prefix = i_strdup(mail_user_get_temp_prefix(mail_user));
+ ruser->tmp_prefix = i_strdup(mail_user_get_temp_prefix(ruser->mail_user));
+
+ return ruser;
}
-void mail_raw_deinit(void)
+void mail_raw_user_deinit(struct mail_raw_user **_ruser)
{
- i_free(raw_tmp_prefix);
+ struct mail_raw_user *ruser = *_ruser;
- mail_user_unref(&raw_mail_user);
+ *_ruser = NULL;
+
+ mail_user_unref(&ruser->mail_user);
+
+ i_free(ruser->tmp_prefix);
+ i_free(ruser);
}
/*
@@ -197,26 +210,18 @@
*/
static struct mail_raw *mail_raw_create
-(struct istream *input, const char *mailfile, const char *sender,
- time_t mtime)
+(struct mail_raw_user *ruser, struct istream *input,
+ const char *mailfile, const char *sender, time_t mtime)
{
pool_t pool;
+ struct mail_namespace *raw_ns = ruser->ns;
struct raw_mailbox *raw_box;
struct mail_raw *mailr;
enum mail_error error;
struct mailbox_header_lookup_ctx *headers_ctx;
- if ( mailfile != NULL ) {
- if ( *mailfile != '/') {
- char cwd[PATH_MAX];
-
- /* Expand relative paths */
- if (getcwd(cwd, sizeof(cwd)) == NULL)
- i_fatal("getcwd() failed: %m");
-
- mailfile = t_strconcat(cwd, "/", mailfile, NULL);
- }
- }
+ if ( mailfile != NULL && *mailfile != '/' )
+ mailfile = t_abspath(mailfile);
pool = pool_alloconly_create("mail_raw", 1024);
mailr = p_new(pool, struct mail_raw, 1);
@@ -227,24 +232,24 @@
MAILBOX_FLAG_NO_INDEX_FILES);
if (mailbox_open_stream(mailr->box, input) < 0) {
- i_fatal("Can't open mail stream as raw: %s",
- mail_storage_get_last_error(raw_ns->storage, &error));
- }
+ i_fatal("Can't open mail stream as raw: %s",
+ mail_storage_get_last_error(raw_ns->storage, &error));
+ }
} else {
mtime = (time_t)-1;
mailr->box = mailbox_alloc(raw_ns->list, mailfile,
MAILBOX_FLAG_NO_INDEX_FILES);
if ( mailbox_open(mailr->box) < 0 ) {
- i_fatal("Can't open mail stream as raw: %s",
- mail_storage_get_last_error(raw_ns->storage, &error));
- }
+ i_fatal("Can't open mail stream as raw: %s",
+ mail_storage_get_last_error(raw_ns->storage, &error));
+ }
}
- if ( mailbox_sync(mailr->box, 0) < 0 ) {
- i_fatal("Can't sync delivery mail: %s",
- mail_storage_get_last_error(raw_ns->storage, &error));
- }
+ if ( mailbox_sync(mailr->box, 0) < 0 ) {
+ i_fatal("Can't sync delivery mail: %s",
+ mail_storage_get_last_error(raw_ns->storage, &error));
+ }
raw_box = (struct raw_mailbox *)mailr->box;
raw_box->envelope_sender = sender != NULL ? sender : DEFAULT_ENVELOPE_SENDER;
@@ -259,21 +264,23 @@
return mailr;
}
-struct mail_raw *mail_raw_open_data(string_t *mail_data)
+struct mail_raw *mail_raw_open_data
+(struct mail_raw_user *ruser, string_t *mail_data)
{
struct mail_raw *mailr;
struct istream *input;
input = i_stream_create_from_data(str_data(mail_data), str_len(mail_data));
- mailr = mail_raw_create(input, NULL, NULL, (time_t)-1);
+ mailr = mail_raw_create(ruser, input, NULL, NULL, (time_t)-1);
i_stream_unref(&input);
return mailr;
}
-struct mail_raw *mail_raw_open_file(const char *path)
+struct mail_raw *mail_raw_open_file
+(struct mail_raw_user *ruser, const char *path)
{
struct mail_raw *mailr;
struct istream *input = NULL;
@@ -285,7 +292,7 @@
input = create_raw_stream(0, &mtime, &sender);
}
- mailr = mail_raw_create(input, path, sender, mtime);
+ mailr = mail_raw_create(ruser, input, path, sender, mtime);
if ( input != NULL )
i_stream_unref(&input);
@@ -293,12 +300,13 @@
return mailr;
}
-void mail_raw_close(struct mail_raw *mailr)
+void mail_raw_close(struct mail_raw **mailr)
{
- mail_free(&mailr->mail);
- mailbox_transaction_rollback(&mailr->trans);
- mailbox_free(&mailr->box);
+ mail_free(&(*mailr)->mail);
+ mailbox_transaction_rollback(&(*mailr)->trans);
+ mailbox_free(&(*mailr)->box);
- pool_unref(&mailr->pool);
+ pool_unref(&(*mailr)->pool);
+ *mailr = NULL;
}
diff -r 94ff6b42c1bd -r 714ca8de07fe src/lib-sieve-tool/mail-raw.h
--- a/src/lib-sieve-tool/mail-raw.h Thu Jul 08 00:47:26 2010 +0200
+++ b/src/lib-sieve-tool/mail-raw.h Sat Jul 10 13:14:53 2010 +0200
@@ -15,14 +15,16 @@
struct mailbox_transaction_context *trans;
};
-void mail_raw_init
-(struct master_service *service, const char *user,
+struct mail_raw_user *mail_raw_user_init
+(struct master_service *service, const char *username,
struct mail_user *mail_user);
-void mail_raw_deinit(void);
+void mail_raw_user_deinit(struct mail_raw_user **_ruser);
-struct mail_raw *mail_raw_open_file(const char *path);
-struct mail_raw *mail_raw_open_data(string_t *mail_data);
-void mail_raw_close(struct mail_raw *mailr);
+struct mail_raw *mail_raw_open_file
+ (struct mail_raw_user *ruser, const char *path);
+struct mail_raw *mail_raw_open_data
+ (struct mail_raw_user *ruser, string_t *mail_data);
+void mail_raw_close(struct mail_raw **mailr);
#endif /* __MAIL_RAW_H */
diff -r 94ff6b42c1bd -r 714ca8de07fe src/lib-sieve-tool/sieve-tool.c
--- a/src/lib-sieve-tool/sieve-tool.c Thu Jul 08 00:47:26 2010 +0200
+++ b/src/lib-sieve-tool/sieve-tool.c Sat Jul 10 13:14:53 2010 +0200
@@ -8,11 +8,18 @@
#include "ostream.h"
#include "hostpid.h"
#include "dict.h"
+#include "mail-namespace.h"
#include "mail-storage.h"
#include "mail-user.h"
+#include "master-service.h"
+#include "master-service-settings.h"
+#include "mail-storage-service.h"
#include "sieve.h"
#include "sieve-plugins.h"
+#include "sieve-extensions.h"
+
+#include "mail-raw.h"
#include "sieve-tool.h"
@@ -21,97 +28,398 @@
#include <unistd.h>
#include <fcntl.h>
#include <pwd.h>
+#include <sysexits.h>
/*
* Global state
*/
-/* Sieve instance */
+struct sieve_tool {
+ char *name;
-struct sieve_instance *sieve_instance;
+ bool no_config;
+
+ char *username;
+ char *homedir;
+
+ char *sieve_extensions;
+ ARRAY_TYPE(const_string) sieve_plugins;
+
+ sieve_tool_setting_callback_t setting_callback;
+ void *setting_callback_context;
+
+ struct sieve_instance *svinst;
More information about the dovecot-cvs
mailing list