Fixed probe reply parsing from the right socket.
authorshort <>
Fri, 21 May 2004 04:52:18 +0000 (04:52 +0000)
committershort <>
Fri, 21 May 2004 04:52:18 +0000 (04:52 +0000)
Cosmetic: Nonsignificant endianity.

src/network.c

index 74208be..6a6adc7 100644 (file)
@@ -170,6 +170,46 @@ static gboolean client_touch_timeout(struct client *client)
        return FALSE;   /* GSource should be removed */
 }
 
+static void handle_master_probe(const void *packet,size_t gotlen,const struct sockaddr_in *sockaddr_in_from)
+{
+GHashTable *got_hash;
+gpointer got_unique_gpointer;
+gpointer hostip_gpointer;
+guint32 hostip_guint32;
+
+       g_return_if_fail(packet!=NULL);
+       g_return_if_fail(sockaddr_in_from!=NULL);
+
+       if (!probe)
+               return;
+
+       if (!(got_hash=packet_disassembly(packet,gotlen)))
+               return;
+       if (!(g_hash_table_lookup_extended(
+                       got_hash,       /* hash_table */
+                       GUINT_TO_POINTER(PACKET_ELEM_TYPE_DATA_GUINT32),        /* lookup_key */
+                       NULL,   /* orig_key */
+                       &got_unique_gpointer))) {
+err_packet_disassembly_destroy_got_hash:
+               packet_disassembly_destroy(got_hash);
+               return;
+               }
+       if (GPOINTER_TO_UINT(got_unique_gpointer)!=probe_unique)
+               goto err_packet_disassembly_destroy_got_hash;
+       if (!(g_hash_table_lookup_extended(
+                       got_hash,       /* hash_table */
+                       GUINT_TO_POINTER(PACKET_ELEM_TYPE_CLIENT_INADDR),       /* lookup_key */
+                       NULL,   /* orig_key */
+                       &hostip_gpointer)))
+               goto err_packet_disassembly_destroy_got_hash;
+       hostip_guint32=GPOINTER_TO_UINT(hostip_gpointer);
+       packet_disassembly_destroy(got_hash);
+
+       client_destroy(probe);
+       if (network_notify_hostip)
+               (*network_notify_hostip)(hostip_guint32,HOSTIP_GUINT32_TO_STRING(hostip_guint32));
+}
+
 static struct client *client_new(void);
 
 static void handle_master(struct client *master)
@@ -195,6 +235,12 @@ GList *clientl;
 
                if (sockaddr_in_from_length!=sizeof(sockaddr_in_from))  /* FIXME: errors reporting */
                        continue;
+
+               if (packet_recognized(packet,gotlen)) {
+                       handle_master_probe(packet,gotlen,&sockaddr_in_from);
+                       continue;
+                       }
+
                /* FIXME: Performance: Ugly search... */
                for (clientl=sock_client_list;clientl;clientl=clientl->next) {
                        client=clientl->data;
@@ -243,38 +289,10 @@ socklen_t sockaddr_in_from_length;
                        0,      /* flags */
                        (struct sockaddr *)&sockaddr_in_from,   /* from */
                        &sockaddr_in_from_length))) {   /* fromlen */
-static GHashTable *got_hash;
-static gpointer got_unique_gpointer;
-static gpointer hostip_gpointer;
-static guint32 hostip_guint32;
-
                if (sockaddr_in_from_length!=sizeof(sockaddr_in_from))  /* FIXME: errors reporting */
                        continue;
-               if (!(got_hash=packet_disassembly(packet,gotlen)))
-                       continue;
-               if (!(g_hash_table_lookup_extended(
-                               got_hash,       /* hash_table */
-                               GUINT_TO_POINTER(PACKET_ELEM_TYPE_DATA_GUINT32),        /* lookup_key */
-                               NULL,   /* orig_key */
-                               &got_unique_gpointer))) {
-err_packet_disassembly_destroy_got_hash:
-                       packet_disassembly_destroy(got_hash);
-                       continue;
-                       }
-               if (GPOINTER_TO_UINT(got_unique_gpointer)!=probe_unique)
-                       goto err_packet_disassembly_destroy_got_hash;
-               if (!(g_hash_table_lookup_extended(
-                               got_hash,       /* hash_table */
-                               GUINT_TO_POINTER(PACKET_ELEM_TYPE_CLIENT_INADDR),       /* lookup_key */
-                               NULL,   /* orig_key */
-                               &hostip_gpointer)))
-                       goto err_packet_disassembly_destroy_got_hash;
-               hostip_guint32=GPOINTER_TO_UINT(hostip_gpointer);
-               packet_disassembly_destroy(got_hash);
 
-               client_destroy(probe);
-               if (network_notify_hostip)
-                       (*network_notify_hostip)(hostip_guint32,HOSTIP_GUINT32_TO_STRING(hostip_guint32));
+               /* Probe socket should have no response; maybe some ICMP errors - ignored. */
                }
 }
 
@@ -515,7 +533,7 @@ struct sockaddr_in sockaddr_in;
        UDPGATE_MEMZERO(&sockaddr_in);
        sockaddr_in.sin_family=AF_INET;
        sockaddr_in.sin_port=htons(port);
-       sockaddr_in.sin_addr.s_addr=INADDR_ANY;
+       sockaddr_in.sin_addr.s_addr=htonl(INADDR_ANY);
        if (bind(master->gpollfd.fd,(struct sockaddr *)&sockaddr_in,sizeof(sockaddr_in))) {
                g_warning("bind(sock,{AF_INET,INADDR_ANY:%d}): %m",(int)port);
 err_sock_gsource_destroy: