28 #include <sys/types.h>
29 #include <netinet/in.h>
31 #include <arpa/nameser.h>
34 #include <arpa/nameser_compat.h>
39 namespace autoconfig {
41 union BaseDns::QueryAnswer
44 uint8_t buf[NS_PACKETSZ];
48 :
Base(face, keyChain, nextStageOnFailure)
55 std::string srvDomain =
"_ndn._udp." + fqdn;
56 std::cerr <<
"Sending DNS query for SRV record for " << srvDomain << std::endl;
64 QueryAnswer queryAnswer;
65 int answerSize = res_query(srvDomain.c_str(),
70 if (answerSize == 0) {
71 BOOST_THROW_EXCEPTION(
Error(
"No DNS SRV records found for " + srvDomain));
73 return parseSrvRr(queryAnswer, answerSize);
82 std::cerr <<
"Sending DNS query for SRV record for _ndn._udp" << std::endl;
84 QueryAnswer queryAnswer;
92 int answerSize = res_search(
"_ndn._udp",
98 if (answerSize == 0) {
99 BOOST_THROW_EXCEPTION(
Error(
"No DNS SRV records found for _ndn._udp"));
102 return parseSrvRr(queryAnswer, answerSize);
106 BaseDns::parseSrvRr(
const QueryAnswer& queryAnswer,
int answerSize)
127 if (ntohs(queryAnswer.header.ancount) == 0) {
128 BOOST_THROW_EXCEPTION(Error(
"SRV record cannot be parsed"));
131 const uint8_t* blob = queryAnswer.buf + NS_HFIXEDSZ;
133 blob += dn_skipname(blob, queryAnswer.buf + answerSize) + NS_QFIXEDSZ;
135 char srvName[NS_MAXDNAME];
136 int serverNameSize = dn_expand(queryAnswer.buf,
137 queryAnswer.buf + answerSize,
141 if (serverNameSize <= 0) {
142 BOOST_THROW_EXCEPTION(Error(
"SRV record cannot be parsed (error decoding domain name)"));
145 const srv_t* server =
reinterpret_cast<const srv_t*
>(&blob[
sizeof(rechdr)]);
146 uint16_t convertedPort = be16toh(server->port);
148 blob += serverNameSize + NS_HFIXEDSZ + NS_QFIXEDSZ;
150 char hostName[NS_MAXDNAME];
151 int hostNameSize = dn_expand(queryAnswer.buf,
152 queryAnswer.buf + answerSize,
156 if (hostNameSize <= 0) {
157 BOOST_THROW_EXCEPTION(Error(
"SRV record cannot be parsed (error decoding host name)"));
160 std::string uri =
"udp://";
161 uri.append(hostName);
163 uri.append(to_string(convertedPort));
Copyright (c) 2014-2016, Regents of the University of California, Arizona Board of Regents...