Alien-cares
view release on metacpan or search on metacpan
libcares/test/dns-proto.cc view on Meta::CPAN
unsigned long order = DNS__16BIT(p);
unsigned long pref = DNS__16BIT(p + 2);
p += 4;
ss << order << " " << pref;
int len = *p++;
std::string flags(p, p + len);
ss << " " << flags;
p += len;
len = *p++;
std::string service(p, p + len);
ss << " '" << service << "'";
p += len;
len = *p++;
std::string regexp(p, p + len);
ss << " '" << regexp << "'";
p += len;
int rc = ares_expand_name(p, packet.data(), packet.size(), &name, &enclen);
if (rc != ARES_SUCCESS) {
ss << "(error from ares_expand_name)";
break;
}
ss << " '" << name << "'";
ares_free_string(name);
} else {
ss << "(RR too short)";
}
break;
}
default:
ss << " " << HexDump(*data, rdatalen);
break;
}
}
*data += rdatalen;
*len -= rdatalen;
ss << "}";
return ss.str();
}
void PushInt32(std::vector<byte>* data, int value) {
data->push_back((value & 0xff000000) >> 24);
data->push_back((value & 0x00ff0000) >> 16);
data->push_back((value & 0x0000ff00) >> 8);
data->push_back(value & 0x000000ff);
}
void PushInt16(std::vector<byte>* data, int value) {
data->push_back((value & 0xff00) >> 8);
data->push_back(value & 0x00ff);
}
std::vector<byte> EncodeString(const std::string& name) {
std::vector<byte> data;
std::stringstream ss(name);
std::string label;
// TODO: cope with escapes
while (std::getline(ss, label, '.')) {
data.push_back(label.length());
data.insert(data.end(), label.begin(), label.end());
}
data.push_back(0);
return data;
}
std::vector<byte> DNSQuestion::data() const {
std::vector<byte> data;
std::vector<byte> encname = EncodeString(name_);
data.insert(data.end(), encname.begin(), encname.end());
PushInt16(&data, rrtype_);
PushInt16(&data, qclass_);
return data;
}
std::vector<byte> DNSRR::data() const {
std::vector<byte> data = DNSQuestion::data();
PushInt32(&data, ttl_);
return data;
}
std::vector<byte> DNSSingleNameRR::data() const {
std::vector<byte> data = DNSRR::data();
std::vector<byte> encname = EncodeString(other_);
int len = encname.size();
PushInt16(&data, len);
data.insert(data.end(), encname.begin(), encname.end());
return data;
}
std::vector<byte> DNSTxtRR::data() const {
std::vector<byte> data = DNSRR::data();
int len = 0;
for (const std::string& txt : txt_) {
len += (1 + txt.size());
}
PushInt16(&data, len);
for (const std::string& txt : txt_) {
data.push_back(txt.size());
data.insert(data.end(), txt.begin(), txt.end());
}
return data;
}
std::vector<byte> DNSMxRR::data() const {
std::vector<byte> data = DNSRR::data();
std::vector<byte> encname = EncodeString(other_);
int len = 2 + encname.size();
PushInt16(&data, len);
PushInt16(&data, pref_);
data.insert(data.end(), encname.begin(), encname.end());
return data;
}
std::vector<byte> DNSSrvRR::data() const {
std::vector<byte> data = DNSRR::data();
std::vector<byte> encname = EncodeString(target_);
int len = 6 + encname.size();
( run in 1.597 second using v1.01-cache-2.11-cpan-6fb7bf0f510 )