diff --git a/Userland/Utilities/install.cpp b/Userland/Utilities/install.cpp index d469229076..8c3fde02f4 100644 --- a/Userland/Utilities/install.cpp +++ b/Userland/Utilities/install.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -16,16 +17,20 @@ ErrorOr serenity_main(Main::Arguments arguments) TRY(Core::System::pledge("stdio rpath wpath cpath fattr")); bool create_leading_dest_components = false; + StringView mode = "0755"sv; Vector sources; StringView destination; Core::ArgsParser args_parser; args_parser.add_ignored(nullptr, 'c'); // "copy files" is the default, no contradicting options exist. args_parser.add_option(create_leading_dest_components, "Create leading components of the destination path", nullptr, 'D'); + args_parser.add_option(mode, "Permissions to set (instead of 0755)", "mode", 'm', "mode"); args_parser.add_positional_argument(sources, "Source path", "source"); args_parser.add_positional_argument(destination, "Destination path", "destination"); args_parser.parse(arguments); + auto permission_mask = TRY(Core::FilePermissionsMask::parse(mode)); + String destination_dir = (sources.size() > 1 ? String { destination } : LexicalPath::dirname(destination)); if (create_leading_dest_components) { @@ -44,6 +49,9 @@ ErrorOr serenity_main(Main::Arguments arguments) TRY(Core::File::copy_file_or_directory(final_destination, source, Core::File::RecursionMode::Allowed, Core::File::LinkMode::Disallowed, Core::File::AddDuplicateFileMarker::No, Core::File::PreserveMode::Nothing)); + + auto current_access = TRY(Core::System::stat(final_destination)); + TRY(Core::System::chmod(final_destination, permission_mask.apply(current_access.st_mode))); } return 0;