master
cpp 49 lines 1.46 KB
Raw
1 // Copyright (C) Microsoft Corporation. All rights reserved.
2 #include "NetlinkChannel.h"
3 #include "NetlinkTransaction.h"
4 #include "NetlinkTransactionError.h"
5
6 NetlinkTransaction::NetlinkTransaction(NetlinkChannel& channel, std::vector<char>&& request, __u32 seq) :
7 m_channel(channel), m_request(std::move(request)), m_seq(seq)
8 {
9 }
10
11 void NetlinkTransaction::Execute(const std::function<void(const NetlinkResponse&)>& routine)
12 {
13 m_channel.SendMessage(m_request);
14
15 std::vector<NetlinkResponse> responses;
16
17 try
18 {
19 do
20 {
21 NetlinkResponse response = m_channel.ReceiveNetlinkResponse();
22 if (response.Sequence() != m_seq)
23 {
24 response.ThrowIfErrorFound();
25 continue;
26 }
27 responses.emplace_back(std::move(response));
28 responses.back().ThrowIfErrorFound();
29
30 routine(responses.back());
31 } while (responses.empty() || (responses.back().MultiMessage() && !responses.back().Done()));
32 }
33 catch (const std::exception& e)
34 {
35 throw NetlinkTransactionError(m_request, responses, e);
36 }
37 }
38
39 void NetlinkTransaction::PrintRequest() const
40 {
41 throw NetlinkTransactionError(m_request, {}, RuntimeErrorWithSourceLocation("Print netlink transaction request"));
42 }
43
44 std::string NetlinkTransaction::GetRawRequestString() const
45 {
46 std::stringstream str;
47 utils::FormatBinary(str, m_request.data(), m_request.size());
48 return str.str();
49 }