]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added a new maildirlock utility for write-locking Dovecot MMaildir.
authorTimo Sirainen <tss@iki.fi>
Tue, 8 Jul 2008 13:49:21 +0000 (19:19 +0530)
committerTimo Sirainen <tss@iki.fi>
Tue, 8 Jul 2008 13:49:21 +0000 (19:19 +0530)
--HG--
branch : HEAD

src/util/Makefile.am
src/util/maildirlock.c [new file with mode: 0644]

index faf9024ef5c6fd26511edb0778dd7d06f925662c..e2d20b10c2d7d0434c7422256441f0165c03474d 100644 (file)
@@ -1,6 +1,6 @@
 pkglibexecdir = $(libexecdir)/dovecot
 
-pkglibexec_PROGRAMS = rawlog gdbhelper idxview listview logview
+pkglibexec_PROGRAMS = rawlog gdbhelper idxview listview logview maildirlock
 sbin_PROGRAMS = dovecotpw
 
 AM_CPPFLAGS = \
@@ -11,35 +11,35 @@ 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 \
        ../lib-ntlm/libntlm.a \
diff --git a/src/util/maildirlock.c b/src/util/maildirlock.c
new file mode 100644 (file)
index 0000000..5691f2c
--- /dev/null
@@ -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;
+}