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)
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;
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. */
}
}
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: