diff options
Diffstat (limited to 'ares/adig.c')
-rw-r--r-- | ares/adig.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/ares/adig.c b/ares/adig.c index 0dfc8bd26..cc0d42d56 100644 --- a/ares/adig.c +++ b/ares/adig.c @@ -151,6 +151,7 @@ static const char *opcodes[] = { "UPDATEA", "UPDATED", "UPDATEDA", "UPDATEM", "UPDATEMA", "ZONEINIT", "ZONEREF" }; + struct in_addr inaddr; static const char *rcodes[] = { "NOERROR", "FORMERR", "SERVFAIL", "NXDOMAIN", "NOTIMP", "REFUSED", @@ -212,11 +213,15 @@ int main(int argc, char **argv) case 's': /* Add a server, and specify servers in the option mask. */ - hostent = gethostbyname(optarg); - if (!hostent || hostent->h_addrtype != AF_INET) + if (inet_pton(AF_INET, optarg, &inaddr) <= 0) { - fprintf(stderr, "adig: server %s not found.\n", optarg); - return 1; + hostent = gethostbyname(optarg); + if (!hostent || hostent->h_addrtype != AF_INET) + { + fprintf(stderr, "adig: server %s not found.\n", optarg); + return 1; + } + memcpy(&inaddr, hostent->h_addr, sizeof(struct in_addr)); } options.servers = realloc(options.servers, (options.nservers + 1) * sizeof(struct in_addr)); @@ -225,7 +230,7 @@ int main(int argc, char **argv) fprintf(stderr, "Out of memory!\n"); return 1; } - memcpy(&options.servers[options.nservers], hostent->h_addr, + memcpy(&options.servers[options.nservers], &inaddr, sizeof(struct in_addr)); options.nservers++; optmask |= ARES_OPT_SERVERS; |