X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=dss.c;h=cd69c27d85a5066a49c00817621db6371c01d31e;hb=20afe2a3b5467c42610a5587ad6914c035930fc8;hp=ef42e39cf0923a141eb1d9b3f4f07a1f1a252089;hpb=cf071bc345919c98c3c0e8737d731bd95411bd67;p=dss.git diff --git a/dss.c b/dss.c index ef42e39..cd69c27 100644 --- a/dss.c +++ b/dss.c @@ -1,3 +1,8 @@ +/* + * Copyright (C) 2008 Andre Noll + * + * Licensed under the GPL v2. For licencing details see COPYING. + */ #include #include #include @@ -119,7 +124,6 @@ static __printf_1_2 void dss_msg(const char* fmt,...) va_end(argp); } -/* TODO: Also consider number of inodes. */ static int disk_space_low(void) { struct disk_space ds; @@ -214,7 +218,7 @@ static int remove_redundant_snapshot(struct snapshot_list *sl) struct snapshot *s; unsigned missing = 0; - DSS_INFO_LOG("looking for intervals containing too many snapshots\n"); + DSS_DEBUG_LOG("looking for intervals containing too many snapshots\n"); for (interval = conf.num_intervals_arg - 1; interval >= 0; interval--) { unsigned keep = desired_number_of_snapshots(interval, conf.num_intervals_arg); unsigned num = sl->interval_count[interval]; @@ -271,7 +275,7 @@ static int remove_outdated_snapshot(struct snapshot_list *sl) int i, ret; struct snapshot *s; - DSS_INFO_LOG("looking for snapshots belonging to intervals greater than %d\n", + DSS_DEBUG_LOG("looking for snapshots belonging to intervals greater than %d\n", conf.num_intervals_arg); FOR_EACH_SNAPSHOT(s, i, sl) { if (s->interval <= conf.num_intervals_arg) @@ -341,7 +345,7 @@ static int try_to_free_disk_space(int low_disk_space) if (ret) goto out; DSS_CRIT_LOG("uhuhu: not enough disk space for a single snapshot\n"); - ret= -ENOSPC; + ret = -ERRNO_TO_DSS_ERROR(ENOSPC); out: free_snapshot_list(&sl); return ret; @@ -603,7 +607,8 @@ static void parse_config_file(int override) .override = override, .initialize = 0, .check_required = 1, - .check_ambiguity = 0 + .check_ambiguity = 0, + .print_errors = 1 }; cmdline_parser_config_file(config_file, &conf, ¶ms); } @@ -628,7 +633,6 @@ static void parse_config_file(int override) } DSS_EMERG_LOG("loglevel: %d\n", conf.loglevel_arg); // cmdline_parser_dump(logfile? logfile : stdout, &conf); - ret = dss_chdir(conf.dest_dir_arg); out: free(config_file); if (ret >= 0) @@ -637,10 +641,23 @@ out: exit(EXIT_FAILURE); } +static void change_to_dest_dir(void) +{ + int ret; + + DSS_INFO_LOG("changing cwd to %s\n", conf.dest_dir_arg); + ret = dss_chdir(conf.dest_dir_arg); + if (ret >= 0) + return; + DSS_EMERG_LOG("%s\n", dss_strerror(-ret)); + exit(EXIT_FAILURE); +} + static void handle_sighup(void) { DSS_NOTICE_LOG("SIGHUP\n"); parse_config_file(1); + change_to_dest_dir(); } static void handle_signal(void) @@ -692,11 +709,6 @@ static void create_rsync_argv(char ***argv, int64_t *num) free(newest); } else DSS_INFO_LOG("no previous snapshot found\n"); - if (conf.exclude_patterns_given) { - (*argv)[i++] = dss_strdup("--exclude-from"); - (*argv)[i++] = dss_strdup(conf.exclude_patterns_arg); - - } logname = dss_logname(); if (conf.remote_user_given && !strcmp(conf.remote_user_arg, logname)) (*argv)[i++] = dss_strdup(conf.source_dir_arg); @@ -738,21 +750,25 @@ static int create_snapshot(char **argv) static int select_loop(void) { int ret; - struct timeval tv = {.tv_sec = 0, .tv_usec = 0}; + /* check every 60 seconds for free disk space */ + struct timeval tv; for (;;) { fd_set rfds; int low_disk_space; char **rsync_argv; - struct timeval now, *tvp = &tv; + struct timeval now, *tvp; - if (rsync_pid) - tv.tv_sec = 60; /* check every 60 seconds for free disk space */ - else if (rm_pid) + if (rm_pid) tvp = NULL; /* sleep until rm process dies */ + else { /* sleep one minute */ + tv.tv_sec = 60; + tv.tv_usec = 0; + tvp = &tv; + } FD_ZERO(&rfds); FD_SET(signal_pipe, &rfds); - DSS_DEBUG_LOG("tvp: %p, tv_sec: %lu\n", tvp, (long unsigned) tv.tv_sec); + DSS_DEBUG_LOG("tvp: %p, tv_sec : %lu\n", tvp, (long unsigned) tv.tv_sec); ret = dss_select(signal_pipe + 1, &rfds, NULL, tvp); if (ret < 0) return ret; @@ -773,7 +789,7 @@ static int select_loop(void) } restart_rsync_process(); gettimeofday(&now, NULL); - if (tv_diff(&next_snapshot_time, &now, &tv) > 0) + if (tv_diff(&next_snapshot_time, &now, NULL) > 0) continue; switch (snapshot_creation_status) { case SCS_READY: @@ -955,7 +971,8 @@ int main(int argc, char **argv) .override = 0, .initialize = 1, .check_required = 0, - .check_ambiguity = 0 + .check_ambiguity = 0, + .print_errors = 1 }; cmdline_parser_ext(argc, argv, &conf, ¶ms); /* aborts on errors */ @@ -963,6 +980,7 @@ int main(int argc, char **argv) if (conf.daemon_given) daemon_init(); + change_to_dest_dir(); setup_signal_handling(); ret = call_command_handler(); if (ret < 0)