python3-devel \
sqlite-devel \
systemd-devel \
- xz-devel
+ xz-devel \
+ zlib-devel
"""
}
systemd \
util-linux-libs \
xz \
- zstd
+ zstd \
+ zlib
"""
}
libsqlite3-dev \
libsystemd-dev \
libzstd-dev \
- uuid-dev
+ uuid-dev \
+ libz-dev
"""
}
tests/data/beep.nm \
tests/data/kernel.nm \
\
+ tests/data/compress/data.gz \
tests/data/compress/data.xz \
tests/data/compress/data.zst \
\
libzstd-dev,
pkg-config,
uuid-dev,
+ libz-dev
Standards-Version: 4.6.2
Homepage: https://pakfire.ipfire.org
Vcs-Browser: https://git.ipfire.org/?p=pakfire.git;a=summary
#include <archive.h>
#include <lzma.h>
#include <zstd.h>
+#include <zlib.h>
#include <pakfire/ctx.h>
#include <pakfire/compress.h>
return f;
}
+/*
+ gzip
+*/
+
+static ssize_t gz_read(void* cookie, char* buffer, size_t size) {
+ return gzread((gzFile)cookie, buffer, size);
+}
+
+static ssize_t gz_write(void* cookie, const char* buffer, size_t size) {
+ return gzwrite((gzFile)cookie, buffer, size);
+}
+
+static int gz_close(void* cookie) {
+ return gzclose((gzFile)cookie);
+}
+
+FILE* pakfire_gzfopen(FILE* f, const char* mode) {
+ gzFile cookie = NULL;
+ int fd = -EBADF;
+
+ // Check for a valid file descriptor
+ if (!f) {
+ errno = EBADF;
+ return NULL;
+ }
+
+ // Fetch the file descriptor
+ fd = fileno(f);
+ if (fd < 0) {
+ errno = EBADF;
+ return NULL;
+ }
+
+ // Duplicate the file descriptor to pass it to gzip
+ fd = dup(fd);
+ if (fd < 0)
+ return NULL;
+
+ // Close the original file handle
+ fclose(f);
+
+ // Open the stream
+ cookie = gzdopen(fd, mode);
+ if (!cookie)
+ return NULL;
+
+ // Increase the buffer size for faster reading
+ gzbuffer(cookie, 128 * 1024);
+
+ static cookie_io_functions_t gz_functions = {
+ .read = gz_read,
+ .write = gz_write,
+ .close = gz_close,
+ };
+
+ return fopencookie(cookie, mode, gz_functions);
+}
+
struct xz_cookie {
FILE* f;
char mode;
// Automatically detect
FILE* pakfire_xfopen(FILE* f, const char* mode);
+// gzip
+FILE* pakfire_gzfopen(FILE* f, const char* mode);
+
// XZ
FILE* pakfire_xzfopen(FILE* f, const char* mode);
return r;
}
+static int test_gzfopen_read(const struct test* t) {
+ return read_test(t, pakfire_gzfopen, "data/compress/data.gz");
+}
+
+static int test_gzfopen_write(const struct test* t) {
+ return write_test(t, pakfire_gzfopen);
+}
+
static int test_xzfopen_read(const struct test* t) {
return read_test(t, pakfire_xzfopen, "data/compress/data.xz");
}
}
int main(int argc, const char* argv[]) {
+ // Gzip
+ testsuite_add_test(test_gzfopen_read, 0);
+ testsuite_add_test(test_gzfopen_write, 0);
+
// XZ
testsuite_add_test(test_xzfopen_read, 0);
testsuite_add_test(test_xzfopen_write, 0);