diff -r 5e309e37906e -r a5837882a252 librazor/uri-io.c --- a/librazor/uri-io.c Fri Jul 08 17:52:02 2016 +0100 +++ b/librazor/uri-io.c Mon Jul 11 16:12:45 2016 +0100 @@ -56,7 +56,7 @@ (s1) ? 1 : (s2) ? -1 : 0) static void * -razor_archive_get_file_contents(const char *filename, int fd, const char *path, +razor_archive_get_file_contents(const char *filename, const char *path, size_t *length, struct razor_error **error) { #if HAVE_LIBARCHIVE @@ -73,7 +73,7 @@ archive_read_support_compression_all(a); archive_read_support_format_all(a); - r = archive_read_open_fd(a, fd, 10240); + r = archive_read_open_filename(a, filename, 10240); if (r) { errmsg = archive_error_string(a); @@ -161,7 +161,7 @@ razor_file_get_contents_archive(const char *filename, size_t *length, struct razor_error **error) { - int fd; + int is_dir; char *path, *slash, *s; void *addr; struct razor_error *tmp_error = NULL; @@ -171,37 +171,23 @@ while (slash) { *slash = '\0'; - fd = open(path, O_RDONLY | O_BINARY); - if (fd >= 0) { - addr = razor_archive_get_file_contents(path, fd, - slash + 1, - length, - error); + is_dir = razor_file_is_directory(path, NULL); + if (is_dir < 0) { + s = strrchr(path, '/'); + *slash = '/'; + slash = s; + } else if (!is_dir) { + addr = razor_archive_get_file_contents(path, slash + 1, + length, error); free(path); - close(fd); return addr; -#ifdef MSWIN_API - } else if (errno != ENOTDIR && errno != ENOENT) { -#else - } else if (errno != ENOTDIR) { -#endif - free(path); - razor_set_error_posix(error, filename); - return NULL; - } - s = strrchr(path, '/'); - *slash = '/'; - slash = s; + } else + break; } free(path); -#ifdef MSWIN_API - razor_set_error(error, RAZOR_POSIX_ERROR, ENOENT, filename, - strerror(ENOENT)); -#else razor_set_error(error, RAZOR_POSIX_ERROR, ENOTDIR, filename, strerror(ENOTDIR)); -#endif return NULL; } @@ -219,7 +205,7 @@ void *razor_file_get_contents(const char *filename, size_t *length, int private, struct razor_error **error) { - int fd; + int fd, saved_errno; struct stat st; void *addr = NULL; size_t nb, size; @@ -228,17 +214,28 @@ fd = open(filename, O_RDONLY | O_BINARY); if (fd < 0) { + saved_errno = errno; #ifdef MSWIN_API - if (errno != ENOTDIR && errno != ENOENT) { + if (saved_errno != ENOTDIR && saved_errno != ENOENT) { #else - if (errno != ENOTDIR) { + if (saved_errno != ENOTDIR) { #endif razor_set_error_posix(error, filename); return NULL; } addr = razor_file_get_contents_archive(filename, &size, error); - if (!addr) + if (!addr) { + if (error && saved_errno != ENOTDIR && + razor_error_matches(error, RAZOR_POSIX_ERROR, + ENOTDIR)) { + razor_error_free(*error); + *error = NULL; + razor_set_error(error, RAZOR_POSIX_ERROR, + saved_errno, filename, + strerror(saved_errno)); + } return NULL; + } } else { if (fstat(fd, &st) < 0) { razor_set_error_posix(error, filename);