diff --git a/src/fs_local.c b/src/fs_local.c index c143bf3..3613db6 100644 --- a/src/fs_local.c +++ b/src/fs_local.c @@ -13,9 +13,6 @@ #include "fsource.h" #include "error.h" -/* for eaccess, define in unistd.h */ -#define __USE_GNU - #include #include #include @@ -154,33 +151,7 @@ int lfs_access(IsoFileSource *src) } data = src->data; - if (eaccess(data->path, R_OK) != 0) { - int err; - - /* error, choose an appropriate return code */ - switch (errno) { - case EACCES: - err = ISO_FILE_ACCESS_DENIED; - break; - case ENOTDIR: - case ENAMETOOLONG: - case ELOOP: - err = ISO_FILE_BAD_PATH; - break; - case ENOENT: - err = ISO_FILE_DOESNT_EXIST; - break; - case EFAULT: - case ENOMEM: - err = ISO_MEM_ERROR; - break; - default: - err = ISO_FILE_ERROR; - break; - } - return err; - } - return ISO_SUCCESS; + return iso_eaccess(data->path); } static diff --git a/src/util.c b/src/util.c index 28e53d1..e2dffe3 100644 --- a/src/util.c +++ b/src/util.c @@ -19,6 +19,10 @@ #include #include +/* for eaccess, define in unistd.h */ +#define __USE_GNU +#include + int int_pow(int base, int power) { int result = 1; @@ -572,3 +576,43 @@ time_t iso_datetime_read_17(const uint8_t *buf) return timegm(&tm) - buf[16] * 60 * 15; } + +/** + * Check whether the caller process has read access to the given local file. + * + * @return + * 1 on success (i.e, the process has read access), < 0 on error + * (including ISO_FILE_ACCESS_DENIED on access denied to the specified file + * or any directory on the path). + */ +int iso_eaccess(const char *path) +{ + // TODO replace non-standard eaccess with our own implementation + if (eaccess(path, R_OK) != 0) { + int err; + + /* error, choose an appropriate return code */ + switch (errno) { + case EACCES: + err = ISO_FILE_ACCESS_DENIED; + break; + case ENOTDIR: + case ENAMETOOLONG: + case ELOOP: + err = ISO_FILE_BAD_PATH; + break; + case ENOENT: + err = ISO_FILE_DOESNT_EXIST; + break; + case EFAULT: + case ENOMEM: + err = ISO_MEM_ERROR; + break; + default: + err = ISO_FILE_ERROR; + break; + } + return err; + } + return ISO_SUCCESS; +} diff --git a/src/util.h b/src/util.h index 137be1b..cc7f9fb 100644 --- a/src/util.h +++ b/src/util.h @@ -122,6 +122,16 @@ void iso_datetime_17(uint8_t *buf, time_t t); time_t iso_datetime_read_7(const uint8_t *buf); time_t iso_datetime_read_17(const uint8_t *buf); +/** + * Check whether the caller process has read access to the given local file. + * + * @return + * 1 on success (i.e, the process has read access), < 0 on error + * (including ISO_FILE_ACCESS_DENIED on access denied to the specified file + * or any directory on the path). + */ +int iso_eaccess(const char *path); + typedef struct iso_rbtree IsoRBTree; /**