1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 13:27:35 +00:00

LibIPC: Add an expressive way to close an IPC::File after sending it

If you don't need a file descriptor after sending it to someone over
IPC, construct it with IPC::File(fd, IPC::File::CloseAfterSending)
and LibIPC will take care of it for you. :^)
This commit is contained in:
Andreas Kling 2021-01-14 09:39:30 +01:00
parent 7f2d8e8884
commit f1f7bf567b
4 changed files with 3 additions and 7 deletions

View file

@ -48,8 +48,10 @@ public:
} }
// Tagged constructor for fd's that should be closed on destruction unless take_fd() is called. // Tagged constructor for fd's that should be closed on destruction unless take_fd() is called.
// Note that the tags are the same, this is intentional to allow expressive invocation.
enum Tag { enum Tag {
ConstructWithReceivedFileDescriptor = 1, ConstructWithReceivedFileDescriptor = 1,
CloseAfterSending = 1,
}; };
File(int fd, Tag) File(int fd, Tag)
: m_fd(fd) : m_fd(fd)

View file

@ -34,8 +34,6 @@ Message::Message()
Message::~Message() Message::~Message()
{ {
if (on_destruction)
on_destruction();
} }
} }

View file

@ -45,8 +45,6 @@ public:
virtual const char* message_name() const = 0; virtual const char* message_name() const = 0;
virtual MessageBuffer encode() const = 0; virtual MessageBuffer encode() const = 0;
Function<void()> on_destruction;
protected: protected:
Message(); Message();
}; };

View file

@ -78,9 +78,7 @@ OwnPtr<Messages::ProtocolServer::StartDownloadResponse> ClientConnection::handle
auto id = download->id(); auto id = download->id();
auto fd = download->download_fd(); auto fd = download->download_fd();
m_downloads.set(id, move(download)); m_downloads.set(id, move(download));
auto response = make<Messages::ProtocolServer::StartDownloadResponse>(id, fd); return make<Messages::ProtocolServer::StartDownloadResponse>(id, IPC::File(fd, IPC::File::CloseAfterSending));
response->on_destruction = [fd] { close(fd); };
return response;
} }
OwnPtr<Messages::ProtocolServer::StopDownloadResponse> ClientConnection::handle(const Messages::ProtocolServer::StopDownload& message) OwnPtr<Messages::ProtocolServer::StopDownloadResponse> ClientConnection::handle(const Messages::ProtocolServer::StopDownload& message)