diff --git a/src/apk_archive.h b/src/apk_archive.h index ac2387f..0b280fc 100644 --- a/src/apk_archive.h +++ b/src/apk_archive.h @@ -21,7 +21,6 @@ typedef int (*apk_archive_entry_parser)(void *ctx, struct apk_istream *istream); int apk_file_get_info(const char *filename, struct apk_file_info *fi); -struct apk_istream *apk_gunzip_bstream(struct apk_bstream *); int apk_parse_tar(struct apk_istream *, apk_archive_entry_parser parser, void *ctx); int apk_parse_tar_gz(struct apk_bstream *, apk_archive_entry_parser parser, void *ctx); diff --git a/src/apk_io.h b/src/apk_io.h index f0b06e1..96dc7c9 100644 --- a/src/apk_io.h +++ b/src/apk_io.h @@ -38,6 +38,8 @@ struct apk_bstream { void (*close)(void *stream, csum_p csum); }; +struct apk_istream *apk_gunzip_bstream(struct apk_bstream *); + struct apk_istream *apk_istream_from_fd(int fd); struct apk_istream *apk_istream_from_file(const char *file); size_t apk_istream_skip(struct apk_istream *istream, size_t size); @@ -46,6 +48,8 @@ size_t apk_istream_splice(void *stream, int fd, size_t size); struct apk_bstream *apk_bstream_from_istream(struct apk_istream *istream); struct apk_bstream *apk_bstream_from_fd(int fd); +struct apk_istream *apk_istream_from_file_gz(const char *file); + apk_blob_t apk_blob_from_istream(struct apk_istream *istream, size_t size); apk_blob_t apk_blob_from_file(const char *file); diff --git a/src/database.c b/src/database.c index 0795a0b..13fc7b9 100644 --- a/src/database.c +++ b/src/database.c @@ -670,8 +670,8 @@ int apk_db_add_repository(apk_database_t _db, apk_blob_t repository) .url = apk_blob_cstr(repository) }; - snprintf(tmp, sizeof(tmp), "%s/APK_INDEX", db->repos[r].url); - is = apk_istream_from_file(tmp); + snprintf(tmp, sizeof(tmp), "%s/APK_INDEX.gz", db->repos[r].url); + is = apk_istream_from_file_gz(tmp); if (is == NULL) { apk_error("Failed to open index file %s", tmp); return -1; diff --git a/src/io.c b/src/io.c index 84b556b..e4dfd33 100644 --- a/src/io.c +++ b/src/io.c @@ -362,3 +362,15 @@ int apk_file_get_info(const char *filename, struct apk_file_info *fi) return 0; } + +struct apk_istream *apk_istream_from_file_gz(const char *file) +{ + int fd; + + fd = open(file, O_RDONLY); + if (fd < 0) + return NULL; + + return apk_gunzip_bstream(apk_bstream_from_fd(fd)); +} +