trying to fix #4003
[oweals/gnunet.git] / src / transport / transport_api_monitor_peers.c
index 5b3fd64b8cd393e98e1ef2005371c93a7ec15845..f1154a95f33d0abb68f835f93b71ab10202dace7 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2009-2014 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2009-2014 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
@@ -74,7 +74,7 @@ struct GNUNET_TRANSPORT_PeerMonitoringContext
   /**
    * Task ID for reconnect.
    */
-  struct GNUNET_SCHEDULER_Task * reconnect_task;
+  struct GNUNET_SCHEDULER_Task *reconnect_task;
 
   /**
    * Identity of the peer to monitor.
@@ -115,7 +115,7 @@ GNUNET_TRANSPORT_is_connected (enum GNUNET_TRANSPORT_PeerState state)
     return GNUNET_NO;
   default:
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Unhandled state `%s' \n",
+                "Unhandled state `%s'\n",
                 GNUNET_TRANSPORT_ps2s (state));
     GNUNET_break (0);
     break;
@@ -333,39 +333,49 @@ peer_response_processor (void *cls,
     return;
   }
 
-  if (0 == tlen)
+  if ( (0 == tlen) && (0 == alen) )
   {
-    GNUNET_break (0); /* This must not happen: address without plugin */
-    return;
+    /* No address available */
+    pal_ctx->cb (pal_ctx->cb_cls, &pir_msg->peer, NULL,
+        ntohl(pir_msg->state),
+        GNUNET_TIME_absolute_ntoh (pir_msg->state_timeout));
   }
-  addr = (const char *) &pir_msg[1];
-  transport_name = &addr[alen];
-
-  if (transport_name[tlen - 1] != '\0')
+  else
   {
-    /* Corrupt plugin name */
-    GNUNET_break (0);
-    if (pal_ctx->one_shot)
+    if (0 == tlen)
     {
-      pal_ctx->cb (pal_ctx->cb_cls, NULL, NULL,
-                  GNUNET_TRANSPORT_PS_NOT_CONNECTED, GNUNET_TIME_UNIT_ZERO_ABS);
-      GNUNET_TRANSPORT_monitor_peers_cancel (pal_ctx);
+      GNUNET_break (0); /* This must not happen: address without plugin */
+      return;
     }
-    else
+    addr = (const char *) &pir_msg[1];
+    transport_name = &addr[alen];
+
+    if (transport_name[tlen - 1] != '\0')
     {
-      reconnect_peer_ctx (pal_ctx);
+      /* Corrupt plugin name */
+      GNUNET_break (0);
+      if (pal_ctx->one_shot)
+      {
+        pal_ctx->cb (pal_ctx->cb_cls, NULL, NULL,
+            GNUNET_TRANSPORT_PS_NOT_CONNECTED, GNUNET_TIME_UNIT_ZERO_ABS);
+        GNUNET_TRANSPORT_monitor_peers_cancel (pal_ctx);
+      }
+      else
+      {
+        reconnect_peer_ctx (pal_ctx);
+      }
+      return;
     }
-    return;
-  }
 
-  /* notify client */
-  address = GNUNET_HELLO_address_allocate (&pir_msg->peer,
-                                          transport_name, addr, alen, ntohl(pir_msg->local_address_info));
-  pal_ctx->cb (pal_ctx->cb_cls, &pir_msg->peer, address,
-              ntohl(pir_msg->state),
-              GNUNET_TIME_absolute_ntoh (pir_msg->state_timeout));
-  GNUNET_HELLO_address_free (address);
+    /* notify client */
+    address = GNUNET_HELLO_address_allocate (&pir_msg->peer,
+        transport_name, addr, alen, ntohl(pir_msg->local_address_info));
+    pal_ctx->cb (pal_ctx->cb_cls, &pir_msg->peer, address,
+        ntohl(pir_msg->state),
+        GNUNET_TIME_absolute_ntoh (pir_msg->state_timeout));
+    GNUNET_HELLO_address_free (address);
 
+  }
 
   /* expect more replies */
   GNUNET_CLIENT_receive (pal_ctx->client, &peer_response_processor,