mirror of
https://github.com/RGBCube/serenity
synced 2025-05-21 16:35:09 +00:00

I broke this when I made the protocol objects be wrapped by smart pointers to appease static analysis. The Protocol base class currently VERIFY's that it's never called. So to have the best of both worlds until someone actually fixes the code to do proper de-registration, just call `exit(..)` so the smart pointers never go out of scope.
50 lines
1.1 KiB
C++
50 lines
1.1 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <AK/HashMap.h>
|
|
#include <RequestServer/Protocol.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
namespace RequestServer {
|
|
|
|
static HashMap<String, Protocol*>& all_protocols()
|
|
{
|
|
static HashMap<String, Protocol*> map;
|
|
return map;
|
|
}
|
|
|
|
Protocol* Protocol::find_by_name(const String& name)
|
|
{
|
|
return all_protocols().get(name).value_or(nullptr);
|
|
}
|
|
|
|
Protocol::Protocol(const String& name)
|
|
{
|
|
all_protocols().set(name, this);
|
|
}
|
|
|
|
Protocol::~Protocol()
|
|
{
|
|
// FIXME: Do proper de-registration.
|
|
VERIFY_NOT_REACHED();
|
|
}
|
|
|
|
Result<Protocol::Pipe, String> Protocol::get_pipe_for_request()
|
|
{
|
|
int fd_pair[2] { 0 };
|
|
if (pipe(fd_pair) != 0) {
|
|
auto saved_errno = errno;
|
|
dbgln("Protocol: pipe() failed: {}", strerror(saved_errno));
|
|
return String { strerror(saved_errno) };
|
|
}
|
|
fcntl(fd_pair[1], F_SETFL, fcntl(fd_pair[1], F_GETFL) | O_NONBLOCK);
|
|
return Pipe { fd_pair[0], fd_pair[1] };
|
|
}
|
|
|
|
}
|