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