Make log functions configurable.
authorJelmer Vernooij <jelmer@samba.org>
Sat, 24 Nov 2007 22:47:30 +0000 (23:47 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Sat, 24 Nov 2007 22:47:30 +0000 (23:47 +0100)
13 files changed:
lib/network.c
lib/network.h
lib/state.c
lib/state.h
src/admin.c
src/ctcp.c
src/internals.h
src/listener.c
src/log.c
src/log.h
src/nickserv.c
src/redirect.c
src/user.c

index d96486295ef2034b1441bc197ea57fd4336dcd01..7c72bd59a9f61de29281552a2ee5796ba5d13cc5 100644 (file)
@@ -46,7 +46,7 @@ void register_new_network_notify(struct global *global, new_network_notify_fn fn
 
 static void state_log_helper(enum log_level l, void *userdata, const char *msg)
 {
-       log_network(l, (const struct network *)userdata, "%s", msg);
+       network_log(l, (const struct network *)userdata, "%s", msg);
 }
 
 static void server_send_login (struct network *s) 
@@ -55,10 +55,11 @@ static void server_send_login (struct network *s)
 
        s->connection.state = NETWORK_CONNECTION_STATE_LOGIN_SENT;
 
-       log_network(LOG_TRACE, s, "Sending login details");
+       network_log(LOG_TRACE, s, "Sending login details");
 
        s->state = network_state_init(s->config->nick, s->config->username, 
                                                                  get_my_hostname());
+       network_state_set_log_fn(s->state, s->log, s->userdata);
        s->state->userdata = s;
        s->state->log = state_log_helper;
        s->linestack = new_linestack(s);
@@ -91,7 +92,7 @@ gboolean network_set_charset(struct network *n, const char *name)
                tmp = g_iconv_open(name, "UTF-8");
 
                if (tmp == (GIConv)-1) {
-                       log_network(LOG_WARNING, n, "Unable to find charset `%s'", name);
+                       network_log(LOG_WARNING, n, "Unable to find charset `%s'", name);
                        return FALSE;
                }
        } else {
@@ -106,7 +107,7 @@ gboolean network_set_charset(struct network *n, const char *name)
        if (name != NULL) {
                tmp = g_iconv_open("UTF-8", name);
                if (tmp == (GIConv)-1) {
-                       log_network(LOG_WARNING, n, "Unable to find charset `%s'", name);
+                       network_log(LOG_WARNING, n, "Unable to find charset `%s'", name);
                        return FALSE;
                }
        } else {
@@ -192,7 +193,7 @@ static gboolean process_from_server(struct network *n, struct line *l)
        n->connection.last_line_recvd = time(NULL);
 
        if (n->state == NULL) {
-               log_network(LOG_WARNING, n, 
+               network_log(LOG_WARNING, n, 
                                        "Dropping message '%s' because network is disconnected.", 
                                        l->args[0]);
                return FALSE;
@@ -213,12 +214,12 @@ static gboolean process_from_server(struct network *n, struct line *l)
        } else if (!g_strcasecmp(l->args[0], "PONG")){
                return TRUE;
        } else if (!g_strcasecmp(l->args[0], "ERROR")) {
-               log_network(LOG_ERROR, n, "error: %s", l->args[1]);
+               network_log(LOG_ERROR, n, "error: %s", l->args[1]);
        } else if (!g_strcasecmp(l->args[0], "433") && 
                          n->connection.state == NETWORK_CONNECTION_STATE_LOGIN_SENT){
                char *tmp = g_strdup_printf("%s_", l->args[2]);
                network_send_args(n, "NICK", tmp, NULL);
-               log_network(LOG_WARNING, n, "%s was already in use, trying %s", 
+               network_log(LOG_WARNING, n, "%s was already in use, trying %s", 
                                        l->args[2], tmp);
                g_free(tmp);
        } else if (atoi(l->args[0]) == RPL_ENDOFMOTD ||
@@ -229,10 +230,10 @@ static gboolean process_from_server(struct network *n, struct line *l)
                network_set_charset(n, get_charset(&n->info));
 
                if (error != NULL)
-                       log_network(LOG_WARNING, n, "Error setting charset %s: %s", 
+                       network_log(LOG_WARNING, n, "Error setting charset %s: %s", 
                                get_charset(&n->info), error->message);
 
-               log_network(LOG_INFO, n, "Successfully logged in");
+               network_log(LOG_INFO, n, "Successfully logged in");
 
                network_update_isupport(&n->info, &n->state->info);
 
@@ -291,7 +292,7 @@ static void network_report_disconnect(struct network *n, const char *fmt, ...)
        g_free(n->connection.data.tcp.last_disconnect_reason);
        n->connection.data.tcp.last_disconnect_reason = tmp;
 
-       log_network(LOG_WARNING, n, "%s", tmp);
+       network_log(LOG_WARNING, n, "%s", tmp);
 }
 
 static gboolean handle_server_receive (GIOChannel *c, GIOCondition cond, void *_server)
@@ -342,7 +343,7 @@ static gboolean handle_server_receive (GIOChannel *c, GIOCondition cond, void *_
                        return FALSE;
                case G_IO_STATUS_ERROR:
                        g_assert(err != NULL);
-                       log_network(LOG_WARNING, server, 
+                       network_log(LOG_WARNING, server, 
                                                "Error \"%s\" reading from server", err->message);
                        if (l != NULL) {
                                ret = process_from_server(server, l);
@@ -418,7 +419,7 @@ static gboolean server_send_queue(GIOChannel *ch, GIOCondition cond,
                g_queue_pop_head(s->connection.pending_lines);
 
                if (status != G_IO_STATUS_NORMAL) {
-                       log_network(LOG_WARNING, s, "Error sending line '%s': %s",
+                       network_log(LOG_WARNING, s, "Error sending line '%s': %s",
                   l->args[0], error != NULL?error->message:"ERROR");
                        free_line(l);
 
@@ -465,7 +466,7 @@ static gboolean network_send_line_direct(struct network *s, struct client *c,
                        g_queue_push_tail(s->connection.pending_lines, linedup(l));
                        s->connection.outgoing_id = g_io_add_watch(s->connection.outgoing, G_IO_OUT, server_send_queue, s);
                } else if (status != G_IO_STATUS_NORMAL) {
-                       log_network(LOG_WARNING, s, "Error sending line '%s': %s",
+                       network_log(LOG_WARNING, s, "Error sending line '%s': %s",
                   l->args[0], error != NULL?error->message:"ERROR");
                        return FALSE;
                }
@@ -654,7 +655,7 @@ static gboolean bindsock(struct network *s,
 
        error = getaddrinfo(address, service, &hints_bind, &addrinfo_bind);
        if (error) {
-               log_network(LOG_ERROR, s, 
+               network_log(LOG_ERROR, s, 
                                        "Unable to lookup %s:%s %s", address, service, 
                                        gai_strerror(error));
                return FALSE;
@@ -663,7 +664,7 @@ static gboolean bindsock(struct network *s,
        for (res_bind = addrinfo_bind; 
                 res_bind; res_bind = res_bind->ai_next) {
                if (bind(sock, res_bind->ai_addr, res_bind->ai_addrlen) < 0) {
-                       log_network(LOG_ERROR, s, "Unable to bind to %s:%s %s", 
+                       network_log(LOG_ERROR, s, "Unable to bind to %s:%s %s", 
                                                address, service, strerror(errno));
                } else 
                        break;
@@ -709,16 +710,16 @@ static gboolean connect_current_tcp_server(struct network *s)
                s->connection.data.tcp.current_server = network_get_next_tcp_server(s);
        }
 
-       log_network(LOG_TRACE, s, "connect_current_tcp_server");
+       network_log(LOG_TRACE, s, "connect_current_tcp_server");
        
        cs = s->connection.data.tcp.current_server;
        if (cs == NULL) {
                s->config->autoconnect = FALSE;
-               log_network(LOG_WARNING, s, "No servers listed, not connecting");
+               network_log(LOG_WARNING, s, "No servers listed, not connecting");
                return FALSE;
        }
 
-       log_network(LOG_INFO, s, "Connecting with %s:%s", cs->host, cs->port);
+       network_log(LOG_INFO, s, "Connecting with %s:%s", cs->host, cs->port);
 
        memset(&hints, 0, sizeof(hints));
        hints.ai_family = PF_UNSPEC;
@@ -728,7 +729,7 @@ static gboolean connect_current_tcp_server(struct network *s)
        /* Lookup */
        error = getaddrinfo(cs->host, cs->port, &hints, &addrinfo);
        if (error) {
-               log_network(LOG_ERROR, s, "Unable to lookup %s:%s %s", 
+               network_log(LOG_ERROR, s, "Unable to lookup %s:%s %s", 
                                        cs->host, cs->port, gai_strerror(error));
                freeaddrinfo(addrinfo);
                return FALSE;
@@ -774,7 +775,7 @@ static gboolean connect_current_tcp_server(struct network *s)
        freeaddrinfo(addrinfo);
 
        if (!ioc) {
-               log_network(LOG_ERROR, s, "Unable to connect: %s", strerror(errno));
+               network_log(LOG_ERROR, s, "Unable to connect: %s", strerror(errno));
                return FALSE;
        }
 
@@ -817,7 +818,7 @@ static void reconnect(struct network *server)
                server->config->type == NETWORK_IOCHANNEL ||
                server->config->type == NETWORK_PROGRAM) {
                server->connection.state = NETWORK_CONNECTION_STATE_RECONNECT_PENDING;
-               log_network(LOG_INFO, server, "Reconnecting in %d seconds", 
+               network_log(LOG_INFO, server, "Reconnecting in %d seconds", 
                                        server->config->reconnect_interval);
                server->reconnect_id = g_timeout_add(1000 * 
                                                                server->config->reconnect_interval, 
@@ -1028,7 +1029,7 @@ static gboolean server_finish_connect(GIOChannel *ioc, GIOCondition cond,
                                                                         );
                        g_assert(ioc != NULL);
 #else
-                       log_network(LOG_WARNING, s, "SSL enabled for %s:%s, but no SSL support loaded", cs->host, cs->port);
+                       network_log(LOG_WARNING, s, "SSL enabled for %s:%s, but no SSL support loaded", cs->host, cs->port);
 #endif
                }
 
@@ -1067,13 +1068,13 @@ gboolean network_set_iochannel(struct network *s, GIOChannel *ioc)
        GError *error = NULL;
        g_assert(s->config->type != NETWORK_VIRTUAL);
        if (g_io_channel_set_encoding(ioc, NULL, &error) != G_IO_STATUS_NORMAL) {
-               log_network(LOG_ERROR, s, "Unable to change encoding: %s", 
+               network_log(LOG_ERROR, s, "Unable to change encoding: %s", 
                                        error?error->message:"unknown");
                return FALSE;
        }
        g_io_channel_set_close_on_unref(ioc, TRUE);
        if (g_io_channel_set_flags(ioc, G_IO_FLAG_NONBLOCK, &error) != G_IO_STATUS_NORMAL) {
-               log_network(LOG_ERROR, s, "Unable to change flags: %s", 
+               network_log(LOG_ERROR, s, "Unable to change flags: %s", 
                                        error?error->message:"unknown");
                return FALSE;
        }
@@ -1296,7 +1297,7 @@ gboolean disconnect_network(struct network *s)
                return FALSE;
        }
 
-       log_network(LOG_INFO, s, "Disconnecting");
+       network_log(LOG_INFO, s, "Disconnecting");
        return close_server(s);
 }
 
@@ -1341,14 +1342,18 @@ gboolean autoconnect_networks(struct global *global)
  * @param cfg Configuration to read from
  * @return TRUE
  */
-gboolean load_networks(struct global *global, struct ctrlproxy_config *cfg)
+gboolean load_networks(struct global *global, struct ctrlproxy_config *cfg, 
+                                          network_log_fn fn)
 {
        GList *gl;
        g_assert(cfg);
        for (gl = cfg->networks; gl; gl = gl->next)
        {
                struct network_config *nc = gl->data;
-               load_network(global, nc);
+               struct network *n;
+               n = load_network(global, nc);
+               if (n != NULL)
+                       network_set_log_fn(n, fn, n);
        }
 
        return TRUE;
@@ -1427,6 +1432,7 @@ struct network *find_network_by_hostname(struct global *global,
        {
                struct tcp_server_config *s = g_new0(struct tcp_server_config, 1);
                struct network_config *nc;
+               struct network *n;
                nc = network_config_init(global->config);
 
                nc->name = g_strdup(hostname);
@@ -1436,7 +1442,9 @@ struct network *find_network_by_hostname(struct global *global,
 
                nc->type_settings.tcp_servers = g_list_append(nc->type_settings.tcp_servers, s);
 
-               return load_network(global, nc);
+               n = load_network(global, nc);
+               network_set_log_fn(n, (network_log_fn)handle_network_log, n);
+               return n;
        }
 
        g_free(portname);
@@ -1476,7 +1484,7 @@ void network_select_next_server(struct network *n)
        if (n->config->type != NETWORK_TCP) 
                return;
 
-       log_network(LOG_INFO, n, "Trying next server");
+       network_log(LOG_INFO, n, "Trying next server");
        n->connection.data.tcp.current_server = network_get_next_tcp_server(n);
 }
 
@@ -1512,3 +1520,31 @@ void network_unref(struct network *n)
                free_network(n);
 }
 
+void network_log(enum log_level l, const struct network *s, 
+                                const char *fmt, ...)
+{
+       char *ret;
+       va_list ap;
+
+       if (s->log == NULL)
+               return;
+
+       g_assert(s);
+       g_assert(fmt);
+
+       va_start(ap, fmt);
+       ret = g_strdup_vprintf(fmt, ap);
+       va_end(ap);
+
+       s->log(l, s->userdata, ret);
+
+       g_free(ret);
+}
+
+void network_set_log_fn(struct network *s, 
+                                               network_log_fn fn,
+                                               void *userdata)
+{
+       s->log = fn;
+       s->userdata = userdata;
+}
index a4f2bb95a9e5d8df3213e9603a9e1d87c3d12a55..0d40474ebd8cb7b56084ac560495327dfcbaa46b 100644 (file)
@@ -89,6 +89,8 @@ struct network_connection {
        } data;
 };
 
+typedef void (*network_log_fn) (enum log_level, void *, const char *);
+
 /**
  * An IRC network
  */
@@ -107,12 +109,15 @@ struct network {
        struct network_info info;
        struct network_connection connection;
        struct linestack_context *linestack;
+
+       void *userdata;
+       network_log_fn log;
 };
 
 /* server.c */
 G_MODULE_EXPORT gboolean network_set_charset(struct network *n, const char *name);
 G_MODULE_EXPORT struct network *find_network_by_hostname(struct global *global, const char *host, guint16 port, gboolean create);
-G_MODULE_EXPORT gboolean load_networks(struct global *, struct ctrlproxy_config *cfg);
+G_MODULE_EXPORT gboolean load_networks(struct global *, struct ctrlproxy_config *cfg, network_log_fn);
 G_MODULE_EXPORT gboolean autoconnect_networks(struct global *);
 G_MODULE_EXPORT struct network *load_network(struct global *, struct network_config *);
 G_MODULE_EXPORT void unload_network(struct network *);
@@ -134,5 +139,7 @@ G_MODULE_EXPORT G_GNUC_MALLOC struct linestack_context *new_linestack(struct net
 G_MODULE_EXPORT G_GNUC_MALLOC char *network_generate_feature_string(struct network *n);
 G_MODULE_EXPORT struct network *network_ref(struct network *);
 G_MODULE_EXPORT void network_unref(struct network *);
+G_MODULE_EXPORT void network_set_log_fn(struct network *s, 
+                                                                               network_log_fn, void *userdata);
 
 #endif /* __CTRLPROXY_NETWORK_H__ */
index 439a6e32973f5c29c882664834b281148a2c6046..4b64ac2e90f50bf3f34739b25ba00300811fb426 100644 (file)
@@ -27,7 +27,7 @@ enum mode_type { REMOVE = 0, ADD = 1 };
 
 #define CHECK_ORIGIN(s,l,name) \
        if ((l)->origin == NULL) { \
-               log_network_state(LOG_WARNING, (s), \
+               network_state_log(LOG_WARNING, (s), \
                                                  "Received "name" line without origin"); \
                return; \
        }
@@ -394,9 +394,9 @@ static void handle_join(struct network_state *s, const struct line *l)
 
                /* The user is joining a channel */
                if (!irccmp(&s->info, nick, s->me.nick)) {
-                       log_network_state(LOG_INFO, s, "Joining channel %s", c->name);
+                       network_state_log(LOG_INFO, s, "Joining channel %s", c->name);
                } else {
-                       log_network_state(LOG_TRACE, s, "%s joins channel %s", nick, 
+                       network_state_log(LOG_TRACE, s, "%s joins channel %s", nick, 
                                                          c->name);
                }
        }
@@ -426,7 +426,7 @@ static void handle_part(struct network_state *s, const struct line *l)
                c = find_channel(s, channels[i]);
 
                if (c == NULL) {
-                       log_network_state(LOG_WARNING, s, 
+                       network_state_log(LOG_WARNING, s, 
                                        "Can't part or let other nick part %s(unknown channel)", 
                                        channels[i]);
                        continue;
@@ -436,16 +436,16 @@ static void handle_part(struct network_state *s, const struct line *l)
                if (n != NULL) {
                        free_channel_nick(n);
                } else {
-                       log_network_state(LOG_WARNING, s, 
+                       network_state_log(LOG_WARNING, s, 
                                "Can't remove nick %s from channel %s: nick not on channel", 
                                nick, channels[i]);
                }
 
                if (!irccmp(&s->info, nick, s->me.nick) && c) {
-                       log_network_state(LOG_INFO, s, "Leaving %s", channels[i]);
+                       network_state_log(LOG_INFO, s, "Leaving %s", channels[i]);
                        free_channel(c);
                } else {
-                       log_network_state(LOG_TRACE, s, "%s leaves %s", nick, channels[i]);
+                       network_state_log(LOG_TRACE, s, "%s leaves %s", nick, channels[i]);
                }
        }
        g_free(nick);
@@ -471,28 +471,28 @@ static void handle_kick(struct network_state *s, const struct line *l)
                c = find_channel(s, channels[i]);
 
                if (c == NULL){
-                       log_network_state(LOG_WARNING, s, "Can't kick nick %s from %s", nicks[i], channels[i]);
+                       network_state_log(LOG_WARNING, s, "Can't kick nick %s from %s", nicks[i], channels[i]);
                        continue;
                }
 
                n = find_channel_nick(c, nicks[i]);
                if (n == NULL) {
-                       log_network_state(LOG_WARNING, s, "Can't kick nick %s from channel %s: nick not on channel", nicks[i], channels[i]);
+                       network_state_log(LOG_WARNING, s, "Can't kick nick %s from channel %s: nick not on channel", nicks[i], channels[i]);
                        continue;
                }
 
                free_channel_nick(n);
 
                if (!irccmp(&s->info, nicks[i], s->me.nick)) {
-                       log_network_state(LOG_INFO, s, "Kicked off %s by %s", c->name, nick);
+                       network_state_log(LOG_INFO, s, "Kicked off %s by %s", c->name, nick);
                        free_channel(c);
                } else {
-                       log_network_state(LOG_TRACE, s, "%s kicked off %s by %s", nicks[i], channels[i], nick);
+                       network_state_log(LOG_TRACE, s, "%s kicked off %s by %s", nicks[i], channels[i], nick);
                }
        }
 
        if (channels[i] != NULL || nicks[i] != NULL) {
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                                          "KICK command has unequal number of channels and nicks");
        }
 
@@ -521,7 +521,7 @@ static void handle_332(struct network_state *s, const struct line *l)
        struct channel_state *c = find_channel(s, l->args[2]);
 
        if (c == NULL) {
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                                        "Can't set topic for unknown channel '%s'!", l->args[2]);
                return;
        }
@@ -535,7 +535,7 @@ static void handle_333(struct network_state *s, const struct line *l)
        struct channel_state *c = find_channel(s, l->args[2]);
 
        if (!c) {
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                                "Can't set topic last set time for unknown channel '%s'!", 
                                l->args[2]);
                return;
@@ -550,7 +550,7 @@ static void handle_no_topic(struct network_state *s, const struct line *l)
        struct channel_state *c = find_channel(s, l->args[1]);
 
        if (c == NULL) {
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                                        "Can't unset topic for unknown channel '%s'!", l->args[2]);
                return;
        }
@@ -566,7 +566,7 @@ static void handle_namreply(struct network_state *s, const struct line *l)
        struct channel_state *c = find_channel(s, l->args[3]);
 
        if (c == NULL) {
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                                        "Can't add names to %s: channel not found", l->args[3]);
                return;
        }
@@ -591,7 +591,7 @@ static void handle_end_names(struct network_state *s, const struct line *l)
        if (c != NULL)
                c->namreply_started = FALSE;
        else 
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                                  "Can't end /NAMES command for %s: channel not found", 
                                  l->args[2]);
 }
@@ -601,7 +601,7 @@ static void handle_invitelist_entry(struct network_state *s, const struct line *
        struct channel_state *c = find_channel(s, l->args[2]);
        
        if (c == NULL) {
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                                "Can't add invitelist entries to %s: channel not found", 
                                l->args[2]);
                return;
@@ -621,7 +621,7 @@ static void handle_end_invitelist(struct network_state *s, const struct line *l)
        if (c != NULL)
                c->invitelist_started = FALSE;
        else 
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                          "Can't end invitelist for %s: channel not found", l->args[2]);
 }
 
@@ -630,7 +630,7 @@ static void handle_exceptlist_entry(struct network_state *s, const struct line *
        struct channel_state *c = find_channel(s, l->args[2]);
        
        if (c == NULL) {
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                                "Can't add exceptlist entries to %s: channel not found", 
                                l->args[2]);
                return;
@@ -650,7 +650,7 @@ static void handle_end_exceptlist(struct network_state *s, const struct line *l)
        if (c != NULL)
                c->exceptlist_started = FALSE;
        else 
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                        "Can't end exceptlist for %s: channel not found", l->args[2]);
 }
 
@@ -662,7 +662,7 @@ static void handle_banlist_entry(struct network_state *s, const struct line *l)
        struct banlist_entry *be;
        
        if (c == NULL) {
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                                        "Can't add banlist entries to %s: channel not found", 
                                        l->args[2]);
                return;
@@ -691,7 +691,7 @@ static void handle_end_banlist(struct network_state *s, const struct line *l)
        if (c != NULL)
                c->banlist_started = FALSE;
        else 
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                                "Can't end banlist for %s: channel not found", l->args[2]);
 }
 
@@ -728,7 +728,7 @@ static void handle_whoreply(struct network_state *s, const struct line *l)
        cn = find_channel_nick(cs, nn->nick);
        
        if (cn == NULL) {
-               log_network_state(LOG_WARNING, 
+               network_state_log(LOG_WARNING, 
                                                  s,
                                                  "User %s in WHO reply not in expected channel %s!", 
                                                  nn->nick, l->args[2]);
@@ -787,7 +787,7 @@ static void handle_mode(struct network_state *s, const struct line *l)
                int arg = 2;
 
                if (c == NULL) {
-                       log_network_state(LOG_WARNING, s, 
+                       network_state_log(LOG_WARNING, s, 
                                "Unable to change mode for unknown channel '%s'", l->args[1]);
                        return;
                }
@@ -811,7 +811,7 @@ static void handle_mode(struct network_state *s, const struct line *l)
                                        c->modes[(unsigned char)'l'] = t;
                                    if (t) {
                                                if (!l->args[++arg]) {
-                                                       log_network_state(LOG_WARNING, s, "Mode +l requires argument, but no argument found");
+                                                       network_state_log(LOG_WARNING, s, "Mode +l requires argument, but no argument found");
                                                        break;
                                                }
                                                c->limit = atol(l->args[arg]);
@@ -823,7 +823,7 @@ static void handle_mode(struct network_state *s, const struct line *l)
                                        c->modes[(unsigned char)'k'] = t;
                                        if (t) {
                                                if (!l->args[++arg]) {
-                                                       log_network_state(LOG_WARNING, s, "Mode k requires argument, but no argument found");
+                                                       network_state_log(LOG_WARNING, s, "Mode k requires argument, but no argument found");
                                                        break;
                                                }
 
@@ -842,7 +842,7 @@ static void handle_mode(struct network_state *s, const struct line *l)
                                          } else {
                                                        n = find_channel_nick(c, l->args[++arg]);
                                                        if (!n) {
-                                                               log_network_state(LOG_WARNING, s, "Can't set mode %c%c on nick %s on channel %s, because nick does not exist!", t == ADD?'+':'-', l->args[2][i], l->args[arg], l->args[1]);
+                                                               network_state_log(LOG_WARNING, s, "Can't set mode %c%c on nick %s on channel %s, because nick does not exist!", t == ADD?'+':'-', l->args[2][i], l->args[arg], l->args[1]);
                                                                break;
                                                        }
                                                        n->mode = (t == ADD?p:' ');
@@ -921,7 +921,7 @@ static void handle_324(struct network_state *s, const struct line *l)
        struct channel_state *ch = find_channel(s, l->args[2]);
 
        if (ch == NULL) {
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                        "Can't store modes for %s: channel not found", l->args[2]);
                return;
        }
@@ -936,7 +936,7 @@ static void handle_329(struct network_state *s, const struct line *l)
        struct channel_state *ch = find_channel(s, l->args[2]);
 
        if (ch == NULL) {
-               log_network_state(LOG_WARNING, s, 
+               network_state_log(LOG_WARNING, s, 
                        "Can't store creationtime for %s: channel not found", l->args[2]);
                return;
        }
@@ -1077,7 +1077,7 @@ void free_network_state(struct network_state *state)
        g_free(state);
 }
 
-void log_network_state(enum log_level l, 
+void network_state_log(enum log_level l, 
                                           const struct network_state *st, const char *fmt, ...)
 {
        char *ret;
@@ -1098,4 +1098,10 @@ void log_network_state(enum log_level l,
        g_free(ret);
 }
 
-
+void network_state_set_log_fn(struct network_state *st, 
+                                                         void (*fn) (enum log_level, void *, const char *),
+                                                         void *userdata)
+{
+       st->log = fn;
+       st->userdata = userdata;
+}
index e88f8c817ac06b1a5f6545cc415f23380421fa35..e96a7d423296d29d42ed99e7f616084d072c5b83 100644 (file)
@@ -125,5 +125,8 @@ G_MODULE_EXPORT struct channel_nick *find_add_channel_nick(struct channel_state
 G_MODULE_EXPORT struct network_nick *find_network_nick(struct network_state *c, const char *name);
 G_MODULE_EXPORT gboolean network_nick_set_hostmask(struct network_nick *n, const char *hm);
 G_MODULE_EXPORT gboolean client_send_state(struct client *, struct network_state *);
+G_MODULE_EXPORT void network_state_log(enum log_level l, const struct network_state *st, const char *fmt, ...);
+G_MODULE_EXPORT void network_state_set_log_fn(struct network_state *st, void (*fn) (enum log_level, void *, const char *), void *userdata);
+
 
 #endif /* __CTRLPROXY_STATE_H__ */
index c2c0aa7acf6da9ed7de3aa856980cabf28c14e28..5a1b3d87e60050972ae4cadcbef5d6d3d7b2a7bf 100644 (file)
@@ -326,6 +326,7 @@ static void cmd_save_config (admin_handle h, char **args, void *userdata)
 static void add_network_helper(admin_handle h, const char *name)
 {
        struct network_config *nc;
+       struct network *n;
 
        if (find_network(admin_get_global(h), name) != NULL) {
                admin_out(h, "Network with name `%s' already exists", name);
@@ -334,7 +335,8 @@ static void add_network_helper(admin_handle h, const char *name)
 
        nc = network_config_init(admin_get_global(h)->config);
        g_free(nc->name); nc->name = g_strdup(name);
-       load_network(admin_get_global(h), nc);
+       n = load_network(admin_get_global(h), nc);
+       network_set_log_fn(n, (network_log_fn)handle_network_log, n);
 
        admin_out(h, "Network `%s' added. Use ADDSERVER to add a server to this network.", name);
 }
index 3bbbe9e4c63ca462e6ea85643f848c5011d2e60e..eef794fe814d79cfa4c5ed76c312aff23c133eb4 100644 (file)
@@ -234,7 +234,7 @@ gboolean ctcp_process_network_reply (struct network *n, struct line *l)
        nick = line_get_nick(l);
 
        if (command == NULL) {
-               log_network(LOG_WARNING, n, "Received mailformed CTCP request from `%s'", nick);
+               network_log(LOG_WARNING, n, "Received mailformed CTCP request from `%s'", nick);
                g_free(nick);
                return FALSE;
        }
@@ -267,7 +267,7 @@ gboolean ctcp_process_network_reply (struct network *n, struct line *l)
        }
 
        /* otherwise, inform user */
-       log_network(LOG_WARNING, n, "Don't know where to send unknown CTCP reply '%s'", command);
+       network_log(LOG_WARNING, n, "Don't know where to send unknown CTCP reply '%s'", command);
 
        g_free(command);
 
@@ -291,7 +291,7 @@ gboolean ctcp_process_network_request (struct network *n, struct line *l)
        t = strchr(data, '\001');
        if (!t) { 
                g_free(data); 
-               log_network(LOG_WARNING, n, "Malformed CTCP request from %s!", h.nick);
+               network_log(LOG_WARNING, n, "Malformed CTCP request from %s!", h.nick);
                g_free(h.nick);
                return FALSE;
        }
@@ -319,7 +319,7 @@ gboolean ctcp_process_network_request (struct network *n, struct line *l)
 
        if (!ret) {
                ctcp_reply(&h, "ERRMSG", NULL);
-               log_network(LOG_WARNING, n, "Received unknown CTCP request '%s'!", data);
+               network_log(LOG_WARNING, n, "Received unknown CTCP request '%s'!", data);
                ret = FALSE;
        }
 
index e87e10971d6b49add7cc702db88b8d05df6b5ceb..e849a49c305bcd46b10e67f08d4f2b2f2b67b1f6 100644 (file)
@@ -56,7 +56,6 @@ gboolean network_set_iochannel(struct network *s, GIOChannel *ioc);
 /* state.c */
 void free_channels(struct network *s);
 void network_nick_set_data(struct network_nick *n, const char *nick, const char *username, const char *host);
-void log_network_state(enum log_level l, const struct network_state *st, const char *fmt, ...);
 
 /* plugins.c */
 gboolean init_plugins(const char *dir);
@@ -78,6 +77,8 @@ gboolean run_replication_filter(struct network *s, const struct line *l, enum da
 gboolean init_log(const char *file);
 void log_network_line(const struct network *n, const struct line *l, gboolean incoming);
 void log_client_line(const struct client *c, const struct line *l, gboolean incoming);
+void handle_network_log(enum log_level level, const struct network *n, 
+                                               const char *msg);
 
 /* redirect.c */
 void redirect_record(const struct network *n, const struct client *c, const struct line *l);
@@ -139,5 +140,7 @@ void free_listeners(struct global *global);
 /* auto_away.c */
 void auto_away_add(struct global *global, struct auto_away_config *config);
 
+
+
 #endif /* __INTERNALS_H__ */
 
index 2b9a9c473a76d0182073a91a489796706102ebab..03d4ba78fc042929a443f852815dafdd41338bf3 100644 (file)
@@ -82,7 +82,7 @@ static gboolean handle_client_line(GIOChannel *c, struct pending_client *pc,
                                log_global(LOG_WARNING, 
                                                   "No password set, allowing client _without_ authentication!");
                        else
-                               log_network(LOG_WARNING, n, 
+                               network_log(LOG_WARNING, n, 
                                                        "No password set, allowing client _without_ authentication!");
                        authenticated = TRUE;
                        networkname = l->args[1];
@@ -99,7 +99,7 @@ static gboolean handle_client_line(GIOChannel *c, struct pending_client *pc,
                        if (n == NULL) 
                                log_global(LOG_INFO, "Client successfully authenticated");
                        else
-                               log_network(LOG_INFO, n, "Client successfully authenticated");
+                               network_log(LOG_INFO, n, "Client successfully authenticated");
 
                        if (networkname != NULL) {
                                n = find_network_by_hostname(pc->listener->global, 
@@ -128,7 +128,7 @@ static gboolean handle_client_line(GIOChannel *c, struct pending_client *pc,
                        if (n == NULL) 
                                log_global(LOG_WARNING, "User tried to log in with incorrect password!");
                        else
-                               log_network(LOG_WARNING, n, 
+                               network_log(LOG_WARNING, n, 
                                                    "User tried to log in with incorrect password!");
 
                        status = irc_sendf(c, iconv, NULL, 
@@ -400,7 +400,7 @@ gboolean start_listener(struct listener *l)
                l->incoming = g_list_append(l->incoming, lio);
 
                if (l->network != NULL) 
-                       log_network(LOG_INFO, l->network, "Listening on %s:%s", 
+                       network_log(LOG_INFO, l->network, "Listening on %s:%s", 
                                                lio->address, lio->port);
                else
                        log_global(LOG_INFO, "Listening on %s:%s", 
@@ -622,7 +622,7 @@ static gboolean pass_handle_data(struct pending_client *cl)
                        log_global(LOG_WARNING, 
                                           "No password set, allowing client _without_ authentication!");
                else
-                       log_network(LOG_WARNING, cl->listener->network, 
+                       network_log(LOG_WARNING, cl->listener->network, 
                                                "No password set, allowing client _without_ authentication!");
        }
 
@@ -775,7 +775,7 @@ static gboolean handle_client_socks_data(GIOChannel *ioc, struct pending_client
 
                                        if (result->connection.state == NETWORK_CONNECTION_STATE_NOT_CONNECTED && 
                                                !connect_network(result)) {
-                                               log_network(LOG_ERROR, result, "Unable to connect");
+                                               network_log(LOG_ERROR, result, "Unable to connect");
                                                return socks_error(ioc, REP_NET_UNREACHABLE);
                                        }
 
@@ -799,7 +799,7 @@ static gboolean handle_client_socks_data(GIOChannel *ioc, struct pending_client
                                                        len = 16;
                                                        port = name6->sin6_port;
                                                } else {
-                                                       log_network(LOG_ERROR, result, "Unable to obtain local address for connection to server");
+                                                       network_log(LOG_ERROR, result, "Unable to obtain local address for connection to server");
                                                        return socks_error(ioc, REP_NET_UNREACHABLE);
                                                }
                                                        
index f03fb7034f5e4cb7b0168acd976cc270db79be06..8e5443f999c4b1cc44aaddae5857c3591812e9e0 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -68,7 +68,7 @@ void log_network_line(const struct network *n, const struct line *l, gboolean in
                return;
 
        raw = irc_line_string(l);
-       log_network(LOG_DATA, n, "%c %s", incoming?'<':'>', raw);
+       network_log(LOG_DATA, n, "%c %s", incoming?'<':'>', raw);
        g_free(raw);
 }
 
@@ -83,19 +83,14 @@ void log_client_line(const struct client *n, const struct line *l, gboolean inco
        g_free(raw);
 }
 
-void log_network(enum log_level level, const struct network *n, const char *fmt, ...)
+void handle_network_log(enum log_level level, const struct network *n, 
+                                               const char *msg)
 {
-       va_list ap;     
-       char *tmp; 
        g_assert(n != NULL);
-       va_start(ap, fmt);
-       tmp = g_strdup_vprintf(fmt, ap);
-       log_entry(level, n, NULL, tmp);
+       log_entry(level, n, NULL, msg);
        if (level <= LOG_INFO)
                clients_send_args_ex(n->clients, NULL, "NOTICE", "*", 
-                                                    tmp, NULL);
-       va_end(ap);
-       g_free(tmp);
+                                                    msg, NULL);
 }
 
 void log_client(enum log_level level, const struct client *c, const char *fmt, ...)
@@ -121,8 +116,6 @@ void log_global(enum log_level level, const char *fmt, ...)
        g_free(tmp);
 }
 
-
-
 static void log_handler(const gchar *log_domain, GLogLevelFlags flags, const gchar *message, gpointer user_data) 
 {
        if (strchr(message, '\n')) {
index 42e9ea8c821a5c3d41f331213340f2b294922b79..35c33bc75675322cd14c2cda787da04d0e86a5b9 100644 (file)
--- a/src/log.h
+++ b/src/log.h
@@ -24,7 +24,7 @@ struct network;
 struct client;
 
 enum log_level { LOG_DATA=5, LOG_TRACE=4, LOG_INFO=3, LOG_WARNING=2, LOG_ERROR=1 };
-G_GNUC_PRINTF(3, 4) G_MODULE_EXPORT void log_network(enum log_level, const struct network *, const char *fmt, ...);
+G_GNUC_PRINTF(3, 4) G_MODULE_EXPORT void network_log(enum log_level, const struct network *, const char *fmt, ...);
 G_GNUC_PRINTF(3, 4) G_MODULE_EXPORT void log_client(enum log_level, const struct client *, const char *fmt, ...);
 G_GNUC_PRINTF(2, 3) G_MODULE_EXPORT void log_global(enum log_level, const char *fmt, ...);
 
index e4c918ef15e7dde5157e2445edaeb6af157bc853..9f1b71631ee9ef0060478a06643d2ca6aff06562 100644 (file)
@@ -69,11 +69,11 @@ void nickserv_identify_me(struct network *network, char *nick)
                const char *nickserv_n = nickserv_nick(network);
                char *raw;
                raw = g_strdup_printf("IDENTIFY %s", pass);
-               log_network(LOG_INFO, network, "Sending password for %s", nickserv_n);
+               network_log(LOG_INFO, network, "Sending password for %s", nickserv_n);
                network_send_args(network, "PRIVMSG", nickserv_n, raw, NULL);
                g_free(raw);
        } else {
-               log_network(LOG_INFO, network, "No password known for `%s'", nick);
+               network_log(LOG_INFO, network, "No password known for `%s'", nick);
        }
 }
 
@@ -106,7 +106,7 @@ static void cache_nickserv_pass(struct network *n, const char *newpass)
        if ((e->pass == NULL || 
                strcmp(e->pass, newpass) != 0) && n->global->config->learn_nickserv) {
                e->pass = g_strdup(newpass);
-               log_network(LOG_INFO, n, "Caching password for nick %s", e->nick);
+               network_log(LOG_INFO, n, "Caching password for nick %s", e->nick);
        } 
 }
 
@@ -145,7 +145,7 @@ static gboolean log_data(struct network *n, const struct line *l, enum data_dire
                        const char *nickserv_n = nickserv_nick(n);
                        char *raw;
                        
-                       log_network(LOG_INFO, n, "Ghosting current user using '%s'", nickattempt);
+                       network_log(LOG_INFO, n, "Ghosting current user using '%s'", nickattempt);
 
                        raw = g_strdup_printf("GHOST %s %s", nickattempt, pass);
                        network_send_args(n, "PRIVMSG", nickserv_n, raw, NULL);
index 85f8695e3751c58ff89e99c8acc0d88dfae37f7b..889e4f77ebb6967c881c0d341d9ef55d162e7aaa 100644 (file)
@@ -470,31 +470,31 @@ static struct query unknown_query = {
 
 static gboolean handle_465(struct network *n, struct line *l)
 {
-       log_network(LOG_ERROR, n, "Banned from server: %s", l->args[1]);
+       network_log(LOG_ERROR, n, "Banned from server: %s", l->args[1]);
        return TRUE;
 }
 
 static gboolean handle_451(struct network *n, struct line *l)
 {
-       log_network(LOG_ERROR, n, "Not registered error, this is probably a bug...");
+       network_log(LOG_ERROR, n, "Not registered error, this is probably a bug...");
        return TRUE;
 }
 
 static gboolean handle_462(struct network *n, struct line *l)
 {
-       log_network(LOG_ERROR, n, "Double registration error, this is probably a bug...");
+       network_log(LOG_ERROR, n, "Double registration error, this is probably a bug...");
        return TRUE;
 }
 
 static gboolean handle_463(struct network *n, struct line *l)
 {
-       log_network(LOG_ERROR, n, "Host not privileged to connect");
+       network_log(LOG_ERROR, n, "Host not privileged to connect");
        return TRUE;
 }
 
 static gboolean handle_464(struct network *n, struct line *l)
 {
-       log_network(LOG_ERROR, n, "Password mismatch");
+       network_log(LOG_ERROR, n, "Password mismatch");
        return TRUE;
 }
 
@@ -611,7 +611,7 @@ gboolean redirect_response(struct network *network, struct line *l)
        }
 
        if (!c) {
-               log_network(LOG_WARNING, network, "Unable to redirect response %s", l->args[0]);
+               network_log(LOG_WARNING, network, "Unable to redirect response %s", l->args[0]);
                clients_send(network->clients, l, NULL);
        }
 
@@ -657,7 +657,7 @@ void redirect_record(const struct network *n, struct client *c,
                        log_client(LOG_WARNING, c, "Unknown command from client: %s", 
                                           l->args[0]);
                } else {
-                       log_network(LOG_WARNING, n, "Sending unknown command '%s'", 
+                       network_log(LOG_WARNING, n, "Sending unknown command '%s'", 
                                                l->args[0]);
                }
 
index adf26c60d611d1e17a0395e2298827d1fc7d8bef..2f244e9d501b61f8ea40d1e9a5e8628ff4f698b6 100644 (file)
@@ -76,7 +76,7 @@ struct global *load_global(const char *config_dir)
        global = init_global();
        global->config = cfg;
 
-       load_networks(global, global->config);
+       load_networks(global, global->config, handle_network_log);
 
        nickserv_load(global);