[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r32258 - gnunet/src/gns/nss
From: |
gnunet |
Subject: |
[GNUnet-SVN] r32258 - gnunet/src/gns/nss |
Date: |
Sat, 8 Feb 2014 00:11:51 +0100 |
Author: schanzen
Date: 2014-02-08 00:11:51 +0100 (Sat, 08 Feb 2014)
New Revision: 32258
Modified:
gnunet/src/gns/nss/nss_gns.c
gnunet/src/gns/nss/nss_gns_query.c
gnunet/src/gns/nss/nss_gns_query.h
Log:
fix reverse DNS lookup, prepare GNS reverse lookup
Modified: gnunet/src/gns/nss/nss_gns.c
===================================================================
--- gnunet/src/gns/nss/nss_gns.c 2014-02-07 18:37:39 UTC (rev 32257)
+++ gnunet/src/gns/nss/nss_gns.c 2014-02-07 23:11:51 UTC (rev 32258)
@@ -252,19 +252,104 @@
size_t buflen,
int *errnop,
int *h_errnop) {
-
- /* we dont do this */
-
+
+ struct userdata u;
enum nss_status status = NSS_STATUS_UNAVAIL;
+ int r;
+ size_t addr_len, idx, astart;
*errnop = EINVAL;
*h_errnop = NO_RECOVERY;
- /* Check for address types */
+ u.count = 0;
+ u.data_len = 0;
- *h_errnop = NO_RECOVERY;
+ addr_len = af == AF_INET ? sizeof(ipv4_address_t) : sizeof(ipv6_address_t);
- status = NSS_STATUS_NOTFOUND;
+ if (len < (int) addr_len ||
+#ifdef NSS_IPV4_ONLY
+ af != AF_INET
+#elif NSS_IPV6_ONLY
+ af != AF_INET6
+#else
+ (af != AF_INET && af != AF_INET6)
+#endif
+ ) {
+ *errnop = EINVAL;
+ *h_errnop = NO_RECOVERY;
+
+ goto finish;
+ }
+
+ if (buflen < sizeof((char*) addr_len)) {
+ *errnop = ERANGE;
+ *h_errnop = NO_RECOVERY;
+ status = NSS_STATUS_TRYAGAIN;
+ goto finish;
+ }
+
+#if ! defined(NSS_IPV6_ONLY) && ! defined(NSS_IPV4_ONLY)
+ if (af == AF_INET)
+#endif
+#ifndef NSS_IPV6_ONLY
+ r = namecache_resolve_ip4((const ipv4_address_t*) addr, &u);
+#endif
+#if ! defined(NSS_IPV6_ONLY) && ! defined(NSS_IPV4_ONLY)
+ else
+#endif
+#ifndef NSS_IPV4_ONLY
+ r = namecache_resolve_ip6((const ipv6_address_t*) addr, &u);
+#endif
+ if (0 > r) {
+ *errnop = ETIMEDOUT;
+ *h_errnop = HOST_NOT_FOUND;
+ //NODE we allow to leak this into DNS so no NOTFOUND
+ status = NSS_STATUS_UNAVAIL;
+ goto finish;
+ }
+
+ *((char**) buffer) = NULL;
+ result->h_aliases = (char**) buffer;
+ idx = sizeof(char*);
+
+ assert(u.count > 0);
+ assert(u.data.name[0]);
+
+ if (buflen <
+ strlen(u.data.name[0])+1+ /* official names */
+ sizeof(char*)+ /* alias names */
+ addr_len+ /* address */
+ sizeof(void*)*2 + /* address list */
+ sizeof(void*)) { /* padding to get the alignment right */
+ *errnop = ERANGE;
+ *h_errnop = NO_RECOVERY;
+ status = NSS_STATUS_TRYAGAIN;
+ goto finish;
+ }
+
+ /* Official name */
+ strcpy(buffer+idx, u.data.name[0]);
+ result->h_name = buffer+idx;
+ idx += strlen(u.data.name[0])+1;
+
+ result->h_addrtype = af;
+ result->h_length = addr_len;
+
+ /* Address */
+ astart = idx;
+ memcpy(buffer+astart, addr, addr_len);
+ idx += addr_len;
+
+ /* Address array, idx might not be at pointer alignment anymore, so we need
+ * to ensure it is*/
+ ALIGN(idx);
+
+ ((char**) (buffer+idx))[0] = buffer+astart;
+ ((char**) (buffer+idx))[1] = NULL;
+ result->h_addr_list = (char**) (buffer+idx);
+
+ status = NSS_STATUS_SUCCESS;
+finish:
return status;
}
Modified: gnunet/src/gns/nss/nss_gns_query.c
===================================================================
--- gnunet/src/gns/nss/nss_gns_query.c 2014-02-07 18:37:39 UTC (rev 32257)
+++ gnunet/src/gns/nss/nss_gns_query.c 2014-02-07 23:11:51 UTC (rev 32258)
@@ -106,4 +106,37 @@
return 0;
}
+#ifndef NSS_IPV6_ONLY
+/**
+ * Wrapper function that uses gnunet-namecache cli tool to resolve
+ * an hostnames from IPv4/6 addresses.
+ *
+ * @param addr the ip to resolve
+ * @param u the userdata (result struct)
+ * @return -1 on error else 0
+ */
+int
+namecache_resolve_ip4 (const ipv4_address_t* addr,
+ struct userdata *u)
+{
+ return -1;
+}
+#endif
+
+#ifndef NSS_IPV4_ONLY
+/**
+ * Wrapper function that uses gnunet-namecache cli tool to resolve
+ * an hostnames from IPv4/6 addresses.
+ *
+ * @param addr the ip to resolve
+ * @param u the userdata (result struct)
+ * @return -1 on error else 0
+ */
+int
+namecache_resolve_ip6 (const ipv6_address_t* addr,
+ struct userdata *u)
+{
+ return -1;
+}
+#endif
/* end of nss_gns_query.c */
Modified: gnunet/src/gns/nss/nss_gns_query.h
===================================================================
--- gnunet/src/gns/nss/nss_gns_query.h 2014-02-07 18:37:39 UTC (rev 32257)
+++ gnunet/src/gns/nss/nss_gns_query.h 2014-02-07 23:11:51 UTC (rev 32258)
@@ -60,4 +60,32 @@
const char *name,
struct userdata *userdata);
+#ifndef NSS_IPV6_ONLY
+/**
+ * Wrapper function that uses gnunet-namecache cli tool to resolve
+ * an hostnames from IPv4/6 addresses.
+ *
+ * @param addr the ip to resolve
+ * @param u the userdata (result struct)
+ * @return -1 on error else 0
+ */
+int
+namecache_resolve_ip4 (const ipv4_address_t* addr,
+ struct userdata *u);
#endif
+
+#ifndef NSS_IPV4_ONLY
+/**
+ * Wrapper function that uses gnunet-namecache cli tool to resolve
+ * an hostnames from IPv4/6 addresses.
+ *
+ * @param addr the ip to resolve
+ * @param u the userdata (result struct)
+ * @return -1 on error else 0
+ */
+int
+namecache_resolve_ip6 (const ipv6_address_t* addr,
+ struct userdata *u);
+#endif
+
+#endif
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r32258 - gnunet/src/gns/nss,
gnunet <=