X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=dss.c;h=366f6e222ed4880e8fcde7752eac2bea5ffa9927;hb=f38f86c1d4695a7016d5002e979c4f68ed12fb69;hp=d0dab0dc3f688254163d9d138069a48dd77ccd5b;hpb=3025388040c1521121255e5ae7ceabdcb1b1e421;p=dss.git diff --git a/dss.c b/dss.c index d0dab0d..366f6e2 100644 --- a/dss.c +++ b/dss.c @@ -1055,9 +1055,15 @@ static int handle_sigchld(void) static int change_to_dest_dir(void) { + int ret; const char *dd = OPT_STRING_VAL(DSS, DEST_DIR); + DSS_INFO_LOG(("changing cwd to %s\n", dd)); - return dss_chdir(dd); + if (chdir(dd) >= 0) + return 1; + ret = -ERRNO_TO_DSS_ERROR(errno); + DSS_ERROR_LOG(("could not change cwd to %s\n", dd)); + return ret; } static int check_config(const struct lls_command *cmd) @@ -1341,6 +1347,7 @@ static void create_rsync_argv(char ***argv, int64_t *num) char *logname; int i = 0, j, N = OPT_GIVEN(DSS, RSYNC_OPTION); struct snapshot_list sl; + static bool seeded; dss_get_snapshot_list(&sl); assert(!name_of_reference_snapshot); @@ -1351,6 +1358,14 @@ static void create_rsync_argv(char ***argv, int64_t *num) (*argv)[i++] = dss_strdup("rsync"); (*argv)[i++] = dss_strdup("-a"); (*argv)[i++] = dss_strdup("--delete"); + if (!seeded) { + srandom((unsigned)time(NULL)); /* no need to be fancy here */ + seeded = true; + } + if (1000 * (random() / (RAND_MAX + 1.0)) < OPT_UINT32_VAL(DSS, CHECKSUM)) { + DSS_NOTICE_LOG(("adding --checksum to rsync options\n")); + (*argv)[i++] = dss_strdup("--checksum"); + } for (j = 0; j < N; j++) (*argv)[i++] = dss_strdup(lls_string_val(j, OPT_RESULT(DSS, RSYNC_OPTION))); @@ -1510,14 +1525,23 @@ static void lock_dss_or_die(void) static int com_run(void) { - int ret; + int ret, fd = -1; + char *config_file; + pid_t pid; if (OPT_GIVEN(DSS, DRY_RUN)) { DSS_ERROR_LOG(("dry run not supported by this command\n")); return -E_SYNTAX; } + config_file = get_config_file_name(); + ret = get_dss_pid(config_file, &pid); + free(config_file); + if (ret >= 0) { + DSS_ERROR_LOG(("pid %d\n", (int)pid)); + return -E_ALREADY_RUNNING; + } if (OPT_GIVEN(RUN, DAEMON)) { - daemon_init(); + fd = daemon_init(); daemonized = true; logfile = open_log(OPT_STRING_VAL(RUN, LOGFILE)); } @@ -1526,6 +1550,16 @@ static int com_run(void) ret = install_sighandler(SIGHUP); if (ret < 0) return ret; + if (fd >= 0) { + ret = write(fd, "\0", 1); + if (ret != 1) { + DSS_ERROR_LOG(("write to daemon pipe returned %d\n", + ret)); + if (ret < 0) + return -ERRNO_TO_DSS_ERROR(errno); + return -E_BUG; + } + } ret = select_loop(); if (ret >= 0) /* impossible */ ret = -E_BUG; @@ -1714,7 +1748,7 @@ int main(int argc, char **argv) const struct lls_command *cmd = CMD_PTR(DSS); char *errctx = NULL; unsigned num_inputs; - const struct dss_user_data *ud = NULL; + const struct dss_user_data *ud; ret = lls_parse(argc, argv, cmd, &cmdline_lpr, &errctx); if (ret < 0) {