dovecot-1.1: Added a new maildirlock utility for write-locking D...

dovecot at dovecot.org dovecot at dovecot.org
Tue Jul 8 16:49:35 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.1/rev/5c99822d2672
changeset: 7731:5c99822d2672
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Jul 08 19:19:21 2008 +0530
description:
Added a new maildirlock utility for write-locking Dovecot MMaildir.

diffstat:

2 files changed, 75 insertions(+), 6 deletions(-)
src/util/Makefile.am   |   12 ++++----
src/util/maildirlock.c |   69 ++++++++++++++++++++++++++++++++++++++++++++++++

diffs (124 lines):

diff -r 6f4db98cdec9 -r 5c99822d2672 src/util/Makefile.am
--- a/src/util/Makefile.am	Tue Jul 08 19:18:17 2008 +0530
+++ b/src/util/Makefile.am	Tue Jul 08 19:19:21 2008 +0530
@@ -1,6 +1,6 @@ pkglibexecdir = $(libexecdir)/dovecot
 pkglibexecdir = $(libexecdir)/dovecot
 
-pkglibexec_PROGRAMS = rawlog gdbhelper idxview listview logview
+pkglibexec_PROGRAMS = rawlog gdbhelper idxview listview logview maildirlock
 sbin_PROGRAMS = dovecotpw
 
 AM_CPPFLAGS = \
@@ -11,34 +11,34 @@ AM_CPPFLAGS = \
 
 rawlog_LDADD = \
 	../lib/liblib.a
-
 rawlog_SOURCES = \
 	rawlog.c
 
 gdbhelper_LDADD = \
 	../lib/liblib.a
-
 gdbhelper_SOURCES = \
 	gdbhelper.c
 
 idxview_LDADD = \
 	../lib-index/libindex.a \
 	../lib/liblib.a
-
 idxview_SOURCES = \
 	idxview.c
 
 listview_LDADD = \
 	../lib/liblib.a
-
 listview_SOURCES = \
 	listview.c
 
 logview_LDADD = \
 	../lib/liblib.a
-
 logview_SOURCES = \
 	logview.c
+
+maildirlock_LDADD = \
+	../lib/liblib.a
+maildirlock_SOURCES = \
+	maildirlock.c
 
 dovecotpw_LDADD = \
 	../auth/libpassword.a \
diff -r 6f4db98cdec9 -r 5c99822d2672 src/util/maildirlock.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/util/maildirlock.c	Tue Jul 08 19:19:21 2008 +0530
@@ -0,0 +1,69 @@
+/* Copyright (c) 2008 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "lib-signals.h"
+#include "ioloop.h"
+#include "file-dotlock.h"
+#include "src/lib-storage/index/maildir/maildir-uidlist.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+
+static struct dotlock_settings dotlock_settings = {
+	MEMBER(temp_prefix) NULL,
+	MEMBER(lock_suffix) NULL,
+	MEMBER(timeout) 0,
+	MEMBER(stale_timeout) MAILDIR_UIDLIST_LOCK_STALE_TIMEOUT,
+	MEMBER(use_excl_lock) FALSE,
+	MEMBER(nfs_flush) FALSE,
+	MEMBER(use_io_notify) TRUE
+};
+
+static struct ioloop *ioloop;
+
+static void sig_die(int signo ATTR_UNUSED, void *context ATTR_UNUSED)
+{
+	io_loop_stop(ioloop);
+}
+
+static int maildir_lock(const char *path, unsigned int timeout,
+			struct dotlock **dotlock_r)
+{
+	dotlock_settings.timeout = timeout;
+	dotlock_settings.use_excl_lock = getenv("DOTLOCK_USE_EXCL") != NULL;
+	dotlock_settings.nfs_flush = getenv("MAIL_NFS_STORAGE") != NULL;
+
+	return file_dotlock_create(&dotlock_settings, path, 0, dotlock_r);
+}
+
+int main(int argc, const char *argv[])
+{
+	struct dotlock *dotlock;
+	unsigned int timeout;
+
+	lib_init();
+	ioloop = io_loop_create();
+
+	if (argc != 3) {
+		printf("Usage: maildirlock <path> <timeout>\n"
+		       " - SIGTERM will release the lock.\n");
+		return 1;
+	}
+
+	timeout = strtoul(argv[2], NULL, 10);
+	if (maildir_lock(argv[1], timeout, &dotlock) <= 0)
+		return 1;
+
+	lib_signals_init();
+	lib_signals_set_handler(SIGINT, TRUE, sig_die, NULL);
+	lib_signals_set_handler(SIGTERM, TRUE, sig_die, NULL);
+	io_loop_run(ioloop);
+
+	file_dotlock_delete(&dotlock);
+	lib_signals_deinit();
+
+	io_loop_destroy(&ioloop);
+	lib_deinit();
+	return 0;
+}


More information about the dovecot-cvs mailing list