1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-27 05:16:38 +02:00

Fix bug with command-line option "irc://" (bug #29990), new format for port and channels

This commit is contained in:
Sebastien Helleu
2010-06-02 15:17:54 +02:00
parent e46fc21129
commit 4a61dc9633
3 changed files with 145 additions and 103 deletions
+3 -1
View File
@@ -1,7 +1,7 @@
WeeChat ChangeLog
=================
FlashCode <flashcode@flashtux.org>
v0.3.3-dev, 2010-06-01
v0.3.3-dev, 2010-06-02
Version 0.3.3 (under dev!)
@@ -14,6 +14,8 @@ Version 0.3.3 (under dev!)
process)
* api: add function "string_expand_home", fix bug with replacement of home in
paths
* irc: fix bug with command-line option "irc://" (bug #29990), new format for
port and channels
* irc: add command /wallchops, fix bug with display of notice for ops
(task #10021, bug #29932)
* irc: add isupport value in servers (content of IRC message 005), with new
+6 -3
View File
@@ -55,10 +55,13 @@ display WeeChat version
Options for plugins depend on plugins, you can look at plugins documentation on WeeChat website for more information.
.TP
For example, with irc plugin, you can connect to temporary server with an url like:
.B irc[6][s]://[[nickname][:password]@]server[/port][//#channel1[,#channel2...]]
.B irc[6][s]://[[nickname][:password]@]server[:port][/#channel1[,#channel2...]]
.TP
To join WeeChat IRC channel support with nick "MyNick":
irc://MyNick@irc.freenode.net//#weechat
To join WeeChat IRC channel support with nick "mynick":
irc://mynick@irc.freenode.net/#weechat
.TP
IPv6 address can be enclosed in brackets to add a port after address, for example:
irc://mynick@[2001:db8:0:85a3::ac1f:8001]:6668/#test
.SH FILES
.TP
+136 -99
View File
@@ -473,9 +473,9 @@ irc_server_alloc (const char *name)
int
irc_server_alloc_with_url (const char *irc_url)
{
char *irc_url2, *url, *pos_server, *pos_channel, *pos, *pos2;
char *password, *nick1, *nicks, *autojoin;
char *server_name;
char *irc_url2, *pos_server, *pos_nick, *pos_password;
char *pos_address, *pos_port, *pos_channel, *pos;
char *server_address, *server_nicks, *server_autojoin;
int ipv6, ssl, length;
struct t_irc_server *ptr_server;
@@ -483,146 +483,183 @@ irc_server_alloc_with_url (const char *irc_url)
if (!irc_url2)
return 0;
pos_server = NULL;
pos_nick = NULL;
pos_password = NULL;
pos_address = NULL;
pos_port = NULL;
pos_channel = NULL;
ipv6 = 0;
ssl = 0;
password = NULL;
nick1 = NULL;
autojoin = NULL;
if (weechat_strncasecmp (irc_url2, "irc6://", 7) == 0)
{
pos = irc_url2 + 7;
ipv6 = 1;
}
else if (weechat_strncasecmp (irc_url2, "ircs://", 7) == 0)
{
pos = irc_url2 + 7;
ssl = 1;
}
else if ((weechat_strncasecmp (irc_url2, "irc6s://", 8) == 0)
|| (weechat_strncasecmp (irc_url2, "ircs6://", 8) == 0))
{
pos = irc_url2 + 8;
ipv6 = 1;
ssl = 1;
}
else if (weechat_strncasecmp (irc_url2, "irc://", 6) == 0)
{
pos = irc_url2 + 6;
}
else
pos_server = strstr (irc_url2, "://");
if (!pos_server)
{
free (irc_url2);
return 0;
}
pos_server[0] = '\0';
pos_server += 3;
free (irc_url2);
url = strdup (pos);
pos_server = strchr (url, '@');
if (pos_server)
{
pos_server[0] = '\0';
pos_server++;
if (!pos[0])
{
free (url);
return 0;
}
pos2 = strchr (url, ':');
if (pos2)
{
pos2[0] = '\0';
password = strdup (pos2 + 1);
}
nick1 = strdup (url);
}
else
pos_server = url;
if (!pos_server[0])
{
free (url);
return 0;
}
pos_channel = strstr (pos_server, "//");
pos_channel = strstr (pos_server, "/");
if (pos_channel)
{
pos_channel[0] = '\0';
pos_channel += 2;
}
if (pos_channel && pos_channel[0])
{
if (irc_channel_is_channel (pos_channel))
autojoin = strdup (pos_channel);
else
pos_channel++;
while (pos_channel[0] == '/')
{
autojoin = malloc (strlen (pos_channel) + 2);
strcpy (autojoin, "#");
strcat (autojoin, pos_channel);
pos_channel++;
}
}
/* server name ends before first '/' (if found) */
server_name = irc_server_get_name_without_port (pos_server);
ptr_server = irc_server_alloc (server_name);
if (server_name)
free (server_name);
/* check for SSL / IPv6 */
if (weechat_strcasecmp (irc_url2, "irc6") == 0)
{
ipv6 = 1;
}
else if (weechat_strcasecmp (irc_url2, "ircs") == 0)
{
ssl = 1;
}
else if ((weechat_strcasecmp (irc_url2, "irc6s") == 0)
|| (weechat_strcasecmp (irc_url2, "ircs6") == 0))
{
ipv6 = 1;
ssl = 1;
}
/* search for nick, password, address+port */
pos_address = strchr (pos_server, '@');
if (pos_address)
{
pos_address[0] = '\0';
pos_address++;
pos_nick = pos_server;
pos_password = strchr (pos_server, ':');
if (pos_password)
{
pos_password[0] = '\0';
pos_password++;
}
}
else
pos_address = pos_server;
/*
* search for port in address, and skip optional [ ] around address
* (can be used to indicate IPv6 port, after ']')
*/
if (pos_address[0] == '[')
{
pos_address++;
pos = strchr (pos_address, ']');
if (!pos)
{
free (irc_url2);
return 0;
}
pos[0] = '\0';
pos++;
pos_port = strchr (pos, ':');
if (pos_port)
{
pos_port[0] = '\0';
pos_port++;
}
}
else
{
pos_port = strchr (pos_address, ':');
if (pos_port)
{
pos_port[0] = '\0';
pos_port++;
}
}
ptr_server = irc_server_alloc (pos_address);
if (ptr_server)
{
ptr_server->temp_server = 1;
weechat_config_option_set (ptr_server->options[IRC_SERVER_OPTION_ADDRESSES],
pos_server,
1);
if (pos_address && pos_address[0])
{
length = strlen (pos_address) + 1 +
((pos_port) ? strlen (pos_port) : 0) + 1;
server_address = malloc (length);
if (server_address)
{
snprintf (server_address, length,
"%s%s%s",
pos_address,
(pos_port && pos_port[0]) ? "/" : "",
(pos_port && pos_port[0]) ? pos_port : "");
weechat_config_option_set (ptr_server->options[IRC_SERVER_OPTION_ADDRESSES],
server_address,
1);
free (server_address);
}
}
weechat_config_option_set (ptr_server->options[IRC_SERVER_OPTION_IPV6],
(ipv6) ? "on" : "off",
1);
weechat_config_option_set (ptr_server->options[IRC_SERVER_OPTION_SSL],
(ssl) ? "on" : "off",
1);
if (nick1)
if (pos_nick && pos_nick[0])
{
length = ((strlen (nick1) + 2) * 5) + 1;
nicks = malloc (length);
if (nicks)
length = ((strlen (pos_nick) + 2) * 5) + 1;
server_nicks = malloc (length);
if (server_nicks)
{
snprintf (nicks, length,
snprintf (server_nicks, length,
"%s,%s1,%s2,%s3,%s4",
nick1, nick1, nick1, nick1, nick1);
pos_nick, pos_nick, pos_nick, pos_nick, pos_nick);
weechat_config_option_set (ptr_server->options[IRC_SERVER_OPTION_NICKS],
nicks,
server_nicks,
1);
free (nicks);
free (server_nicks);
}
}
if (password)
if (pos_password && pos_password[0])
weechat_config_option_set (ptr_server->options[IRC_SERVER_OPTION_PASSWORD],
password,
1);
if (autojoin)
weechat_config_option_set (ptr_server->options[IRC_SERVER_OPTION_AUTOJOIN],
autojoin,
pos_password,
1);
weechat_config_option_set (ptr_server->options[IRC_SERVER_OPTION_AUTOCONNECT],
"on",
1);
/* autojoin */
if (pos_channel && pos_channel[0])
{
if (irc_channel_is_channel (pos_channel))
server_autojoin = strdup (pos_channel);
else
{
server_autojoin = malloc (strlen (pos_channel) + 2);
if (server_autojoin)
{
strcpy (server_autojoin, "#");
strcat (server_autojoin, pos_channel);
}
}
if (server_autojoin)
{
weechat_config_option_set (ptr_server->options[IRC_SERVER_OPTION_AUTOJOIN],
server_autojoin,
1);
free (server_autojoin);
}
}
}
else
{
weechat_printf (NULL,
_("%s%s: error creating new server \"%s\""),
weechat_prefix ("error"), IRC_PLUGIN_NAME,
pos_server);
pos_address);
}
if (password)
free (password);
if (nick1)
free (nick1);
if (autojoin)
free (autojoin);
free (url);
free (irc_url2);
return (ptr_server) ? 1 : 0;
}