From: Timo Sirainen Date: Tue, 8 Jul 2008 13:49:21 +0000 (+0530) Subject: Added a new maildirlock utility for write-locking Dovecot MMaildir. X-Git-Tag: 1.2.alpha1~184 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5ae1765a2cad99de34d3e42b98b087a39b606184;p=thirdparty%2Fdovecot%2Fcore.git Added a new maildirlock utility for write-locking Dovecot MMaildir. --HG-- branch : HEAD --- diff --git a/src/util/Makefile.am b/src/util/Makefile.am index faf9024ef5..e2d20b10c2 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -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 index 0000000000..5691f2cfcf --- /dev/null +++ b/src/util/maildirlock.c @@ -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 +#include +#include + +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 \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; +}