proper cleanup
authorChristian Grothoff <christian@grothoff.org>
Mon, 11 Jul 2011 14:35:44 +0000 (14:35 +0000)
committerChristian Grothoff <christian@grothoff.org>
Mon, 11 Jul 2011 14:35:44 +0000 (14:35 +0000)
src/nat/nat.c
src/nat/nat_mini.c

index 9d7d3ee72216d43b9022efc0dc43440a7a7da94c..bf956587723d48a4f3c72bf2b7053874db3f02d1 100644 (file)
@@ -1316,7 +1316,8 @@ GNUNET_NAT_unregister (struct GNUNET_NAT_Handle *h)
       GNUNET_CONTAINER_DLL_remove (h->mini_head,
                                   h->mini_tail,
                                   ml);
-      GNUNET_NAT_mini_map_stop (ml->mini);
+      if (NULL != ml->mini)
+       GNUNET_NAT_mini_map_stop (ml->mini);
       GNUNET_free (ml);
     }
   if (h->ext_dns != NULL)
index be8f63f6614326ae93769b21733b0a3414399cc8..c8ac65edb00ed9aa8d84b135ebc889b22857281c 100644 (file)
@@ -399,7 +399,7 @@ process_map_output (void *cls,
  * @param is_tcp GNUNET_YES to map TCP, GNUNET_NO for UDP
  * @param ac function to call with mapping result
  * @param ac_cls closure for 'ac'
- * @return NULL on error
+ * @return NULL on error (no 'upnpc' installed)
  */
 struct GNUNET_NAT_MiniHandle *
 GNUNET_NAT_mini_map_start (uint16_t port,
@@ -410,6 +410,9 @@ GNUNET_NAT_mini_map_start (uint16_t port,
   struct GNUNET_NAT_MiniHandle *ret;
   char pstr[6];
 
+  if (GNUNET_SYSERR ==
+      GNUNET_OS_check_helper_binary ("upnpc"))
+    return NULL;
   ret = GNUNET_malloc (sizeof (struct GNUNET_NAT_MiniHandle));
   ret->ac = ac;
   ret->ac_cls = ac_cls;
@@ -474,16 +477,6 @@ GNUNET_NAT_mini_map_stop (struct GNUNET_NAT_MiniHandle *mini)
 {
   char pstr[6];
 
-  if (! mini->did_map)
-    {
-      if (mini->map_cmd != NULL)
-       {
-         GNUNET_OS_command_stop (mini->map_cmd);
-         mini->map_cmd = NULL;
-       }
-      GNUNET_free (mini);
-      return;
-    }
   if (GNUNET_SCHEDULER_NO_TASK != mini->refresh_task)
     {
       GNUNET_SCHEDULER_cancel (mini->refresh_task);
@@ -494,6 +487,16 @@ GNUNET_NAT_mini_map_stop (struct GNUNET_NAT_MiniHandle *mini)
       GNUNET_OS_command_stop (mini->refresh_cmd);
       mini->refresh_cmd = NULL;
     }
+  if (! mini->did_map)
+    {
+      if (mini->map_cmd != NULL)
+       {
+         GNUNET_OS_command_stop (mini->map_cmd);
+         mini->map_cmd = NULL;
+       }
+      GNUNET_free (mini);
+      return;
+    }
   mini->ac (mini->ac_cls, GNUNET_NO,
            (const struct sockaddr*) &mini->current_addr,
            sizeof (mini->current_addr));