mirror of
https://github.com/RGBCube/serenity
synced 2026-01-21 01:31:01 +00:00
Now we will only load resources from $build/share/Lagom. On macOS, we load from the bundle directory Contents/Resources instead. This simplifies the commands and environment variables needed to execute Ladybird from the build directory, and makes our install setup less awkward for distributions and packagers.
67 lines
2.7 KiB
C++
67 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
* Copyright (c) 2023, Andrew Kaster <akaster@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <AK/LexicalPath.h>
|
|
#include <AK/OwnPtr.h>
|
|
#include <LibCore/ArgsParser.h>
|
|
#include <LibCore/EventLoop.h>
|
|
#include <LibCore/LocalServer.h>
|
|
#include <LibCore/System.h>
|
|
#include <LibFileSystem/FileSystem.h>
|
|
#include <LibIPC/SingleServer.h>
|
|
#include <LibMain/Main.h>
|
|
#include <LibTLS/Certificate.h>
|
|
#include <RequestServer/ConnectionFromClient.h>
|
|
#include <RequestServer/GeminiProtocol.h>
|
|
#include <RequestServer/HttpProtocol.h>
|
|
#include <RequestServer/HttpsProtocol.h>
|
|
|
|
// FIXME: Share b/w RequestServer and WebSocket
|
|
ErrorOr<ByteString> find_certificates(StringView serenity_resource_root)
|
|
{
|
|
auto cert_path = ByteString::formatted("{}/ladybird/cacert.pem", serenity_resource_root);
|
|
if (!FileSystem::exists(cert_path))
|
|
return Error::from_string_view("Don't know how to load certs!"sv);
|
|
return cert_path;
|
|
}
|
|
|
|
ErrorOr<int> serenity_main(Main::Arguments arguments)
|
|
{
|
|
AK::set_rich_debug_enabled(true);
|
|
|
|
int fd_passing_socket { -1 };
|
|
StringView serenity_resource_root;
|
|
Vector<ByteString> certificates;
|
|
|
|
Core::ArgsParser args_parser;
|
|
args_parser.add_option(fd_passing_socket, "File descriptor of the fd passing socket", "fd-passing-socket", 'c', "fd-passing-socket");
|
|
args_parser.add_option(certificates, "Path to a certificate file", "certificate", 'C', "certificate");
|
|
args_parser.add_option(serenity_resource_root, "Absolute path to directory for serenity resources", "serenity-resource-root", 'r', "serenity-resource-root");
|
|
args_parser.parse(arguments);
|
|
|
|
// Ensure the certificates are read out here.
|
|
if (certificates.is_empty())
|
|
certificates.append(TRY(find_certificates(serenity_resource_root)));
|
|
DefaultRootCACertificates::set_default_certificate_paths(certificates.span());
|
|
[[maybe_unused]] auto& certs = DefaultRootCACertificates::the();
|
|
|
|
Core::EventLoop event_loop;
|
|
|
|
[[maybe_unused]] auto gemini = make<RequestServer::GeminiProtocol>();
|
|
[[maybe_unused]] auto http = make<RequestServer::HttpProtocol>();
|
|
[[maybe_unused]] auto https = make<RequestServer::HttpsProtocol>();
|
|
|
|
auto client = TRY(IPC::take_over_accepted_client_from_system_server<RequestServer::ConnectionFromClient>());
|
|
client->set_fd_passing_socket(TRY(Core::LocalSocket::adopt_fd(fd_passing_socket)));
|
|
|
|
auto result = event_loop.exec();
|
|
|
|
// FIXME: We exit instead of returning, so that protocol destructors don't get called.
|
|
// The Protocol base class should probably do proper de-registration instead of
|
|
// just VERIFY_NOT_REACHED().
|
|
exit(result);
|
|
}
|