<meta charset="utf-8" emacsmode="-*- markdown -*-"> A warm welcome to DNS
Note: this page is part of the 'hello-dns' documentation effort.
Based on tdns
, a C++ project, a C API is also available.
This is meant as an easy gateway for C users. The tdns C-API is aimed to resolve simple queries, without having to import all the glory that is `getdns`. For any advanced work, including asynchronous queries, encryption and cryptography, please use getdns.
To start, initialize a TDNSContext
object like this:
``` struct TDNSContext* tdns = TDNSMakeContext(""); if(!tdns) { fprintf(stderr, "Unable to initialize tdns\n"); return EXIT_FAILURE; } ``` This will lift resolver addresses from the system default. To use a specific resolver, pass its address to TDNSMakeContext
.
A context needs to be freed by calling freeTDNSContext
.
Once a context is acquired, it can be used to perform queries:
``` struct TDNSIPAddresses* ips; err = TDNSLookupIPs(tdns, "www.dns-oarc.net", 1000, 1, 1, &ips); if(err) { fprintf(stderr, "Error looking up domain name: %s\n", TDNSErrorMessage(err)); return EXIT_FAILURE; } ```
This call specifies a timeout of 1000 milliseconds, and requests IPv4 and IPv6 addresses.
An error is indicated by a non-zero return value, in which case the error is available through TDNSErrorMessage
.
Actual IP addresses, IPv4 or IPv6, are returned as struct sockaddr_storage
pointers in TDNSIpAddressess::addresses
:
``` for(int n = 0; ips->addresses[n]; ++n) { struct sockaddr_storage* res = ips->addresses[n]; char ip[INET6_ADDRSTRLEN]; if(res->ss_family == AF_INET) inet_ntop(res->ss_family, &((struct sockaddr_in*)res)->sin_addr, ip, INET6_ADDRSTRLEN); else inet_ntop(res->ss_family, &((struct sockaddr_in6*)res)->sin6_addr, ip, INET6_ADDRSTRLEN); printf("IP address: %s\n", ip); } freeTDNSIPAddresses(ips); `` The sequence is terminated by a 0 pointer in
addressses. Note that the answer must also be freed with
freeTDNSIPAddresses`.
Looking up MX records proceeds among similar lines:
``` struct TDNSMXs* mxs; err = TDNSLookupMXs(tdns, "isc.org", 1000, &mxs);
(...)
for(int n = 0; mxs->mxs[n]; ++n) { struct TDNSMX* res = mxs->mxs[n]; printf("MX %d %s\n", res->priority, res->name); } freeTDNSMXs(mxs); ```
And TXT records:
``` struct TDNSTXTs* txts; err = TDNSLookupTXTs(tdns, "nl", 1000, &txts);
(...)
for(int n = 0; txts->txts[n]; ++n) { struct TDNSTXT* res = txts->txts[n]; printf("TXT %s\n", res->content); } freeTDNSTXTs(txts); ```
The full code of these examples can be found on GitHub.
<script> window.markdeepOptions={}; window.markdeepOptions.tocStyle = "long"; </script> <style class="fallback">body{visibility:hidden;white-space:pre;font-family:monospace}</style><script src="../ext/markdeep.min.js"></script><script>window.alreadyProcessedMarkdeep||(document.body.style.visibility="visible")</script>