53 lines
1.1 KiB
C++
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;
|
|
}
|