Fix handling of virtual networks.
authorJelmer Vernooij <jelmer@samba.org>
Sat, 13 Jun 2009 23:58:10 +0000 (01:58 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Sat, 13 Jun 2009 23:58:10 +0000 (01:58 +0200)
libirc/connection.c
src/admin.c
src/settings.c
src/settings.h

index 236d24bbab27a284629783e3c9b603f12419064e..6f693993e6be320bd5f7689775929694918585d3 100644 (file)
@@ -204,8 +204,7 @@ static gboolean network_send_line_direct(struct irc_network *s, struct irc_clien
        g_assert(l->origin == NULL);
 
        if (nc->type == NETWORK_VIRTUAL) {
-               if (s->connection.data.virtual.ops == NULL) 
-                       return FALSE;
+               g_assert (s->connection.data.virtual.ops != NULL) ;
                return s->connection.data.virtual.ops->to_server(s, c, l);
        } else {
                if (s->connection.transport == NULL)
@@ -790,8 +789,14 @@ static gboolean connect_virtual(struct irc_network *s)
        struct irc_login_details *details;
        struct network_config *nc = s->private_data;
 
-       if (nc->type_settings.virtual.ops == NULL)
+       g_assert(nc->type_settings.virtual_name != NULL);
+
+       s->connection.data.virtual.ops = find_virtual_network(nc->type_settings.virtual_name);
+       if (s->connection.data.virtual.ops == NULL) {
+               log_global(LOG_WARNING, "Unable to find virtual network kind '%s'", 
+                                  nc->type_settings.virtual_name);
                return FALSE;
+       }
 
        details = s->callbacks->get_login_details(s);
 
@@ -805,8 +810,8 @@ static gboolean connect_virtual(struct irc_network *s)
                s->callbacks->state_set(s);
        s->connection.state = NETWORK_CONNECTION_STATE_MOTD_RECVD;
 
-       if (nc->type_settings.virtual.ops->init)
-               return nc->type_settings.virtual.ops->init(s);
+       if (s->connection.data.virtual.ops->init)
+               return s->connection.data.virtual.ops->init(s);
 
        return TRUE;
 }
index f43f04d5c3062413c8ca496a775e62ab7b7ceb8e..11cc1837b59ba4aed4f6008726f69d39945cc27f 100644 (file)
@@ -59,12 +59,13 @@ static char *admin_hostmask(struct irc_network *n)
 static void privmsg_admin_out(admin_handle h, const char *data)
 {
        struct irc_client *c = h->client;
+       struct irc_network *n = h->network;
        char *nick = c->state->me.nick;
        char *hostmask;
 
-       hostmask = admin_hostmask(c->network);
-       if (c->network->external_state != NULL) 
-               nick = c->network->external_state->me.nick;
+       hostmask = admin_hostmask(n);
+       if (n->external_state != NULL) 
+               nick = n->external_state->me.nick;
        client_send_args_ex(c, hostmask, "NOTICE", nick, data, NULL);
 
        g_free(hostmask);
index 014b69648f06707848787a3e449bd3ceb309371c..0fbe446ee257569596e205da7c44bb2a6ce97a65 100644 (file)
@@ -217,7 +217,7 @@ static void config_save_network(struct ctrlproxy_config *cfg,
 
        switch(n->type) {
        case NETWORK_VIRTUAL:
-               g_key_file_set_string(kf, n->groupname, "virtual", n->type_settings.virtual.name);
+               g_key_file_set_string(kf, n->groupname, "virtual", n->type_settings.virtual_name);
                break;
        case NETWORK_PROGRAM:
                g_key_file_set_string(kf, n->groupname, "program", n->type_settings.program_location);
@@ -644,8 +644,7 @@ static struct network_config *config_load_network_keyfile_group(struct ctrlproxy
                n->type_settings.program_location = g_key_file_get_string(kf, groupname, "program", NULL);
                break;
        case NETWORK_VIRTUAL:
-               n->type_settings.virtual.name = g_key_file_get_string(kf, groupname, "virtual", NULL);
-               n->type_settings.virtual.ops = find_virtual_network(n->type_settings.virtual.name);
+               n->type_settings.virtual_name = g_key_file_get_string(kf, groupname, "virtual", NULL);
                break;
        case NETWORK_IOCHANNEL:
                /* Don't store */
@@ -1464,7 +1463,7 @@ void free_config(struct ctrlproxy_config *cfg)
                        g_free(nc->type_settings.tcp.default_bind_address);
                        break;
                case NETWORK_VIRTUAL:
-                       g_free(nc->type_settings.virtual.name);
+                       g_free(nc->type_settings.virtual_name);
                        break;
                case NETWORK_PROGRAM:
                        g_free(nc->type_settings.program_location);
index e08bbd4736f85f3da75e1c548d6d57ba0d4be426..af0e089dff816b5c92c4b3cfad8cdc31cd6f27d1 100644 (file)
@@ -101,10 +101,7 @@ struct network_config
 
        union {
                char *program_location;
-               struct {
-                       char *name;
-                       struct virtual_network_ops *ops;
-               } virtual;
+               char *virtual_name;
                struct { 
                        char *default_bind_address;
                        GList *servers;