X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=fsck.c;h=7bca01637beddba149f7476bd994f1e2940618a0;hp=bc4083aed2cf988922a259e9a391f553eb96fc00;hb=5f05aea3182a80a625c3ce15380136e682497be2;hpb=e95fc5a017e89dd9004836d759163056b0dc7095 diff --git a/fsck.c b/fsck.c index bc4083ae..7bca0163 100644 --- a/fsck.c +++ b/fsck.c @@ -1,18 +1,12 @@ #include "para.h" #include "error.h" #include "osl_core.h" +#include "fsck.cmdline.h" -#define OSL_DUMP_DIR "/tmp/osldump" +static struct fsck_args_info conf; -enum errors { - E_FSCK_SYNTAX = 501, - E_RANGE_VIOLATION, - E_NO_DS_FILE, - E_NOT_A_REGULAR_FILE, - E_BAD_HASH_PATH, -}; - -INIT_STDERR_LOGGING(1); +INIT_FSCK_ERRLISTS; +INIT_STDERR_LOGGING(conf.loglevel_arg); /* taken from git */ signed char hexval_table[256] = { @@ -93,7 +87,8 @@ static int check_range(struct osl_table *t, uint32_t row_num, uint32_t col_num) // PARA_INFO_LOG("obj: %p..%p\n", obj_start, obj_start + obj.size); // PARA_INFO_LOG("map: %p..%p\n", map_start, map_start + col->data_map.size); if (obj_start < map_start || obj_start + obj.size > map_start + col->data_map.size) { - PARA_CRIT_LOG("row %u, col %u: range violation, very bad\n", row_num, col_num); + PARA_CRIT_LOG("range violation in row %u, col %u\n", row_num, + col_num); return -E_RANGE_VIOLATION; } PARA_DEBUG_LOG("col %u: ok\n", col_num); @@ -568,10 +563,6 @@ out: return ret; } -#define FSCK 1 -#define FORCE 1 -#define DUMP 0 - static void set_dummy_contents(struct osl_table_description *desc) { int i; @@ -603,7 +594,7 @@ static int fsck_init(struct osl_table_description *desc, struct osl_table **t) } PARA_INFO_LOG("unmapping index\n"); para_munmap(map.data, map.size); - if (FORCE) + if (conf.force_given) ret = map_table(*t, (MAP_TBL_FL_IGNORE_DIRTY)); else ret = map_table(*t, 0); @@ -864,25 +855,48 @@ out: fsck_cleanup(t); return ret; } -int main(__a_unused int argc, __a_unused char **argv) + +int main(__a_unused int argc, char **argv) { - int ret; + int i, ret; struct osl_table_description desc = {.column_descriptions = NULL}; + char *base_dir = NULL; - ret = -E_FSCK_SYNTAX; - if (argc < 3) + ret = fsck_cmdline_parser(argc, argv, &conf); + if (ret < 0) { + ret = -E_FSCK_SYNTAX; goto out; - desc.dir = argv[1]; - desc.name = argv[2]; - if (FSCK) { - ret = fsck(&desc); - if (ret < 0) - goto out; } - if (DUMP) - ret = dump_table(OSL_DUMP_DIR, &desc); + HANDLE_VERSION_FLAG("fsck", conf); + if (!conf.inputs_num) { + /* FIXME: Find all subdirs */ + ret = -E_FSCK_SYNTAX; + goto out; + } + desc.dir = conf.base_dir_arg; + if (!conf.base_dir_given) { + char *home = para_homedir(); + base_dir = make_message("%s/.paraslash/afs_database", home); + free(home); + desc.dir = base_dir; + } + for (i = 0; i < conf.inputs_num; i++) { + desc.name = conf.inputs[i]; + if (!conf.no_fsck_given) { + ret = fsck(&desc); + if (ret < 0) + break; + } + if (conf.dump_dir_given && *conf.dump_dir_arg) { + ret = dump_table(conf.dump_dir_arg, &desc); + if (ret < 0) + break; + } + } + free(base_dir); + ret = 1; out: if (ret < 0) - PARA_ERROR_LOG("error %d\n", ret); - return ret < 0? EXIT_FAILURE: EXIT_SUCCESS; + PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret)); + return ret < 0? EXIT_FAILURE : EXIT_SUCCESS; }