X-Git-Url: http://git.tuebingen.mpg.de/?p=osl.git;a=blobdiff_plain;f=fsck.c;h=357fbe765846a503f0ab7e7b04d47e636048b317;hp=68e31078892e08edcd4fc7e193b5ebdbd9ccf54f;hb=7d53d2f571da94ec9caf85fb456118ebee85fcf9;hpb=e2950383a28766d521a69ec5660b8271f322cbdb diff --git a/fsck.c b/fsck.c index 68e3107..357fbe7 100644 --- a/fsck.c +++ b/fsck.c @@ -39,7 +39,10 @@ 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(num, txt) E_FSCK_ ## num enum { @@ -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;