X-Git-Url: http://git.tuebingen.mpg.de/?p=dss.git;a=blobdiff_plain;f=dss.c;h=744efaf0965f5a44c68d53d43163ae8dcbb6b209;hp=9dc717da90db8338471268e5a0443c398a7cda72;hb=9f00c1b8d6e8a345aba4ec225d7d90a8a423d5f3;hpb=a24b8c773e1d5be1497c8cbbfe9707d15e88bf7b diff --git a/dss.c b/dss.c index 9dc717d..744efaf 100644 --- a/dss.c +++ b/dss.c @@ -29,11 +29,12 @@ #include "time.h" #include "snap.h" - +/** Command line and config file options. */ static struct gengetopt_args_info conf; +/** Non-NULL if we log to a file. */ static FILE *logfile; +/** The read end of the signal pipe */ static int signal_pipe; - /** Process id of current rsync process. */ static pid_t rsync_pid; /** Whether the rsync process is currently stopped */ @@ -46,11 +47,11 @@ static struct timeval next_snapshot_time; static pid_t pre_create_hook_pid; /** The pid of the post-create hook. */ static pid_t post_create_hook_pid; -/* Creation time of the snapshot currently being created. */ +/** Creation time of the snapshot currently being created. */ static int64_t current_snapshot_creation_time; - +/** Needed by the post-create hook. */ static char *path_to_last_complete_snapshot; - +/** \sa \ref snap.h for details. */ static unsigned snapshot_creation_status; @@ -76,6 +77,14 @@ static int call_command_handler(void) #undef COMMAND #undef COMMANDS +/** + * The log function of dss. + * + * \param ll Loglevel. + * \param fml Usual format string. + * + * All DSS_XXX_LOG() macros use this function. + */ __printf_2_3 void dss_log(int ll, const char* fmt,...) { va_list argp; @@ -124,6 +133,9 @@ static int disk_space_low(void) if (conf.min_free_percent_arg) if (ds.percent_free < conf.min_free_percent_arg) return 1; + if (conf.min_free_percent_inodes_arg) + if (ds.percent_free_inodes < conf.min_free_percent_inodes_arg) + return 1; return 0; } @@ -543,7 +555,6 @@ static int handle_sigchld(void) exit(EXIT_FAILURE); } - static int check_config(void) { if (conf.unit_interval_arg <= 0) { @@ -592,7 +603,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); } @@ -617,7 +629,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) @@ -626,10 +637,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) @@ -681,11 +705,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); @@ -931,7 +950,12 @@ err: exit(EXIT_FAILURE); } - +/** + * The main function of dss. + * + * \param argc Usual argument count. + * \param argv Usual argument vector. + */ int main(int argc, char **argv) { int ret; @@ -939,7 +963,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 */ @@ -947,6 +972,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)