X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=dss.c;h=5f35435727e956c13bb82f6801fdbe251204665f;hb=2f2b61d159e93e3da97c21da3d644c2c549bf12c;hp=f8bbb99a987b51943a4699af51b69480bc0b92aa;hpb=4b93d353a2ac15b45b9e6064620bf93e41aa1b51;p=dss.git diff --git a/dss.c b/dss.c index f8bbb99..5f35435 100644 --- a/dss.c +++ b/dss.c @@ -81,7 +81,7 @@ static int64_t next_snapshot_time; static struct timeval next_removal_check; /** Creation time of the snapshot currently being created. */ static int64_t current_snapshot_creation_time; -/** The snapshot currently being removed. */ +/* Set by the pre-rm hook, cleared by handle_remove_exit(). */ struct snapshot *snapshot_currently_being_removed; /** Needed by the post-create hook. */ static char *path_to_last_complete_snapshot; @@ -574,9 +574,6 @@ static int is_reference_snapshot(struct snapshot *s) return strcmp(s->name, name_of_reference_snapshot)? 0 : 1; } -/* - * return: 0: no redundant snapshots, 1: rm process started, negative: error - */ static struct snapshot *find_redundant_snapshot(struct snapshot_list *sl) { int i, interval; @@ -1386,7 +1383,7 @@ out: static void create_rsync_argv(char ***argv, int64_t *num) { char *logname; - int i = 0, j, N = OPT_GIVEN(DSS, RSYNC_OPTION); + int i = 0, j, N; struct snapshot_list sl; static bool seeded; @@ -1395,7 +1392,13 @@ static void create_rsync_argv(char ***argv, int64_t *num) name_of_reference_snapshot = name_of_newest_complete_snapshot(&sl); free_snapshot_list(&sl); - *argv = dss_malloc((15 + N) * sizeof(char *)); + /* + * We specify up to 6 arguments, one argument per given rsync option + * and one argument per given source dir. We also need space for the + * terminating NULL pointer. + */ + N = OPT_GIVEN(DSS, RSYNC_OPTION) + OPT_GIVEN(DSS, SOURCE_DIR); + *argv = dss_malloc((7 + N) * sizeof(char *)); (*argv)[i++] = dss_strdup("rsync"); (*argv)[i++] = dss_strdup("-a"); (*argv)[i++] = dss_strdup("--delete"); @@ -1407,7 +1410,7 @@ static void create_rsync_argv(char ***argv, int64_t *num) DSS_NOTICE_LOG(("adding --checksum to rsync options\n")); (*argv)[i++] = dss_strdup("--checksum"); } - for (j = 0; j < N; j++) + for (j = 0; j < OPT_GIVEN(DSS, RSYNC_OPTION); j++) (*argv)[i++] = dss_strdup(lls_string_val(j, OPT_RESULT(DSS, RSYNC_OPTION))); if (name_of_reference_snapshot) { @@ -1417,9 +1420,8 @@ static void create_rsync_argv(char ***argv, int64_t *num) } else DSS_INFO_LOG(("no suitable reference snapshot found\n")); logname = dss_logname(); - N = OPT_GIVEN(DSS, SOURCE_DIR); if (use_rsync_locally(logname)) { - for (j = 0; j < N; j++) + for (j = 0; j < OPT_GIVEN(DSS, SOURCE_DIR); j++) (*argv)[i++] = dss_strdup(lls_string_val(j, OPT_RESULT(DSS, SOURCE_DIR))); } else { @@ -1436,13 +1438,13 @@ static void create_rsync_argv(char ***argv, int64_t *num) * directory on the destination match the source. To preserve * the old behaviour, we thus have to special-case N=1. */ - for (j = 0; j < N; j++) { + for (j = 0; j < OPT_GIVEN(DSS, SOURCE_DIR); j++) { (*argv)[i++] = make_message("%s@%s:%s%s", OPT_GIVEN(DSS, REMOTE_USER)? OPT_STRING_VAL(DSS, REMOTE_USER) : logname, OPT_STRING_VAL(DSS, REMOTE_HOST), lls_string_val(j, OPT_RESULT(DSS, SOURCE_DIR)), - N == 1? "/" : "" + OPT_GIVEN(DSS, SOURCE_DIR) == 1? "/" : "" ); } } @@ -1565,7 +1567,7 @@ static void exit_hook(int exit_code) { pid_t pid; char **argv, *tmp = dss_strdup(OPT_STRING_VAL(DSS, EXIT_HOOK)); - unsigned n = split_args(tmp, &argv, " \t"); + unsigned n = split_args(tmp, &argv); n++; argv = dss_realloc(argv, (n + 1) * sizeof(char *));