1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 13:47:45 +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.
// Note that the tags are the same, this is intentional to allow expressive invocation.
enum Tag {
ConstructWithReceivedFileDescriptor = 1,
CloseAfterSending = 1,
};
File(int fd, Tag)
: m_fd(fd)

View file

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

View file

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

View file

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