]> git.tuebingen.mpg.de Git - dss.git/blobdiff - dss.c
Change email address and URLs.
[dss.git] / dss.c
diff --git a/dss.c b/dss.c
index 4202d08da8c0eeee0a567da6db239a5865beed6b..0ad7a35989a75e893fe40e30d84d1ff18f4d94ff 100644 (file)
--- a/dss.c
+++ b/dss.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2011 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2008-2011 Andre Noll <maan@tuebingen.mpg.de>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
 #include "gcc-compat.h"
 #include "cmdline.h"
 #include "log.h"
-#include "string.h"
-#include "error.h"
-#include "fd.h"
+#include "str.h"
+#include "err.h"
+#include "file.h"
 #include "exec.h"
 #include "daemon.h"
-#include "signal.h"
+#include "sig.h"
 #include "df.h"
-#include "time.h"
+#include "tv.h"
 #include "snap.h"
 #include "ipc.h"
 
@@ -548,10 +548,17 @@ static int rename_incomplete_snapshot(int64_t start)
 {
        char *old_name;
        int ret;
+       int64_t now;
 
+       /*
+        * We don't want the dss_rename() below to fail with EEXIST because the
+        * last complete snapshot was created (and completed) in the same
+        * second as this one.
+        */
+       while ((now = get_current_time()) == start)
+               sleep(1);
        free(path_to_last_complete_snapshot);
-       ret = complete_name(start, get_current_time(),
-               &path_to_last_complete_snapshot);
+       ret = complete_name(start, now, &path_to_last_complete_snapshot);
        if (ret < 0)
                return ret;
        old_name = incomplete_name(start);
@@ -932,8 +939,9 @@ static int check_config(void)
                return -E_INVALID_NUMBER;
        }
        DSS_DEBUG_LOG(("unit interval: %i day(s)\n", conf.unit_interval_arg));
-       if (conf.num_intervals_arg <= 0) {
-               DSS_ERROR_LOG(("bad number of intervals  %i\n", conf.num_intervals_arg));
+       if (conf.num_intervals_arg <= 0 || conf.num_intervals_arg > 30) {
+               DSS_ERROR_LOG(("bad number of intervals: %i\n",
+                       conf.num_intervals_arg));
                return -E_INVALID_NUMBER;
        }
        DSS_DEBUG_LOG(("number of intervals: %i\n", conf.num_intervals_arg));
@@ -1030,6 +1038,13 @@ static int handle_sighup(void)
        return change_to_dest_dir();
 }
 
+static void kill_children(void)
+{
+       restart_create_process();
+       dss_kill(create_pid, SIGTERM, NULL);
+       dss_kill(remove_pid, SIGTERM, NULL);
+}
+
 static int handle_signal(void)
 {
        int sig, ret = next_signal();
@@ -1040,9 +1055,7 @@ static int handle_signal(void)
        switch (sig) {
        case SIGINT:
        case SIGTERM:
-               restart_create_process();
-               dss_kill(create_pid, SIGTERM, NULL);
-               dss_kill(remove_pid, SIGTERM, NULL);
+               kill_children();
                ret = -E_SIGNAL;
                break;
        case SIGHUP:
@@ -1140,7 +1153,7 @@ static void create_rsync_argv(char ***argv, int64_t *num)
 
        *argv = dss_malloc((15 + conf.rsync_option_given) * sizeof(char *));
        (*argv)[i++] = dss_strdup("rsync");
-       (*argv)[i++] = dss_strdup("-aq");
+       (*argv)[i++] = dss_strdup("-a");
        (*argv)[i++] = dss_strdup("--delete");
        for (j = 0; j < conf.rsync_option_given; j++)
                (*argv)[i++] = dss_strdup(conf.rsync_option_arg[j]);
@@ -1311,6 +1324,7 @@ static int com_run(void)
        ret = select_loop();
        if (ret >= 0) /* impossible */
                ret = -E_BUG;
+       kill_children();
        exit_hook(ret);
        return ret;
 }
@@ -1434,7 +1448,7 @@ static int com_ls(void)
                if (s->flags & SS_COMPLETE)
                        d = (s->completion_time - s->creation_time) / 60;
                dss_msg("%u\t%s\t%3" PRId64 ":%02" PRId64 "\n", s->interval, s->name, d/60, d%60);
-       };
+       }
        free_snapshot_list(&sl);
        return 1;
 }