From 1f735a34406c1856fd2f6f9a522a06b429c4f799 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 30 Oct 2015 12:33:40 +0100 Subject: : Support xz-compressed NARs --- src/libutil/compression.cc | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/libutil/compression.hh | 9 +++++++++ src/libutil/local.mk | 4 +++- 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/libutil/compression.cc create mode 100644 src/libutil/compression.hh (limited to 'src/libutil') diff --git a/src/libutil/compression.cc b/src/libutil/compression.cc new file mode 100644 index 0000000000..446fcb7815 --- /dev/null +++ b/src/libutil/compression.cc @@ -0,0 +1,46 @@ +#include "compression.hh" +#include "types.hh" + +#include + +namespace nix { + +std::string decompressXZ(const std::string & in) +{ + lzma_stream strm = LZMA_STREAM_INIT; + + lzma_ret ret = lzma_stream_decoder( + &strm, UINT64_MAX, LZMA_CONCATENATED); + if (ret != LZMA_OK) + throw Error("unable to initialise lzma decoder"); + + lzma_action action = LZMA_RUN; + uint8_t outbuf[BUFSIZ]; + string res; + strm.next_in = (uint8_t *) in.c_str(); + strm.avail_in = in.size(); + strm.next_out = outbuf; + strm.avail_out = sizeof(outbuf); + + while (true) { + + if (strm.avail_in == 0) + action = LZMA_FINISH; + + lzma_ret ret = lzma_code(&strm, action); + + if (strm.avail_out == 0 || ret == LZMA_STREAM_END) { + res.append((char *) outbuf, sizeof(outbuf) - strm.avail_out); + strm.next_out = outbuf; + strm.avail_out = sizeof(outbuf); + } + + if (ret == LZMA_STREAM_END) + return res; + + if (ret != LZMA_OK) + throw Error("error while decompressing xz file"); + } +} + +} diff --git a/src/libutil/compression.hh b/src/libutil/compression.hh new file mode 100644 index 0000000000..962ce5ac77 --- /dev/null +++ b/src/libutil/compression.hh @@ -0,0 +1,9 @@ +#pragma once + +#include + +namespace nix { + +std::string decompressXZ(const std::string & in); + +} diff --git a/src/libutil/local.mk b/src/libutil/local.mk index 8af2e78d9c..4a97b662ae 100644 --- a/src/libutil/local.mk +++ b/src/libutil/local.mk @@ -6,8 +6,10 @@ libutil_DIR := $(d) libutil_SOURCES := $(wildcard $(d)/*.cc) +libutil_LDFLAGS = -llzma + ifeq ($(HAVE_OPENSSL), 1) - libutil_LDFLAGS = $(OPENSSL_LIBS) + libutil_LDFLAGS += $(OPENSSL_LIBS) else libutil_SOURCES += $(d)/md5.c $(d)/sha1.c $(d)/sha256.c endif -- cgit 1.4.1