diff options
| -rw-r--r-- | ares/adig.c | 41 | 
1 files changed, 28 insertions, 13 deletions
| diff --git a/ares/adig.c b/ares/adig.c index 27b250047..c09920ba0 100644 --- a/ares/adig.c +++ b/ares/adig.c @@ -27,14 +27,23 @@  #include <unistd.h>  #include <netdb.h>  #endif +#ifdef HAVE_GETOPT_H +#include <getopt.h> +#endif  #include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <ctype.h>  #include <errno.h> +  #include "ares.h"  #include "ares_dns.h" +#include "inet_ntop.h" + +#ifdef WATT32 +#undef WIN32  /* Redefined in MingW headers */ +#endif  #ifndef INADDR_NONE  #define INADDR_NONE 0xffffffff @@ -45,8 +54,10 @@  #define T_SRV 33 /* server selection */  #endif +#ifndef optind  extern int optind;  extern char *optarg; +#endif  struct nv {    const char *name; @@ -412,7 +423,7 @@ static const unsigned char *display_rr(const unsigned char *aptr,    char *name;    int type, dnsclass, ttl, dlen, status;    long len; -  struct in_addr addr; +  char addr[46];    /* Parse the RR name. */    status = ares_expand_name(aptr, abuf, alen, &name, &len); @@ -474,12 +485,12 @@ static const unsigned char *display_rr(const unsigned char *aptr,        len = *p;        if (p + len + 1 > aptr + dlen)          return NULL; -      printf("\t%.*s", len, p + 1); +      printf("\t%.*s", (int)len, p + 1);        p += len + 1;        len = *p;        if (p + len + 1 > aptr + dlen)          return NULL; -      printf("\t%.*s", len, p + 1); +      printf("\t%.*s", (int)len, p + 1);        break;      case T_MINFO: @@ -504,7 +515,7 @@ static const unsigned char *display_rr(const unsigned char *aptr,         */        if (dlen < 2)          return NULL; -      printf("\t%d", (aptr[0] << 8) | aptr[1]); +      printf("\t%d", DNS__16BIT(aptr));        status = ares_expand_name(aptr + 2, abuf, alen, &name, &len);        if (status != ARES_SUCCESS)          return NULL; @@ -531,12 +542,9 @@ static const unsigned char *display_rr(const unsigned char *aptr,        p += len;        if (p + 20 > aptr + dlen)          return NULL; -      printf("\t\t\t\t\t\t( %d %d %d %d %d )", -             (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3], -             (p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7], -             (p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11], -             (p[12] << 24) | (p[13] << 16) | (p[14] << 8) | p[15], -             (p[16] << 24) | (p[17] << 16) | (p[18] << 8) | p[19]); +      printf("\t\t\t\t\t\t( %lu %lu %lu %lu %lu )", +             DNS__32BIT(p), DNS__32BIT(p+4), DNS__32BIT(p+8), +             DNS__32BIT(p+12), DNS__32BIT(p+16));        break;      case T_TXT: @@ -548,7 +556,7 @@ static const unsigned char *display_rr(const unsigned char *aptr,            len = *p;            if (p + len + 1 > aptr + dlen)              return NULL; -          printf("\t%.*s", len, p + 1); +          printf("\t%.*s", (int)len, p + 1);            p += len + 1;          }        break; @@ -557,8 +565,14 @@ static const unsigned char *display_rr(const unsigned char *aptr,        /* The RR data is a four-byte Internet address. */        if (dlen != 4)          return NULL; -      memcpy(&addr, aptr, sizeof(struct in_addr)); -      printf("\t%s", inet_ntoa(addr)); +      printf("\t%s", ares_inet_ntop(AF_INET,aptr,addr,sizeof(addr))); +      break; + +    case T_AAAA: +      /* The RR data is a 16-byte IPv6 address. */ +      if (dlen != 16) +        return NULL; +      printf("\t%s", ares_inet_ntop(AF_INET6,aptr,addr,sizeof(addr)));        break;      case T_WKS: @@ -583,6 +597,7 @@ static const unsigned char *display_rr(const unsigned char *aptr,      default:        printf("\t[Unknown RR; cannot parse]"); +      break;      }    printf("\n"); | 
