X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=fsck.c;h=391516f30ebeacb82758c1aa4af51bfffa45e0c6;hp=7bca01637beddba149f7476bd994f1e2940618a0;hb=f7fb539505316b2cd8c5e57b6529d43b936208fb;hpb=6c3da3d98f13377c20b6ade64480e7bb9f6f7320 diff --git a/fsck.c b/fsck.c index 7bca0163..391516f3 100644 --- a/fsck.c +++ b/fsck.c @@ -1,4 +1,17 @@ +/* + * Copyright (C) 1997-2007 Andre Noll + * + * Licensed under the GPL v2. For licencing details see COPYING. + */ + +/** \file fsck.c The program used to check an osl table. */ + + +#include +#include + #include "para.h" +#include "fd.h" #include "error.h" #include "osl_core.h" #include "fsck.cmdline.h" @@ -558,6 +571,7 @@ static int check_disk_storage_columns(struct osl_table *t) out_close_hash_tree: osl_close_table(hash_tree_table, 0); free(hashes); + hashes = NULL; out: clear_rbtrees(t); /* TODO why are we doing that here? Seems odd */ return ret; @@ -856,10 +870,60 @@ out: return ret; } +static int check_table(char *base_dir, char *table_name) +{ + struct osl_table_description desc = { + .column_descriptions = NULL, + .dir = base_dir, + .name = table_name + }; + int ret; + + if (!conf.no_fsck_given) { + ret = fsck(&desc); + if (ret < 0) + return ret; + } + if (!conf.dump_dir_given || !*conf.dump_dir_arg) + return 1; + return dump_table(conf.dump_dir_arg, &desc); +} + +static int check_all_tables(char *base_dir) +{ + DIR *dir; + struct dirent *entry; + int cwd_fd, ret2, ret = para_opendir(base_dir, &dir, &cwd_fd); + + if (ret < 0) + return ret; + while ((entry = readdir(dir))) { + mode_t m; + struct stat s; + if (!strcmp(entry->d_name, ".")) + continue; + if (!strcmp(entry->d_name, "..")) + continue; + if (lstat(entry->d_name, &s) == -1) + continue; + m = s.st_mode; + if (!S_ISDIR(m)) + continue; + ret = check_table(base_dir, entry->d_name); + if (ret < 0) + break; + } + closedir(dir); + ret2 = para_fchdir(cwd_fd); + if (ret2 < 0 && ret >= 0) + ret = ret2; + close(cwd_fd); + return ret; +} + int main(__a_unused int argc, char **argv) { int i, ret; - struct osl_table_description desc = {.column_descriptions = NULL}; char *base_dir = NULL; ret = fsck_cmdline_parser(argc, argv, &conf); @@ -868,34 +932,25 @@ int main(__a_unused int argc, char **argv) goto out; } 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) { + if (conf.base_dir_given) + base_dir = conf.base_dir_arg; + else { char *home = para_homedir(); base_dir = make_message("%s/.paraslash/afs_database", home); free(home); - desc.dir = base_dir; + } + if (!conf.inputs_num) { + ret = check_all_tables(base_dir); + goto out; } 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; - } + ret = check_table(base_dir, conf.inputs[i]); + if (ret < 0) + break; } - free(base_dir); - ret = 1; out: + if (!conf.base_dir_given) + free(base_dir); if (ret < 0) PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret)); return ret < 0? EXIT_FAILURE : EXIT_SUCCESS;