summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/irc/irc-protocol.c89
-rw-r--r--tests/unit/plugins/irc/test-irc-protocol.cpp32
2 files changed, 67 insertions, 54 deletions
diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c
index 4030f3821..af1f36890 100644
--- a/src/plugins/irc/irc-protocol.c
+++ b/src/plugins/irc/irc-protocol.c
@@ -261,24 +261,27 @@ irc_protocol_parse_time (const char *time)
}
/*
- * Builds a string with concatenation of IRC command parameters.
+ * Builds a string with concatenation of IRC command parameters, from
+ * arg_start to arg_end.
*
* Note: result must be free after use.
*/
char *
-irc_protocol_string_params (const char **params, int start_arg)
+irc_protocol_string_params (const char **params, int arg_start, int arg_end)
{
int i, length;
char *result;
- if (!params || (start_arg < 0))
+ if (!params || (arg_start < 0) || (arg_end < arg_start))
return strdup ("");
length = 0;
for (i = 0; params[i]; i++)
{
- if (i >= start_arg)
+ if (i > arg_end)
+ break;
+ if (i >= arg_start)
length += strlen (params[i]) + 1;
}
@@ -291,10 +294,12 @@ irc_protocol_string_params (const char **params, int start_arg)
result[0] = '\0';
- for (i = start_arg; params[i]; i++)
+ for (i = arg_start; params[i]; i++)
{
+ if (i > arg_end)
+ break;
strcat (result, params[i]);
- if (params[i + 1])
+ if ((i + 1 <= arg_end) && params[i + 1])
strcat (result, " ");
}
@@ -305,6 +310,13 @@ irc_protocol_string_params (const char **params, int start_arg)
* Prints a FAIL/WARN/NOTE command.
*
* Called by callbacks for commands: FAIL, WARN, NOTE.
+ *
+ * Commands looks like:
+ * FAIL * NEED_REGISTRATION :You need to be registered to continue
+ * FAIL ACC REG_INVALID_CALLBACK REGISTER :Email address is not valid
+ * FAIL BOX BOXES_INVALID STACK CLOCKWISE :Given boxes are not supported
+ * WARN REHASH CERTS_EXPIRED :Certificate [xxx] has expired
+ * NOTE * OPER_MESSAGE :The message
*/
void
@@ -313,24 +325,23 @@ irc_protocol_print_error_warning_msg (struct t_irc_server *server,
const char *command,
const char *prefix,
const char *label,
- char *error_command,
- char *args)
+ const char **params,
+ int num_params)
{
const char *ptr_command;
- char *pos_desc;
+ char *str_context;
- ptr_command = (error_command && (strcmp (error_command, "*") != 0)) ?
- error_command : NULL;
+ ptr_command = (strcmp (params[0], "*") != 0) ?
+ params[0] : NULL;
- pos_desc = (args) ? strstr (args, " :") : NULL;
- if (pos_desc)
- pos_desc[0] = '\0';
+ str_context = (num_params > 2) ?
+ irc_protocol_string_params (params, 1, num_params - 2) : NULL;
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (server, NULL, command, NULL, NULL),
date,
irc_protocol_tags (command, NULL, NULL, NULL),
- "%s%s%s%s%s%s[%s%s%s]%s%s%s",
+ "%s%s%s%s%s%s[%s%s%s]%s %s",
(prefix) ? prefix : "",
(label) ? label : "",
(label) ? " " : "",
@@ -338,15 +349,13 @@ irc_protocol_print_error_warning_msg (struct t_irc_server *server,
(ptr_command) ? " " : "",
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_RESET,
- (args) ? args : "",
+ (str_context) ? str_context : "",
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_RESET,
- (pos_desc) ? ": " : "",
- (pos_desc) ? pos_desc + 2 : "");
-
- if (pos_desc)
- pos_desc[0] = ' ';
+ params[num_params - 1]);
+ if (str_context)
+ free (str_context);
}
/*
@@ -1034,7 +1043,7 @@ IRC_PROTOCOL_CALLBACK(cap)
if (num_params < 3)
return WEECHAT_RC_OK;
- str_params = irc_protocol_string_params (params, 2);
+ str_params = irc_protocol_string_params (params, 2, num_params - 1);
weechat_printf_date_tags (
server->buffer, date, NULL,
_("%s%s: client capability, refused: %s"),
@@ -1049,7 +1058,7 @@ IRC_PROTOCOL_CALLBACK(cap)
if (num_params < 3)
return WEECHAT_RC_OK;
- str_params = irc_protocol_string_params (params, 2);
+ str_params = irc_protocol_string_params (params, 2, num_params - 1);
weechat_printf_date_tags (
server->buffer, date, NULL,
_("%s%s: client capability, now available: %s"),
@@ -1100,7 +1109,7 @@ IRC_PROTOCOL_CALLBACK(cap)
if (num_params < 3)
return WEECHAT_RC_OK;
- str_params = irc_protocol_string_params (params, 2);
+ str_params = irc_protocol_string_params (params, 2, num_params - 1);
weechat_printf_date_tags (
server->buffer, date, NULL,
_("%s%s: client capability, removed: %s"),
@@ -1231,7 +1240,7 @@ IRC_PROTOCOL_CALLBACK(error)
IRC_PROTOCOL_MIN_PARAMS(1);
- str_params = irc_protocol_string_params (params, 0);
+ str_params = irc_protocol_string_params (params, 0, num_params - 1);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (server, NULL, command, NULL, NULL),
@@ -1285,7 +1294,7 @@ IRC_PROTOCOL_CALLBACK(generic_error)
ptr_buffer = (ptr_channel) ? ptr_channel->buffer : server->buffer;
- str_params = irc_protocol_string_params (params, arg_error);
+ str_params = irc_protocol_string_params (params, arg_error, num_params - 1);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
@@ -1316,14 +1325,14 @@ IRC_PROTOCOL_CALLBACK(generic_error)
* Callback for the IRC command "FAIL".
*
* Command looks like:
- * :server FAIL * NEED_REGISTRATION :You need to be registered to continue
- * :server FAIL ACC REG_INVALID_CALLBACK REGISTER :Email address is not valid
- * :server FAIL BOX BOXES_INVALID STACK CLOCKWISE :Given boxes are not supported
+ * FAIL * NEED_REGISTRATION :You need to be registered to continue
+ * FAIL ACC REG_INVALID_CALLBACK REGISTER :Email address is not valid
+ * FAIL BOX BOXES_INVALID STACK CLOCKWISE :Given boxes are not supported
*/
IRC_PROTOCOL_CALLBACK(fail)
{
- IRC_PROTOCOL_MIN_ARGS(4);
+ IRC_PROTOCOL_MIN_PARAMS(2);
irc_protocol_print_error_warning_msg (
server,
@@ -1331,8 +1340,8 @@ IRC_PROTOCOL_CALLBACK(fail)
command,
weechat_prefix ("error"),
_("Failure:"),
- argv[2],
- argv_eol[3]);
+ params,
+ num_params);
return WEECHAT_RC_OK;
}
@@ -2054,12 +2063,12 @@ IRC_PROTOCOL_CALLBACK(nick)
* Callback for the IRC command "NOTE".
*
* Command looks like:
- * :server NOTE * OPER_MESSAGE :The message
+ * NOTE * OPER_MESSAGE :The message
*/
IRC_PROTOCOL_CALLBACK(note)
{
- IRC_PROTOCOL_MIN_ARGS(4);
+ IRC_PROTOCOL_MIN_PARAMS(2);
irc_protocol_print_error_warning_msg (
server,
@@ -2067,8 +2076,8 @@ IRC_PROTOCOL_CALLBACK(note)
command,
weechat_prefix ("network"),
_("Note:"),
- argv[2],
- argv_eol[3]);
+ params,
+ num_params);
return WEECHAT_RC_OK;
}
@@ -3322,12 +3331,12 @@ IRC_PROTOCOL_CALLBACK(wallops)
* Callback for the IRC command "WARN".
*
* Command looks like:
- * :server WARN REHASH CERTS_EXPIRED :Certificate [xxx] has expired
+ * WARN REHASH CERTS_EXPIRED :Certificate [xxx] has expired
*/
IRC_PROTOCOL_CALLBACK(warn)
{
- IRC_PROTOCOL_MIN_ARGS(4);
+ IRC_PROTOCOL_MIN_PARAMS(2);
irc_protocol_print_error_warning_msg (
server,
@@ -3335,8 +3344,8 @@ IRC_PROTOCOL_CALLBACK(warn)
command,
weechat_prefix ("error"),
_("Warning:"),
- argv[2],
- argv_eol[3]);
+ params,
+ num_params);
return WEECHAT_RC_OK;
}
diff --git a/tests/unit/plugins/irc/test-irc-protocol.cpp b/tests/unit/plugins/irc/test-irc-protocol.cpp
index 037feeb9e..777012992 100644
--- a/tests/unit/plugins/irc/test-irc-protocol.cpp
+++ b/tests/unit/plugins/irc/test-irc-protocol.cpp
@@ -46,7 +46,8 @@ extern const char *irc_protocol_nick_address (struct t_irc_server *server,
struct t_irc_nick *nick,
const char *nickname,
const char *address);
-extern char *irc_protocol_string_params (const char **params, int start_arg);
+extern char *irc_protocol_string_params (const char **params,
+ int arg_start, int arg_end);
extern char *irc_protocol_cap_to_enable (const char *capabilities,
int sasl_requested);
}
@@ -320,27 +321,30 @@ TEST(IrcProtocol, StringParams)
const char *params_3[] = { "param1", "param2", "param3", NULL };
/* invalid arguments */
- WEE_TEST_STR("", irc_protocol_string_params (NULL, -1));
- WEE_TEST_STR("", irc_protocol_string_params (NULL, 0));
+ WEE_TEST_STR("", irc_protocol_string_params (NULL, -1, -1));
+ WEE_TEST_STR("", irc_protocol_string_params (NULL, 0, 0));
+ WEE_TEST_STR("", irc_protocol_string_params (NULL, 0, -1));
+ WEE_TEST_STR("", irc_protocol_string_params (params_1, 1, 0));
/* empty parameter */
- WEE_TEST_STR("", irc_protocol_string_params (params_empty, 0));
- WEE_TEST_STR("", irc_protocol_string_params (params_empty, 1));
+ WEE_TEST_STR("", irc_protocol_string_params (params_empty, 0, 0));
+ WEE_TEST_STR("", irc_protocol_string_params (params_empty, 1, 1));
/* one parameter */
- WEE_TEST_STR("param1", irc_protocol_string_params (params_1, 0));
- WEE_TEST_STR("", irc_protocol_string_params (params_1, 1));
+ WEE_TEST_STR("param1", irc_protocol_string_params (params_1, 0, 0));
+ WEE_TEST_STR("", irc_protocol_string_params (params_1, 1, 1));
/* two parameters */
- WEE_TEST_STR("param1 param2", irc_protocol_string_params (params_2, 0));
- WEE_TEST_STR("param2", irc_protocol_string_params (params_2, 1));
- WEE_TEST_STR("", irc_protocol_string_params (params_2, 2));
+ WEE_TEST_STR("param1 param2", irc_protocol_string_params (params_2, 0, 1));
+ WEE_TEST_STR("param2", irc_protocol_string_params (params_2, 1, 1));
+ WEE_TEST_STR("", irc_protocol_string_params (params_2, 2, 2));
/* three parameters */
- WEE_TEST_STR("param1 param2 param3", irc_protocol_string_params (params_3, 0));
- WEE_TEST_STR("param2 param3", irc_protocol_string_params (params_3, 1));
- WEE_TEST_STR("param3", irc_protocol_string_params (params_3, 2));
- WEE_TEST_STR("", irc_protocol_string_params (params_3, 3));
+ WEE_TEST_STR("param1 param2 param3", irc_protocol_string_params (params_3, 0, 2));
+ WEE_TEST_STR("param2 param3", irc_protocol_string_params (params_3, 1, 2));
+ WEE_TEST_STR("param2", irc_protocol_string_params (params_3, 1, 1));
+ WEE_TEST_STR("param3", irc_protocol_string_params (params_3, 2, 2));
+ WEE_TEST_STR("", irc_protocol_string_params (params_3, 3, 3));
}
TEST_GROUP(IrcProtocolWithServer)