/* * tar.cc - Implementation of the tarball Horizon Image Creation backend * image, the image processing utilities for * Project Horizon * * Copyright (c) 2020 Adélie Linux and contributors. All rights reserved. * This code is licensed under the AGPL 3.0 license, as noted in the * LICENSE-code file in the root directory of this repository. * * SPDX-License-Identifier: AGPL-3.0-only */ #include #include "basic.hh" #include "util/output.hh" namespace Horizon { namespace Image { class TarBackend : public BasicBackend { public: enum CompressionType { None, GZip, BZip2, XZ }; private: CompressionType comp; struct archive *a; public: TarBackend(std::string ir, std::string out, CompressionType _c = None) : BasicBackend(ir, out), comp(_c) {}; int prepare() override { int res; a = archive_write_new(); archive_write_set_format_pax_restricted(a); switch(comp) { case None: break; case GZip: archive_write_add_filter_gzip(a); break; case BZip2: archive_write_add_filter_bzip2(a); break; case XZ: archive_write_add_filter_xz(a); break; } res = archive_write_open_filename(a, this->out_path.c_str()) < ARCHIVE_OK; if(res < ARCHIVE_OK) { if(res < ARCHIVE_WARN) { output_error("tar backend", archive_error_string(a)); return res; } else { output_warning("tar backend", archive_error_string(a)); } } return 0; } int create() override { return 0; } int finalise() override { archive_write_close(a); archive_write_free(a); return 0; } }; __attribute__((constructor(400))) void register_tar_backend() { BackendManager::register_backend( {"tar", "Create a tarball (.tar)", [](std::string ir_dir, std::string out_path) { return new TarBackend(ir_dir, out_path); } }); BackendManager::register_backend( {"tgz", "Create a tarball with GZ compression (.tar.gz)", [](std::string ir_dir, std::string out_path) { return new TarBackend(ir_dir, out_path, TarBackend::GZip); } }); BackendManager::register_backend( {"tbz", "Create a tarball with BZip2 compression (.tar.bz2)", [](std::string ir_dir, std::string out_path) { return new TarBackend(ir_dir, out_path, TarBackend::BZip2); } }); BackendManager::register_backend( {"txz", "Create a tarball with XZ compression (.tar.xz)", [](std::string ir_dir, std::string out_path) { return new TarBackend(ir_dir, out_path, TarBackend::XZ); } }); } } }