#include <luna/String.h> #include <os/ArgumentParser.h> #include <os/File.h> #include <signal.h> #include <stdio.h> #include <termios.h> #include <unistd.h> Result<int> luna_main(int argc, char** argv) { StringView username; os::ArgumentParser parser; parser.add_description("Begin a new session on the system."); parser.add_system_program_info("login"_sv); parser.add_positional_argument(username, "user", false); parser.parse(argc, argv); if (geteuid() != 0) { os::eprintln("error: login must be run as root."); return 1; } putchar('\n'); String name; if (username.is_empty()) { signal(SIGTTOU, SIG_IGN); if (isatty(STDIN_FILENO)) tcsetpgrp(STDIN_FILENO, getpgid(0)); auto input = os::File::standard_input(); os::print("Username: "); name = TRY(input->read_line()); name.trim("\n"); if (name.is_empty()) return 0; username = name.view(); } execl("/bin/su", "login", "-lp", "--", username.chars(), nullptr); perror("su"); return 1; }