mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 08:37:45 +00:00
SystemServer: Use more LibCore syscall wrappers :^)
This commit is contained in:
parent
2637a64130
commit
87b1ad2356
1 changed files with 32 additions and 81 deletions
|
@ -53,19 +53,19 @@ static void sigchld_handler(int)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void determine_system_mode()
|
static ErrorOr<void> determine_system_mode()
|
||||||
{
|
{
|
||||||
auto f = Core::File::construct("/proc/system_mode");
|
auto f = Core::File::construct("/proc/system_mode");
|
||||||
if (!f->open(Core::OpenMode::ReadOnly)) {
|
if (!f->open(Core::OpenMode::ReadOnly)) {
|
||||||
dbgln("Failed to read system_mode: {}", f->error_string());
|
dbgln("Failed to read system_mode: {}", f->error_string());
|
||||||
// Continue to assume "graphical".
|
// Continue to assume "graphical".
|
||||||
return;
|
return {};
|
||||||
}
|
}
|
||||||
const String system_mode = String::copy(f->read_all(), Chomp);
|
const String system_mode = String::copy(f->read_all(), Chomp);
|
||||||
if (f->error()) {
|
if (f->error()) {
|
||||||
dbgln("Failed to read system_mode: {}", f->error_string());
|
dbgln("Failed to read system_mode: {}", f->error_string());
|
||||||
// Continue to assume "graphical".
|
// Continue to assume "graphical".
|
||||||
return;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
g_system_mode = system_mode;
|
g_system_mode = system_mode;
|
||||||
|
@ -80,6 +80,7 @@ static void determine_system_mode()
|
||||||
dbgln("WARNING: Text mode with framebuffers won't work as expected! Consider using 'fbdev=off'.");
|
dbgln("WARNING: Text mode with framebuffers won't work as expected! Consider using 'fbdev=off'.");
|
||||||
}
|
}
|
||||||
dbgln("System in {} mode", g_system_mode);
|
dbgln("System in {} mode", g_system_mode);
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static void chown_wrapper(const char* path, uid_t uid, gid_t gid)
|
static void chown_wrapper(const char* path, uid_t uid, gid_t gid)
|
||||||
|
@ -332,60 +333,26 @@ static void populate_devfs()
|
||||||
umask(old_mask);
|
umask(old_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void prepare_synthetic_filesystems()
|
static ErrorOr<void> prepare_synthetic_filesystems()
|
||||||
{
|
{
|
||||||
// FIXME: Find a better way to all of this stuff, without hardcoding all of this!
|
// FIXME: Find a better way to all of this stuff, without hardcoding all of this!
|
||||||
int rc = mount(-1, "/proc", "proc", MS_NOSUID);
|
TRY(Core::System::mount(-1, "/proc", "proc", MS_NOSUID));
|
||||||
if (rc != 0) {
|
TRY(Core::System::mount(-1, "/sys", "sys", 0));
|
||||||
VERIFY_NOT_REACHED();
|
TRY(Core::System::mount(-1, "/dev", "dev", 0));
|
||||||
}
|
|
||||||
|
|
||||||
rc = mount(-1, "/sys", "sys", 0);
|
TRY(Core::System::symlink("/proc/self/fd/0", "/dev/stdin"));
|
||||||
if (rc != 0) {
|
TRY(Core::System::symlink("/proc/self/fd/1", "/dev/stdout"));
|
||||||
VERIFY_NOT_REACHED();
|
TRY(Core::System::symlink("/proc/self/fd/2", "/dev/stderr"));
|
||||||
}
|
TRY(Core::System::symlink("/proc/self/tty", "/dev/tty"));
|
||||||
|
|
||||||
rc = mount(-1, "/dev", "dev", 0);
|
|
||||||
if (rc != 0) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = symlink("/proc/self/fd/0", "/dev/stdin");
|
|
||||||
if (rc < 0) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = symlink("/proc/self/fd/1", "/dev/stdout");
|
|
||||||
if (rc < 0) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = symlink("/proc/self/fd/2", "/dev/stderr");
|
|
||||||
if (rc < 0) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = symlink("/proc/self/tty", "/dev/tty");
|
|
||||||
if (rc < 0) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
|
|
||||||
populate_devfs();
|
populate_devfs();
|
||||||
|
|
||||||
rc = mkdir("/dev/pts", 0755);
|
TRY(Core::System::mkdir("/dev/pts", 0755));
|
||||||
if (rc != 0) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = mount(-1, "/dev/pts", "devpts", 0);
|
TRY(Core::System::mount(-1, "/dev/pts", "devpts", 0));
|
||||||
if (rc != 0) {
|
|
||||||
VERIFY_NOT_REACHED();
|
TRY(Core::System::symlink("/dev/random", "/dev/urandom"));
|
||||||
}
|
|
||||||
|
|
||||||
rc = symlink("/dev/random", "/dev/urandom");
|
|
||||||
if (rc < 0) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
chmod_wrapper("/dev/urandom", 0666);
|
chmod_wrapper("/dev/urandom", 0666);
|
||||||
|
|
||||||
auto phys_group = getgrnam("phys");
|
auto phys_group = getgrnam("phys");
|
||||||
|
@ -413,55 +380,39 @@ static void prepare_synthetic_filesystems()
|
||||||
// This affects also every other process that inherits the file descriptors
|
// This affects also every other process that inherits the file descriptors
|
||||||
// from SystemServer, so it is important for other things (also for ProcFS
|
// from SystemServer, so it is important for other things (also for ProcFS
|
||||||
// tests that are running in CI mode).
|
// tests that are running in CI mode).
|
||||||
int stdin_new_fd = open("/dev/null", O_NONBLOCK);
|
int stdin_new_fd = TRY(Core::System::open("/dev/null", O_NONBLOCK));
|
||||||
if (stdin_new_fd < 0) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
rc = dup2(stdin_new_fd, 0);
|
|
||||||
if (rc < 0) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = dup2(stdin_new_fd, 1);
|
TRY(Core::System::dup2(stdin_new_fd, 0));
|
||||||
if (rc < 0) {
|
TRY(Core::System::dup2(stdin_new_fd, 1));
|
||||||
VERIFY_NOT_REACHED();
|
TRY(Core::System::dup2(stdin_new_fd, 2));
|
||||||
}
|
|
||||||
rc = dup2(stdin_new_fd, 2);
|
|
||||||
if (rc < 0) {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
|
|
||||||
endgrent();
|
endgrent();
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mount_all_filesystems()
|
static ErrorOr<void> mount_all_filesystems()
|
||||||
{
|
{
|
||||||
dbgln("Spawning mount -a to mount all filesystems.");
|
dbgln("Spawning mount -a to mount all filesystems.");
|
||||||
pid_t pid = fork();
|
pid_t pid = TRY(Core::System::fork());
|
||||||
|
|
||||||
if (pid < 0) {
|
if (pid == 0) {
|
||||||
perror("fork");
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
} else if (pid == 0) {
|
|
||||||
execl("/bin/mount", "mount", "-a", nullptr);
|
execl("/bin/mount", "mount", "-a", nullptr);
|
||||||
perror("exec");
|
perror("exec");
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
} else {
|
} else {
|
||||||
wait(nullptr);
|
wait(nullptr);
|
||||||
}
|
}
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static void create_tmp_coredump_directory()
|
static ErrorOr<void> create_tmp_coredump_directory()
|
||||||
{
|
{
|
||||||
dbgln("Creating /tmp/coredump directory");
|
dbgln("Creating /tmp/coredump directory");
|
||||||
auto old_umask = umask(0);
|
auto old_umask = umask(0);
|
||||||
// FIXME: the coredump directory should be made read-only once CrashDaemon is no longer responsible for compressing coredumps
|
// FIXME: the coredump directory should be made read-only once CrashDaemon is no longer responsible for compressing coredumps
|
||||||
auto rc = mkdir("/tmp/coredump", 0777);
|
TRY(Core::System::mkdir("/tmp/coredump", 0777));
|
||||||
if (rc < 0) {
|
|
||||||
perror("mkdir(/tmp/coredump)");
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
umask(old_umask);
|
umask(old_umask);
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<int> serenity_main(Main::Arguments arguments)
|
ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
|
@ -472,15 +423,15 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
args_parser.parse(arguments);
|
args_parser.parse(arguments);
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
mount_all_filesystems();
|
TRY(mount_all_filesystems());
|
||||||
prepare_synthetic_filesystems();
|
TRY(prepare_synthetic_filesystems());
|
||||||
}
|
}
|
||||||
|
|
||||||
TRY(Core::System::pledge("stdio proc exec tty accept unix rpath wpath cpath chown fattr id sigaction"));
|
TRY(Core::System::pledge("stdio proc exec tty accept unix rpath wpath cpath chown fattr id sigaction"));
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
create_tmp_coredump_directory();
|
TRY(create_tmp_coredump_directory());
|
||||||
determine_system_mode();
|
TRY(determine_system_mode());
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::EventLoop event_loop;
|
Core::EventLoop event_loop;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue