Add connected and disconnected hooks
authorjelmer <jelmer>
Thu, 18 Dec 2003 19:20:19 +0000 (21:20 +0200)
committerjelmer <jelmer>
Thu, 18 Dec 2003 19:20:19 +0000 (21:20 +0200)
ctrlproxy.h
doc/development.xml
hooks.c
server.c

index c469dafefc34b874768b7bb343c1a35f0bdcdeee..4b75157a08f6aab20e26806bb96ce92cce255ded 100644 (file)
@@ -229,4 +229,14 @@ void add_motd_hook(char *name, motd_hook);
 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__ */
index f06c7afb8b7f16564b9783ef6bbb6a225bfd41b9..c46e9fb7abf56b031841a659a744205b13c99d5e 100644 (file)
@@ -127,10 +127,11 @@ static gboolean my_message_handler(struct line *l);
 
        </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 *);
@@ -139,6 +140,13 @@ void add_new_client_hook(char *name, new_client_hook h);
 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. 
diff --git a/hooks.c b/hooks.c
index 0c87bdc8ee53d490ad93f50c874e6b7345a59a80..be68ead24d1c216bb34c3529015cc5989ac7e5dc 100644 (file)
--- a/hooks.c
+++ b/hooks.c
@@ -241,3 +241,89 @@ char ** get_motd_lines(struct network *n)
 
        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;
+       }
+}
index c163fa3715048c39ed68adf8dbbadaa440bfc293..a0df4efcce4854190582fbc8e337a213dd29e000 100644 (file)
--- a/server.c
+++ b/server.c
@@ -78,6 +78,7 @@ void handle_server_receive (struct transport_context *c, char *raw, void *_serve
                        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")) {
@@ -178,11 +179,13 @@ void reconnect(struct transport_context *c, void *_server)
 {
        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);