diff --git a/Userland/Utilities/CMakeLists.txt b/Userland/Utilities/CMakeLists.txt index 139651a5c6..c0762475f8 100644 --- a/Userland/Utilities/CMakeLists.txt +++ b/Userland/Utilities/CMakeLists.txt @@ -128,7 +128,7 @@ target_link_libraries(run-tests LibRegex) target_link_libraries(shot LibGUI) target_link_libraries(sql LibLine LibSQL LibIPC) target_link_libraries(stat LibMain) -target_link_libraries(su LibCrypt) +target_link_libraries(su LibCrypt LibMain) target_link_libraries(tar LibArchive LibCompress) target_link_libraries(telws LibProtocol LibLine) target_link_libraries(test-crypto LibCrypto LibTLS LibLine) diff --git a/Userland/Utilities/su.cpp b/Userland/Utilities/su.cpp index d737f14129..382ae1e6b5 100644 --- a/Userland/Utilities/su.cpp +++ b/Userland/Utilities/su.cpp @@ -8,76 +8,45 @@ #include #include #include +#include +#include #include #include -extern "C" int main(int, char**); - -int main(int argc, char** argv) +ErrorOr serenity_main(Main::Arguments arguments) { - if (pledge("stdio rpath tty exec id", nullptr) < 0) { - perror("pledge"); - return 1; - } + TRY(Core::System::pledge("stdio rpath tty exec id")); - if (!isatty(STDIN_FILENO)) { - warnln("{}: standard in is not a terminal", argv[0]); - return 1; - } + if (!TRY(Core::System::isatty(STDIN_FILENO))) + return Error::from_string_literal("Standard input is not a terminal"); const char* user = nullptr; Core::ArgsParser args_parser; args_parser.add_positional_argument(user, "User to switch to (defaults to user with UID 0)", "user", Core::ArgsParser::Required::No); - args_parser.parse(argc, argv); + args_parser.parse(arguments); - if (geteuid() != 0) { - warnln("Not running as root :("); - return 1; - } + if (geteuid() != 0) + return Error::from_string_literal("Not running as root :("); - auto account_or_error = (user) - ? Core::Account::from_name(user) - : Core::Account::from_uid(0); - if (account_or_error.is_error()) { - warnln("Core::Account::from_name: {}", account_or_error.error()); - return 1; - } + auto account = TRY(user ? Core::Account::from_name(user) : Core::Account::from_uid(0)); - if (pledge("stdio tty exec id", nullptr) < 0) { - perror("pledge"); - return 1; - } - - const auto& account = account_or_error.value(); + TRY(Core::System::pledge("stdio tty exec id")); if (getuid() != 0 && account.has_password()) { - auto password = Core::get_password(); - if (password.is_error()) { - warnln("{}", password.error()); - return 1; - } - - if (!account.authenticate(password.value())) { - warnln("Incorrect or disabled password."); - return 1; - } + auto password = TRY(Core::get_password()); + if (!account.authenticate(password)) + return Error::from_string_literal("Incorrect or disabled password."); } - if (pledge("stdio exec id", nullptr) < 0) { - perror("pledge"); - return 1; - } + TRY(Core::System::pledge("stdio exec id")); if (!account.login()) { perror("Core::Account::login"); return 1; } - if (pledge("stdio exec", nullptr) < 0) { - perror("pledge"); - return 1; - } + TRY(Core::System::pledge("stdio exec")); execl(account.shell().characters(), account.shell().characters(), nullptr); perror("execl");