- if (inet_aton(av[i], &r->sa.sin.sin_addr)) {
- T( trace(T_ADMIN, "admin: resop %s done the easy way", BGTAG(r)); )
- r->sa.sin.sin_family = AF_INET;
- setport(&r->sa, r->port);
- func(r, ARES_OK);
+ aihint.ai_family = AF_INET;
+ aihint.ai_socktype = SOCK_DGRAM;
+ aihint.ai_protocol = IPPROTO_UDP;
+ aihint.ai_flags = AI_NUMERICHOST;
+ if (!getaddrinfo(av[i], 0, &aihint, &ailist)) {
+ for (ai = ailist; ai; ai = ai->ai_next) {
+ if ((j = afix(ai->ai_family)) >= 0 && udpsock[j].fd >= 0)
+ break;
+ }
+ if (!ai) {
+ T( trace(T_ADMIN, "admin: resop %s failed: "
+ "no suitable addresses returned", BGTAG(r)); )
+ a_bgfail(&r->bg, "resolve-error", "%s" , r->addr, A_END);
+ func(r, ARES_FAIL);
+ } else {
+ T( trace(T_ADMIN, "admin: resop %s done the easy way", BGTAG(r)); )
+ assert(ai->ai_addrlen <= sizeof(r->sa));
+ memcpy(&r->sa, ai->ai_addr, ai->ai_addrlen);
+ setport(&r->sa, r->port);
+ func(r, ARES_OK);
+ }
+ freeaddrinfo(ailist);