Serenity Operating System
at master 49 lines 1.4 kB view raw
1/* 2 * Copyright (c) 2022, Tim Flynn <trflynn89@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#define AK_DONT_REPLACE_STD 8 9#include <AK/DeprecatedString.h> 10#include <LibCore/ArgsParser.h> 11#include <LibCore/Directory.h> 12#include <LibCore/EventLoop.h> 13#include <LibCore/StandardPaths.h> 14#include <LibIPC/MultiServer.h> 15#include <LibMain/Main.h> 16#include <SQLServer/ConnectionFromClient.h> 17 18ErrorOr<int> serenity_main(Main::Arguments arguments) 19{ 20 DeprecatedString pid_file; 21 22 Core::ArgsParser args_parser; 23 args_parser.add_option(pid_file, "Path to the PID file for the SQLServer singleton process", "pid-file", 'p', "pid_file"); 24 args_parser.parse(arguments); 25 26 VERIFY(!pid_file.is_empty()); 27 28 auto database_path = DeprecatedString::formatted("{}/Ladybird", Core::StandardPaths::data_directory()); 29 TRY(Core::Directory::create(database_path, Core::Directory::CreateDirectories::Yes)); 30 31 Core::EventLoop loop; 32 33 auto server = TRY(IPC::MultiServer<SQLServer::ConnectionFromClient>::try_create()); 34 u64 connection_count { 0 }; 35 36 server->on_new_client = [&](auto& client) { 37 client.set_database_path(database_path); 38 ++connection_count; 39 40 client.on_disconnect = [&]() { 41 if (--connection_count == 0) { 42 MUST(Core::System::unlink(pid_file)); 43 loop.quit(0); 44 } 45 }; 46 }; 47 48 return loop.exec(); 49}