summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/irc/irc-recv.c53
1 files changed, 48 insertions, 5 deletions
diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c
index b4be5b46a..c35e1692b 100644
--- a/src/irc/irc-recv.c
+++ b/src/irc/irc-recv.c
@@ -2431,7 +2431,8 @@ irc_cmd_recv_topic (t_irc_server *server, char *host, char *nick, char *argument
int
irc_cmd_recv_004 (t_irc_server *server, char *host, char *nick, char *arguments)
{
- char *pos;
+ char *pos, *buffer, *s, *q;
+ int i, f;
t_irc_channel *ptr_channel;
pos = strchr (arguments, ' ');
@@ -2454,11 +2455,53 @@ irc_cmd_recv_004 (t_irc_server *server, char *host, char *nick, char *arguments)
/* execute command once connected */
if (server->command && server->command[0])
{
- user_command (server, NULL, server->command);
- if (server->command_delay > 0)
- sleep (server->command_delay);
+ /* splitting command on ';' which can be escaped with '\;' */
+ buffer = (char *) malloc ( (strlen(server->command) + 1) * sizeof (char));
+
+ if (buffer)
+ {
+ s = server->command;
+ i = 0;
+ while(*s != '\0')
+ {
+ f = 0;
+ if (*s == ';')
+ {
+ if (s == server->command)
+ f = 1;
+ else if ( *(s-1) != '\\')
+ f = 1;
+ else if ( *(s-1) == '\\')
+ f = 2;
+ }
+ if (f == 1)
+ {
+ buffer[i] = '\0';
+ i = -1;
+ q = buffer;
+ while (*q == ' ') q++;
+ if (q && q[0])
+ user_command (server, NULL, q);
+ }
+ else if (f == 2)
+ buffer[--i] = *s;
+ else
+ buffer[i] = *s;
+ i++; s++;
+ }
+ buffer[i] = '\0';
+ q = buffer;
+ while (*q == ' ') q++;
+ if (q && q[0])
+ user_command (server, NULL, q);
+
+ free (buffer);
+ }
+
+ if (server->command_delay > 0)
+ sleep (server->command_delay);
}
-
+
/* auto-join after disconnection (only rejoins opened channels) */
if (server->reconnect_join && server->channels)
{