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;
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");
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) {
} 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 {
* 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,