gnunet-svn
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]