gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r33013 - gnunet/src/nat


From: gnunet
Subject: [GNUnet-SVN] r33013 - gnunet/src/nat
Date: Thu, 10 Apr 2014 10:04:26 +0200

Author: wachs
Date: 2014-04-10 10:04:26 +0200 (Thu, 10 Apr 2014)
New Revision: 33013

Modified:
   gnunet/src/nat/nat.c
Log:
upnp support just silently failed if upnp client is not available


Modified: gnunet/src/nat/nat.c
===================================================================
--- gnunet/src/nat/nat.c        2014-04-10 07:49:43 UTC (rev 33012)
+++ gnunet/src/nat/nat.c        2014-04-10 08:04:26 UTC (rev 33013)
@@ -1024,32 +1024,51 @@
   struct LocalAddressList *pos;
   struct LocalAddressList *next;
 
+
   if (GNUNET_YES == add_remove)
   {
     add_to_address_list (h, LAL_UPNP, addr, addrlen);
     return;
   }
-  /* remove address */
-  next = h->lal_head;
-  while (NULL != (pos = next))
+  else if (GNUNET_NO == add_remove)
   {
-    next = pos->next;
-    if ((pos->source != LAL_UPNP) || (pos->addrlen != addrlen) ||
-        (0 != memcmp (&pos[1], addr, addrlen)))
-      continue;
-    GNUNET_CONTAINER_DLL_remove (h->lal_head, h->lal_tail, pos);
-    if (NULL != h->address_callback)
-      h->address_callback (h->callback_cls, GNUNET_NO,
-                           (const struct sockaddr *) &pos[1], pos->addrlen);
-    GNUNET_free (pos);
-    return;                     /* only remove once */
+    /* remove address */
+    next = h->lal_head;
+    while (NULL != (pos = next))
+    {
+      next = pos->next;
+      if ((pos->source != LAL_UPNP) || (pos->addrlen != addrlen) ||
+          (0 != memcmp (&pos[1], addr, addrlen)))
+        continue;
+      GNUNET_CONTAINER_DLL_remove (h->lal_head, h->lal_tail, pos);
+      if (NULL != h->address_callback)
+        h->address_callback (h->callback_cls, GNUNET_NO,
+                             (const struct sockaddr *) &pos[1], pos->addrlen);
+      GNUNET_free (pos);
+      return;                     /* only remove once */
+    }
+    /* asked to remove address that does not exist */
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "Asked to remove unkown address `%s'\n",
+         GNUNET_a2s(addr, addrlen));
+    GNUNET_break (0);
   }
-  /* asked to remove address that does not exist */
-  LOG (GNUNET_ERROR_TYPE_ERROR,
-       "Asked to remove unkown address `%s'\n",
-       GNUNET_a2s(addr, addrlen));
-  GNUNET_break (0);
+  else if (GNUNET_SYSERR == add_remove)
+  {
+    /* Error while running upnp client */
+    if (NULL != emsg)
+      LOG (GNUNET_ERROR_TYPE_ERROR,
+          _("Error while running upnp client: `%s'\n"), emsg);
+    else
+      LOG (GNUNET_ERROR_TYPE_ERROR,
+          _("Error while running upnp client \n"));
+    return;
+  }
+  else
+  {
 
+    GNUNET_break (0);
+  }
 }
 
 
@@ -1072,9 +1091,19 @@
       return;                   /* already got this port */
     ml = ml->next;
   }
+
   ml = GNUNET_new (struct MiniList);
   ml->port = port;
   ml->mini = GNUNET_NAT_mini_map_start (port, h->is_tcp, &upnp_add, h);
+
+  if (NULL == ml->mini)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+        _("Failed to run upnp client for port %u\n"), ml->port);
+    GNUNET_free (ml);
+    return;
+  }
+
   GNUNET_CONTAINER_DLL_insert (h->mini_head, h->mini_tail, ml);
 }
 
@@ -1112,7 +1141,12 @@
         add_to_address_list (h, LAL_BINDTO_ADDRESS, sa,
                              sizeof (struct sockaddr_in));
       if (h->enable_upnp)
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+            "Running upnp client for address `%s'\n",
+            GNUNET_a2s (sa,sizeof (struct sockaddr_in)));
         add_minis (h, ntohs (v4->sin_port));
+      }
       break;
     case AF_INET6:
       if (sizeof (struct sockaddr_in6) != h->local_addrlens[i])
@@ -1254,6 +1288,15 @@
   if (NULL == reversal_callback)
     h->enable_nat_server = GNUNET_NO;
 
+  /* Check for UPnP client, disable immediately if not available */
+  if (GNUNET_SYSERR ==
+      GNUNET_OS_check_helper_binary ("upnpc", GNUNET_NO, NULL))
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+        _("UPnP enable in configuration, but UPnP client `upnpc` command not 
found, disabling UPnP \n"));
+    h->enable_upnp = GNUNET_NO;
+  }
+
   /* Check if NAT was hole-punched */
   if ((NULL != h->address_callback) &&
       (NULL != h->external_address) &&




reply via email to

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