From 154d33f240ede399deed27bea53293e8bb395f11 Mon Sep 17 00:00:00 2001 From: mjz19910 Date: Mon, 3 Jan 2022 15:24:56 -0700 Subject: [PATCH] unzip: Port to LibMain --- Userland/Utilities/CMakeLists.txt | 2 +- Userland/Utilities/unzip.cpp | 36 +++++++++---------------------- 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/Userland/Utilities/CMakeLists.txt b/Userland/Utilities/CMakeLists.txt index d31bd03adf..1973b51b3c 100644 --- a/Userland/Utilities/CMakeLists.txt +++ b/Userland/Utilities/CMakeLists.txt @@ -151,7 +151,7 @@ target_link_libraries(truncate LibMain) target_link_libraries(tt LibPthread) target_link_libraries(uname LibMain) target_link_libraries(uniq LibMain) -target_link_libraries(unzip LibArchive LibCompress) +target_link_libraries(unzip LibArchive LibCompress LibMain) target_link_libraries(uptime LibMain) target_link_libraries(userdel LibMain) target_link_libraries(usermod LibMain) diff --git a/Userland/Utilities/unzip.cpp b/Userland/Utilities/unzip.cpp index 096c69e2c0..d46fe5edfb 100644 --- a/Userland/Utilities/unzip.cpp +++ b/Userland/Utilities/unzip.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -71,7 +72,7 @@ static bool unpack_zip_member(Archive::ZipMember zip_member, bool quiet) return true; } -int main(int argc, char** argv) +ErrorOr serenity_main(Main::Arguments arguments) { const char* path; int map_size_limit = 32 * MiB; @@ -83,16 +84,11 @@ int main(int argc, char** argv) args_parser.add_option(output_directory_path, "Directory to receive the archive content", "output-directory", 'd', "path"); args_parser.add_option(quiet, "Be less verbose", "quiet", 'q'); args_parser.add_positional_argument(path, "File to unzip", "path", Core::ArgsParser::Required::Yes); - args_parser.parse(argc, argv); + args_parser.parse(arguments); String zip_file_path { path }; - struct stat st; - int rc = stat(zip_file_path.characters(), &st); - if (rc < 0) { - perror("stat"); - return 1; - } + struct stat st = TRY(Core::System::stat(zip_file_path)); // FIXME: Map file chunk-by-chunk once we have mmap() with offset. // This will require mapping some parts then unmapping them repeatedly, @@ -104,34 +100,22 @@ int main(int argc, char** argv) return 1; } - auto file_or_error = Core::MappedFile::map(zip_file_path); - if (file_or_error.is_error()) { - warnln("Failed to open {}: {}", zip_file_path, file_or_error.error()); - return 1; - } - auto& mapped_file = *file_or_error.value(); + auto mapped_file = TRY(Core::MappedFile::map(zip_file_path)); if (!quiet) warnln("Archive: {}", zip_file_path); - auto zip_file = Archive::Zip::try_create(mapped_file.bytes()); + auto zip_file = Archive::Zip::try_create(mapped_file->bytes()); if (!zip_file.has_value()) { warnln("Invalid zip file {}", zip_file_path); return 1; } if (!output_directory_path.is_null()) { - rc = mkdir(output_directory_path.characters(), 0755); - if (rc < 0 && errno != EEXIST) { - perror("mkdir"); - return 1; - } - - rc = chdir(output_directory_path.characters()); - if (rc < 0) { - perror("chdir"); - return 1; - } + auto mkdir_error = Core::System::mkdir(output_directory_path, 0755); + if (mkdir_error.is_error() && mkdir_error.error().code() != EEXIST) + return mkdir_error.release_error(); + TRY(Core::System::chdir(output_directory_path)); } auto success = zip_file->for_each_member([&](auto zip_member) {