Serenity Operating System
at master 49 lines 1.5 kB view raw
1/* 2 * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> 3 * Copyright (c) 2022, Lucas Chollet <lucas.chollet@free.fr> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#include <AK/Vector.h> 9#include <LibCore/ArgsParser.h> 10#include <LibCore/File.h> 11#include <LibCore/System.h> 12#include <LibMain/Main.h> 13 14ErrorOr<int> serenity_main(Main::Arguments arguments) 15{ 16 TRY(Core::System::pledge("stdio rpath")); 17 18 Vector<StringView> paths; 19 20 Core::ArgsParser args_parser; 21 args_parser.set_general_help("Concatenate files or pipes to stdout."); 22 args_parser.add_positional_argument(paths, "File path", "path", Core::ArgsParser::Required::No); 23 args_parser.parse(arguments); 24 25 if (paths.is_empty()) 26 paths.append("-"sv); 27 28 Vector<NonnullOwnPtr<Core::File>> files; 29 TRY(files.try_ensure_capacity(paths.size())); 30 31 for (auto const& path : paths) { 32 if (auto result = Core::File::open_file_or_standard_stream(path, Core::File::OpenMode::Read); result.is_error()) 33 warnln("Failed to open {}: {}", path, result.release_error()); 34 else 35 files.unchecked_append(result.release_value()); 36 } 37 38 TRY(Core::System::pledge("stdio")); 39 40 Array<u8, 32768> buffer; 41 for (auto const& file : files) { 42 while (!file->is_eof()) { 43 auto const buffer_span = TRY(file->read_some(buffer)); 44 out("{:s}", buffer_span); 45 } 46 } 47 48 return files.size() != paths.size(); 49}