Implement SIGUSR2 to save the DB without resetting it.
authorEmil Mikulic <emikulic@gmail.com>
Sun, 15 May 2011 07:42:16 +0000 (17:42 +1000)
committerEmil Mikulic <emikulic@gmail.com>
Sat, 28 May 2011 10:10:53 +0000 (20:10 +1000)
This has been requested a few times.

darkstat.8.in
darkstat.c

index 471f0a1..bece1b7 100644 (file)
@@ -248,7 +248,8 @@ database.
 .\"
 .TP
 .BI \-\-export " filename"
-On shutdown, and upon receiving SIGUSR1, export the in-memory database
+On shutdown, or upon receiving SIGUSR1 or SIGUSR2,
+export the in-memory database
 to the named file, relative to the chroot directory.
 If you wish to use \fB\-\-export\fR, you must first specify a
 \fB\-\-chroot\fR directory, and it must be writeable by the
@@ -404,6 +405,7 @@ Sending the SIGUSR1 signal will cause \fIdarkstat\fR to empty out its
 in-memory database.
 If an \fB\-\-export\fR file was set, it will first save the database to
 file.
+Sending SIGUSR2 will save the database without emptying it.
 .PP
 .\"
 .SH FREQUENTLY ASKED QUESTIONS
index aa4a820..0f0f9de 100644 (file)
@@ -45,8 +45,14 @@ time_t now;
 static volatile int running = 1;
 static void sig_shutdown(int signum _unused_) { running = 0; }
 
-static volatile int reset_pending = 0;
-static void sig_reset(int signum _unused_) { reset_pending = 1; }
+static volatile int reset_pending = 0, export_pending = 0;
+static void sig_reset(int signum _unused_)
+{
+   reset_pending = 1;
+   export_pending = 1;
+}
+
+static void sig_export(int signum _unused_) { export_pending = 1; }
 
 /* --- Commandline parsing --- */
 static unsigned long
@@ -424,6 +430,8 @@ main(int argc, char **argv)
       errx(1, "signal(SIGINT) failed");
    if (signal(SIGUSR1, sig_reset) == SIG_ERR)
       errx(1, "signal(SIGUSR1) failed");
+   if (signal(SIGUSR2, sig_export) == SIG_ERR)
+      errx(1, "signal(SIGUSR2) failed");
 
    verbosef("entering main loop");
    daemonize_finish();
@@ -435,8 +443,13 @@ main(int argc, char **argv)
 
       now = time(NULL);
 
+      if (export_pending) {
+         if (export_fn != NULL)
+            db_export(export_fn);
+         export_pending = 0;
+      }
+
       if (reset_pending) {
-         if (export_fn != NULL) db_export(export_fn); /* FIXME: USR2? */
          hosts_db_reset();
          graph_reset();
          reset_pending = 0;