diff --git a/lix/libutil/compression.cc b/lix/libutil/compression.cc index 0e99b62c7..3050ca8e2 100644 --- a/lix/libutil/compression.cc +++ b/lix/libutil/compression.cc @@ -16,7 +16,6 @@ #include #include #include -#include #include #include @@ -63,13 +62,15 @@ struct ArchiveDecompressionSource : Source struct archive_entry * ae; if (!archive) { archive = std::make_unique(*src, true); - this->archive->check(archive_read_next_header(this->archive->archive, &ae), - "failed to read header (%s)"); - if (archive_filter_count(this->archive->archive) < 2) { + this->archive->check( + archive_read_next_header(this->archive->archive.get(), &ae), + "failed to read header (%s)" + ); + if (archive_filter_count(this->archive->archive.get()) < 2) { throw CompressionError("input compression not recognized"); } } - ssize_t result = archive_read_data(this->archive->archive, data, len); + ssize_t result = archive_read_data(this->archive->archive.get(), data, len); if (result > 0) return result; if (result == 0) { throw EndOfFile("reached end of compressed file"); diff --git a/lix/libutil/tarfile.cc b/lix/libutil/tarfile.cc index a9fcca682..9aa9f5680 100644 --- a/lix/libutil/tarfile.cc +++ b/lix/libutil/tarfile.cc @@ -45,48 +45,45 @@ void TarArchive::check(int err, const std::string & reason) if (err == ARCHIVE_EOF) throw EndOfFile("reached end of archive"); else if (err != ARCHIVE_OK) - throw Error(reason, archive_error_string(this->archive)); + throw Error(reason, archive_error_string(this->archive.get())); } -TarArchive::TarArchive(Source & source, bool raw) : buffer(65536) +TarArchive::TarArchive(Source & source, bool raw) + : archive{archive_read_new(), archive_read_free} + , source(&source) + , buffer(65536) { - this->archive = archive_read_new(); - this->source = &source; - if (!raw) { - archive_read_support_filter_all(archive); - archive_read_support_format_all(archive); + archive_read_support_filter_all(archive.get()); + archive_read_support_format_all(archive.get()); } else { - archive_read_support_filter_all(archive); - archive_read_support_format_raw(archive); - archive_read_support_format_empty(archive); + archive_read_support_filter_all(archive.get()); + archive_read_support_format_raw(archive.get()); + archive_read_support_format_empty(archive.get()); } - archive_read_set_option(archive, nullptr, "mac-ext", nullptr); - check(archive_read_open(archive, (void *)this, callback_open, callback_read, callback_close), "Failed to open archive (%s)"); + archive_read_set_option(archive.get(), nullptr, "mac-ext", nullptr); + check( + archive_read_open( + archive.get(), (void *) this, callback_open, callback_read, callback_close + ), + "Failed to open archive (%s)" + ); } - -TarArchive::TarArchive(const Path & path) +TarArchive::TarArchive(const Path & path) : archive{archive_read_new(), archive_read_free} { - this->archive = archive_read_new(); - - archive_read_support_filter_all(archive); - archive_read_support_format_all(archive); - archive_read_set_option(archive, nullptr, "mac-ext", nullptr); + archive_read_support_filter_all(archive.get()); + archive_read_support_format_all(archive.get()); + archive_read_set_option(archive.get(), nullptr, "mac-ext", nullptr); check( - archive_read_open_filename(archive, requireCString(path), 16384), + archive_read_open_filename(archive.get(), requireCString(path), 16384), "failed to open archive: %s" ); } void TarArchive::close() { - check(archive_read_close(this->archive), "Failed to close archive (%s)"); -} - -TarArchive::~TarArchive() -{ - if (this->archive) archive_read_free(this->archive); + check(archive_read_close(this->archive.get()), "Failed to close archive (%s)"); } static void extract_archive(TarArchive & archive, const Path & destDir) @@ -99,13 +96,15 @@ static void extract_archive(TarArchive & archive, const Path & destDir) for (;;) { struct archive_entry * entry; - int r = archive_read_next_header(archive.archive, &entry); + int r = archive_read_next_header(archive.archive.get(), &entry); if (r == ARCHIVE_EOF) break; auto name = archive_entry_pathname(entry); if (!name) - throw Error("cannot get archive member name: %s", archive_error_string(archive.archive)); + throw Error( + "cannot get archive member name: %s", archive_error_string(archive.archive.get()) + ); if (r == ARCHIVE_WARN) - printTaggedWarning("%1%", Uncolored(archive_error_string(archive.archive))); + printTaggedWarning("%1%", Uncolored(archive_error_string(archive.archive.get()))); else archive.check(r); @@ -125,7 +124,7 @@ static void extract_archive(TarArchive & archive, const Path & destDir) (destDir + "/" + original_hardlink).c_str()); } - archive.check(archive_read_extract(archive.archive, entry, flags)); + archive.check(archive_read_extract(archive.archive.get(), entry, flags)); } archive.close(); diff --git a/lix/libutil/tarfile.hh b/lix/libutil/tarfile.hh index 4fc6ce4e4..e4dfc8d03 100644 --- a/lix/libutil/tarfile.hh +++ b/lix/libutil/tarfile.hh @@ -8,7 +8,7 @@ namespace nix { struct TarArchive { - struct archive * archive; + std::unique_ptr archive; Source * source; std::vector buffer; @@ -22,8 +22,6 @@ struct TarArchive { TarArchive(const TarArchive &) = delete; void close(); - - ~TarArchive(); }; kj::Promise> unpackTarfile(AsyncInputStream & source, const Path & destDir);