]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Added stop and reload commands.
authorTimo Sirainen <tss@iki.fi>
Fri, 28 May 2010 12:03:49 +0000 (13:03 +0100)
committerTimo Sirainen <tss@iki.fi>
Fri, 28 May 2010 12:03:49 +0000 (13:03 +0100)
--HG--
branch : HEAD

src/doveadm/Makefile.am
src/doveadm/doveadm-master.c [new file with mode: 0644]
src/doveadm/doveadm.c
src/doveadm/doveadm.h

index 025bedbf08914114fe4ce63737a7a909431dfa6a..086d99738091f576cd3302b2a11a7ee065b78f3c 100644 (file)
@@ -52,6 +52,7 @@ doveadm_SOURCES = \
        doveadm-dump-mailboxlog.c \
        doveadm-dump-thread.c \
        doveadm-kick.c \
+       doveadm-master.c \
        doveadm-mail.c \
        doveadm-mail-altmove.c \
        doveadm-mail-expunge.c \
diff --git a/src/doveadm/doveadm-master.c b/src/doveadm/doveadm-master.c
new file mode 100644 (file)
index 0000000..b56bd27
--- /dev/null
@@ -0,0 +1,93 @@
+/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "doveadm.h"
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <signal.h>
+
+#define MASTER_PID_FILE_NAME "master.pid"
+
+static bool pid_file_read(const char *path, pid_t *pid_r)
+{
+       char buf[32];
+       int fd;
+       ssize_t ret;
+       bool found;
+
+       fd = open(path, O_RDONLY);
+       if (fd == -1) {
+               if (errno == ENOENT)
+                       return FALSE;
+               i_fatal("open(%s) failed: %m", path);
+       }
+
+       ret = read(fd, buf, sizeof(buf));
+       if (ret <= 0) {
+               if (ret == 0)
+                       i_error("Empty PID file in %s", path);
+               else
+                       i_fatal("read(%s) failed: %m", path);
+               found = FALSE;
+       } else {
+               if (buf[ret-1] == '\n')
+                       ret--;
+               buf[ret] = '\0';
+               if (str_to_pid(buf, pid_r) < 0)
+                       found = FALSE;
+               else {
+                       found = !(*pid_r == getpid() ||
+                                 (kill(*pid_r, 0) < 0 && errno == ESRCH));
+               }
+       }
+       (void)close(fd);
+       return found;
+}
+
+static void send_master_signal(int signo)
+{
+       const char *pidfile_path;
+       unsigned int i;
+       pid_t pid;
+
+       pidfile_path = t_strconcat(doveadm_settings->base_dir,
+                                  "/"MASTER_PID_FILE_NAME, NULL);
+
+       if (!pid_file_read(pidfile_path, &pid))
+               i_fatal("Dovecot is not running (read from %s)", pidfile_path);
+
+       if (kill(pid, signo) < 0)
+               i_fatal("kill(%s, %d) failed: %m", dec2str(pid), signo);
+
+       if (signo == SIGTERM) {
+               /* wait for a while for the process to die */
+               usleep(1000);
+               for (i = 0; i < 30; i++) {
+                       if (kill(pid, 0) < 0) {
+                               if (errno != ESRCH)
+                                       i_error("kill() failed: %m");
+                               break;
+                       }
+                       usleep(100000);
+               }
+       }
+}
+
+static void cmd_stop(int argc ATTR_UNUSED, char *argv[] ATTR_UNUSED)
+{
+       send_master_signal(SIGTERM);
+}
+
+static void cmd_reload(int argc ATTR_UNUSED, char *argv[] ATTR_UNUSED)
+{
+       send_master_signal(SIGHUP);
+}
+
+struct doveadm_cmd doveadm_cmd_stop = {
+       cmd_stop, "stop", "", NULL
+};
+
+struct doveadm_cmd doveadm_cmd_reload = {
+       cmd_reload, "reload", "", NULL
+};
index 8ff03b5246250f9ec83a08b948a0fd1801dcd72e..3b5b5bf17266dd6fce6f1a74e32d02978ac946b4 100644 (file)
@@ -176,6 +176,8 @@ static void doveadm_load_modules(void)
 
 static struct doveadm_cmd *doveadm_commands[] = {
        &doveadm_cmd_help,
+       &doveadm_cmd_stop,
+       &doveadm_cmd_reload,
        &doveadm_cmd_auth,
        &doveadm_cmd_user,
        &doveadm_cmd_dump,
index afe8f4505f2ac032a27792d1e5c2a9b8187d1a6c..4f7e452472dcf7c456994485899c012fccc760d8 100644 (file)
@@ -14,6 +14,8 @@ struct doveadm_cmd {
        const char *long_usage;
 };
 
+extern struct doveadm_cmd doveadm_cmd_stop;
+extern struct doveadm_cmd doveadm_cmd_reload;
 extern struct doveadm_cmd doveadm_cmd_auth;
 extern struct doveadm_cmd doveadm_cmd_user;
 extern struct doveadm_cmd doveadm_cmd_dump;