From: Pekka Riikonen Date: Fri, 25 May 2001 16:30:47 +0000 (+0000) Subject: updates. X-Git-Tag: robodoc-323~290 X-Git-Url: http://git.silc.fi/gitweb/?a=commitdiff_plain;h=a1cf1b95af413bf7a5aafb4b8f8d676e01a3a6a6;p=silc.git updates. --- diff --git a/CHANGES b/CHANGES index 11a70cf5..be2ab6e5 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,9 @@ Fri May 25 14:38:38 EEST 2001 Pekka Riikonen * Fixed TOPIC command sending in the client library. + * Fixed a memory leak in silc_client_command_free in the file + lib/silcclient/command.c. + Thu May 24 19:08:55 EEST 2001 Pekka Riikonen * Imported a modified version of Irssi client to the source tree. diff --git a/apps/irssi/config b/apps/irssi/config index ccdd7599..0d21cd5d 100644 --- a/apps/irssi/config +++ b/apps/irssi/config @@ -22,6 +22,7 @@ aliases = { HOST = "userhost"; LAST = "lastlog"; SAY = "msg *"; + WHO = "users *"; WI = "whois"; WII = "whois $0 $0"; WW = "whowas"; diff --git a/apps/irssi/src/silc/core/silc-channels.c b/apps/irssi/src/silc/core/silc-channels.c index f57ff33c..dfa58a31 100644 --- a/apps/irssi/src/silc/core/silc-channels.c +++ b/apps/irssi/src/silc/core/silc-channels.c @@ -394,13 +394,15 @@ static void event_ban(SILC_SERVER_REC *server, va_list va) } +/* PART (LEAVE) command. */ + static void command_part(const char *data, SILC_SERVER_REC *server, WI_ITEM_REC *item) { SILC_CHANNEL_REC *chanrec; if (!IS_SILC_SERVER(server) || !server->connected) - return; + cmd_return_error(CMDERR_NOT_CONNECTED); if (*data == '\0') { if (!IS_SILC_CHANNEL(item)) @@ -421,6 +423,92 @@ static void command_part(const char *data, SILC_SERVER_REC *server, channel_destroy(CHANNEL(chanrec)); } +/* ME local command. */ + +static void command_me(const char *data, SILC_SERVER_REC *server, + WI_ITEM_REC *item) +{ + SILC_CHANNEL_REC *chanrec; + char *tmpcmd = "ME", *tmp; + uint32 argc = 0; + unsigned char **argv; + uint32 *argv_lens, *argv_types; + int i; + + if (!IS_SILC_SERVER(server) || !server->connected) + cmd_return_error(CMDERR_NOT_CONNECTED); + + if (!IS_SILC_CHANNEL(item)) + cmd_return_error(CMDERR_NOT_JOINED); + + /* Now parse all arguments */ + tmp = g_strconcat(tmpcmd, " ", data, NULL); + silc_parse_command_line(tmp, &argv, &argv_lens, + &argv_types, &argc, 2); + g_free(tmp); + + if (argc < 2) + cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); + + chanrec = silc_channel_find(server, item->name); + if (chanrec == NULL) + cmd_return_error(CMDERR_CHAN_NOT_FOUND); + + /* Send the action message */ + silc_client_send_channel_message(silc_client, server->conn, + chanrec->entry, NULL, + SILC_MESSAGE_FLAG_ACTION, + argv[1], argv_lens[1], TRUE); + + for (i = 0; i < argc; i++) + silc_free(argv[i]); + silc_free(argv_lens); + silc_free(argv_types); +} + +/* NOTICE local command. */ + +static void command_notice(const char *data, SILC_SERVER_REC *server, + WI_ITEM_REC *item) +{ + SILC_CHANNEL_REC *chanrec; + char *tmpcmd = "ME", *tmp; + uint32 argc = 0; + unsigned char **argv; + uint32 *argv_lens, *argv_types; + int i; + + if (!IS_SILC_SERVER(server) || !server->connected) + cmd_return_error(CMDERR_NOT_CONNECTED); + + if (!IS_SILC_CHANNEL(item)) + cmd_return_error(CMDERR_NOT_JOINED); + + /* Now parse all arguments */ + tmp = g_strconcat(tmpcmd, " ", data, NULL); + silc_parse_command_line(tmp, &argv, &argv_lens, + &argv_types, &argc, 2); + g_free(tmp); + + if (argc < 2) + cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); + + chanrec = silc_channel_find(server, item->name); + if (chanrec == NULL) + cmd_return_error(CMDERR_CHAN_NOT_FOUND); + + /* Send the action message */ + silc_client_send_channel_message(silc_client, server->conn, + chanrec->entry, NULL, + SILC_MESSAGE_FLAG_NOTICE, + argv[1], argv_lens[1], TRUE); + + for (i = 0; i < argc; i++) + silc_free(argv[i]); + silc_free(argv_lens); + silc_free(argv_types); +} + void silc_channels_init(void) { signal_add("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed); @@ -442,6 +530,8 @@ void silc_channels_init(void) signal_add("silc event ban", (SIGNAL_FUNC) event_ban); command_bind("part", MODULE_NAME, (SIGNAL_FUNC) command_part); + command_bind("me", MODULE_NAME, (SIGNAL_FUNC) command_me); + command_bind("notice", MODULE_NAME, (SIGNAL_FUNC) command_notice); silc_nicklist_init(); } @@ -469,6 +559,8 @@ void silc_channels_deinit(void) signal_remove("silc event ban", (SIGNAL_FUNC) event_ban); command_unbind("part", (SIGNAL_FUNC) command_part); + command_unbind("me", (SIGNAL_FUNC) command_me); + command_unbind("notice", (SIGNAL_FUNC) command_notice); silc_nicklist_deinit(); } diff --git a/apps/irssi/src/silc/core/silc-core.c b/apps/irssi/src/silc/core/silc-core.c index 56eee03e..10866c51 100644 --- a/apps/irssi/src/silc/core/silc-core.c +++ b/apps/irssi/src/silc/core/silc-core.c @@ -158,10 +158,16 @@ silc_channel_message(SilcClient client, SilcClientConnection conn, chanrec = silc_channel_find_entry(server, channel); nick = silc_nicklist_find(chanrec, sender); - signal_emit("message public", 6, server, msg, - nick == NULL ? "[]" : nick->nick, - nick == NULL ? NULL : nick->host, - chanrec->name, nick); + + if (flags & SILC_MESSAGE_FLAG_ACTION) + ; + else if (flags & SILC_MESSAGE_FLAG_NOTICE) + ; + else + signal_emit("message public", 6, server, msg, + nick == NULL ? "[]" : nick->nick, + nick == NULL ? NULL : nick->host, + chanrec->name, nick); } /* Private message to the client. The `sender' is the nickname of the @@ -347,179 +353,179 @@ silc_command_reply(SilcClient client, SilcClientConnection conn, va_start(vp, status); switch(command) { - case SILC_COMMAND_WHOIS: - { - char buf[1024], *nickname, *username, *realname; - int len; - uint32 idle, mode; - SilcBuffer channels; - - /* XXX should use irssi routines */ - - if (status == SILC_STATUS_ERR_NO_SUCH_NICK || - status == SILC_STATUS_ERR_NO_SUCH_CLIENT_ID) { - char *tmp; - tmp = silc_argument_get_arg_type(silc_command_get_args(cmd_payload), - 3, NULL); - if (tmp) - client->ops->say(client, conn, "%s: %s", tmp, - silc_client_command_status_message(status)); - else - client->ops->say(client, conn, "%s", - silc_client_command_status_message(status)); - break; - } - - if (!success) - return; - - (void)va_arg(vp, SilcClientEntry); - nickname = va_arg(vp, char *); - username = va_arg(vp, char *); - realname = va_arg(vp, char *); - channels = va_arg(vp, SilcBuffer); - mode = va_arg(vp, uint32); - idle = va_arg(vp, uint32); - - memset(buf, 0, sizeof(buf)); - - if (nickname) { - len = strlen(nickname); - strncat(buf, nickname, len); - strncat(buf, " is ", 4); - } + case SILC_COMMAND_WHOIS: + { + char buf[1024], *nickname, *username, *realname; + int len; + uint32 idle, mode; + SilcBuffer channels; + + /* XXX should use irssi routines */ + + if (status == SILC_STATUS_ERR_NO_SUCH_NICK || + status == SILC_STATUS_ERR_NO_SUCH_CLIENT_ID) { + char *tmp; + tmp = silc_argument_get_arg_type(silc_command_get_args(cmd_payload), + 3, NULL); + if (tmp) + client->ops->say(client, conn, "%s: %s", tmp, + silc_client_command_status_message(status)); + else + client->ops->say(client, conn, "%s", + silc_client_command_status_message(status)); + break; + } + + if (!success) + return; + + (void)va_arg(vp, SilcClientEntry); + nickname = va_arg(vp, char *); + username = va_arg(vp, char *); + realname = va_arg(vp, char *); + channels = va_arg(vp, SilcBuffer); + mode = va_arg(vp, uint32); + idle = va_arg(vp, uint32); + + memset(buf, 0, sizeof(buf)); + + if (nickname) { + len = strlen(nickname); + strncat(buf, nickname, len); + strncat(buf, " is ", 4); + } - if (username) { - strncat(buf, username, strlen(username)); - } + if (username) { + strncat(buf, username, strlen(username)); + } - if (realname) { - strncat(buf, " (", 2); - strncat(buf, realname, strlen(realname)); - strncat(buf, ")", 1); - } - - client->ops->say(client, conn, "%s", buf); - - if (channels) { - SilcDList list = silc_channel_payload_parse_list(channels); - if (list) { - SilcChannelPayload entry; - - memset(buf, 0, sizeof(buf)); - strcat(buf, "on channels: "); - - silc_dlist_start(list); - while ((entry = silc_dlist_get(list)) != SILC_LIST_END) { - char *m = silc_client_chumode_char(silc_channel_get_mode(entry)); - uint32 name_len; - char *name = silc_channel_get_name(entry, &name_len); - - if (m) - strncat(buf, m, strlen(m)); - strncat(buf, name, name_len); - strncat(buf, " ", 1); - silc_free(m); - } - - client->ops->say(client, conn, "%s", buf); - silc_channel_payload_list_free(list); + if (realname) { + strncat(buf, " (", 2); + strncat(buf, realname, strlen(realname)); + strncat(buf, ")", 1); + } + + client->ops->say(client, conn, "%s", buf); + + if (channels) { + SilcDList list = silc_channel_payload_parse_list(channels); + if (list) { + SilcChannelPayload entry; + + memset(buf, 0, sizeof(buf)); + strcat(buf, "on channels: "); + + silc_dlist_start(list); + while ((entry = silc_dlist_get(list)) != SILC_LIST_END) { + char *m = silc_client_chumode_char(silc_channel_get_mode(entry)); + uint32 name_len; + char *name = silc_channel_get_name(entry, &name_len); + + if (m) + strncat(buf, m, strlen(m)); + strncat(buf, name, name_len); + strncat(buf, " ", 1); + silc_free(m); } - } - if (mode) { - if ((mode & SILC_UMODE_SERVER_OPERATOR) || - (mode & SILC_UMODE_ROUTER_OPERATOR)) - client->ops->say(client, conn, "%s is %s", nickname, - (mode & SILC_UMODE_SERVER_OPERATOR) ? - "Server Operator" : - (mode & SILC_UMODE_ROUTER_OPERATOR) ? - "SILC Operator" : "[Unknown mode]"); - - if (mode & SILC_UMODE_GONE) - client->ops->say(client, conn, "%s is gone", nickname); + client->ops->say(client, conn, "%s", buf); + silc_channel_payload_list_free(list); } - - if (idle && nickname) - client->ops->say(client, conn, "%s has been idle %d %s", - nickname, - idle > 60 ? (idle / 60) : idle, - idle > 60 ? "minutes" : "seconds"); } - break; - - case SILC_COMMAND_WHOWAS: - { - char buf[1024], *nickname, *username, *realname; - int len; - - /* XXX should use irssi routines */ - - if (status == SILC_STATUS_ERR_NO_SUCH_NICK || - status == SILC_STATUS_ERR_NO_SUCH_CLIENT_ID) { - char *tmp; - tmp = silc_argument_get_arg_type(silc_command_get_args(cmd_payload), - 3, NULL); - if (tmp) - client->ops->say(client, conn, "%s: %s", tmp, - silc_client_command_status_message(status)); - else - client->ops->say(client, conn, "%s", - silc_client_command_status_message(status)); - break; - } - - if (!success) - return; - - (void)va_arg(vp, SilcClientEntry); - nickname = va_arg(vp, char *); - username = va_arg(vp, char *); - realname = va_arg(vp, char *); - - memset(buf, 0, sizeof(buf)); - - if (nickname) { - len = strlen(nickname); - strncat(buf, nickname, len); - strncat(buf, " was ", 5); - } - - if (username) { - strncat(buf, username, strlen(nickname)); - } + + if (mode) { + if ((mode & SILC_UMODE_SERVER_OPERATOR) || + (mode & SILC_UMODE_ROUTER_OPERATOR)) + client->ops->say(client, conn, "%s is %s", nickname, + (mode & SILC_UMODE_SERVER_OPERATOR) ? + "Server Operator" : + (mode & SILC_UMODE_ROUTER_OPERATOR) ? + "SILC Operator" : "[Unknown mode]"); - if (realname) { - strncat(buf, " (", 2); - strncat(buf, realname, strlen(realname)); - strncat(buf, ")", 1); - } - - client->ops->say(client, conn, "%s", buf); + if (mode & SILC_UMODE_GONE) + client->ops->say(client, conn, "%s is gone", nickname); } - break; - - case SILC_COMMAND_INVITE: - { - SilcChannelEntry channel; - char *invite_list; - - if (!success) - return; - - /* XXX should use irssi routines */ - - channel = va_arg(vp, SilcChannelEntry); - invite_list = va_arg(vp, char *); - - if (invite_list) - silc_say(client, conn, "%s invite list: %s", channel->channel_name, - invite_list); + + if (idle && nickname) + client->ops->say(client, conn, "%s has been idle %d %s", + nickname, + idle > 60 ? (idle / 60) : idle, + idle > 60 ? "minutes" : "seconds"); + } + break; + + case SILC_COMMAND_WHOWAS: + { + char buf[1024], *nickname, *username, *realname; + int len; + + /* XXX should use irssi routines */ + + if (status == SILC_STATUS_ERR_NO_SUCH_NICK || + status == SILC_STATUS_ERR_NO_SUCH_CLIENT_ID) { + char *tmp; + tmp = silc_argument_get_arg_type(silc_command_get_args(cmd_payload), + 3, NULL); + if (tmp) + client->ops->say(client, conn, "%s: %s", tmp, + silc_client_command_status_message(status)); else - silc_say(client, conn, "%s invite list not set", - channel->channel_name); + client->ops->say(client, conn, "%s", + silc_client_command_status_message(status)); + break; } - break; + + if (!success) + return; + + (void)va_arg(vp, SilcClientEntry); + nickname = va_arg(vp, char *); + username = va_arg(vp, char *); + realname = va_arg(vp, char *); + + memset(buf, 0, sizeof(buf)); + + if (nickname) { + len = strlen(nickname); + strncat(buf, nickname, len); + strncat(buf, " was ", 5); + } + + if (username) { + strncat(buf, username, strlen(nickname)); + } + + if (realname) { + strncat(buf, " (", 2); + strncat(buf, realname, strlen(realname)); + strncat(buf, ")", 1); + } + + client->ops->say(client, conn, "%s", buf); + } + break; + + case SILC_COMMAND_INVITE: + { + SilcChannelEntry channel; + char *invite_list; + + if (!success) + return; + + /* XXX should use irssi routines */ + + channel = va_arg(vp, SilcChannelEntry); + invite_list = va_arg(vp, char *); + + if (invite_list) + silc_say(client, conn, "%s invite list: %s", channel->channel_name, + invite_list); + else + silc_say(client, conn, "%s invite list not set", + channel->channel_name); + } + break; case SILC_COMMAND_JOIN: { @@ -888,7 +894,7 @@ silc_failure(SilcClient client, SilcClientConnection conn, silc_say_error("Server does not support one of your proposed PKCS"); if (status == SILC_SKE_STATUS_UNKNOWN_HASH_FUNCTION) silc_say_error("Server does not support one of your proposed " - "hash function"); + "hash function"); if (status == SILC_SKE_STATUS_UNKNOWN_HMAC) silc_say_error("Server does not support one of your proposed HMAC"); if (status == SILC_SKE_STATUS_INCORRECT_SIGNATURE) diff --git a/apps/irssi/src/silc/core/silc-servers.c b/apps/irssi/src/silc/core/silc-servers.c index 91733413..062b6049 100644 --- a/apps/irssi/src/silc/core/silc-servers.c +++ b/apps/irssi/src/silc/core/silc-servers.c @@ -235,7 +235,8 @@ void silc_command_exec(SILC_SERVER_REC *server, g_return_if_fail(server != NULL); - tmpcmd = g_strdup(command); g_strup(tmpcmd); + tmpcmd = g_strdup(command); + g_strup(tmpcmd); cmd = silc_client_command_find(tmpcmd); g_free(tmpcmd); if (cmd == NULL) diff --git a/lib/silcclient/command.c b/lib/silcclient/command.c index 7d66a101..b3d8e4f6 100644 --- a/lib/silcclient/command.c +++ b/lib/silcclient/command.c @@ -195,6 +195,8 @@ void silc_client_command_free(SilcClientCommandContext ctx) for (i = 0; i < ctx->argc; i++) silc_free(ctx->argv[i]); + silc_free(ctx->argv_lens); + silc_free(ctx->argv_types); silc_free(ctx); } } diff --git a/lib/silccore/silcchannel.c b/lib/silccore/silcchannel.c index ca783cc6..c6a9d36c 100644 --- a/lib/silccore/silcchannel.c +++ b/lib/silccore/silcchannel.c @@ -307,7 +307,7 @@ silc_channel_message_payload_parse(SilcBuffer buffer, goto err; if (new->data_len < 1 || new->data_len > buffer->len) { - SILC_LOG_ERROR(("Incorrect channel messaeg payload in packet, " + SILC_LOG_ERROR(("Incorrect channel message payload in packet, " "packet dropped")); goto err; }