X-Git-Url: http://git.tuebingen.mpg.de/?p=osl.git;a=blobdiff_plain;f=fsck.c;h=bd1b5567ba86c05d2f168ecf9506c8dcda7ab5f7;hp=68e31078892e08edcd4fc7e193b5ebdbd9ccf54f;hb=aaedc06d0448b048c7d41074985f9ee81e93d077;hpb=6d7dce7f277fc8606fb8d5ed6360660c13a218af diff --git a/fsck.c b/fsck.c index 68e3107..bd1b556 100644 --- a/fsck.c +++ b/fsck.c @@ -14,7 +14,6 @@ #include "log.h" #include "osl.h" -#include "error.h" #include "util.h" #include "osl_core.h" #include "fsck.cmdline.h" @@ -39,8 +38,12 @@ static struct fsck_args_info conf; #define FSCK_ERRORS \ FSCK_ERROR(RANGE_VIOLATION, "range violation detected, very bad"), \ FSCK_ERROR(NOT_A_REGULAR_FILE, "not a regular file"), \ - FSCK_ERROR(SYNTAX, "fsck syntax error"), + FSCK_ERROR(SYNTAX, "fsck syntax error"), \ + FSCK_ERROR(ACCESS, "permission denied"), \ + FSCK_ERROR(CHDIR, "could not change directory"), \ + FSCK_ERROR(OPENDIR, "could not open directory"), +#define FSCK_ERROR_BIT 29 #define FSCK_ERROR(num, txt) E_FSCK_ ## num enum { FSCK_DUMMY = (1 << FSCK_ERROR_BIT) - 1, @@ -217,9 +220,9 @@ static int uint32_compare(const struct osl_object *obj1, const struct osl_object */ static inline int __fchdir(int fd) { - if (fchdir(fd) < 0) - return -ERRNO_TO_ERROR(errno); - return 1; + if (fchdir(fd) >= 0) + return 1; + return errno == EACCES? -E_FSCK_ACCESS : -E_FSCK_CHDIR; } /** @@ -233,7 +236,7 @@ _static_inline_ int __chdir(const char *path) { if (chdir(path) >= 0) return 1; - return -ERRNO_TO_ERROR(errno); + return errno == EACCES? -E_FSCK_ACCESS : -E_FSCK_CHDIR; } /** @@ -276,7 +279,7 @@ static int fsck_opendir(const char *dirname, DIR **dir, int *cwd) *dir = opendir("."); if (*dir) return 1; - ret = -ERRNO_TO_ERROR(errno); + ret = errno == EACCES? -E_FSCK_ACCESS : -E_FSCK_OPENDIR; /* Ignore return value of fchdir() and close(). We're busted anyway. */ if (cwd) fchdir(*cwd); @@ -310,7 +313,7 @@ static int for_each_file_in_dir(const char *dirname, int cwd_fd, ret2, ret = fsck_opendir(dirname, &dir, &cwd_fd); if (ret < 0) - return ret == -ERRNO_TO_ERROR(EACCES)? 1 : ret; + return ret == -E_FSCK_ACCESS? 1 : ret; /* scan cwd recursively */ while ((entry = readdir(dir))) { mode_t m; @@ -1059,12 +1062,12 @@ static int dump_rows(char *dump_dir, struct osl_table *t) current_dir = make_message("%s/rows_%u-%u", dump_dir, i, i + 999); NOTICE_LOG("dumping rows %u - %u\n", i, i + 999); ret = osl_mkdir(current_dir, 0777); - if (ret < 0 && !is_errno(-ret, EEXIST)) + if (ret < 0 && ret != -E_OSL_DIR_EXISTS) goto out; } row_dir = make_message("%s/row_%03u", current_dir, i); ret = osl_mkdir(row_dir, 0777); - if (ret < 0 && !is_errno(-ret, EEXIST)) { + if (ret < 0 && ret != -E_OSL_DIR_EXISTS) { free(row_dir); goto out; } @@ -1088,11 +1091,11 @@ static int dump_table(char *dump_dir, struct osl_table_description *desc) if (ret < 0) goto out; ret = osl_mkdir(dump_dir, 0777); - if (ret < 0 && !is_errno(-ret, EEXIST)) + if (ret < 0 && ret != -E_OSL_DIR_EXISTS) goto out; table_dump_dir = make_message("%s/%s", dump_dir, desc->name); ret = osl_mkdir(table_dump_dir, 0777); - if (ret < 0 && !is_errno(-ret, EEXIST)) + if (ret < 0 && ret != -E_OSL_DIR_EXISTS) goto out; desc_file = make_message("%s/table_description.c", table_dump_dir); ret = osl_open(desc_file, O_WRONLY | O_CREAT | O_EXCL, 0644);