static int check_config(void)
{
- int ret;
uint32_t unit_interval = OPT_UINT32_VAL(DSS, UNIT_INTERVAL);
uint32_t num_intervals = OPT_UINT32_VAL(DSS, NUM_INTERVALS);
DSS_ERROR_LOG(("--dest-dir required\n"));
return -E_SYNTAX;
}
- ret = change_to_dest_dir();
- if (ret < 0)
- return ret;
}
DSS_DEBUG_LOG(("number of intervals: %i\n", num_intervals));
return 1;
close(fd);
out:
free(config_file);
- if (ret < 0)
- DSS_EMERG_LOG(("%s\n", dss_strerror(-ret)));
return ret;
}
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? "/" : ""
);
}
}
{
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 *));
DSS_ERROR_LOG(("pid %d\n", (int)pid));
return -E_ALREADY_RUNNING;
}
+ /*
+ * Order is important here: Since daemon_init() forks, it would drop
+ * the lock if it had been acquired already. Changing the cwd before
+ * grabbing the lock causes stat(2) to fail in case a relative config
+ * file path was given, which results in a different key ID for
+ * locking. Therefore we must first daemonize, then lock, then change
+ * the cwd.
+ */
if (OPT_GIVEN(RUN, DAEMON)) {
fd = daemon_init();
daemonized = true;
logfile = open_log(OPT_STRING_VAL(RUN, LOGFILE));
}
lock_dss_or_die();
+ ret = change_to_dest_dir();
+ if (ret < 0)
+ return ret;
dump_dss_config("startup");
ret = install_sighandler(SIGHUP);
if (ret < 0)
struct snapshot *victim;
struct disk_space ds;
char *why;
+ bool try_hard;
lock_dss_or_die();
- ret = get_disk_space(".", &ds);
+ ret = change_to_dest_dir();
if (ret < 0)
return ret;
- log_disk_space(&ds);
+ switch (OPT_UINT32_VAL(PRUNE, DISK_SPACE)) {
+ case FDS_LOW: try_hard = true; break;
+ case FDS_HIGH: try_hard = false; break;
+ default:
+ ret = get_disk_space(".", &ds);
+ if (ret < 0)
+ return ret;
+ log_disk_space(&ds);
+ try_hard = disk_space_low(&ds);
+ }
dss_get_snapshot_list(&sl);
- victim = find_removable_snapshot(&sl, disk_space_low(&ds), &why);
+ victim = find_removable_snapshot(&sl, try_hard, &why);
if (!victim) {
dss_msg("nothing to prune\n");
ret = 0;
char **rsync_argv;
lock_dss_or_die();
+ ret = change_to_dest_dir();
+ if (ret < 0)
+ return ret;
if (OPT_GIVEN(DSS, DRY_RUN)) {
int i;
char *msg = NULL;
static int com_ls(void)
{
- int i;
+ int i, ret;
struct snapshot_list sl;
struct snapshot *s;
int64_t now = get_current_time();
+ ret = change_to_dest_dir();
+ if (ret < 0)
+ return ret;
dss_get_snapshot_list(&sl);
FOR_EACH_SNAPSHOT(s, i, &sl) {
int64_t d;