diff --git a/Userland/Libraries/LibIPC/MultiServer.h b/Userland/Libraries/LibIPC/MultiServer.h new file mode 100644 index 0000000000..3a3794fb28 --- /dev/null +++ b/Userland/Libraries/LibIPC/MultiServer.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace IPC { + +template +class MultiServer { +public: + static ErrorOr> try_create(Optional socket_path = {}) + { + auto server = TRY(Core::LocalServer::try_create()); + TRY(server->take_over_from_system_server(socket_path.value_or({}))); + return adopt_nonnull_own_or_enomem(new (nothrow) MultiServer(move(server))); + } + +private: + explicit MultiServer(NonnullRefPtr server) + : m_server(move(server)) + { + m_server->on_accept = [&](auto client_socket) { + auto client_id = ++m_next_client_id; + (void)IPC::new_client_connection(move(client_socket), client_id); + }; + } + + int m_next_client_id { 0 }; + RefPtr m_server; +}; + +} diff --git a/Userland/Services/Clipboard/main.cpp b/Userland/Services/Clipboard/main.cpp index ea4ddc4855..3e087fcfd7 100644 --- a/Userland/Services/Clipboard/main.cpp +++ b/Userland/Services/Clipboard/main.cpp @@ -7,9 +7,8 @@ #include #include #include -#include #include -#include +#include #include ErrorOr serenity_main(Main::Arguments) @@ -18,14 +17,7 @@ ErrorOr serenity_main(Main::Arguments) Core::EventLoop event_loop; TRY(Core::System::unveil(nullptr, nullptr)); - auto server = TRY(Core::LocalServer::try_create()); - TRY(server->take_over_from_system_server()); - - server->on_accept = [&](auto client_socket) { - static int s_next_client_id = 0; - int client_id = ++s_next_client_id; - (void)IPC::new_client_connection(move(client_socket), client_id); - }; + auto server = TRY(IPC::MultiServer::try_create()); Clipboard::Storage::the().on_content_change = [&] { Clipboard::ClientConnection::for_each_client([&](auto& client) { diff --git a/Userland/Services/ConfigServer/main.cpp b/Userland/Services/ConfigServer/main.cpp index cde261b8a7..344e940a94 100644 --- a/Userland/Services/ConfigServer/main.cpp +++ b/Userland/Services/ConfigServer/main.cpp @@ -5,9 +5,9 @@ */ #include "ClientConnection.h" -#include #include #include +#include #include ErrorOr serenity_main(Main::Arguments) @@ -18,13 +18,6 @@ ErrorOr serenity_main(Main::Arguments) Core::EventLoop event_loop; - auto server = TRY(Core::LocalServer::try_create()); - TRY(server->take_over_from_system_server()); - server->on_accept = [&](auto client_socket) { - static int s_next_client_id = 0; - int client_id = ++s_next_client_id; - (void)IPC::new_client_connection(move(client_socket), client_id); - }; - + auto server = TRY(IPC::MultiServer::try_create()); return event_loop.exec(); } diff --git a/Userland/Services/InspectorServer/main.cpp b/Userland/Services/InspectorServer/main.cpp index 5029ffdc90..d9770f32fa 100644 --- a/Userland/Services/InspectorServer/main.cpp +++ b/Userland/Services/InspectorServer/main.cpp @@ -10,21 +10,16 @@ #include #include #include +#include #include ErrorOr serenity_main(Main::Arguments) { Core::EventLoop event_loop; - auto server = TRY(Core::LocalServer::try_create()); TRY(Core::System::pledge("stdio unix accept")); - TRY(server->take_over_from_system_server("/tmp/portal/inspector")); - server->on_accept = [&](auto client_socket) { - static int s_next_client_id = 0; - int client_id = ++s_next_client_id; - (void)IPC::new_client_connection(move(client_socket), client_id); - }; + auto server = TRY(IPC::MultiServer::try_create("/tmp/portal/inspector")); auto inspectables_server = TRY(Core::LocalServer::try_create()); TRY(inspectables_server->take_over_from_system_server("/tmp/portal/inspectables")); diff --git a/Userland/Services/LaunchServer/main.cpp b/Userland/Services/LaunchServer/main.cpp index 00d6137fb2..befe4af84b 100644 --- a/Userland/Services/LaunchServer/main.cpp +++ b/Userland/Services/LaunchServer/main.cpp @@ -8,14 +8,14 @@ #include "Launcher.h" #include #include -#include #include +#include #include ErrorOr serenity_main(Main::Arguments) { Core::EventLoop event_loop; - auto server = TRY(Core::LocalServer::try_create()); + auto server = TRY(IPC::MultiServer::try_create()); auto launcher = LaunchServer::Launcher(); launcher.load_handlers(); @@ -23,12 +23,5 @@ ErrorOr serenity_main(Main::Arguments) TRY(Core::System::pledge("stdio accept rpath proc exec")); - TRY(server->take_over_from_system_server()); - server->on_accept = [&](auto client_socket) { - static int s_next_client_id = 0; - int client_id = ++s_next_client_id; - (void)IPC::new_client_connection(move(client_socket), client_id); - }; - return event_loop.exec(); } diff --git a/Userland/Services/LookupServer/LookupServer.cpp b/Userland/Services/LookupServer/LookupServer.cpp index 9cc5115117..2018901088 100644 --- a/Userland/Services/LookupServer/LookupServer.cpp +++ b/Userland/Services/LookupServer/LookupServer.cpp @@ -72,13 +72,7 @@ LookupServer::LookupServer() } m_mdns = MulticastDNS::construct(this); - m_local_server = Core::LocalServer::construct(this); - m_local_server->on_accept = [](auto client_socket) { - static int s_next_client_id = 0; - int client_id = ++s_next_client_id; - (void)IPC::new_client_connection(move(client_socket), client_id); - }; - MUST(m_local_server->take_over_from_system_server()); + m_server = MUST(IPC::MultiServer::try_create()); } void LookupServer::load_etc_hosts() diff --git a/Userland/Services/LookupServer/LookupServer.h b/Userland/Services/LookupServer/LookupServer.h index 2e42d5e290..f94b3ad10c 100644 --- a/Userland/Services/LookupServer/LookupServer.h +++ b/Userland/Services/LookupServer/LookupServer.h @@ -6,12 +6,14 @@ #pragma once +#include "ClientConnection.h" #include "DNSName.h" #include "DNSPacket.h" #include "DNSServer.h" #include "MulticastDNS.h" #include #include +#include namespace LookupServer { @@ -32,7 +34,7 @@ private: Vector lookup(const DNSName& hostname, const String& nameserver, bool& did_get_response, DNSRecordType record_type, ShouldRandomizeCase = ShouldRandomizeCase::Yes); - RefPtr m_local_server; + OwnPtr> m_server; RefPtr m_dns_server; RefPtr m_mdns; Vector m_nameservers; diff --git a/Userland/Services/NotificationServer/main.cpp b/Userland/Services/NotificationServer/main.cpp index ef74de1a2e..d7e69122f5 100644 --- a/Userland/Services/NotificationServer/main.cpp +++ b/Userland/Services/NotificationServer/main.cpp @@ -5,10 +5,9 @@ */ #include "ClientConnection.h" -#include #include #include -#include +#include #include ErrorOr serenity_main(Main::Arguments arguments) @@ -16,14 +15,7 @@ ErrorOr serenity_main(Main::Arguments arguments) TRY(Core::System::pledge("stdio recvfd sendfd accept rpath unix")); auto app = TRY(GUI::Application::try_create(arguments)); - auto server = TRY(Core::LocalServer::try_create()); - - TRY(server->take_over_from_system_server()); - server->on_accept = [&](auto client_socket) { - static int s_next_client_id = 0; - int client_id = ++s_next_client_id; - (void)IPC::new_client_connection(move(client_socket), client_id); - }; + auto server = TRY(IPC::MultiServer::try_create()); TRY(Core::System::unveil("/res", "r")); TRY(Core::System::unveil(nullptr, nullptr)); diff --git a/Userland/Services/SQLServer/main.cpp b/Userland/Services/SQLServer/main.cpp index 814d3e342c..98ccc1099b 100644 --- a/Userland/Services/SQLServer/main.cpp +++ b/Userland/Services/SQLServer/main.cpp @@ -5,8 +5,8 @@ */ #include -#include #include +#include #include #include #include @@ -26,13 +26,6 @@ ErrorOr serenity_main(Main::Arguments) Core::EventLoop event_loop; - auto server = TRY(Core::LocalServer::try_create()); - TRY(server->take_over_from_system_server()); - server->on_accept = [&](auto client_socket) { - static int s_next_client_id = 0; - int client_id = ++s_next_client_id; - (void)IPC::new_client_connection(client_socket, client_id); - }; - + auto server = TRY(IPC::MultiServer::try_create()); return event_loop.exec(); } diff --git a/Userland/Services/WindowServer/EventLoop.cpp b/Userland/Services/WindowServer/EventLoop.cpp index 15a4f3d701..101740f550 100644 --- a/Userland/Services/WindowServer/EventLoop.cpp +++ b/Userland/Services/WindowServer/EventLoop.cpp @@ -19,26 +19,12 @@ namespace WindowServer { EventLoop::EventLoop() - : m_window_server(Core::LocalServer::construct()) - , m_wm_server(Core::LocalServer::construct()) { m_keyboard_fd = open("/dev/keyboard0", O_RDONLY | O_NONBLOCK | O_CLOEXEC); m_mouse_fd = open("/dev/mouse0", O_RDONLY | O_NONBLOCK | O_CLOEXEC); - MUST(m_window_server->take_over_from_system_server("/tmp/portal/window")); - MUST(m_wm_server->take_over_from_system_server("/tmp/portal/wm")); - - m_window_server->on_accept = [&](auto client_socket) { - static int s_next_client_id = 0; - int client_id = ++s_next_client_id; - (void)IPC::new_client_connection(move(client_socket), client_id); - }; - - m_wm_server->on_accept = [&](auto client_socket) { - static int s_next_wm_id = 0; - int wm_id = ++s_next_wm_id; - (void)IPC::new_client_connection(move(client_socket), wm_id); - }; + m_window_server = MUST(IPC::MultiServer::try_create("/tmp/portal/window")); + m_wm_server = MUST(IPC::MultiServer::try_create("/tmp/portal/wm")); if (m_keyboard_fd >= 0) { m_keyboard_notifier = Core::Notifier::construct(m_keyboard_fd, Core::Notifier::Read); diff --git a/Userland/Services/WindowServer/EventLoop.h b/Userland/Services/WindowServer/EventLoop.h index 2964de8408..dfad84b887 100644 --- a/Userland/Services/WindowServer/EventLoop.h +++ b/Userland/Services/WindowServer/EventLoop.h @@ -6,10 +6,12 @@ #pragma once +#include "ClientConnection.h" +#include "WMClientConnection.h" #include #include -#include #include +#include namespace WindowServer { @@ -31,8 +33,8 @@ private: RefPtr m_keyboard_notifier; int m_mouse_fd { -1 }; RefPtr m_mouse_notifier; - RefPtr m_window_server; - RefPtr m_wm_server; + OwnPtr> m_window_server; + OwnPtr> m_wm_server; }; }