summaryrefslogtreecommitdiff
path: root/src/network/res_msend.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-06-04 16:53:39 -0400
committerRich Felker <dalias@aerifal.cx>2014-06-04 16:53:39 -0400
commit01dc3f4fea73e4df31cc3e3bb1cd5580fc0d7938 (patch)
tree2f2df4e89bd0f01b63fda221ef9e6f147367afd9 /src/network/res_msend.c
parent934aa1350b96461f205ad69c95e8f6f035f6b62c (diff)
downloadmusl-01dc3f4fea73e4df31cc3e3bb1cd5580fc0d7938.tar.gz
add support for reverse name lookups from hosts file to getnameinfo
this also affects the legacy gethostbyaddr family, which uses getnameinfo as its backend. some other minor changes associated with the refactoring of source files are also made; in particular, the resolv.conf parser now uses the same code that's used elsewhere to handle ip literals, so as a side effect it can now accept a scope id for nameserver addressed with link-local scope.
Diffstat (limited to 'src/network/res_msend.c')
-rw-r--r--src/network/res_msend.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/network/res_msend.c b/src/network/res_msend.c
index a5b7793a..5192b4d8 100644
--- a/src/network/res_msend.c
+++ b/src/network/res_msend.c
@@ -12,6 +12,7 @@
#include <pthread.h>
#include "stdio_impl.h"
#include "syscall.h"
+#include "lookup.h"
static void cleanup(void *p)
{
@@ -47,6 +48,7 @@ int __res_msend(int nqueries, const unsigned char *const *queries,
int cs;
struct pollfd pfd;
unsigned long t0, t1, t2;
+ struct address iplit;
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
@@ -76,13 +78,18 @@ int __res_msend(int nqueries, const unsigned char *const *queries,
for (z=s; *z && !isspace(*z); z++);
*z=0;
- if (inet_pton(AF_INET, s, &ns[nns].sin.sin_addr)>0) {
- ns[nns].sin.sin_port = htons(53);
- ns[nns++].sin.sin_family = AF_INET;
- } else if (inet_pton(AF_INET6, s, &ns[nns].sin6.sin6_addr)>0) {
- sl = sizeof sa.sin6;
- ns[nns].sin6.sin6_port = htons(53);
- ns[nns++].sin6.sin6_family = family = AF_INET6;
+ if (__lookup_ipliteral(&iplit, s, AF_UNSPEC)>0) {
+ if (iplit.family == AF_INET) {
+ memcpy(&ns[nns].sin.sin_addr, iplit.addr, 4);
+ ns[nns].sin.sin_port = htons(53);
+ ns[nns++].sin.sin_family = AF_INET;
+ } else {
+ sl = sizeof sa.sin6;
+ memcpy(&ns[nns].sin6.sin6_addr, iplit.addr, 16);
+ ns[nns].sin6.sin6_port = htons(53);
+ ns[nns].sin6.sin6_scope_id = iplit.scopeid;
+ ns[nns++].sin6.sin6_family = family = AF_INET6;
+ }
}
}
if (f) __fclose_ca(f);