Mercurial > dovecot > original-hg > dovecot-1.2
changeset 7977:fed87704b48a HEAD
Added a new maildirlock utility for write-locking Dovecot MMaildir.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 08 Jul 2008 19:19:21 +0530 |
parents | d4b7ef797828 |
children | 6f47263b947b |
files | src/util/Makefile.am src/util/maildirlock.c |
diffstat | 2 files changed, 75 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- 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 -pkglibexec_PROGRAMS = rawlog gdbhelper idxview listview logview +pkglibexec_PROGRAMS = rawlog gdbhelper idxview listview logview maildirlock sbin_PROGRAMS = dovecotpw AM_CPPFLAGS = \ @@ -11,35 +11,35 @@ 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 \
--- /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; +}