| 185 | void HandleSocketData(fasio::tcp_socket&); |
| 186 | |
| 187 | bool InitializeServerSocket(bool abstract) { |
| 188 | fextl::string ServerSocketName; |
| 189 | if (abstract) { |
| 190 | ServerSocketName = FEXServerClient::GetServerSocketName(); |
| 191 | } else { |
| 192 | ServerSocketName = FEXServerClient::GetServerSocketPath(); |
| 193 | // Unlink the socket file if it exists |
| 194 | // We are being asked to create a daemon, not error check |
| 195 | // We don't care if this failed or not |
| 196 | unlink(ServerSocketName.c_str()); |
| 197 | } |
| 198 | auto Acceptor = fasio::tcp_acceptor::create(Reactor, abstract, ServerSocketName); |
| 199 | if (!Acceptor) { |
| 200 | LogMan::Msg::EFmt("Failed to create FEXServer socket: error {} ({})", errno, strerror(errno)); |
| 201 | return false; |
| 202 | } |
| 203 | |
| 204 | Acceptor->async_accept([](fasio::error ec, std::optional<fasio::tcp_socket> Socket) { |
| 205 | if (ec != fasio::error::success) { |
| 206 | if (ec == fasio::error::generic_errno) { |
| 207 | LogMan::Msg::EFmt("FEXServer failed to establish client connection: error {} ({})", errno, strerror(errno)); |
| 208 | } |
| 209 | // Ignore error and wait for next connection |
| 210 | return fasio::post_callback::repeat; |
| 211 | } |
| 212 | |
| 213 | int FD = Socket->FD; |
| 214 | ++NumClients; |
| 215 | Reactor.bind_handler( |
| 216 | pollfd { |
| 217 | .fd = FD, |
| 218 | .events = POLLIN | POLLPRI | POLLRDHUP, |
| 219 | .revents = 0, |
| 220 | }, |
| 221 | [Socket = std::move(Socket).value()](fasio::error ec) mutable { |
| 222 | if (ec != fasio::error::success) { |
| 223 | close(Socket.FD); |
| 224 | --NumClients; |
| 225 | return fasio::post_callback::drop; |
| 226 | } |
| 227 | HandleSocketData(Socket); |
| 228 | // Wait for next data |
| 229 | return fasio::post_callback::repeat; |
| 230 | }); |
| 231 | |
| 232 | // Wait for next connection |
| 233 | return fasio::post_callback::repeat; |
| 234 | }); |
| 235 | |
| 236 | (abstract ? ServerAcceptor : ServerFSAcceptor) = std::move(Acceptor).value(); |
| 237 | return true; |
| 238 | } |
| 239 | |
| 240 | void SendEmptyErrorPacket(fasio::tcp_socket& Socket) { |
| 241 | FEXServerClient::FEXServerResultPacket Res { |
no test coverage detected