1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-05 09:13:14 +02:00

Fixed many crashes with DCC chat

This commit is contained in:
Sebastien Helleu
2006-04-15 16:47:43 +00:00
parent b34bb801dc
commit 2fd53dcc37
52 changed files with 7470 additions and 7270 deletions
+177 -49
View File
@@ -86,6 +86,12 @@ t_weechat_command weechat_commands[] =
N_("[servername]"),
N_("servername: server name to disconnect"),
"%S", 0, 1, weechat_cmd_disconnect, NULL },
{ "dcc", N_("starts DCC (file or chat) or close chat"),
N_("action [nickname [file]]"),
N_(" action: 'send' (file) or 'chat' or 'close' (chat)\n"
"nickname: nickname to send file or chat\n"
" file: filename (on local host)"),
"chat|send|close %n %f", 1, MAX_ARGS, NULL, weechat_cmd_dcc },
{ "debug", N_("print debug messages"),
N_("dump | windows"),
N_(" dump: save memory dump in WeeChat log file (same dump is written when WeeChat crashes)\n"
@@ -902,6 +908,17 @@ exec_weechat_command (t_irc_server *server, t_irc_channel *channel, char *string
free (command);
return 0;
}
if (channel && channel->dcc_chat)
{
irc_display_prefix (server, channel->buffer, PREFIX_ERROR);
gui_printf (channel->buffer,
_("%s command \"%s\" can not be "
"executed on DCC CHAT buffer\n"),
WEECHAT_ERROR,
irc_commands[i].command_name);
free (command);
return 0;
}
if (irc_commands[i].cmd_function_args)
return_code = (int) (irc_commands[i].cmd_function_args)
(server, channel, argc, argv);
@@ -942,7 +959,7 @@ user_command (t_irc_server *server, t_irc_channel *channel, char *command, int o
{
t_gui_buffer *buffer;
t_irc_nick *ptr_nick;
int plugin_args_length;
int plugin_args_length, text_sent;
char *command_with_colors, *command_encoded, *command_with_colors2;
char *plugin_args;
@@ -968,11 +985,22 @@ user_command (t_irc_server *server, t_irc_channel *channel, char *command, int o
command_encoded = channel_iconv_encode (server, channel,
(command_with_colors) ? command_with_colors : command);
text_sent = 1;
if (CHANNEL(buffer)->dcc_chat)
dcc_chat_sendf ((t_irc_dcc *)(CHANNEL(buffer)->dcc_chat),
"%s\r\n",
(command_encoded) ? command_encoded :
((command_with_colors) ? command_with_colors : command));
{
if (((t_irc_dcc *)(CHANNEL(buffer)->dcc_chat))->sock < 0)
{
irc_display_prefix (server, buffer, PREFIX_ERROR);
gui_printf_nolog (buffer, "%s DCC CHAT is closed\n",
WEECHAT_ERROR);
text_sent = 0;
}
else
dcc_chat_sendf ((t_irc_dcc *)(CHANNEL(buffer)->dcc_chat),
"%s\r\n",
(command_encoded) ? command_encoded :
((command_with_colors) ? command_with_colors : command));
}
else
server_sendf (server, "PRIVMSG %s :%s\r\n",
CHANNEL(buffer)->name,
@@ -981,25 +1009,14 @@ user_command (t_irc_server *server, t_irc_channel *channel, char *command, int o
command_with_colors2 = (command_with_colors) ?
(char *)gui_color_decode ((unsigned char *)command_with_colors, 1) : NULL;
if (CHANNEL(buffer)->type == CHANNEL_TYPE_PRIVATE)
if (text_sent)
{
irc_display_nick (buffer, NULL, server->nick,
MSG_TYPE_NICK, 1, COLOR_WIN_NICK_SELF, 0);
gui_printf_type (buffer,
MSG_TYPE_MSG,
"%s%s\n",
GUI_COLOR(COLOR_WIN_CHAT),
(command_with_colors2) ?
command_with_colors2 : command);
}
else
{
ptr_nick = nick_search (CHANNEL(buffer), server->nick);
if (ptr_nick)
if ((CHANNEL(buffer)->type == CHANNEL_TYPE_PRIVATE)
|| (CHANNEL(buffer)->type == CHANNEL_TYPE_DCC_CHAT))
{
irc_display_nick (buffer, ptr_nick, NULL,
MSG_TYPE_NICK, 1, -1, 0);
irc_display_nick (buffer, NULL, server->nick,
MSG_TYPE_NICK, 1, COLOR_WIN_NICK_SELF, 0);
gui_printf_type (buffer,
MSG_TYPE_MSG,
"%s%s\n",
@@ -1009,10 +1026,25 @@ user_command (t_irc_server *server, t_irc_channel *channel, char *command, int o
}
else
{
irc_display_prefix (server, server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s cannot find nick for sending message\n"),
WEECHAT_ERROR);
ptr_nick = nick_search (CHANNEL(buffer), server->nick);
if (ptr_nick)
{
irc_display_nick (buffer, ptr_nick, NULL,
MSG_TYPE_NICK, 1, -1, 0);
gui_printf_type (buffer,
MSG_TYPE_MSG,
"%s%s\n",
GUI_COLOR(COLOR_WIN_CHAT),
(command_with_colors2) ?
command_with_colors2 : command);
}
else
{
irc_display_prefix (server, server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s cannot find nick for sending message\n"),
WEECHAT_ERROR);
}
}
}
@@ -1343,32 +1375,44 @@ weechat_cmd_buffer (t_irc_server *server, t_irc_channel *channel,
}
else
{
if (SERVER(buffer))
if (CHANNEL(buffer)
&& (CHANNEL(buffer)->type == CHANNEL_TYPE_DCC_CHAT))
{
if (SERVER(buffer)->is_connected
&& CHANNEL(buffer)
&& CHANNEL(buffer)->nicks)
{
pos = strstr (arguments, "close ");
if (pos)
pos += 6;
CHANNEL(buffer)->close = 1;
irc_cmd_send_part (SERVER(buffer),
CHANNEL(buffer),
pos);
}
else
{
ptr_channel = channel_search (SERVER(buffer),
CHANNEL(buffer)->name);
if (ptr_channel)
channel_free (SERVER(buffer),
ptr_channel);
gui_buffer_free (buffer, 1);
}
ptr_channel = CHANNEL(buffer);
gui_buffer_free (ptr_channel->buffer, 1);
channel_free (SERVER(buffer), ptr_channel);
gui_draw_buffer_status (buffer, 1);
gui_draw_buffer_input (buffer, 1);
}
else
gui_buffer_free (buffer, 1);
{
if (SERVER(buffer))
{
if (SERVER(buffer)->is_connected
&& CHANNEL(buffer)
&& CHANNEL(buffer)->nicks)
{
pos = strstr (arguments, "close ");
if (pos)
pos += 6;
CHANNEL(buffer)->close = 1;
irc_cmd_send_part (SERVER(buffer),
CHANNEL(buffer),
pos);
}
else
{
ptr_channel = channel_search_any (SERVER(buffer),
CHANNEL(buffer)->name);
if (ptr_channel)
channel_free (SERVER(buffer),
ptr_channel);
gui_buffer_free (buffer, 1);
}
}
else
gui_buffer_free (buffer, 1);
}
}
gui_draw_buffer_status (buffer, 1);
}
@@ -1847,6 +1891,90 @@ weechat_cmd_connect (t_irc_server *server, t_irc_channel *channel,
return 0;
}
/*
* weechat_cmd_dcc: DCC control (file or chat)
*/
int
weechat_cmd_dcc (t_irc_server *server, t_irc_channel *channel,
char *arguments)
{
t_gui_buffer *buffer;
char *pos_nick, *pos_file;
irc_find_context (server, channel, NULL, &buffer);
/* DCC SEND file */
if (strncasecmp (arguments, "send", 4) == 0)
{
pos_nick = strchr (arguments, ' ');
if (!pos_nick)
{
irc_display_prefix (NULL, server->buffer, PREFIX_ERROR);
gui_printf_nolog (server->buffer,
_("%s wrong argument count for \"%s\" command\n"),
WEECHAT_ERROR, "dcc send");
return -1;
}
while (pos_nick[0] == ' ')
pos_nick++;
pos_file = strchr (pos_nick, ' ');
if (!pos_file)
{
irc_display_prefix (NULL, server->buffer, PREFIX_ERROR);
gui_printf_nolog (server->buffer,
_("%s wrong argument count for \"%s\" command\n"),
WEECHAT_ERROR, "dcc send");
return -1;
}
pos_file[0] = '\0';
pos_file++;
while (pos_file[0] == ' ')
pos_file++;
dcc_send_request (server, DCC_FILE_SEND, pos_nick, pos_file);
}
/* DCC CHAT */
else if (strncasecmp (arguments, "chat", 4) == 0)
{
pos_nick = strchr (arguments, ' ');
if (!pos_nick)
{
irc_display_prefix (NULL, server->buffer, PREFIX_ERROR);
gui_printf_nolog (server->buffer,
_("%s wrong argument count for \"%s\" command\n"),
WEECHAT_ERROR, "dcc chat");
return -1;
}
while (pos_nick[0] == ' ')
pos_nick++;
dcc_send_request (server, DCC_CHAT_SEND, pos_nick, NULL);
}
/* close DCC CHAT */
else if (ascii_strcasecmp (arguments, "close") == 0)
{
if (BUFFER_IS_PRIVATE(buffer) &&
CHANNEL(buffer)->dcc_chat)
{
dcc_close ((t_irc_dcc *)(CHANNEL(buffer)->dcc_chat), DCC_ABORTED);
dcc_redraw (1);
}
}
/* unknown DCC action */
else
{
irc_display_prefix (NULL, server->buffer, PREFIX_ERROR);
gui_printf_nolog (server->buffer,
_("%s wrong arguments for \"%s\" command\n"),
WEECHAT_ERROR, "dcc");
return -1;
}
return 0;
}
/*
* weechat_cmd_debug_display_windows: display tree of windows
*/