• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

PowerDNS / pdns / 18743945403

23 Oct 2025 09:29AM UTC coverage: 65.845% (+0.02%) from 65.829%
18743945403

Pull #16356

github

web-flow
Merge 8a2027ef1 into efa3637e8
Pull Request #16356: auth 5.0: backport "pdnsutil: fix b2b-migrate to from sql to non-sql"

42073 of 92452 branches covered (45.51%)

Branch coverage included in aggregate %.

128008 of 165855 relevant lines covered (77.18%)

6379935.17 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

74.75
/pdns/dnstap.cc
1
#include <boost/uuid/uuid.hpp>
2
#include "config.h"
3
#include "gettime.hh"
4
#include "protozero/types.hpp"
5
#include "dnstap.hh"
6

7
#ifndef DISABLE_PROTOBUF
8

9
#include <protozero/pbf_writer.hpp>
10

11
namespace DnstapBaseFields
12
{
13
enum : protozero::pbf_tag_type
14
{
15
  identity = 1,
16
  version = 2,
17
  extra = 3,
18
  message = 14,
19
  type = 15
20
};
21
}
22

23
namespace DnstapMessageTypes
24
{
25
enum : protozero::pbf_tag_type
26
{
27
  message = 1
28
};
29
}
30

31
namespace DnstapSocketFamilyTypes
32
{
33
enum : protozero::pbf_tag_type
34
{
35
  inet = 1,
36
  inet6 = 2
37
};
38
}
39

40
namespace DnstapMessageFields
41
{
42
enum : protozero::pbf_tag_type
43
{
44
  type = 1,
45
  socket_family = 2,
46
  socket_protocol = 3,
47
  query_address = 4,
48
  response_address = 5,
49
  query_port = 6,
50
  response_port = 7,
51
  query_time_sec = 8,
52
  query_time_nsec = 9,
53
  query_message = 10,
54
  query_zone = 11,
55
  response_time_sec = 12,
56
  response_time_nsec = 13,
57
  response_message = 14,
58
  policy = 15,
59
  http_protocol = 16,
60
};
61
}
62

63
std::string&& DnstapMessage::getBuffer()
64
{
36✔
65
  return std::move(d_buffer);
36✔
66
}
36✔
67

68
DnstapMessage::DnstapMessage(std::string&& buffer, DnstapMessage::MessageType type, const std::string& identity, const ComboAddress* requestor, const ComboAddress* responder, DnstapMessage::ProtocolType protocol, const char* packet, const size_t len, const struct timespec* queryTime, const struct timespec* responseTime, const boost::optional<const DNSName&>& auth, const boost::optional<HttpProtocolType> httpProtocol) :
69
  d_buffer(std::move(buffer))
