From: Jonathan Dieter Date: Mon, 28 May 2018 18:52:31 +0000 (+0300) Subject: Add system zchunk support X-Git-Tag: 0.7.0~16^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F270%2Fhead;p=thirdparty%2Flibsolv.git Add system zchunk support Signed-off-by: Jonathan Dieter --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c6a1bea..6def3818 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,9 @@ PROJECT (libsolv) CMAKE_MINIMUM_REQUIRED (VERSION 2.4) +IF (COMMAND CMAKE_POLICY) +CMAKE_POLICY(SET CMP0003 NEW) +ENDIF (COMMAND CMAKE_POLICY) OPTION (ENABLE_STATIC "Build a static version of the libraries?" OFF) OPTION (DISABLE_SHARED "Do not build a shared version of the libraries?" OFF) @@ -35,7 +38,7 @@ OPTION (ENABLE_LZMA_COMPRESSION "Build with lzma/xz compression support?" OFF) OPTION (ENABLE_BZIP2_COMPRESSION "Build with bzip2 compression support?" OFF) OPTION (ENABLE_ZSTD_COMPRESSION "Build with zstd compression support?" OFF) OPTION (ENABLE_ZCHUNK_COMPRESSION "Build with zchunk compression support?" OFF) - +OPTION (USE_SYSTEM_ZCHUNK "Use system zchunk library?" OFF) OPTION (WITH_LIBXML2 "Build with libxml2 instead of libexpat?" OFF) # Library @@ -156,6 +159,12 @@ IF (ENABLE_ARCHREPO OR ENABLE_DEBIAN) SET (ENABLE_LZMA_COMPRESSION ON) ENDIF (ENABLE_ARCHREPO OR ENABLE_DEBIAN) +IF (USE_SYSTEM_ZCHUNK) +SET (ENABLE_ZCHUNK_COMPRESSION ON) +FIND_PACKAGE(PkgConfig REQUIRED) +PKG_CHECK_MODULES(ZCHUNK zck REQUIRED) +ENDIF (USE_SYSTEM_ZCHUNK) + IF (ENABLE_ZCHUNK_COMPRESSION) SET (ENABLE_ZSTD_COMPRESSION ON) ENDIF (ENABLE_ZCHUNK_COMPRESSION) @@ -294,7 +303,8 @@ FOREACH (VAR ENABLE_SUSEREPO ENABLE_COMPS ENABLE_TESTCASE_HELIXREPO ENABLE_HELIXREPO ENABLE_MDKREPO ENABLE_ARCHREPO ENABLE_DEBIAN ENABLE_HAIKU ENABLE_ZLIB_COMPRESSION ENABLE_LZMA_COMPRESSION ENABLE_BZIP2_COMPRESSION - ENABLE_ZSTD_COMPRESSION ENABLE_ZCHUNK_COMPRESSION ENABLE_PGPVRFY ENABLE_APPDATA) + ENABLE_ZSTD_COMPRESSION ENABLE_ZCHUNK_COMPRESSION ENABLE_PGPVRFY ENABLE_APPDATA + USE_SYSTEM_ZCHUNK) IF(${VAR}) ADD_DEFINITIONS (-D${VAR}=1) SET (SWIG_FLAGS ${SWIG_FLAGS} -D${VAR}) @@ -399,6 +409,9 @@ ENDIF (ENABLE_BZIP2_COMPRESSION) IF (ENABLE_ZSTD_COMPRESSION) SET (SYSTEM_LIBRARIES ${SYSTEM_LIBRARIES} ${ZSTD_LIBRARY}) ENDIF (ENABLE_ZSTD_COMPRESSION) +IF (USE_SYSTEM_ZCHUNK) +SET (SYSTEM_LIBRARIES ${SYSTEM_LIBRARIES} ${ZCHUNK_LIBRARIES}) +ENDIF (USE_SYSTEM_ZCHUNK) IF (ENABLE_RPMDB) SET (SYSTEM_LIBRARIES ${RPMDB_LIBRARY} ${SYSTEM_LIBRARIES}) ENDIF (ENABLE_RPMDB) diff --git a/ext/solv_xfopen.c b/ext/solv_xfopen.c index a74762f2..d5764ee0 100644 --- a/ext/solv_xfopen.c +++ b/ext/solv_xfopen.c @@ -504,26 +504,63 @@ static inline FILE *myzstdfdopen(int fd, const char *mode) #ifdef ENABLE_ZCHUNK_COMPRESSION +#ifdef USE_SYSTEM_ZCHUNK +#include + +static ssize_t cookie_zckread(void *cookie, char *buf, size_t nbytes) +{ + return zck_read((zckCtx *)cookie, buf, nbytes); +} + +static ssize_t cookie_zckwrite(void *cookie, const char *buf, size_t nbytes) +{ + return zck_write((zckCtx *)cookie, buf, nbytes); +} + +static int cookie_zckclose(void *cookie) +{ + zckCtx *zck = (zckCtx *)cookie; + zck_free(&zck); + return 0; +} +#else #include "solv_zchunk.h" +#endif static void *zchunkopen(const char *path, const char *mode, int fd) { FILE *fp; - void *f; if (!path && fd < 0) return 0; - if (strcmp(mode, "r") != 0) - return 0; if (fd != -1) fp = fdopen(fd, mode); else fp = fopen(path, mode); if (!fp) return 0; + +#ifdef USE_SYSTEM_ZCHUNK + zckCtx *f = zck_create(); + if(!f) + return NULL; + if(strncmp(mode, "r", 2) == 0) { + if(!zck_init_read(f, fileno(fp))) + return NULL; + } else { + if(!zck_init_write(f, fileno(fp))) + return NULL; + } + return cookieopen(f, mode, cookie_zckread, cookie_zckwrite, cookie_zckclose); +#else + if (strcmp(mode, "r") != 0) + return 0; + + void *f; f = solv_zchunk_open(fp, 1); if (!f) fclose(fp); return cookieopen(f, mode, (ssize_t (*)(void *, char *, size_t))solv_zchunk_read, 0, (int (*)(void *))solv_zchunk_close); +#endif } static inline FILE *myzchunkfopen(const char *fn, const char *mode) @@ -535,7 +572,6 @@ static inline FILE *myzchunkfdopen(int fd, const char *mode) { return zchunkopen(0, mode, fd); } - #endif FILE * @@ -584,7 +620,7 @@ solv_xfopen(const char *fn, const char *mode) if (suf && !strcmp(suf, ".zck")) return myzchunkfopen(fn, mode); #else - if (suf && !strcmp(suf, ".zst")) + if (suf && !strcmp(suf, ".zck")) return 0; #endif return fopen(fn, mode); @@ -649,7 +685,7 @@ solv_xfopen_fd(const char *fn, int fd, const char *mode) if (suf && !strcmp(suf, ".zck")) return myzchunkfdopen(fd, simplemode); #else - if (suf && !strcmp(suf, ".zst")) + if (suf && !strcmp(suf, ".zck")) return 0; #endif return fdopen(fd, mode);