summaryrefslogtreecommitdiff
path: root/src/util/resolver_api.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2009-10-02 09:34:12 +0000
committerChristian Grothoff <christian@grothoff.org>2009-10-02 09:34:12 +0000
commit74efb4e42222ce72d27a8e783cb907f359821e8d (patch)
treebd835759f3fd3f6f25ca150b5b9c8558aa229f18 /src/util/resolver_api.c
parent76c961d4271d58514a3b78b56ee6b95780a2aab9 (diff)
downloadgnunet-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.c58
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 */
71static const char *loopback[] = { 71static 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: