-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,
I enclose the patch that recodes channel names according to the
encoding specified for the chatnet.
Now it is possible to join and control channels the names of which are
in different encoding than the current encoding is.

Denis
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iEYEARECAAYFAkyEBQkACgkQ2NWb5jcEx3zr4gCfSoidKRb/a+XK0r8976Ryg0Ky
uuUAn0wpVOCwTYiMfFwGKZkUfwlWg9k1
=g4qv
-----END PGP SIGNATURE-----
Index: src/fe-common/irc/fe-events.c
===================================================================
--- src/fe-common/irc/fe-events.c	(revision 5190)
+++ src/fe-common/irc/fe-events.c	(working copy)
@@ -50,6 +50,8 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
+	if (ischannel(*target))
+		target = recode_in(SERVER(server), target, NULL);
 	if (nick == NULL) nick = server->real_address;
 	if (addr == NULL) addr = "";
 	if (*target == '@' && ischannel(target[1])) {
@@ -65,6 +67,8 @@
 			    server, recoded, nick, addr,
 			    get_visible_target(server, target));
 	}
+	if (ischannel(*target))
+		g_free(target);
 
 	g_free(params);
 	g_free(recoded);
@@ -115,26 +119,33 @@
 	params = event_get_params(data, 1, &channel);
 	tmp = strchr(channel, 7); /* ^G does something weird.. */
 	if (tmp != NULL) *tmp = '\0';
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	signal_emit("message join", 4, server,
 		    get_visible_target(server, channel), nick, addr);
+
+	g_free(channel);
 	g_free(params);
 }
 
 static void event_part(IRC_SERVER_REC *server, const char *data,
 		       const char *nick, const char *addr)
 {
-	char *params, *channel, *reason, *recoded;
+	char *params, *channel, *reason;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
 				  &channel, &reason);
-	recoded = recode_in(SERVER(server), reason, channel);
+	channel = recode_in(SERVER(server), channel, NULL);
+	reason = recode_in(SERVER(server), reason, channel);
+
 	signal_emit("message part", 5, server,
-		    get_visible_target(server, channel), nick, addr, recoded);
+		    get_visible_target(server, channel), nick, addr, reason);
+
+	g_free(reason);
+	g_free(channel);
 	g_free(params);
-	g_free(recoded);
 }
 
 static void event_quit(IRC_SERVER_REC *server, const char *data,
@@ -153,18 +164,22 @@
 static void event_kick(IRC_SERVER_REC *server, const char *data,
 		       const char *kicker, const char *addr)
 {
-	char *params, *channel, *nick, *reason, *recoded;
+	char *params, *channel, *nick, *reason;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 3 | PARAM_FLAG_GETREST,
 				  &channel, &nick, &reason);
-	recoded = recode_in(SERVER(server), reason, channel);
+	channel = recode_in(SERVER(server), channel, NULL);
+	reason = recode_in(SERVER(server), reason, channel);
+
 	signal_emit("message kick", 6,
 		    server, get_visible_target(server, channel),
-		    nick, kicker, addr, recoded);
+		    nick, kicker, addr, reason);
+
+	g_free(reason);
+	g_free(channel);
 	g_free(params);
-	g_free(recoded);
 }
 
 static void event_kill(IRC_SERVER_REC *server, const char *data,
@@ -225,10 +240,13 @@
 
 	params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
 				  &channel, &mode);
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	signal_emit("message irc mode", 5,
 		    server, get_visible_target(server, channel),
 		    nick, addr, g_strchomp(mode));
+
+	g_free(channel);
 	g_free(params);
 }
 
@@ -252,25 +270,33 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
+
 	signal_emit("message invite", 4,
 		    server, get_visible_target(server, channel), nick, addr);
+
+	g_free(channel);
 	g_free(params);
 }
 
 static void event_topic(IRC_SERVER_REC *server, const char *data,
 			const char *nick, const char *addr)
 {
-	char *params, *channel, *topic, *recoded;
+	char *params, *channel, *topic;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
 				  &channel, &topic);
-	recoded = recode_in(SERVER(server), topic, channel);
+	channel = recode_in(SERVER(server), channel, NULL);
+	topic = recode_in(SERVER(server), topic, channel);
+
 	signal_emit("message topic", 5, server,
-		    get_visible_target(server, channel), recoded, nick, addr);
+		    get_visible_target(server, channel), topic, nick, addr);
+
+	g_free(topic);
+	g_free(channel);
 	g_free(params);
-	g_free(recoded);
 }
 
 static void event_error(IRC_SERVER_REC *server, const char *data)
Index: src/fe-common/irc/fe-events-numeric.c
===================================================================
--- src/fe-common/irc/fe-events-numeric.c	(revision 5190)
+++ src/fe-common/irc/fe-events-numeric.c	(working copy)
@@ -75,6 +75,7 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 4, NULL, NULL, &channel, &names);
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	chanrec = irc_channel_find(server, channel);
 	if (chanrec == NULL || chanrec->names_got) {
@@ -84,6 +85,7 @@
                 printtext(server, channel, MSGLEVEL_CRAP, "%s", names);
 
 	}
+	g_free(channel);
 	g_free(params);
 }
 
@@ -96,35 +98,44 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	chanrec = irc_channel_find(server, channel);
 	if (chanrec == NULL || chanrec->names_got)
 		print_event_received(server, data, nick, FALSE);
+
+	g_free(channel);
 	g_free(params);
 }
 
 static void event_who(IRC_SERVER_REC *server, const char *data)
 {
 	char *params, *nick, *channel, *user, *host, *stat, *realname, *hops;
-	char *serv, *recoded;
+	char *serv;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 8, NULL, &channel, &user,
 				  &host, &serv, &nick, &stat, &realname);
 
+	channel = recode_in(SERVER(server), channel, NULL);
+	user = recode_in(SERVER(server), user, NULL);
+	host = recode_in(SERVER(server), host, NULL);
 	/* split hops/realname */
 	hops = realname;
 	while (*realname != '\0' && *realname != ' ') realname++;
 	if (*realname == ' ')
 		*realname++ = '\0';
-	
-	recoded = recode_in(SERVER(server), realname, nick);
+	realname = recode_in(SERVER(server), realname, nick);
+
 	printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_WHO,
-		    channel, nick, stat, hops, user, host, recoded, serv);
+		    channel, nick, stat, hops, user, host, realname, serv);
 
+	//g_free(realname);
+	g_free(host);
+	g_free(user);
+	g_free(channel);
 	g_free(params);
-	g_free(recoded);
 }
 
 static void event_end_of_who(IRC_SERVER_REC *server, const char *data)
@@ -134,7 +145,11 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
+
 	printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_END_OF_WHO, channel);
+
+	g_free(channel);
 	g_free(params);
 }
 
@@ -142,47 +157,50 @@
 {
 	IRC_CHANNEL_REC *chanrec;
 	BAN_REC *banrec;
-	const char *channel;
-	char *params, *ban, *setby, *tims;
+	char *params, *channel, *ban, *setby, *tims;
+	const char *target;
 	long secs;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 5, NULL, &channel,
 				  &ban, &setby, &tims);
+	channel = recode_in(SERVER(server), channel, NULL);
+	target = get_visible_target(server, channel);
+	chanrec = irc_channel_find(server, target);
+	banrec = chanrec == NULL ? NULL : banlist_find(chanrec->banlist, ban);
 	secs = *tims == '\0' ? 0 :
 		(long) (time(NULL) - atol(tims));
 
-	chanrec = irc_channel_find(server, channel);
-	banrec = chanrec == NULL ? NULL : banlist_find(chanrec->banlist, ban);
-
-	channel = get_visible_target(server, channel);
-	printformat(server, channel, MSGLEVEL_CRAP,
+	printformat(server, target, MSGLEVEL_CRAP,
 		    *setby == '\0' ? IRCTXT_BANLIST : IRCTXT_BANLIST_LONG,
 		    banrec == NULL ? 0 : g_slist_index(chanrec->banlist, banrec)+1,
-		    channel, ban, setby, secs);
+		    target, ban, setby, secs);
 
+	g_free(channel);
 	g_free(params);
 }
 
 static void event_eban_list(IRC_SERVER_REC *server, const char *data)
 {
-	const char *channel;
-	char *params, *ban, *setby, *tims;
+	char *params, *channel, *ban, *setby, *tims;
+	const char *target;
 	long secs;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 5, NULL, &channel,
 				  &ban, &setby, &tims);
+	channel = recode_in(SERVER(server), channel, NULL);
+	target = get_visible_target(server, channel);
 	secs = *tims == '\0' ? 0 :
 		(long) (time(NULL) - atol(tims));
 
-	channel = get_visible_target(server, channel);
-	printformat(server, channel, MSGLEVEL_CRAP,
+	printformat(server, target, MSGLEVEL_CRAP,
 		    *setby == '\0' ? IRCTXT_EBANLIST : IRCTXT_EBANLIST_LONG,
-		    channel, ban, setby, secs);
+		    target, ban, setby, secs);
 
+	g_free(channel);
 	g_free(params);
 }
 
@@ -213,21 +231,24 @@
 
 static void event_invite_list(IRC_SERVER_REC *server, const char *data)
 {
-	const char *channel;
-	char *params, *invite, *setby, *tims;
+	char *params, *channel, *invite, *setby, *tims;
+	const char *target;
 	long secs;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 5, NULL, &channel, &invite,
 			&setby, &tims);
+	channel = recode_in(SERVER(server), channel, NULL);
+	target = get_visible_target(server, channel);
 	secs = *tims == '\0' ? 0 :
 		(long) (time(NULL) - atol(tims));
 
-	channel = get_visible_target(server, channel);
-	printformat(server, channel, MSGLEVEL_CRAP,
+	printformat(server, target, MSGLEVEL_CRAP,
 		    *setby == '\0' ? IRCTXT_INVITELIST : IRCTXT_INVITELIST_LONG,
-		    channel, invite, setby, secs);
+		    target, invite, setby, secs);
+
+	g_free(channel);
 	g_free(params);
 }
 
@@ -248,72 +269,85 @@
 
 static void event_topic_get(IRC_SERVER_REC *server, const char *data)
 {
-	const char *channel;
-	char *params, *topic, *recoded;
+	char *params, *channel, *topic;
+	const char *target;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 3, NULL, &channel, &topic);
-	recoded = recode_in(SERVER(server), topic, channel);
-	channel = get_visible_target(server, channel);
-	printformat(server, channel, MSGLEVEL_CRAP,
-		    IRCTXT_TOPIC, channel, recoded);
+	channel = recode_in(SERVER(server), channel, NULL);
+	topic = recode_in(SERVER(server), topic, channel);
+	target = get_visible_target(server, channel);
+
+	printformat(server, target, MSGLEVEL_CRAP,
+		    IRCTXT_TOPIC, target, topic);
+
+	g_free(topic);
+	g_free(channel);
 	g_free(params);
-	g_free(recoded);
 }
 
 static void event_topic_info(IRC_SERVER_REC *server, const char *data)
 {
-	const char *channel;
-	char *params, *timestr, *bynick, *byhost, *topictime;
+	char *params, *channel, *timestr, *bynick, *byhost, *topictime;
+	const char *target;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 4, NULL, &channel,
 				  &bynick, &topictime);
-
+	channel = recode_in(SERVER(server), channel, NULL);
+	target = get_visible_target(server, channel);
         timestr = my_asctime((time_t) atol(topictime));
 
 	byhost = strchr(bynick, '!');
 	if (byhost != NULL)
 		*byhost++ = '\0';
 
-	channel = get_visible_target(server, channel);
-	printformat(server, channel, MSGLEVEL_CRAP, IRCTXT_TOPIC_INFO,
+	printformat(server, target, MSGLEVEL_CRAP, IRCTXT_TOPIC_INFO,
 		    bynick, timestr, byhost == NULL ? "" : byhost);
+
 	g_free(timestr);
+	g_free(channel);
 	g_free(params);
 }
 
 static void event_channel_mode(IRC_SERVER_REC *server, const char *data)
 {
-	const char *channel;
-	char *params, *mode;
+	char *params, *channel, *mode;
+	const char *target;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 3 | PARAM_FLAG_GETREST,
 				  NULL, &channel, &mode);
-	channel = get_visible_target(server, channel);
-	printformat(server, channel, MSGLEVEL_CRAP,
-		    IRCTXT_CHANNEL_MODE, channel, g_strchomp(mode));
+	channel = recode_in(SERVER(server), channel, NULL);
+	target = get_visible_target(server, channel);
+
+	printformat(server, target, MSGLEVEL_CRAP,
+		    IRCTXT_CHANNEL_MODE, target, g_strchomp(mode));
+
+	g_free(channel);
 	g_free(params);
 }
 
 static void event_channel_created(IRC_SERVER_REC *server, const char *data)
 {
-	const char *channel;
-	char *params, *createtime, *timestr;
+	char *params, *channel, *createtime, *timestr;
+	const char *target;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 3, NULL, &channel, &createtime);
+	channel = recode_in(SERVER(server), channel, NULL);
+	target = get_visible_target(server, channel);
+	timestr = my_asctime((time_t) atol(createtime));
 
-        timestr = my_asctime((time_t) atol(createtime));
-	channel = get_visible_target(server, channel);
-	printformat(server, channel, MSGLEVEL_CRAP,
-		    IRCTXT_CHANNEL_CREATED, channel, timestr);
+	printformat(server, target, MSGLEVEL_CRAP,
+		    IRCTXT_CHANNEL_CREATED, target, timestr);
+
 	g_free(timestr);
+	g_free(channel);
 	g_free(params);
 }
 
@@ -370,22 +404,30 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 3, NULL, &nick, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
+
 	printformat(server, nick, MSGLEVEL_CRAP,
 		    IRCTXT_INVITING, nick, channel);
+
+	g_free(channel);
 	g_free(params);
 }
 
 static void event_chanserv_url(IRC_SERVER_REC *server, const char *data)
 {
-	const char *channel;
-	char *params, *url;
+	char *params, *channel, *url;
+	const char *target;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 3, NULL, &channel, &url);
-	channel = get_visible_target(server, channel);
-	printformat(server, channel, MSGLEVEL_CRAP,
-		    IRCTXT_CHANNEL_URL, channel, url);
+	channel = recode_in(SERVER(server), channel, NULL);
+	target = get_visible_target(server, channel);
+
+	printformat(server, target, MSGLEVEL_CRAP,
+		    IRCTXT_CHANNEL_URL, target, url);
+
+	g_free(channel);
 	g_free(params);
 }
 
@@ -393,17 +435,18 @@
 				     const char *nick, const char *addr)
 {
 	IRC_CHANNEL_REC *chanrec;
-	char *params, *target;
+	char *params, *channel, *target;
 
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2, NULL, &target);
-	if (!ischannel(*target)) {
+	channel = recode_in(SERVER(server), target, NULL);
+	if (!ischannel(*channel)) {
 		/* nick unavailable */
 		printformat(server, NULL, MSGLEVEL_CRAP,
 			    IRCTXT_NICK_UNAVAILABLE, target);
 	} else {
-		chanrec = irc_channel_find(server, target);
+		chanrec = irc_channel_find(server, channel);
 		if (chanrec != NULL && chanrec->joined) {
 			/* dalnet - can't change nick while being banned */
 			print_event_received(server, data, nick, FALSE);
@@ -414,6 +457,7 @@
 		}
 	}
 
+	g_free(channel);
 	g_free(params);
 }
 
@@ -441,8 +485,12 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
+
 	printformat(server, channel, MSGLEVEL_CRAP,
 		    IRCTXT_NO_SUCH_CHANNEL, channel);
+
+	g_free(channel);
 	g_free(params);
 }
 
@@ -453,7 +501,11 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
+
 	printformat(server, NULL, MSGLEVEL_CRAP, format, channel);
+
+	g_free(channel);
 	g_free(params);
 }
 
@@ -472,6 +524,7 @@
 	/* this new addition to ircd breaks completely with older
 	   "standards", "nick Duplicate ::!!channel ...." */
 	params = event_get_params(data, 3, NULL, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
 	p = strchr(channel, ' ');
 	if (p != NULL) *p = '\0';
 
@@ -481,6 +534,7 @@
 	} else
 		print_event_received(server, data, nick, FALSE);
 
+	g_free(channel);
 	g_free(params);
 }
 
@@ -523,9 +577,12 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	chanrec = irc_channel_find(server, channel);
 	print_event_received(server, data, nick, chanrec == NULL || chanrec->joined);
+
+	g_free(channel);
 	g_free(params);
 }
 
@@ -542,9 +599,12 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	chanrec = irc_channel_find(server, channel);
 	print_event_received(server, data, nick, chanrec == NULL || chanrec->joined);
+
+	g_free(channel);
 	g_free(params);
 }
 
Index: src/irc/core/irc-channels.c
===================================================================
--- src/irc/core/irc-channels.c	(revision 5190)
+++ src/irc/core/irc-channels.c	(working copy)
@@ -23,6 +23,7 @@
 #include "misc.h"
 #include "levels.h"
 #include "channels-setup.h"
+#include "recode.h"
 
 #include "bans.h"
 #include "modes.h"
@@ -146,11 +147,21 @@
 				continue;
 		}
 		if (outchans->len > 0) {
+			char *outchans_recoded;
+			char *outkeys_recoded;
+
 			g_string_truncate(outchans, outchans->len-1);
+			outchans_recoded = recode_out(SERVER(server),
+			        outchans->str, NULL);
 			g_string_truncate(outkeys, outkeys->len-1);
+			outkeys_recoded = recode_out(SERVER(server),
+			        outkeys->str, NULL);
 			irc_send_cmdv(IRC_SERVER(server),
 				      use_keys ? "JOIN %s %s" : "JOIN %s",
-				      outchans->str, outkeys->str);
+				      outchans_recoded, outkeys_recoded);
+
+			g_free(outkeys_recoded);
+			g_free(outchans_recoded);
 		}
 		cmdlen = 0;
 		g_string_truncate(outchans,0);
Index: src/irc/core/irc-nicklist.c
===================================================================
--- src/irc/core/irc-nicklist.c	(revision 5190)
+++ src/irc/core/irc-nicklist.c	(working copy)
@@ -21,6 +21,7 @@
 #include "module.h"
 #include "signals.h"
 #include "misc.h"
+#include "recode.h"
 
 #include "irc-servers.h"
 #include "irc-channels.h"
@@ -110,10 +111,12 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 4, NULL, &type, &channel, &names);
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	chanrec = irc_channel_find(server, channel);
 	if (chanrec == NULL || chanrec->names_got) {
 		/* unknown channel / names list already read */
+		g_free(channel);
 		g_free(params);
 		return;
 	}
@@ -168,6 +171,7 @@
 		}
 	}
 
+	g_free(channel);
 	g_free(params);
 }
 
@@ -181,6 +185,7 @@
 	g_return_if_fail(server != NULL);
 
 	params = event_get_params(data, 2, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	chanrec = irc_channel_find(server, channel);
 	if (chanrec != NULL && !chanrec->names_got) {
@@ -199,6 +204,7 @@
 		signal_emit("channel joined", 1, chanrec);
 	}
 
+	g_free(channel);
 	g_free(params);
 }
 
@@ -212,6 +218,7 @@
 
 	params = event_get_params(data, 8, NULL, &channel, &user, &host,
 				  NULL, &nick, &stat, &realname);
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	/* get hop count */
 	hops = realname;
@@ -238,6 +245,7 @@
 			      strchr(stat, 'G') != NULL, /* gone */
 			      strchr(stat, '*') != NULL); /* ircop */
 
+	g_free(channel);
 	g_free(params);
 }
 
Index: src/irc/core/channel-events.c
===================================================================
--- src/irc/core/channel-events.c	(revision 5190)
+++ src/irc/core/channel-events.c	(working copy)
@@ -59,10 +59,12 @@
 	   which we haven't joined yet. 4xx are error codes and should
 	   indicate that the join failed. */
 	params = event_get_params(line, 3, &numeric, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	if (numeric[0] == '4')
 		check_join_failure(server, channel);
 
+	g_free(channel);
 	g_free(params);
 }
 
