diff options
author | Christian Grothoff <christian@grothoff.org> | 2009-10-02 09:34:12 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2009-10-02 09:34:12 +0000 |
commit | 74efb4e42222ce72d27a8e783cb907f359821e8d (patch) | |
tree | bd835759f3fd3f6f25ca150b5b9c8558aa229f18 /src/util/resolver_api.c | |
parent | 76c961d4271d58514a3b78b56ee6b95780a2aab9 (diff) | |
download | gnunet-74efb4e42222ce72d27a8e783cb907f359821e8d.tar.gz gnunet-74efb4e42222ce72d27a8e783cb907f359821e8d.zip |
support any numeric address
Diffstat (limited to 'src/util/resolver_api.c')
-rw-r--r-- | src/util/resolver_api.c | 58 |
1 files changed, 44 insertions, 14 deletions
diff --git a/src/util/resolver_api.c b/src/util/resolver_api.c index dcda3141e..d761c075e 100644 --- a/src/util/resolver_api.c +++ b/src/util/resolver_api.c | |||
@@ -70,9 +70,7 @@ struct GetAddressContext | |||
70 | */ | 70 | */ |
71 | static const char *loopback[] = { | 71 | static const char *loopback[] = { |
72 | "localhost", | 72 | "localhost", |
73 | "127.0.0.1", | ||
74 | "ip6-localnet", | 73 | "ip6-localnet", |
75 | "::1", | ||
76 | NULL | 74 | NULL |
77 | }; | 75 | }; |
78 | 76 | ||
@@ -86,6 +84,8 @@ check_config (const struct GNUNET_CONFIGURATION_Handle *cfg) | |||
86 | { | 84 | { |
87 | char *hostname; | 85 | char *hostname; |
88 | unsigned int i; | 86 | unsigned int i; |
87 | struct in_addr v4; | ||
88 | struct in6_addr v6; | ||
89 | 89 | ||
90 | if (GNUNET_OK != | 90 | if (GNUNET_OK != |
91 | GNUNET_CONFIGURATION_get_value_string (cfg, | 91 | GNUNET_CONFIGURATION_get_value_string (cfg, |
@@ -99,6 +99,13 @@ check_config (const struct GNUNET_CONFIGURATION_Handle *cfg) | |||
99 | "resolver"); | 99 | "resolver"); |
100 | GNUNET_assert (0); | 100 | GNUNET_assert (0); |
101 | } | 101 | } |
102 | if ( (0 == inet_pton (AF_INET, | ||
103 | hostname, | ||
104 | &v4)) || | ||
105 | (0 == inet_pton (AF_INET6, | ||
106 | hostname, | ||
107 | &v6)) ) | ||
108 | return; | ||
102 | i = 0; | 109 | i = 0; |
103 | while (loopback[i] != NULL) | 110 | while (loopback[i] != NULL) |
104 | if (0 == strcmp (loopback[i++], hostname)) | 111 | if (0 == strcmp (loopback[i++], hostname)) |
@@ -274,25 +281,48 @@ GNUNET_RESOLVER_ip_get (struct GNUNET_SCHEDULER_Handle *sched, | |||
274 | struct sockaddr_in v4; | 281 | struct sockaddr_in v4; |
275 | struct sockaddr_in6 v6; | 282 | struct sockaddr_in6 v6; |
276 | 283 | ||
284 | memset (&v4, 0, sizeof(v4)); | ||
285 | v4.sin_addr.s_addr = htonl (INADDR_LOOPBACK); | ||
286 | v4.sin_family = AF_INET; | ||
287 | #if HAVE_SOCKADDR_IN_SIN_LEN | ||
288 | v4.sin_len = sizeof(v4); | ||
289 | #endif | ||
290 | memset (&v6, 0, sizeof(v6)); | ||
291 | v6.sin6_family = AF_INET6; | ||
292 | #if HAVE_SOCKADDR_IN_SIN_LEN | ||
293 | v6.sin6_len = sizeof(v6); | ||
294 | #endif | ||
295 | /* first, check if this is a numeric address */ | ||
296 | if ( ( (domain == AF_UNSPEC) ||(domain == AF_INET) ) && | ||
297 | (0 == inet_pton (AF_INET, | ||
298 | hostname, | ||
299 | &v4.sin_addr)) ) | ||
300 | { | ||
301 | callback (callback_cls, | ||
302 | (const struct sockaddr*) &v4, | ||
303 | sizeof(v4)); | ||
304 | callback (callback_cls, NULL, 0); | ||
305 | return; | ||
306 | } | ||
307 | if ( ( (domain == AF_UNSPEC) ||(domain == AF_INET) ) && | ||
308 | (0 == inet_pton (AF_INET6, | ||
309 | hostname, | ||
310 | &v6.sin6_addr)) ) | ||
311 | { | ||
312 | callback (callback_cls, | ||
313 | (const struct sockaddr*) &v6, | ||
314 | sizeof(v6)); | ||
315 | callback (callback_cls, NULL, 0); | ||
316 | return; | ||
317 | } | ||
277 | check_config (cfg); | 318 | check_config (cfg); |
319 | /* then, check if this is a loopback address */ | ||
278 | i = 0; | 320 | i = 0; |
279 | while (loopback[i] != NULL) | 321 | while (loopback[i] != NULL) |
280 | if (0 == strcmp (loopback[i++], hostname)) | 322 | if (0 == strcmp (loopback[i++], hostname)) |
281 | { | 323 | { |
282 | memset (&v4, 0, sizeof(v4)); | ||
283 | #if HAVE_SOCKADDR_IN_SIN_LEN | ||
284 | v4.sin_len = sizeof (v4); | ||
285 | #endif | ||
286 | v4.sin_family = AF_INET; | ||
287 | v4.sin_addr.s_addr = htonl (INADDR_LOOPBACK); | 324 | v4.sin_addr.s_addr = htonl (INADDR_LOOPBACK); |
288 | |||
289 | memset (&v6, 0, sizeof(v6)); | ||
290 | #if HAVE_SOCKADDR_IN_SIN_LEN | ||
291 | v6.sin6_len = sizeof (v6); | ||
292 | #endif | ||
293 | v6.sin6_family = AF_INET6; | ||
294 | v6.sin6_addr = in6addr_loopback; | 325 | v6.sin6_addr = in6addr_loopback; |
295 | |||
296 | switch (domain) | 326 | switch (domain) |
297 | { | 327 | { |
298 | case AF_INET: | 328 | case AF_INET: |