@@ -87,36 +87,37 @@ ErrorOr<NonnullRefPtr<WebView::WebContentClient>> launch_web_content_process(Web
8787 return new_client;
8888}
8989
90- ErrorOr<NonnullRefPtr<Protocol::RequestClient>> launch_request_server_process (ReadonlySpan<String> candidate_request_server_paths, StringView serenity_resource_root)
90+ template <typename Client>
91+ ErrorOr<NonnullRefPtr<Client>> launch_generic_server_process (ReadonlySpan<String> candidate_server_paths, StringView serenity_resource_root, StringView server_name)
9192{
9293 int socket_fds[2 ] {};
9394 TRY (Core::System::socketpair (AF_LOCAL, SOCK_STREAM, 0 , socket_fds));
9495
9596 int ui_fd = socket_fds[0 ];
96- int rc_fd = socket_fds[1 ];
97+ int server_fd = socket_fds[1 ];
9798
9899 int fd_passing_socket_fds[2 ] {};
99100 TRY (Core::System::socketpair (AF_LOCAL, SOCK_STREAM, 0 , fd_passing_socket_fds));
100101
101102 int ui_fd_passing_fd = fd_passing_socket_fds[0 ];
102- int rc_fd_passing_fd = fd_passing_socket_fds[1 ];
103+ int server_fd_passing_fd = fd_passing_socket_fds[1 ];
103104
104105 if (auto child_pid = TRY (Core::System::fork ()); child_pid == 0 ) {
105106 TRY (Core::System::close (ui_fd));
106107 TRY (Core::System::close (ui_fd_passing_fd));
107108
108- auto takeover_string = TRY (String::formatted (" RequestServer :{}" , rc_fd ));
109+ auto takeover_string = TRY (String::formatted (" {} :{}" , server_name, server_fd ));
109110 TRY (Core::System::setenv (" SOCKET_TAKEOVER" sv, takeover_string, true ));
110111
111- auto fd_passing_socket_string = TRY (String::number (rc_fd_passing_fd ));
112+ auto fd_passing_socket_string = TRY (String::number (server_fd_passing_fd ));
112113
113114 ErrorOr<void > result;
114- for (auto const & path : candidate_request_server_paths ) {
115+ for (auto const & path : candidate_server_paths ) {
115116
116117 if (Core::System::access (path, X_OK).is_error ())
117118 continue ;
118119
119- auto arguments = Vector {
120+ auto arguments = Vector<StringView, 5 > {
120121 path.bytes_as_string_view (),
121122 " --fd-passing-socket" sv,
122123 fd_passing_socket_string,
@@ -130,18 +131,28 @@ ErrorOr<NonnullRefPtr<Protocol::RequestClient>> launch_request_server_process(Re
130131 }
131132
132133 if (result.is_error ())
133- warnln (" Could not launch any of {}: {}" , candidate_request_server_paths , result.error ());
134+ warnln (" Could not launch any of {}: {}" , candidate_server_paths , result.error ());
134135 VERIFY_NOT_REACHED ();
135136 }
136137
137- TRY (Core::System::close (rc_fd ));
138- TRY (Core::System::close (rc_fd_passing_fd ));
138+ TRY (Core::System::close (server_fd ));
139+ TRY (Core::System::close (server_fd_passing_fd ));
139140
140141 auto socket = TRY (Core::LocalSocket::adopt_fd (ui_fd));
141142 TRY (socket->set_blocking (true ));
142143
143- auto new_client = TRY (try_make_ref_counted<Protocol::RequestClient >(move (socket)));
144+ auto new_client = TRY (try_make_ref_counted<Client >(move (socket)));
144145 new_client->set_fd_passing_socket (TRY (Core::LocalSocket::adopt_fd (ui_fd_passing_fd)));
145146
146147 return new_client;
147148}
149+
150+ ErrorOr<NonnullRefPtr<Protocol::RequestClient>> launch_request_server_process (ReadonlySpan<String> candidate_request_server_paths, StringView serenity_resource_root)
151+ {
152+ return launch_generic_server_process<Protocol::RequestClient>(candidate_request_server_paths, serenity_resource_root, " RequestServer" sv);
153+ }
154+
155+ ErrorOr<NonnullRefPtr<Protocol::WebSocketClient>> launch_web_socket_process (ReadonlySpan<String> candidate_web_socket_paths, StringView serenity_resource_root)
156+ {
157+ return launch_generic_server_process<Protocol::WebSocketClient>(candidate_web_socket_paths, serenity_resource_root, " WebSocket" sv);
158+ }
0 commit comments