#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
int main(void) {
struct in_addr server;
struct sockaddr_in serverSock;
//For our 'fake' resolution
struct addrinfo hints, *servinfo;
if(inet_pton(AF_INET, "208.67.220.220", &server) == 0) {
exit(1);
}
//Have to run getaddrinfo before we do this, atleast once, for some reason.
// memset(&hints, 0, sizeof hints);
// getaddrinfo("google.com", NULL, &hints, &servinfo);
// freeaddrinfo((struct addrinfo*)servinfo);
serverSock.sin_family = AF_INET;
serverSock.sin_port = htons(53);
serverSock.sin_addr = server;
res_init();
_res.nscount = 1;
_res.nsaddr_list[0] = serverSock;
char nsbuf[8192];
char disbuf[8192];
ns_msg msg;
ns_rr rr;
int l = res_query("myip.opendns.com", ns_t_a, ns_t_a, nsbuf, sizeof(nsbuf));
if(l<0) {
printf(":(\n");
exit(1);
}
ns_initparse(nsbuf, l, &msg);
int c = ns_msg_count(msg, ns_s_an);
for (int j=0; j < c; j++) {
if (ns_parserr(&msg, ns_s_an, j, &rr)) {
continue;
}
ns_sprintrr (&msg, &rr, NULL, NULL, disbuf, sizeof (disbuf));
printf("%s\n", disbuf);
}
}