diff --git a/Userland/Utilities/CMakeLists.txt b/Userland/Utilities/CMakeLists.txt index b13de2e832..0cb5171c88 100644 --- a/Userland/Utilities/CMakeLists.txt +++ b/Userland/Utilities/CMakeLists.txt @@ -7,7 +7,7 @@ list(APPEND REQUIRED_TARGETS touch tr true umount uname uniq uptime w wc which whoami xargs yes ) list(APPEND RECOMMENDED_TARGETS - adjtime aplay abench asctl bt checksum chres cksum copy fortune gunzip gzip init install keymap lsirq lsof lspci man mknod mktemp + adjtime aplay abench asctl bt checksum chres cksum copy fortune gunzip gzip init install keymap lsirq lsof lspci lzcat man mknod mktemp nc netstat notify ntpquery open passwd pls printf pro shot strings tar tt unzip wallpaper zip ) @@ -105,6 +105,7 @@ target_link_libraries(keymap PRIVATE LibKeyboard) target_link_libraries(less PRIVATE LibLine) target_link_libraries(lspci PRIVATE LibPCIDB) target_link_libraries(lsusb PRIVATE LibUSBDB) +target_link_libraries(lzcat PRIVATE LibCompress) target_link_libraries(man PRIVATE LibMarkdown LibManual) target_link_libraries(markdown-check PRIVATE LibMarkdown) target_link_libraries(matroska PRIVATE LibVideo) diff --git a/Userland/Utilities/lzcat.cpp b/Userland/Utilities/lzcat.cpp new file mode 100644 index 0000000000..5884a9f0d2 --- /dev/null +++ b/Userland/Utilities/lzcat.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2023, Tim Schumacher + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include + +ErrorOr serenity_main(Main::Arguments arguments) +{ + TRY(Core::System::pledge("rpath stdio")); + + StringView filename; + + Core::ArgsParser args_parser; + args_parser.set_general_help("Decompress and print an LZMA archive"); + args_parser.add_positional_argument(filename, "File to decompress", "file"); + args_parser.parse(arguments); + + auto file = TRY(Core::File::open_file_or_standard_stream(filename, Core::File::OpenMode::Read)); + auto stream = TRY(Compress::LzmaDecompressor::create_from_container(move(file))); + + // Arbitrarily chosen buffer size. + Array buffer; + while (!stream->is_eof()) { + auto slice = TRY(stream->read_some(buffer)); + out("{:s}", slice); + } + + return 0; +}