void del_motd_hook(char *name);
char **get_motd_lines(struct network *n);
+typedef void (*server_connected_hook) (struct network *);
+void add_server_connected_hook(char *name, server_connected_hook h);
+void del_server_connected_hook(char *name);
+void server_connected_hook_execute(struct network *);
+
+typedef void (*server_disconnected_hook) (struct network *);
+void add_server_disconnected_hook(char *name, server_disconnected_hook h);
+void del_server_disconnected_hook(char *name);
+void server_disconnected_hook_execute(struct network *);
+
#endif /* __CTRLPROXY_H__ */
</sect2>
- <sect2><title>Registering a new client or lose client handler</title>
+ <sect2><title>Registering a new client/server or lose client/server handler</title>
<para>A module can also register a function that should be called when a new
- client connects or when a client disconnects. </para>
+ client connects or when a client disconnects and when the server has successfully connected to
+ the client or when the connection to the client is broken.</para>
<programlisting>
typedef gboolean (*new_client_hook) (struct client *);
void del_new_client_hook(char *name);
void add_lose_client_hook(char *name, lose_client_hook h);
void del_lose_client_hook(char *name);
+
+typedef void (*server_connected_hook) (struct network *);
+typedef void (*server_disconnected_hook) (struct network *);
+void add_server_connected_hook(char *name, server_connected_hook);
+void del_server_connected_hook(char *name);
+void add_server_disconnected_hook(char *name, server_disconnected_hook);
+void del_server_disconnected_hook(char *name);
</programlisting>
<para>The prototypes of these functions pretty much speak for themselves.
return l;
}
+
+struct server_connected_hook_data {
+ char *name;
+ server_connected_hook hook;
+};
+
+GList *server_connected_hooks = NULL;
+
+void add_server_connected_hook(char *name, server_connected_hook h)
+{
+ struct server_connected_hook_data *d;
+ g_message("Adding lose client hook '%s'", name);
+
+ d = malloc(sizeof(struct server_connected_hook_data));
+ d->name = strdup(name);
+ d->hook = h;
+ server_connected_hooks = g_list_append(server_connected_hooks, d);
+}
+
+void del_server_connected_hook(char *name)
+{
+ GList *l = server_connected_hooks;
+ while(l) {
+ struct server_connected_hook_data *d = (struct server_connected_hook_data *)l->data;
+ if(!strcmp(d->name, name)) {
+ g_message("Lose client hook '%s' removed", d->name);
+ free(d->name);
+ server_connected_hooks = g_list_remove(server_connected_hooks, d);
+ return;
+ }
+ l = l->next;
+ }
+}
+
+void server_connected_hook_execute(struct network *c)
+{
+ GList *l = server_connected_hooks;
+ while(l) {
+ struct server_connected_hook_data *d = (struct server_connected_hook_data *)l->data;
+ d->hook(c);
+ l = l->next;
+ }
+}
+
+struct server_disconnected_hook_data {
+ char *name;
+ server_disconnected_hook hook;
+};
+
+GList *server_disconnected_hooks = NULL;
+
+void add_server_disconnected_hook(char *name, server_disconnected_hook h)
+{
+ struct server_disconnected_hook_data *d;
+ g_message("Adding lose client hook '%s'", name);
+
+ d = malloc(sizeof(struct server_disconnected_hook_data));
+ d->name = strdup(name);
+ d->hook = h;
+ server_disconnected_hooks = g_list_append(server_disconnected_hooks, d);
+}
+
+void del_server_disconnected_hook(char *name)
+{
+ GList *l = server_disconnected_hooks;
+ while(l) {
+ struct server_disconnected_hook_data *d = (struct server_disconnected_hook_data *)l->data;
+ if(!strcmp(d->name, name)) {
+ g_message("Lose client hook '%s' removed", d->name);
+ free(d->name);
+ server_disconnected_hooks = g_list_remove(server_disconnected_hooks, d);
+ return;
+ }
+ l = l->next;
+ }
+}
+
+void server_disconnected_hook_execute(struct network *c)
+{
+ GList *l = server_disconnected_hooks;
+ while(l) {
+ struct server_disconnected_hook_data *d = (struct server_disconnected_hook_data *)l->data;
+ d->hook(c);
+ l = l->next;
+ }
+}
if(!(l->options & LINE_DONT_SEND))clients_send(server, l, NULL);
} else if(atoi(l->args[0]) == 4) {
xmlNodePtr cur = server->xmlConf->xmlChildrenNode;
+ server_connected_hook_execute(server);
server->authenticated = 1;
while(cur) {
if(!strcmp(cur->name, "autosend")) {
{
struct network *server = (struct network *)_server;
char *server_name;
+
/* Don't report disconnections twice */
g_assert(server);
server_name = xmlGetProp(server->xmlConf, "name");
if(!server->outgoing) return;
+ server_disconnected_hook_execute(server);
transport_free(server->outgoing); server->outgoing = NULL;
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Connection to server %s lost, trying to reconnect...", server_name);