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)
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_SYSTEM_ZCHUNK "Use system zchunk library?" OFF)
OPTION (WITH_LIBXML2 "Build with libxml2 instead of libexpat?" OFF)
# Library
SET (ENABLE_LZMA_COMPRESSION ON)
ENDIF (ENABLE_ARCHREPO OR ENABLE_DEBIAN)
-IF (USE_SYSTEM_ZCHUNK)
+IF (WITH_SYSTEM_ZCHUNK)
SET (ENABLE_ZCHUNK_COMPRESSION ON)
FIND_PACKAGE(PkgConfig REQUIRED)
PKG_CHECK_MODULES(ZCHUNK zck REQUIRED)
-ENDIF (USE_SYSTEM_ZCHUNK)
+ENDIF (WITH_SYSTEM_ZCHUNK)
IF (ENABLE_ZCHUNK_COMPRESSION)
SET (ENABLE_ZSTD_COMPRESSION ON)
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
- USE_SYSTEM_ZCHUNK)
+ WITH_SYSTEM_ZCHUNK)
IF(${VAR})
ADD_DEFINITIONS (-D${VAR}=1)
SET (SWIG_FLAGS ${SWIG_FLAGS} -D${VAR})
IF (ENABLE_ZSTD_COMPRESSION)
SET (SYSTEM_LIBRARIES ${SYSTEM_LIBRARIES} ${ZSTD_LIBRARY})
ENDIF (ENABLE_ZSTD_COMPRESSION)
-IF (USE_SYSTEM_ZCHUNK)
+IF (WITH_SYSTEM_ZCHUNK)
SET (SYSTEM_LIBRARIES ${SYSTEM_LIBRARIES} ${ZCHUNK_LIBRARIES})
-ENDIF (USE_SYSTEM_ZCHUNK)
+ENDIF (WITH_SYSTEM_ZCHUNK)
IF (ENABLE_RPMDB)
SET (SYSTEM_LIBRARIES ${RPMDB_LIBRARY} ${SYSTEM_LIBRARIES})
ENDIF (ENABLE_RPMDB)
#ifdef ENABLE_ZCHUNK_COMPRESSION
-#ifdef USE_SYSTEM_ZCHUNK
+#ifdef WITH_SYSTEM_ZCHUNK
+/* use the system's zchunk library that supports reading and writing of zchunk files */
+
#include <zck.h>
static ssize_t cookie_zckread(void *cookie, char *buf, size_t nbytes)
static int cookie_zckclose(void *cookie)
{
zckCtx *zck = (zckCtx *)cookie;
+ int fd = zck_get_fd(zck);
+ if (fd != -1)
+ close(fd);
zck_free(&zck);
return 0;
}
+
+static void *zchunkopen(const char *path, const char *mode, int fd)
+{
+ zckCtx *f;
+
+ if (!path && fd < 0)
+ return 0;
+ if (fd == -1)
+ {
+ if (*mode != 'w')
+ fd = open(path, O_RDONLY);
+ else
+ fd = open(path, O_WRONLY | O_CREAT, 0666);
+ if (fd == -1)
+ return 0;
+ }
+ f = zck_create();
+ if (!f)
+ {
+ close(fd);
+ return 0;
+ }
+ if (*mode != 'w')
+ {
+ if(!zck_init_read(f, fd);
+ return 0;
+ }
+ else
+ {
+ if(!zck_init_write(f, fd);
+ return 0;
+ }
+ return cookieopen(f, mode, cookie_zckread, cookie_zckwrite, cookie_zckclose);
+}
+
#else
+
#include "solv_zchunk.h"
-#endif
+/* use the libsolv's limited zchunk implementation that only supports reading of zchunk files */
static void *zchunkopen(const char *path, const char *mode, int fd)
{
FILE *fp;
+ void *f;
if (!path && fd < 0)
return 0;
if (fd != -1)
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
}
+#endif
+
static inline FILE *myzchunkfopen(const char *fn, const char *mode)
{
return zchunkopen(fn, mode, -1);
{
return zchunkopen(0, mode, fd);
}
-#endif
+
+#endif /* ENABLE_ZCHUNK_COMPRESSION */
+
FILE *
solv_xfopen(const char *fn, const char *mode)