@@ -73,6 +75,7 @@
 	char *params, *channel;
 
 	params = event_get_params(data, 2, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
 	chanrec = *channel == '!' && channel[1] != '\0' ?
 		channel_find(SERVER(server), channel) : NULL;
 
@@ -83,12 +86,15 @@
 		if (setup != NULL && setup->autojoin) {
 			/* it's autojoin channel though, so create it */
 			irc_send_cmdv(server, "JOIN !%s", chanrec->name);
+			g_free(channel);
 			g_free(params);
                         return;
 		}
 	}
 
 	check_join_failure(server, channel);
+
+	g_free(channel);
 	g_free(params);
 }
 
@@ -102,6 +108,7 @@
 	/* this new addition to ircd breaks completely with older
 	   "standards", "nick Duplicate ::!!channel ...." */
 	params = event_get_params(data, 3, NULL, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
 	p = strchr(channel, ' ');
 	if (p != NULL) *p = '\0';
 
@@ -114,6 +121,7 @@
 		}
 	}
 
+	g_free(channel);
 	g_free(params);
 }
 
@@ -150,7 +158,11 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 3, NULL, &channel, &topic);
+	channel = recode_in(SERVER(server), channel, NULL);
+
 	channel_change_topic(server, channel, topic, NULL, 0);
+
+	g_free(channel);
 	g_free(params);
 }
 
@@ -162,10 +174,14 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2, &channel, &topic);
+	channel = recode_in(SERVER(server), channel, NULL);
 	mask = addr == NULL ? g_strdup(nick) :
 		g_strconcat(nick, "!", addr, NULL);
+
 	channel_change_topic(server, channel, topic, mask, time(NULL));
+
 	g_free(mask);
+	g_free(channel);
 	g_free(params);
 }
 
@@ -178,9 +194,12 @@
 
 	params = event_get_params(data, 4, NULL, &channel,
 				  &topicby, &topictime);
+	channel = recode_in(SERVER(server), channel, NULL);
+	t = (time_t) atol(topictime);
 
-	t = (time_t) atol(topictime);
 	channel_change_topic(server, channel, NULL, topicby, t);
+
+	g_free(channel);
 	g_free(params);
 }
 
@@ -223,6 +242,7 @@
 		server->userhost = g_strdup(address);
 
 	params = event_get_params(data, 1, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
 	tmp = strchr(channel, 7); /* ^G does something weird.. */
 	if (tmp != NULL) *tmp = '\0';
 
@@ -276,6 +296,7 @@
 	}
 
 	g_free(shortchan);
+	g_free(channel);
 	g_free(params);
 }
 
@@ -292,6 +313,7 @@
 	}
 
 	params = event_get_params(data, 2, &channel, &reason);
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	chanrec = channel_find(SERVER(server), channel);
 	if (chanrec != NULL && chanrec->joined) {
@@ -299,6 +321,7 @@
 		channel_destroy(chanrec);
 	}
 
+	g_free(channel);
 	g_free(params);
 }
 
@@ -310,6 +333,7 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 3, &channel, &nick, &reason);
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	if (g_strcasecmp(nick, server->nick) != 0) {
 		/* someone else was kicked, no need to do anything */
@@ -324,6 +348,7 @@
 		channel_destroy(chanrec);
 	}
 
+	g_free(channel);
 	g_free(params);
 }
 
@@ -334,6 +359,7 @@
 	g_return_if_fail(data != NULL);
 
 	params = event_get_params(data, 2, NULL, &channel);
+	channel = recode_in(SERVER(server), channel, NULL);
 
 	if (irc_channel_find(server, channel) == NULL) {
                 /* check if we're supposed to autojoin this channel */
@@ -353,6 +379,7 @@
 
 	g_free_not_null(server->last_invite);
 	server->last_invite = g_strdup(channel);
+	g_free(channel);
 	g_free(params);
 }
 
Index: src/irc/core/irc-commands.c
===================================================================
--- src/irc/core/irc-commands.c	(revision 5190)
+++ src/irc/core/irc-commands.c	(working copy)
@@ -170,17 +170,20 @@
 
 	if (*msg != '\0')
 		recoded = recode_out(SERVER(server), msg, channame);
