From 078fda7e0989c045b7b987cce34fc3ab52bef4a0 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Thu, 30 Oct 2008 22:30:17 +0100 Subject: [PATCH] Merged mail-raw implementations of sieve commandline tools and the testsuite, thus removing duplicate code. --- configure.in | 1 + src/Makefile.am | 2 +- src/lib-util/Makefile.am | 18 ++++ src/{sieve-bin => lib-util}/mail-raw.c | 99 ++++++++++++++------- src/{sieve-bin => lib-util}/mail-raw.h | 7 +- src/sieve-bin/Makefile.am | 24 +++--- src/sieve-bin/bin-common.c | 13 --- src/sieve-bin/sieve-exec.c | 2 +- src/sieve-bin/sieve-test.c | 2 +- src/testsuite/Makefile.am | 8 +- src/testsuite/mail-raw.c | 114 ------------------------- src/testsuite/mail-raw.h | 24 ------ src/testsuite/testsuite-common.c | 2 +- 13 files changed, 114 insertions(+), 202 deletions(-) create mode 100644 src/lib-util/Makefile.am rename src/{sieve-bin => lib-util}/mail-raw.c (76%) rename src/{sieve-bin => lib-util}/mail-raw.h (79%) delete mode 100644 src/testsuite/mail-raw.c delete mode 100644 src/testsuite/mail-raw.h diff --git a/configure.in b/configure.in index 06268f819..57b901ded 100644 --- a/configure.in +++ b/configure.in @@ -86,6 +86,7 @@ src/lib-sieve/plugins/include/Makefile src/lib-sieve/plugins/body/Makefile src/lib-sieve/plugins/variables/Makefile src/lib-sieve/plugins/enotify/Makefile +src/lib-util/Makefile src/plugins/Makefile src/plugins/lda-sieve/Makefile src/sieve-bin/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 4edf1020e..f70c0f9bb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,2 +1,2 @@ -SUBDIRS = lib-sieve sieve-bin plugins testsuite +SUBDIRS = lib-sieve lib-util sieve-bin plugins testsuite diff --git a/src/lib-util/Makefile.am b/src/lib-util/Makefile.am new file mode 100644 index 000000000..88d8d67d2 --- /dev/null +++ b/src/lib-util/Makefile.am @@ -0,0 +1,18 @@ +noinst_LTLIBRARIES = libutil.la + +AM_CPPFLAGS = \ + -I$(dovecot_incdir) \ + -I$(dovecot_incdir)/src/lib \ + -I$(dovecot_incdir)/src/lib-mail \ + -I$(dovecot_incdir)/src/lib-index \ + -I$(dovecot_incdir)/src/lib-storage \ + -I$(dovecot_incdir)/src/lib-storage/index \ + -I$(dovecot_incdir)/src/lib-storage/index/raw \ + -I$(dovecot_incdir)/src/lib-storage/index/mbox \ + -I$(dovecot_incdir)/src/lib-storage/index/maildir + +libutil_la_SOURCES = \ + mail-raw.c + +noinst_HEADERS = \ + mail-raw.h diff --git a/src/sieve-bin/mail-raw.c b/src/lib-util/mail-raw.c similarity index 76% rename from src/sieve-bin/mail-raw.c rename to src/lib-util/mail-raw.c index 5f8421363..2899de706 100644 --- a/src/sieve-bin/mail-raw.c +++ b/src/lib-util/mail-raw.c @@ -1,11 +1,9 @@ /* Copyright (c) 2002-2008 Dovecot Sieve authors, see the included COPYING file */ -/* This file was gratefully stolen from dovecot/src/deliver/deliver.c and altered - * to suit our needs. So, this contains lots and lots of duplicated code. - * The sieve-test and sieve-exec programs need to read an email message from stdin - * and needs to build a struct mail (to be fed to the sieve library). Deliver does - * something similar already, so that source was a basis for these test tools. +/* This file was gratefully stolen from dovecot/src/deliver/deliver.c and + * altered to suit our needs. So, this contains lots and lots of duplicated + * code. */ #include "lib.h" @@ -107,53 +105,66 @@ static struct istream *create_raw_stream return input; } +/* + * Init/Deinit + */ + void mail_raw_init(const char *user) { const char *error; - + raw_mail_user = mail_user_init(user, NULL); raw_ns = mail_namespaces_init_empty(raw_mail_user); raw_ns->flags |= NAMESPACE_FLAG_INTERNAL; - if (mail_storage_create(raw_ns, "raw", "/tmp", + if ( mail_storage_create(raw_ns, "raw", "/tmp", MAIL_STORAGE_FLAG_FULL_FS_ACCESS, - FILE_LOCK_METHOD_FCNTL, &error) < 0) - i_fatal("Couldn't create internal raw storage: %s", error); -} + FILE_LOCK_METHOD_FCNTL, &error) < 0 ) { + i_fatal("Couldn't create internal raw storage: %s", error); + } +} + +void mail_raw_deinit(void) +{ + mail_user_deinit(&raw_mail_user); + mail_namespaces_deinit(&raw_ns); +} -struct mail_raw *mail_raw_open(const char *path) +/* + * Open raw mail data + */ + +static struct mail_raw *mail_raw_create +(struct istream *input, const char *mailfile, const char *sender, + time_t mtime) { pool_t pool; - time_t mtime; - struct istream *input; struct raw_mailbox *raw_box; struct mail_raw *mailr; - const char *sender = NULL; - + pool = pool_alloconly_create("mail_raw", 1024); mailr = p_new(pool, struct mail_raw, 1); mailr->pool = pool; - if ( path == NULL || strcmp(path, "-") == 0 ) { - input = create_raw_stream(0, &mtime, &sender); - mailr->box = mailbox_open(raw_ns->storage, "Dovecot Delivery Mail", + if ( mailfile == NULL ) { + mailr->box = mailbox_open(raw_ns->storage, "Dovecot Raw Mail", input, MAILBOX_OPEN_NO_INDEX_FILES); - i_stream_unref(&input); } else { mtime = (time_t)-1; - mailr->box = mailbox_open(raw_ns->storage, path, NULL, + mailr->box = mailbox_open(raw_ns->storage, mailfile, NULL, MAILBOX_OPEN_NO_INDEX_FILES); } - - if (mailr->box == NULL) + + if ( mailr->box == NULL ) i_fatal("Can't open mail stream as raw"); - if (mailbox_sync(mailr->box, 0, 0, NULL) < 0) { + if ( mailbox_sync(mailr->box, 0, 0, NULL ) < 0) { enum mail_error error; 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; raw_box->mtime = mtime; @@ -166,18 +177,48 @@ struct mail_raw *mail_raw_open(const char *path) return mailr; } +struct mail_raw *mail_raw_open_data(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); + + i_stream_unref(&input); + + return mailr; +} + +struct mail_raw *mail_raw_open_file(const char *path) +{ + struct mail_raw *mailr; + struct istream *input = NULL; + time_t mtime; + const char *sender = NULL; + + if ( path == NULL || strcmp(path, "-") == 0 ) { + path = NULL; + input = create_raw_stream(0, &mtime, &sender); + } + + mailr = mail_raw_create(input, path, sender, mtime); + + if ( input != NULL ) + i_stream_unref(&input); + + return mailr; +} + void mail_raw_close(struct mail_raw *mailr) { - mail_free(&mailr->mail); mailbox_header_lookup_unref(&mailr->headers_ctx); + + mail_free(&mailr->mail); mailbox_transaction_rollback(&mailr->trans); mailbox_close(&mailr->box); pool_unref(&mailr->pool); } -void mail_raw_deinit(void) -{ - mail_user_deinit(&raw_mail_user); -} - diff --git a/src/sieve-bin/mail-raw.h b/src/lib-util/mail-raw.h similarity index 79% rename from src/sieve-bin/mail-raw.h rename to src/lib-util/mail-raw.h index b9e6ae4de..2834eae36 100644 --- a/src/sieve-bin/mail-raw.h +++ b/src/lib-util/mail-raw.h @@ -14,8 +14,11 @@ struct mail_raw { }; void mail_raw_init(const char *user); -struct mail_raw *mail_raw_open(const char *path); -void mail_raw_close(struct mail_raw *mailr); void mail_raw_deinit(void); +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); + + #endif /* __MAIL_RAW_H */ diff --git a/src/sieve-bin/Makefile.am b/src/sieve-bin/Makefile.am index 48c489e04..587c89d7a 100644 --- a/src/sieve-bin/Makefile.am +++ b/src/sieve-bin/Makefile.am @@ -4,6 +4,7 @@ bin_PROGRAMS = sievec sieved sieve-test sieve-exec AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib-sieve \ + -I$(top_srcdir)/src/lib-util \ -I$(dovecot_incdir) \ -I$(dovecot_incdir)/src/lib \ -I$(dovecot_incdir)/src/lib-mail \ @@ -22,23 +23,24 @@ sieve_exec_LDFLAGS = -export-dynamic -Wl,--start-group libs = \ $(top_srcdir)/src/lib-sieve/libsieve.la \ + $(top_srcdir)/src/lib-util/libutil.la \ $(dovecot_incdir)/src/lib-storage/list/libstorage_list.a \ $(dovecot_incdir)/src/lib-storage/index/raw/libstorage_raw.a \ $(dovecot_incdir)/src/lib-storage/index/maildir/libstorage_maildir.a \ $(dovecot_incdir)/src/lib-storage/index/mbox/libstorage_mbox.a \ - $(dovecot_incdir)/src/lib-storage/index/libstorage_index.a \ - $(dovecot_incdir)/src/lib-storage/libstorage.a \ - $(dovecot_incdir)/src/lib-index/libindex.a \ - $(dovecot_incdir)/src/lib-imap/libimap.a \ - $(dovecot_incdir)/src/lib-mail/libmail.a \ - $(dovecot_incdir)/src/lib-charset/libcharset.a \ + $(dovecot_incdir)/src/lib-storage/index/libstorage_index.a \ + $(dovecot_incdir)/src/lib-storage/libstorage.a \ + $(dovecot_incdir)/src/lib-index/libindex.a \ + $(dovecot_incdir)/src/lib-imap/libimap.a \ + $(dovecot_incdir)/src/lib-mail/libmail.a \ + $(dovecot_incdir)/src/lib-charset/libcharset.a \ $(dovecot_incdir)/src/lib/liblib.a ldadd = \ $(libs) \ $(LIBICONV) \ - $(RAND_LIBS) \ - $(MODULE_LIBS) + $(RAND_LIBS) \ + $(MODULE_LIBS) sievec_LDADD = $(ldadd) sieved_LDADD = $(ldadd) @@ -52,8 +54,7 @@ sieve_exec_DEPENDENCIES = $(libs) common_sources = \ bin-common.c \ - namespaces.c \ - mail-raw.c + namespaces.c sievec_SOURCES = \ $(common_sources) \ @@ -73,5 +74,4 @@ sieve_exec_SOURCES = \ noinst_HEADERS = \ bin-common.h \ - namespaces.h \ - mail-raw.h + namespaces.h diff --git a/src/sieve-bin/bin-common.c b/src/sieve-bin/bin-common.c index 866f15276..b99685083 100644 --- a/src/sieve-bin/bin-common.c +++ b/src/sieve-bin/bin-common.c @@ -135,19 +135,6 @@ void bin_dump_sieve_binary_to(struct sieve_binary *sbin, const char *filename) close(dfd); } -int bin_open_mail_file(const char *filename) -{ - int mfd; - - if ( strcmp(filename, "-") == 0 ) - return 0; - - if ( (mfd = open(filename, O_RDONLY)) < 0 ) - i_fatal("Failed to open mail file: %m"); - - return mfd; -} - void bin_close_mail_file(int mfd) { if ( mfd != 0 ) diff --git a/src/sieve-bin/sieve-exec.c b/src/sieve-bin/sieve-exec.c index 7720b7f4a..d5be0901c 100644 --- a/src/sieve-bin/sieve-exec.c +++ b/src/sieve-bin/sieve-exec.c @@ -179,7 +179,7 @@ int main(int argc, char **argv) /* Open text file as mail message */ mail_raw_init(user); - mailr = mail_raw_open(mailfile); + mailr = mail_raw_open_file(mailfile); bin_fill_in_envelope(mailr->mail, &recipient, &sender); diff --git a/src/sieve-bin/sieve-test.c b/src/sieve-bin/sieve-test.c index 0812184af..146bb1a7f 100644 --- a/src/sieve-bin/sieve-test.c +++ b/src/sieve-bin/sieve-test.c @@ -135,7 +135,7 @@ int main(int argc, char **argv) namespaces_init(); mail_raw_init(user); - mailr = mail_raw_open(mailfile); + mailr = mail_raw_open_file(mailfile); bin_fill_in_envelope(mailr->mail, &recipient, &sender); diff --git a/src/testsuite/Makefile.am b/src/testsuite/Makefile.am index 890c80ea0..1cb3a99ce 100644 --- a/src/testsuite/Makefile.am +++ b/src/testsuite/Makefile.am @@ -2,6 +2,7 @@ noinst_PROGRAMS = testsuite AM_CPPFLAGS = \ -I../lib-sieve \ + -I../lib-util \ -I$(dovecot_incdir) \ -I$(dovecot_incdir)/src/lib \ -I$(dovecot_incdir)/src/lib-mail \ @@ -10,12 +11,13 @@ AM_CPPFLAGS = \ -I$(dovecot_incdir)/src/lib-storage/index \ -I$(dovecot_incdir)/src/lib-storage/index/raw \ -I$(dovecot_incdir)/src/lib-storage/index/mbox \ - -I$(dovecot_incdir)/src/lib-storage/index/maildir + -I$(dovecot_incdir)/src/lib-storage/index/maildir testsuite_LDFLAGS = -export-dynamic -Wl,--start-group libs = \ $(top_srcdir)/src/lib-sieve/libsieve.la \ + $(top_srcdir)/src/lib-util/libutil.la \ $(dovecot_incdir)/src/lib-storage/list/libstorage_list.a \ $(dovecot_incdir)/src/lib-storage/index/raw/libstorage_raw.a \ $(dovecot_incdir)/src/lib-storage/index/maildir/libstorage_maildir.a \ @@ -50,7 +52,6 @@ tests = \ testsuite_SOURCES = \ namespaces.c \ - mail-raw.c \ testsuite-common.c \ testsuite-objects.c \ testsuite-result.c \ @@ -63,6 +64,5 @@ noinst_HEADERS = \ testsuite-common.h \ testsuite-objects.h \ testsuite-result.h \ - namespaces.h \ - mail-raw.h + namespaces.h diff --git a/src/testsuite/mail-raw.c b/src/testsuite/mail-raw.c deleted file mode 100644 index a1ed1ec56..000000000 --- a/src/testsuite/mail-raw.c +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (c) 2002-2008 Dovecot Sieve authors, see the included COPYING file - */ - -/* This file was gratefully stolen from dovecot/src/deliver/deliver.c and altered - * to suit our needs. So, this contains lots and lots of duplicated code. - * FIXME: As a matter of fact a similar file is located at src/sieve-bin/mail-raw.c - * These must be merged. - */ - -#include "lib.h" -#include "istream.h" -#include "istream-seekable.h" -#include "istream-crlf.h" -#include "fd-set-nonblock.h" -#include "str.h" -#include "str-sanitize.h" -#include "strescape.h" -#include "message-address.h" -#include "raw-storage.h" -#include "mail-namespace.h" - -#include "mail-raw.h" - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <pwd.h> - -/* - * Configuration - */ - -#define DEFAULT_ENVELOPE_SENDER "MAILER-DAEMON" - -/* After buffer grows larger than this, create a temporary file to /tmp - where to read the mail. */ -#define MAIL_MAX_MEMORY_BUFFER (1024*128) - -/* - * Implementation - */ - -static struct mail_namespace *raw_ns; - -void mail_raw_init(const char *user) -{ - const char *error; - struct mail_user *raw_mail_user; - - raw_mail_user = mail_user_init(user, NULL); - raw_ns = mail_namespaces_init_empty(raw_mail_user); - raw_ns->flags |= NAMESPACE_FLAG_INTERNAL; - if (mail_storage_create(raw_ns, "raw", "/tmp", - MAIL_STORAGE_FLAG_FULL_FS_ACCESS, - FILE_LOCK_METHOD_FCNTL, &error) < 0) - i_fatal("Couldn't create internal raw storage: %s", error); -} - -struct mail_raw *mail_raw_open(string_t *mail_data) -{ - pool_t pool; - struct raw_mailbox *raw_box; - struct mail_raw *mailr; - - pool = pool_alloconly_create("mail_raw", 1024); - mailr = p_new(pool, struct mail_raw, 1); - mailr->pool = pool; - - mailr->input = i_stream_create_from_data - (str_data(mail_data), str_len(mail_data)); - - mailr->box = mailbox_open(raw_ns->storage, - "Dovecot Raw Mail", mailr->input, MAILBOX_OPEN_NO_INDEX_FILES); - - if (mailr->box == NULL) - i_fatal("Can't open mail stream as raw"); - - if (mailbox_sync(mailr->box, 0, 0, NULL) < 0) { - enum mail_error error; - - i_fatal("Can't sync raw mail: %s", - mail_storage_get_last_error(raw_ns->storage, &error)); - } - - raw_box = (struct raw_mailbox *) mailr->box; - raw_box->envelope_sender = DEFAULT_ENVELOPE_SENDER; - - mailr->trans = mailbox_transaction_begin(mailr->box, 0); - mailr->mail = mail_alloc(mailr->trans, 0, NULL); - mail_set_seq(mailr->mail, 1); - - /* */ - i_stream_seek(mailr->input, 0); - - return mailr; -} - -void mail_raw_close(struct mail_raw *mailr) -{ - i_stream_unref(&mailr->input); - - mail_free(&mailr->mail); - mailbox_transaction_rollback(&mailr->trans); - mailbox_close(&mailr->box); - - pool_unref(&mailr->pool); -} - -void mail_raw_deinit(void) -{ - mail_namespaces_deinit(&raw_ns); -} - diff --git a/src/testsuite/mail-raw.h b/src/testsuite/mail-raw.h deleted file mode 100644 index c401208e5..000000000 --- a/src/testsuite/mail-raw.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (c) 2002-2008 Dovecot Sieve authors, see the included COPYING file - */ - -#ifndef __MAIL_RAW_H -#define __MAIL_RAW_H - -#include "lib.h" -#include "str.h" - -struct mail_raw { - pool_t pool; - struct mail *mail; - - struct istream *input; - struct mailbox *box; - struct mailbox_transaction_context *trans; -}; - -void mail_raw_init(const char *user); -struct mail_raw *mail_raw_open(string_t *mail_data); -void mail_raw_close(struct mail_raw *mailr); -void mail_raw_deinit(void); - -#endif /* __MAIL_RAW_H */ diff --git a/src/testsuite/testsuite-common.c b/src/testsuite/testsuite-common.c index 64e3e23d5..d0cd43452 100644 --- a/src/testsuite/testsuite-common.c +++ b/src/testsuite/testsuite-common.c @@ -74,7 +74,7 @@ static void _testsuite_message_set(string_t *message) * Open message as mail struct */ - _raw_message = mail_raw_open(message); + _raw_message = mail_raw_open_data(message); mail = _raw_message->mail; /* -- GitLab