X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=fsck.c;h=3b605c2d0a65d6260094ba99494009ee8bbfbef8;hp=6d5078c7ea0fa6cdcf5b137acbb31fd06bac6b54;hb=20ad4f0f93da79e2ec0a9699dff58b9922556438;hpb=98b15c02668ea0ef84be6e04daa1838c206658a5 diff --git a/fsck.c b/fsck.c index 6d5078c7..3b605c2d 100644 --- a/fsck.c +++ b/fsck.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2007 Andre Noll + * Copyright (C) 1997-2009 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -19,7 +19,9 @@ static struct fsck_args_info conf; INIT_FSCK_ERRLISTS; -INIT_STDERR_LOGGING(conf.loglevel_arg); + +static int loglevel; +INIT_STDERR_LOGGING(loglevel); /* taken from git */ signed char hexval_table[256] = { @@ -474,7 +476,7 @@ static int dummy_compare(const struct osl_object *obj1, const struct osl_object static unsigned files_pruned; -int prune_disk_storage_file(const char *path, const void *private_data) +int prune_disk_storage_file(const char *path, void *private_data) { HASH_TYPE hash[HASH_SIZE]; unsigned flags = *(unsigned *)private_data; @@ -534,7 +536,8 @@ static int prune_disk_storage_files(struct osl_table *t) PARA_INFO_LOG("looking for unreferenced disk storage files\n"); FOR_EACH_DISK_STORAGE_COLUMN(i, t, cd) { char *dirname = column_filename(t, i); - ret = for_each_file_in_dir(dirname, prune_disk_storage_file, &t->desc->flags); + ret = for_each_file_in_dir(dirname, prune_disk_storage_file, + (unsigned *)&t->desc->flags); free(dirname); } if (files_pruned) @@ -885,14 +888,22 @@ static int check_table(char *base_dir, char *table_name) }; int ret; + PARA_INFO_LOG("checking table %s\n", table_name); if (!conf.no_fsck_given) { ret = fsck(&desc); if (ret < 0) - return ret; + goto out; } + ret = 1; if (!conf.dump_dir_given || !*conf.dump_dir_arg) - return 1; - return dump_table(conf.dump_dir_arg, &desc); + goto out; + ret = dump_table(conf.dump_dir_arg, &desc); +out: + if (ret < 0) + PARA_ERROR_LOG("failed to check table %s\n", table_name); + else + PARA_NOTICE_LOG("successfully checked table %s\n", table_name); + return ret; } static int check_all_tables(char *base_dir) @@ -927,6 +938,14 @@ static int check_all_tables(char *base_dir) return ret; } +/** + * The praslash database check program. + * + * \param argc Usual arg count. + * \param argv Usual arg vector. + * + * \return \p EXIT_SUCCESS or \p EXIT_FAILURE. + */ int main(int argc, char **argv) { int i, ret; @@ -938,8 +957,9 @@ int main(int argc, char **argv) goto out; } HANDLE_VERSION_FLAG("fsck", conf); + loglevel = get_loglevel_by_name(conf.loglevel_arg); if (conf.base_dir_given) - base_dir = conf.base_dir_arg; + base_dir = para_strdup(conf.base_dir_arg); else { char *home = para_homedir(); base_dir = make_message("%s/.paraslash/afs_database", home); @@ -955,9 +975,15 @@ int main(int argc, char **argv) break; } out: - if (!conf.base_dir_given) + if (ret < 0) { + PARA_ERROR_LOG("%s%s: %s\n", + base_dir? "base_dir: " : "", + base_dir? base_dir : "", + para_strerror(-ret) + ); + } else + PARA_NOTICE_LOG("success\n"); + if (base_dir) free(base_dir); - if (ret < 0) - PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret)); return ret < 0? EXIT_FAILURE : EXIT_SUCCESS; }