+	channame = recode_out(SERVER(server), channame, NULL);
+
 	irc_send_cmdv(server, ! recoded ? "PART %s" : "PART %s :%s",
 		      channame, recoded);
 
 	g_free(recoded);
+	g_free(channame);
 	cmd_params_free(free_arg);
 }
 
 /* SYNTAX: KICK [<channel>] <nicks> [<reason>] */
 static void cmd_kick(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item)
 {
-	char *channame, *nicks, *reason, *recoded;
+	char *channame, *nicks, *reason;
 	void *free_arg;
 
         CMD_IRC_SERVER(server);
@@ -193,12 +196,14 @@
 	if (*channame == '\0' || *nicks == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
 	if (!ischannel(*channame)) cmd_param_error(CMDERR_NOT_JOINED);
 
-	recoded = recode_out(SERVER(server), reason, channame);
-	g_string_printf(tmpstr, "KICK %s %s :%s", channame, nicks, recoded);
-	g_free(recoded);
+	reason = recode_out(SERVER(server), reason, channame);
+	channame = recode_out(SERVER(server), channame, NULL);
+	g_string_printf(tmpstr, "KICK %s %s :%s", channame, nicks, reason);
 
 	irc_send_cmd_split(server, tmpstr->str, 3, server->max_kicks_in_cmd);
 
+	g_free(reason);
+	g_free(channame);
 	cmd_params_free(free_arg);
 }
 
@@ -207,7 +212,6 @@
 {
 	GHashTable *optlist;
 	char *channame, *topic;
-	char *recoded = NULL;
 	void *free_arg;
 
         CMD_IRC_SERVER(server);
@@ -218,11 +222,13 @@
 		return;
 
 	if (*topic != '\0' || g_hash_table_lookup(optlist, "delete") != NULL)
-		recoded = recode_out(SERVER(server), topic, channame);
-	irc_send_cmdv(server, recoded == NULL ? "TOPIC %s" : "TOPIC %s :%s",
-		      channame, recoded);
-	g_free(recoded);
+		topic = recode_out(SERVER(server), topic, channame);
+	channame = recode_out(SERVER(server), channame, NULL);
+	irc_send_cmdv(server, topic == NULL ? "TOPIC %s" : "TOPIC %s :%s",
+		      channame, topic);
 
+	g_free(topic);
+	g_free(channame);
 	cmd_params_free(free_arg);
 }
 
@@ -244,8 +250,11 @@
 
 		channame = IRC_CHANNEL(item)->name;
 	}
+	channame = recode_out(SERVER(server), channame, NULL);
 
 	irc_send_cmdv(server, "INVITE %s %s", nick, channame);
+
+	g_free(channame);
 	cmd_params_free(free_arg);
 }
 
@@ -268,7 +277,10 @@
 	     server->channels_formed > LIST_MAX_CHANNELS_PASS))
 		cmd_param_error(CMDERR_NOT_GOOD_IDEA);
 
+	str = recode_out(SERVER(server), str, NULL);
 	irc_send_cmdv(server, "LIST %s", str);
+
+	g_free(str);
 	cmd_params_free(free_arg);
 }
 
@@ -292,11 +304,14 @@
 	}
 	if (strcmp(channel, "**") == 0) {
 		/* ** displays all nicks.. */
-		*channel = '\0';
+		irc_send_cmd(server, "WHO");
+	} else {
+		channel = recode_out(SERVER(server), channel, NULL);
+		irc_send_cmdv(server, *rest == '\0' ? "WHO %s" : "WHO %s %s",
+		      channel, rest);
+		g_free(channel);
 	}
 
-	irc_send_cmdv(server, *rest == '\0' ? "WHO %s" : "WHO %s %s",
-		      channel, rest);
 	cmd_params_free(free_arg);
 }
 
@@ -324,7 +339,9 @@
 		/* ** displays all nicks.. */
                 irc_send_cmd(server, "NAMES");
 	} else {
+		channel = recode_out(SERVER(server), channel, NULL);
 		irc_send_cmdv(server, "NAMES %s", channel);
+		g_free(channel);
 	}
 
 	cmd_params_free(free_arg);

Attachment: channel-name-recode.diff.sig
Description: PGP signature

Reply via email to