On Wed, Nov 11, 2009 at 05:00:03PM -0600,
[email protected] <[email protected]> wrote
a message of 60 lines which said:
> I am wondering if anyone knows of an app similar to nslookup or
> dig that actually uses the system resolver.
C source attached. Compile, for instance, with:
gcc -o resolve-name resolve-name.c
> I am basically trying to uinderstand why the system resolver was
> getting stuck on the third entry within the resolv.conf while it
> should have tried one of the first two working DNS servers first.
Not sure it will help.
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip6.h>
#define MAXHOSTNAMELEN 256
char progname[MAXHOSTNAMELEN + 1];
void
usage()
{
fprintf(stderr, "Usage: %s hostname\n", progname);
}
char *
text_of(struct sockaddr *address)
{
char *text = malloc(INET6_ADDRSTRLEN);
struct sockaddr_in6 *address_v6;
struct sockaddr_in *address_v4;
if (address->sa_family == AF_INET6) {
address_v6 = (struct sockaddr_in6 *) address;
inet_ntop(AF_INET6, &address_v6->sin6_addr, text, INET6_ADDRSTRLEN);
} else if (address->sa_family == AF_INET) {
address_v4 = (struct sockaddr_in *) address;
inet_ntop(AF_INET, &address_v4->sin_addr, text, INET_ADDRSTRLEN);
} else {
return ("[Unknown family address]");
}
return text;
}
int
main(int argc, char **argv)
{
char hostname[MAXHOSTNAMELEN + 1];
struct addrinfo hints_numeric, hints;
struct addrinfo *result, *hostref;
int status;
strncpy(progname, argv[0], MAXHOSTNAMELEN);
progname[MAXHOSTNAMELEN] = 0;
if (argc != 2) {
usage();
exit(1);
}
strncpy(hostname, argv[1], MAXHOSTNAMELEN);
hostname[MAXHOSTNAMELEN] = 0;
/* RFC 1123 says we must try IP addresses first */
memset(&hints_numeric, 0, sizeof(hints_numeric));
hints_numeric.ai_flags = AI_NUMERICHOST;
hints_numeric.ai_socktype = SOCK_STREAM;
result = malloc(sizeof(struct addrinfo));
status = getaddrinfo(hostname, NULL, &hints_numeric, &result);
if (!status) {
fprintf(stdout, "%s is an IP address\n", hostname);
} else {
if (status == EAI_NONAME) {
/* Not an IP address */
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
result = malloc(sizeof(struct addrinfo));
status = getaddrinfo(hostname, NULL, &hints, &result);
if (status) {
fprintf(stderr, "Nothing found about host name %s\n", hostname);
abort();
}
} else {
fprintf(stderr, "Internal error, cannot resolve %s (error %i)\n",
hostname, status);
abort();
}
fprintf(stdout, "Address(es) of %s is(are):", hostname);
fprintf(stdout, " %s ", text_of(result->ai_addr));
for (hostref = result->ai_next; hostref != NULL; hostref = hostref->ai_next) {
fprintf(stdout, "%s ", text_of(hostref->ai_addr));
}
fprintf(stdout, "\n");
}
exit(0);
}
_______________________________________________
bind-users mailing list
[email protected]
https://lists.isc.org/mailman/listinfo/bind-users