Luna/apps/login.cpp

53 lines
1.1 KiB
C++

#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;
setpgid(0, 0);
signal(SIGTTOU, SIG_IGN);
if (isatty(STDIN_FILENO)) tcsetpgrp(STDIN_FILENO, getpgid(0));
if (username.is_empty())
{
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("/usr/bin/su", "login", "-lp", "--", username.chars(), nullptr);
perror("su");
return 1;
}