30✔
70
{
36✔
71
  protozero::pbf_writer pbf{d_buffer};
36✔
72

73
  pbf.add_bytes(DnstapBaseFields::identity, identity);
36✔
74
  pbf.add_bytes(DnstapBaseFields::version, PACKAGE_STRING);
36✔
75
  pbf.add_enum(DnstapBaseFields::type, DnstapMessageTypes::message);
36✔
76

77
  protozero::pbf_writer pbf_message{pbf, DnstapBaseFields::message};
36✔
78

79
  // NOLINTNEXTLINE(bugprone-narrowing-conversions,cppcoreguidelines-narrowing-conversions)
80
  pbf_message.add_enum(DnstapMessageFields::type, static_cast<protozero::pbf_tag_type>(type));
36✔
81
  // NOLINTNEXTLINE(bugprone-narrowing-conversions,cppcoreguidelines-narrowing-conversions)
82
  pbf_message.add_enum(DnstapMessageFields::socket_protocol, static_cast<protozero::pbf_tag_type>(protocol));
36✔
83

84
  if (requestor != nullptr) {
36!
85
    pbf_message.add_enum(DnstapMessageFields::socket_family, requestor->sin4.sin_family == AF_INET ? DnstapSocketFamilyTypes::inet : DnstapSocketFamilyTypes::inet6);
36!
86
  }
36✔
87
  else if (responder != nullptr) {
×
88
    pbf_message.add_enum(DnstapMessageFields::socket_family, responder->sin4.sin_family == AF_INET ? DnstapSocketFamilyTypes::inet : DnstapSocketFamilyTypes::inet6);
×
89
  }
×
90

91
  if (requestor != nullptr) {
36!
92
    if (requestor->sin4.sin_family == AF_INET) {
36!
93
      // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
94
      pbf_message.add_bytes(DnstapMessageFields::query_address, reinterpret_cast<const char*>(&requestor->sin4.sin_addr.s_addr), sizeof(requestor->sin4.sin_addr.s_addr));
36✔
95
    }
36✔
96
    else if (requestor->sin4.sin_family == AF_INET6) {
×
97
      // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
98
      pbf_message.add_bytes(DnstapMessageFields::query_address, reinterpret_cast<const char*>(&requestor->sin6.sin6_addr.s6_addr), sizeof(requestor->sin6.sin6_addr.s6_addr));
×
99
    }
×
100
    pbf_message.add_uint32(DnstapMessageFields::query_port, ntohs(requestor->sin4.sin_port));
36✔
101
  }
36✔
102

103
  if (responder != nullptr) {
36!
104
    if (responder->sin4.sin_family == AF_INET) {
36!
105
      // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
106
      pbf_message.add_bytes(DnstapMessageFields::response_address, reinterpret_cast<const char*>(&responder->sin4.sin_addr.s_addr), sizeof(responder->sin4.sin_addr.s_addr));
36✔
107
    }
36✔
108
    else if (responder->sin4.sin_family == AF_INET6) {
×
109
      // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
110
      pbf_message.add_bytes(DnstapMessageFields::response_address, reinterpret_cast<const char*>(&responder->sin6.sin6_addr.s6_addr), sizeof(responder->sin6.sin6_addr.s6_addr));
×
111
    }
×
112
    pbf_message.add_uint32(DnstapMessageFields::response_port, ntohs(responder->sin4.sin_port));
36✔
113
  }
36✔
114

115
  if (queryTime != nullptr) {
36!
116
    pbf_message.add_uint64(DnstapMessageFields::query_time_sec, queryTime->tv_sec);
36✔
117
    pbf_message.add_fixed32(DnstapMessageFields::query_time_nsec, queryTime->tv_nsec);
36✔
118
  }
36✔
119

120
  if (responseTime != nullptr) {
36✔
121
    pbf_message.add_uint64(DnstapMessageFields::response_time_sec, responseTime->tv_sec);
8✔
122
    pbf_message.add_fixed32(DnstapMessageFields::response_time_nsec, responseTime->tv_nsec);
8✔
123
  }
8✔
124

125
  if (packet != nullptr && len >= sizeof(dnsheader)) {
36!
126
    const dnsheader_aligned dnsheader(packet);
34✔
127
    if (!dnsheader->qr) {
34✔
128
      pbf_message.add_bytes(DnstapMessageFields::query_message, packet, len);
24✔
129
    }
24✔
130
    else {
10✔
131
      pbf_message.add_bytes(DnstapMessageFields::response_message, packet, len);
10✔
132
    }
10✔
133
  }
34✔
134
  if (httpProtocol) {
36✔
135
    // NOLINTNEXTLINE(bugprone-narrowing-conversions,cppcoreguidelines-narrowing-conversions)
136
    pbf_message.add_enum(DnstapMessageFields::http_protocol, static_cast<protozero::pbf_tag_type>(*httpProtocol));
2✔
137
  }
2✔
138

139
  if (auth) {
36✔
140
    pbf_message.add_bytes(DnstapMessageFields::query_zone, auth->toDNSString());
6✔
141
  }
6✔
142

143
  pbf_message.commit();
36✔
144
}
36✔
145

146
void DnstapMessage::setExtra(const std::string& extra)
147
{
8✔
148
  protozero::pbf_writer pbf{d_buffer};
8✔
149
  pbf.add_bytes(DnstapBaseFields::extra, extra);
8✔
150
}
8✔
151

152
#endif /* DISABLE_PROTOBUF */
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc