diff options
author | Martin Schanzenbach <mschanzenbach@posteo.de> | 2014-02-07 23:11:51 +0000 |
---|---|---|
committer | Martin Schanzenbach <mschanzenbach@posteo.de> | 2014-02-07 23:11:51 +0000 |
commit | ea14803789efc976c0f9d89097b1785a9325968d (patch) | |
tree | bf0d21cf7f77de131fdade0e1f435bbb25d28479 /src/gns | |
parent | bfe1a23a86253029afddd32e45b9802fabd48832 (diff) | |
download | gnunet-ea14803789efc976c0f9d89097b1785a9325968d.tar.gz gnunet-ea14803789efc976c0f9d89097b1785a9325968d.zip |
fix reverse DNS lookup, prepare GNS reverse lookup
Diffstat (limited to 'src/gns')
-rw-r--r-- | src/gns/nss/nss_gns.c | 97 | ||||
-rw-r--r-- | src/gns/nss/nss_gns_query.c | 33 | ||||
-rw-r--r-- | src/gns/nss/nss_gns_query.h | 28 |
3 files changed, 152 insertions, 6 deletions
diff --git a/src/gns/nss/nss_gns.c b/src/gns/nss/nss_gns.c index 5991c5a0f..d97d51fb5 100644 --- a/src/gns/nss/nss_gns.c +++ b/src/gns/nss/nss_gns.c | |||
@@ -252,19 +252,104 @@ enum nss_status _nss_gns_gethostbyaddr_r( | |||
252 | size_t buflen, | 252 | size_t buflen, |
253 | int *errnop, | 253 | int *errnop, |
254 | int *h_errnop) { | 254 | int *h_errnop) { |
255 | 255 | ||
256 | /* we dont do this */ | 256 | struct userdata u; |
257 | |||
258 | enum nss_status status = NSS_STATUS_UNAVAIL; | 257 | enum nss_status status = NSS_STATUS_UNAVAIL; |
258 | int r; | ||
259 | size_t addr_len, idx, astart; | ||
259 | 260 | ||
260 | *errnop = EINVAL; | 261 | *errnop = EINVAL; |
261 | *h_errnop = NO_RECOVERY; | 262 | *h_errnop = NO_RECOVERY; |
262 | 263 | ||
263 | /* Check for address types */ | 264 | u.count = 0; |
265 | u.data_len = 0; | ||
264 | 266 | ||
265 | *h_errnop = NO_RECOVERY; | 267 | addr_len = af == AF_INET ? sizeof(ipv4_address_t) : sizeof(ipv6_address_t); |
268 | |||
269 | if (len < (int) addr_len || | ||
270 | #ifdef NSS_IPV4_ONLY | ||
271 | af != AF_INET | ||
272 | #elif NSS_IPV6_ONLY | ||
273 | af != AF_INET6 | ||
274 | #else | ||
275 | (af != AF_INET && af != AF_INET6) | ||
276 | #endif | ||
277 | ) { | ||
278 | *errnop = EINVAL; | ||
279 | *h_errnop = NO_RECOVERY; | ||
280 | |||
281 | goto finish; | ||
282 | } | ||
283 | |||
284 | if (buflen < sizeof((char*) addr_len)) { | ||
285 | *errnop = ERANGE; | ||
286 | *h_errnop = NO_RECOVERY; | ||
287 | status = NSS_STATUS_TRYAGAIN; | ||
288 | goto finish; | ||
289 | } | ||
266 | 290 | ||
267 | status = NSS_STATUS_NOTFOUND; | 291 | #if ! defined(NSS_IPV6_ONLY) && ! defined(NSS_IPV4_ONLY) |
292 | if (af == AF_INET) | ||
293 | #endif | ||
294 | #ifndef NSS_IPV6_ONLY | ||
295 | r = namecache_resolve_ip4((const ipv4_address_t*) addr, &u); | ||
296 | #endif | ||
297 | #if ! defined(NSS_IPV6_ONLY) && ! defined(NSS_IPV4_ONLY) | ||
298 | else | ||
299 | #endif | ||
300 | #ifndef NSS_IPV4_ONLY | ||
301 | r = namecache_resolve_ip6((const ipv6_address_t*) addr, &u); | ||
302 | #endif | ||
303 | if (0 > r) { | ||
304 | *errnop = ETIMEDOUT; | ||
305 | *h_errnop = HOST_NOT_FOUND; | ||
306 | //NODE we allow to leak this into DNS so no NOTFOUND | ||
307 | status = NSS_STATUS_UNAVAIL; | ||
308 | goto finish; | ||
309 | } | ||
310 | |||
311 | *((char**) buffer) = NULL; | ||
312 | result->h_aliases = (char**) buffer; | ||
313 | idx = sizeof(char*); | ||
314 | |||
315 | assert(u.count > 0); | ||
316 | assert(u.data.name[0]); | ||
317 | |||
318 | if (buflen < | ||
319 | strlen(u.data.name[0])+1+ /* official names */ | ||
320 | sizeof(char*)+ /* alias names */ | ||
321 | addr_len+ /* address */ | ||
322 | sizeof(void*)*2 + /* address list */ | ||
323 | sizeof(void*)) { /* padding to get the alignment right */ | ||
324 | *errnop = ERANGE; | ||
325 | *h_errnop = NO_RECOVERY; | ||
326 | status = NSS_STATUS_TRYAGAIN; | ||
327 | goto finish; | ||
328 | } | ||
329 | |||
330 | /* Official name */ | ||
331 | strcpy(buffer+idx, u.data.name[0]); | ||
332 | result->h_name = buffer+idx; | ||
333 | idx += strlen(u.data.name[0])+1; | ||
334 | |||
335 | result->h_addrtype = af; | ||
336 | result->h_length = addr_len; | ||
337 | |||
338 | /* Address */ | ||
339 | astart = idx; | ||
340 | memcpy(buffer+astart, addr, addr_len); | ||
341 | idx += addr_len; | ||
342 | |||
343 | /* Address array, idx might not be at pointer alignment anymore, so we need | ||
344 | * to ensure it is*/ | ||
345 | ALIGN(idx); | ||
346 | |||
347 | ((char**) (buffer+idx))[0] = buffer+astart; | ||
348 | ((char**) (buffer+idx))[1] = NULL; | ||
349 | result->h_addr_list = (char**) (buffer+idx); | ||
350 | |||
351 | status = NSS_STATUS_SUCCESS; | ||
352 | finish: | ||
268 | return status; | 353 | return status; |
269 | } | 354 | } |
270 | 355 | ||
diff --git a/src/gns/nss/nss_gns_query.c b/src/gns/nss/nss_gns_query.c index b90fd6d05..9e1cdde34 100644 --- a/src/gns/nss/nss_gns_query.c +++ b/src/gns/nss/nss_gns_query.c | |||
@@ -106,4 +106,37 @@ gns_resolve_name (int af, | |||
106 | return 0; | 106 | return 0; |
107 | } | 107 | } |
108 | 108 | ||
109 | #ifndef NSS_IPV6_ONLY | ||
110 | /** | ||
111 | * Wrapper function that uses gnunet-namecache cli tool to resolve | ||
112 | * an hostnames from IPv4/6 addresses. | ||
113 | * | ||
114 | * @param addr the ip to resolve | ||
115 | * @param u the userdata (result struct) | ||
116 | * @return -1 on error else 0 | ||
117 | */ | ||
118 | int | ||
119 | namecache_resolve_ip4 (const ipv4_address_t* addr, | ||
120 | struct userdata *u) | ||
121 | { | ||
122 | return -1; | ||
123 | } | ||
124 | #endif | ||
125 | |||
126 | #ifndef NSS_IPV4_ONLY | ||
127 | /** | ||
128 | * Wrapper function that uses gnunet-namecache cli tool to resolve | ||
129 | * an hostnames from IPv4/6 addresses. | ||
130 | * | ||
131 | * @param addr the ip to resolve | ||
132 | * @param u the userdata (result struct) | ||
133 | * @return -1 on error else 0 | ||
134 | */ | ||
135 | int | ||
136 | namecache_resolve_ip6 (const ipv6_address_t* addr, | ||
137 | struct userdata *u) | ||
138 | { | ||
139 | return -1; | ||
140 | } | ||
141 | #endif | ||
109 | /* end of nss_gns_query.c */ | 142 | /* end of nss_gns_query.c */ |
diff --git a/src/gns/nss/nss_gns_query.h b/src/gns/nss/nss_gns_query.h index 65b0311fe..95c0d2f29 100644 --- a/src/gns/nss/nss_gns_query.h +++ b/src/gns/nss/nss_gns_query.h | |||
@@ -60,4 +60,32 @@ int gns_resolve_name(int af, | |||
60 | const char *name, | 60 | const char *name, |
61 | struct userdata *userdata); | 61 | struct userdata *userdata); |
62 | 62 | ||
63 | #ifndef NSS_IPV6_ONLY | ||
64 | /** | ||
65 | * Wrapper function that uses gnunet-namecache cli tool to resolve | ||
66 | * an hostnames from IPv4/6 addresses. | ||
67 | * | ||
68 | * @param addr the ip to resolve | ||
69 | * @param u the userdata (result struct) | ||
70 | * @return -1 on error else 0 | ||
71 | */ | ||
72 | int | ||
73 | namecache_resolve_ip4 (const ipv4_address_t* addr, | ||
74 | struct userdata *u); | ||
75 | #endif | ||
76 | |||
77 | #ifndef NSS_IPV4_ONLY | ||
78 | /** | ||
79 | * Wrapper function that uses gnunet-namecache cli tool to resolve | ||
80 | * an hostnames from IPv4/6 addresses. | ||
81 | * | ||
82 | * @param addr the ip to resolve | ||
83 | * @param u the userdata (result struct) | ||
84 | * @return -1 on error else 0 | ||
85 | */ | ||
86 | int | ||
87 | namecache_resolve_ip6 (const ipv6_address_t* addr, | ||
88 | struct userdata *u); | ||
89 | #endif | ||
90 | |||
63 | #endif | 91 | #endif |