#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 {
*/
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;
}
/**
{
if (chdir(path) >= 0)
return 1;
- return -ERRNO_TO_ERROR(errno);
+ return errno == EACCES? -E_FSCK_ACCESS : -E_FSCK_CHDIR;
}
/**
*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);
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;