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)
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);
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 {
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 {
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;
} 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 ||
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);
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)
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);
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);
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;
}
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;
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;
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;
/* 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;
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;
}
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,
);
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
}
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;
}
return FALSE;
}
- log_network(LOG_INFO, s, "Disconnecting");
+ network_log(LOG_INFO, s, "Disconnecting");
return close_server(s);
}
* @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;
{
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);
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);
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);
}
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;
+}
} data;
};
+typedef void (*network_log_fn) (enum log_level, void *, const char *);
+
/**
* An IRC 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 *);
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__ */
#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; \
}
/* 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);
}
}
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;
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);
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");
}
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;
}
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;
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;
}
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;
}
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]);
}
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;
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]);
}
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;
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]);
}
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;
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]);
}
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]);
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;
}
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]);
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;
}
} 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:' ');
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;
}
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;
}
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;
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;
+}
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__ */
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);
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);
}
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;
}
}
/* 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);
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;
}
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;
}
/* 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);
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);
/* auto_away.c */
void auto_away_add(struct global *global, struct auto_away_config *config);
+
+
#endif /* __INTERNALS_H__ */
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];
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,
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,
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",
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!");
}
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);
}
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);
}
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);
}
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, ...)
g_free(tmp);
}
-
-
static void log_handler(const gchar *log_domain, GLogLevelFlags flags, const gchar *message, gpointer user_data)
{
if (strchr(message, '\n')) {
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, ...);
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);
}
}
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);
}
}
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);
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;
}
}
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);
}
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]);
}
global = init_global();
global->config = cfg;
- load_networks(global, global->config);
+ load_networks(global, global->config, handle_network_log);
nickserv_load(global);