@@ -300,6 +300,13 @@ ifeq ($(PERF_DEFINED), 1)
CFLAGS += -DPERF
endif
+ZLIB_INSTALLED := $(shell if (printf "$(pound)include <zlib.h>\n void main(){deflateInit(NULL, Z_BEST_COMPRESSION);}" | $(CC) -o /dev/null -x c - -lz >/dev/null 2>&1) ; then echo 1; else echo 0 ; fi)
+ifeq ($(ZLIB_INSTALLED), 1)
+export ZLIB_INSTALLED
+CFLAGS += -DHAVE_ZLIB
+$(info Have zlib compression support)
+endif
+
CUNIT_INSTALLED := $(shell if (printf "$(pound)include <CUnit/Basic.h>\n void main(){CU_initialize_registry();}" | $(CC) -o /dev/null -x c - -lcunit >/dev/null 2>&1) ; then echo 1; else echo 0 ; fi)
export CUNIT_INSTALLED
@@ -26,6 +26,9 @@ OBJS += trace-timesync-ptp.o
OBJS += trace-timesync-kvm.o
endif
OBJS += trace-compress.o
+ifeq ($(ZLIB_INSTALLED), 1)
+OBJS += trace-compress-zlib.o
+endif
# Additional util objects
OBJS += trace-blk-hack.o
@@ -47,6 +50,10 @@ $(LIBTRACECMD_STATIC): $(OBJS)
LIBS = $(LIBTRACEEVENT_LDLAGS) $(LIBTRACEFS_LDLAGS) -lpthread
+ifeq ($(ZLIB_INSTALLED), 1)
+LIBS += -lz
+endif
+
$(LIBTRACECMD_SHARED_VERSION): $(LIBTRACECMD_SHARED)
@ln -sf $(<F) $@
@@ -26,6 +26,10 @@ void tracecmd_info(const char *fmt, ...);
#endif
#endif
+#ifdef HAVE_ZLIB
+int tracecmd_zlib_init(void);
+#endif
+
struct data_file_write {
unsigned long long file_size;
unsigned long long write_size;
new file mode 100644
@@ -0,0 +1,109 @@
+// SPDX-License-Identifier: LGPL-2.1
+/*
+ * Copyright (C) 2021, VMware, Tzvetomir Stoyanov tz.stoyanov@gmail.com>
+ *
+ */
+#include <stdlib.h>
+#include <dlfcn.h>
+#include <zlib.h>
+#include <errno.h>
+
+#include "trace-cmd-private.h"
+
+#define __ZLIB_NAME "zlib"
+#define __ZLIB_WEIGTH 10
+
+static int zlib_compress(const char *in, unsigned int in_bytes,
+ char *out, unsigned int *out_bytes)
+{
+ unsigned long out_size = *out_bytes;
+ int ret;
+
+ ret = compress2((unsigned char *)out, &out_size,
+ (unsigned char *)in, (unsigned long)in_bytes, Z_BEST_COMPRESSION);
+ *out_bytes = out_size;
+ errno = 0;
+ switch (ret) {
+ case Z_OK:
+ return 0;
+ case Z_BUF_ERROR:
+ errno = -ENOBUFS;
+ break;
+ case Z_MEM_ERROR:
+ errno = -ENOMEM;
+ break;
+ case Z_STREAM_ERROR:
+ errno = -EINVAL;
+ break;
+ default:
+ errno = -EFAULT;
+ break;
+ }
+
+ return -1;
+}
+
+static int zlib_decompress(const char *in, unsigned int in_bytes,
+ char *out, unsigned int *out_bytes)
+{
+ unsigned long out_size = *out_bytes;
+ int ret;
+
+ ret = uncompress((unsigned char *)out, &out_size,
+ (unsigned char *)in, (unsigned long)in_bytes);
+ *out_bytes = out_size;
+ errno = 0;
+ switch (ret) {
+ case Z_OK:
+ return 0;
+ case Z_BUF_ERROR:
+ errno = -ENOBUFS;
+ break;
+ case Z_MEM_ERROR:
+ errno = -ENOMEM;
+ break;
+ case Z_DATA_ERROR:
+ errno = -EINVAL;
+ break;
+ default:
+ errno = -EFAULT;
+ break;
+ }
+
+ return -1;
+}
+
+static unsigned int zlib_compress_bound(unsigned int in_bytes)
+{
+ return compressBound(in_bytes);
+}
+
+static bool zlib_is_supported(const char *name, const char *version)
+{
+ const char *zver;
+
+ if (!name)
+ return false;
+ if (strlen(name) != strlen(__ZLIB_NAME) || strcmp(name, __ZLIB_NAME))
+ return false;
+
+ if (!version)
+ return true;
+
+ zver = zlibVersion();
+ if (!zver)
+ return false;
+
+ /* Compare the major version number */
+ if (atoi(version) <= atoi(zver))
+ return true;
+
+ return false;
+}
+
+int tracecmd_zlib_init(void)
+{
+ return tracecmd_compress_proto_register(__ZLIB_NAME, zlibVersion(), __ZLIB_WEIGTH,
+ zlib_compress, zlib_decompress,
+ zlib_compress_bound, zlib_is_supported);
+}
@@ -386,6 +386,10 @@ void tracecmd_compress_init(void)
gettimeofday(&time, NULL);
srand((time.tv_sec * 1000) + (time.tv_usec / 1000));
+
+#ifdef HAVE_ZLIB
+ tracecmd_zlib_init();
+#endif
}
static struct compress_proto *compress_proto_select(void)
@@ -51,6 +51,10 @@ CONFIG_INCLUDES =
CONFIG_LIBS = -lrt -lpthread $(TRACE_LIBS)
CONFIG_FLAGS =
+ifeq ($(ZLIB_INSTALLED), 1)
+CONFIG_LIBS += -lz
+endif
+
all: $(TARGETS)
$(bdir):
Added implementation for zlib compression algorithm, using libz library, if available. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- Makefile | 7 ++ lib/trace-cmd/Makefile | 7 ++ lib/trace-cmd/include/trace-cmd-local.h | 4 + lib/trace-cmd/trace-compress-zlib.c | 109 ++++++++++++++++++++++++ lib/trace-cmd/trace-compress.c | 4 + tracecmd/Makefile | 4 + 6 files changed, 135 insertions(+) create mode 100644 lib/trace-cmd/trace-compress-zlib.c