]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Add system zchunk support 270/head
authorJonathan Dieter <jdieter@gmail.com>
Mon, 28 May 2018 18:52:31 +0000 (21:52 +0300)
committerJonathan Dieter <jdieter@gmail.com>
Fri, 28 Sep 2018 22:11:32 +0000 (23:11 +0100)
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
CMakeLists.txt
ext/solv_xfopen.c

index 8c6a1bea6100628e496141e459dd374f14fb9f87..6def381856da9907afc98b0e19fce3f5b9fd1f87 100644 (file)
@@ -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)
index a74762f262ca6e5ef68262e4f715b1e9703156f6..d5764ee06430bf2bf1795b93f783d0fe219ed66a 100644 (file)
@@ -504,26 +504,63 @@ static inline FILE *myzstdfdopen(int fd, const char *mode)
 
 #ifdef ENABLE_ZCHUNK_COMPRESSION
 
+#ifdef USE_SYSTEM_ZCHUNK
+#include <zck.h>
+
+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);