#include "network.h"
#include "packet.h"
+#include "main.h" /* for optarg_verbose */
/* Config: */
#define PROBE_TIMEOUT_SEC (5)
-void (*network_notify_hostip)(guint32 hostip_guint32,const gchar *hostip_string);
+void (*network_notify_hostip)(guint32 hostip_guint32);
struct client {
if (client->timeout_id) {
gboolean errgboolean;
+ if (optarg_verbose)
+ g_message(_("Client fd %d removed timeout id %d"),client->gpollfd.fd,client->timeout_id);
errgboolean=g_source_remove(client->timeout_id);
g_assert(errgboolean==TRUE);
client->timeout_id=0;
(client==probe ? PROBE_TIMEOUT_SEC*1000 : CLIENT_TIMEOUT_SEC*1000), /* interval; msec */
(GSourceFunc)client_touch_timeout, /* function */
client); /* data */
+ if (optarg_verbose)
+ g_message(_("Client fd %d new timeout id %d"),client->gpollfd.fd,client->timeout_id);
g_assert(client->timeout_id!=0);
}
g_return_val_if_fail(client!=NULL,FALSE); /* FALSE=>should be removed */
g_return_val_if_fail(client!=master,FALSE); /* FALSE=>should be removed */
+ if (optarg_verbose)
+ g_message(_("Client fd %d timeout id %d occured/entered"),client->gpollfd.fd,client->timeout_id);
+
+ /* Do not destroy the timeout in client_destroy().
+ * It would crash GLib - we remove it be returning FALSE from here.
+ */
+ g_assert(client->timeout_id!=0);
+ client->timeout_id=0;
+
if (client==probe) {
network_stop();
- if (network_notify_hostip)
- (*network_notify_hostip)(0,NULL);
+ /* Never destroy 'client' now - it has been destroyed by network_stop()! */
+ }
+ else {
+ client_destroy(client);
}
- client_destroy(client);
+ if (optarg_verbose)
+ g_message(_("Client timeout occurance finish"));
return FALSE; /* GSource should be removed */
}
client_destroy(probe);
if (network_notify_hostip)
- (*network_notify_hostip)(hostip_guint32,HOSTIP_GUINT32_TO_STRING(hostip_guint32));
+ (*network_notify_hostip)(hostip_guint32);
}
static struct client *client_new(void);
sock_client_list=g_list_prepend(sock_client_list,client);
g_source_add_poll(sock_gsource,&client->gpollfd);
+ if (optarg_verbose)
+ g_message(_("Client fd %d created"),client->gpollfd.fd);
+
return client;
}
if (!sock_gsource_new())
return;
+ if (optarg_verbose)
+ g_message(_("Client fd %d timeout id %d destroy enter"),client->gpollfd.fd,client->timeout_id);
+
if (client==master) {
master=NULL;
g_assert(client->timeout_id==0);
g_source_remove_poll(sock_gsource,&client->gpollfd);
sock_client_list=g_list_remove(sock_client_list,client);
close(client->gpollfd.fd); /* errors ignored */
+
+ if (optarg_verbose)
+ g_message(_("Client fd %d timeout id %d destroy finish"),client->gpollfd.fd,client->timeout_id);
+
g_free(client);
}
client_touch(probe); /* timeout */
write_daemon_running(getpid());
+ if (network_notify_hostip)
+ (*network_notify_hostip)(0);
return TRUE;
}
}
if (daemon_pid==getpid()) {
sock_gsource_destroy();
- return TRUE;
+ goto ok;
}
errno=0;
kill(daemon_pid,SIGKILL);
(int)daemon_pid,strerror(errno_save)));
return FALSE;
}
+ok:
+ if (network_notify_hostip)
+ (*network_notify_hostip)(0);
return TRUE;
}