updates.
authorPekka Riikonen <priikone@silcnet.org>
Fri, 25 May 2001 16:30:47 +0000 (16:30 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Fri, 25 May 2001 16:30:47 +0000 (16:30 +0000)
CHANGES
apps/irssi/config
apps/irssi/src/silc/core/silc-channels.c
apps/irssi/src/silc/core/silc-core.c
apps/irssi/src/silc/core/silc-servers.c
lib/silcclient/command.c
lib/silccore/silcchannel.c

diff --git a/CHANGES b/CHANGES
index 11a70cf5d668462e92040b1c4d9cc441896cb210..be2ab6e5d246e880480ae5083f433d5a0be41050 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -16,6 +16,9 @@ Fri May 25 14:38:38 EEST 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
 
        * 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 <priikone@poseidon.pspt.fi>
 
        * Imported a modified version of Irssi client to the source tree.
index ccdd759913c4687e003574740b3bc9305bc6e533..0d21cd5dbdd6cae81da1f0e9e2d2840c315b282c 100644 (file)
@@ -22,6 +22,7 @@ aliases = {
   HOST = "userhost";
   LAST = "lastlog";
   SAY = "msg *";
+  WHO = "users *";
   WI = "whois";
   WII = "whois $0 $0";
   WW = "whowas";
index f57ff33cf9a9980adc48569088bc3f65ed516dbb..dfa58a3188abc2a41bb400de25ad50ade00a9371 100644 (file)
@@ -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();
 }
index 56eee03e991d21a737128831723e61888f5b490c..10866c51c3c382f158fb14fc7a2a26cdfec2ff6f 100644 (file)
@@ -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 ? "[<unknown>]" : 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 ? "[<unknown>]" : 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)
index 91733413b26197a384394a634b650fc45f512e21..062b6049fb221fc66095b5e939a0160a002d3018 100644 (file)
@@ -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)
index 7d66a101c0c73eed1cc01a64d58abf12b9237c82..b3d8e4f68c0342d469aefdf601a67e46ab30b1f8 100644 (file)
@@ -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);
   }
 }
index ca783cc6da02eecf6471a02aab396878b3860db6..c6a9d36c187e3584c7c1009e3df8a42f3fbb41fb 100644 (file)
@@ -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;
   }