updates
authorPekka Riikonen <priikone@silcnet.org>
Fri, 19 Apr 2002 11:29:06 +0000 (11:29 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Fri, 19 Apr 2002 11:29:06 +0000 (11:29 +0000)
CHANGES
TODO
apps/irssi/src/silc/core/client_ops.c
apps/irssi/src/silc/core/client_ops.h
lib/silcclient/client_ops_example.c
lib/silcclient/command.c
lib/silcclient/silcclient.h

diff --git a/CHANGES b/CHANGES
index cfce68d85784ab3a52e1e6142024c4a51f84506d..5f7ed21c8119e357e4b95934586aa8ac7afed30d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,13 @@ Fri Apr 19 09:02:20 CEST 2002  Pekka Riikonen <priikone@silcnet.org>
           client for now.  Protocol TODO #20.  Affected files are
           lib/silccore/silcstatus.h, lib/silccore/silccommand.h.
 
           client for now.  Protocol TODO #20.  Affected files are
           lib/silccore/silcstatus.h, lib/silccore/silccommand.h.
 
+       * Added SilcStatus argument to `command' client operation
+         to return the error status when command sending fails
+         locally.  Changed all command in client library to return
+         correct command status.  Affected files are
+         lib/silcclient/command.c, lib/silcclient/silcclient.h and
+         irssi/src/silc/core/client_ops.c.
+
 Thu Apr 18 14:09:51 CEST 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * Added silc_mime_parse function to parse MIME headers.
 Thu Apr 18 14:09:51 CEST 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * Added silc_mime_parse function to parse MIME headers.
diff --git a/TODO b/TODO
index e93daa8d761a583051ecd1b8e5cedc5d98a7bfb0..314939a08f346d823c0dcbc30a9485c9994a5d6e 100644 (file)
--- a/TODO
+++ b/TODO
@@ -14,9 +14,6 @@ TODO/bugs In SILC Client Library
    set the key only if application wishes to set (accept the key) it
    (Do this to 1.0).
 
    set the key only if application wishes to set (accept the key) it
    (Do this to 1.0).
 
- o Add SilcStatus to `command' client operation and return common
-   error statuses to the client operation.
-
  o Remove conn->current_channel.
 
  o Additions to do after protocol version 1.1:
  o Remove conn->current_channel.
 
  o Additions to do after protocol version 1.1:
index d2807c47ce8ea7b5b9320999b24a282f60641a9e..6df6da378b7971ff3595c7dd2ce7da8a0d531dfe 100644 (file)
@@ -162,6 +162,30 @@ void silc_private_message(SilcClient client, SilcClientConnection conn,
   if (sender->username)
     snprintf(userhost, sizeof(userhost) - 1, "%s@%s",
             sender->username, sender->hostname);
   if (sender->username)
     snprintf(userhost, sizeof(userhost) - 1, "%s@%s",
             sender->username, sender->hostname);
+
+  if (flags & SILC_MESSAGE_FLAG_DATA) {
+    /* MIME object received, try to display it as well as we can */
+    char type[128];
+    unsigned char *data;
+
+    memset(type, 0, sizeof(type));
+    if (!silc_mime_parse(message, message_len, NULL, 0, type, sizeof(type) - 1,
+                        NULL, 0, &data, NULL))
+      return;
+
+    /* Then figure out what we can display */
+    if (strstr(type, "text/") && !strstr(type, "text/t140") &&
+       !strstr(type, "text/vnd")) {
+      /* It is something textual, display it */
+      message = (const unsigned char *)data;
+    } else {
+      message = NULL;
+    }
+  }
+
+  if (!message)
+    return;
+
   signal_emit("message private", 4, server, message,
              sender->nickname ? sender->nickname : "[<unknown>]",
              sender->username ? userhost : NULL);
   signal_emit("message private", 4, server, message,
              sender->nickname ? sender->nickname : "[<unknown>]",
              sender->username ? userhost : NULL);
@@ -740,8 +764,8 @@ void silc_disconnect(SilcClient client, SilcClientConnection conn)
    that the command really was processed. */
 
 void silc_command(SilcClient client, SilcClientConnection conn, 
    that the command really was processed. */
 
 void silc_command(SilcClient client, SilcClientConnection conn, 
-                 SilcClientCommandContext cmd_context, int success,
-                 SilcCommand command)
+                 SilcClientCommandContext cmd_context, bool success,
+                 SilcCommand command, SilcStatus status)
 {
   SILC_SERVER_REC *server = conn->context;
 
 {
   SILC_SERVER_REC *server = conn->context;
 
@@ -873,7 +897,7 @@ void silc_getkey_cb(bool success, void *context)
 
 void 
 silc_command_reply(SilcClient client, SilcClientConnection conn,
 
 void 
 silc_command_reply(SilcClient client, SilcClientConnection conn,
-                  SilcCommandPayload cmd_payload, int success,
+                  SilcCommandPayload cmd_payload, bool success,
                   SilcCommand command, SilcStatus status, ...)
 
 {
                   SilcCommand command, SilcStatus status, ...)
 
 {
index f76eae13f3d07183e3276db566e53b8a15d1bb69..6a7eaef7d82ddff2a0d123615e8732e7c872bf60 100644 (file)
@@ -38,10 +38,10 @@ void silc_private_message(SilcClient client, SilcClientConnection conn,
 void silc_notify(SilcClient client, SilcClientConnection conn, 
                 SilcNotifyType type, ...);
 void silc_command(SilcClient client, SilcClientConnection conn, 
 void silc_notify(SilcClient client, SilcClientConnection conn, 
                 SilcNotifyType type, ...);
 void silc_command(SilcClient client, SilcClientConnection conn, 
-                 SilcClientCommandContext cmd_context, int success,
-                 SilcCommand command);
+                 SilcClientCommandContext cmd_context, bool success,
+                 SilcCommand command, SilcStatus status);
 void silc_command_reply(SilcClient client, SilcClientConnection conn,
 void silc_command_reply(SilcClient client, SilcClientConnection conn,
-                       SilcCommandPayload cmd_payload, int success,
+                       SilcCommandPayload cmd_payload, bool success,
                        SilcCommand command, SilcStatus status, ...);
 void silc_connect(SilcClient client, SilcClientConnection conn,
                  SilcClientConnectionStatus status);
                        SilcCommand command, SilcStatus status, ...);
 void silc_connect(SilcClient client, SilcClientConnection conn,
                  SilcClientConnectionStatus status);
index 66014b89157a4a03c675074941b65cc95eda02be..d7d922351a335562003f7d043bbfdeb201bae07c 100644 (file)
@@ -77,8 +77,8 @@ silc_notify(SilcClient client, SilcClientConnection conn,
 
 static void
 silc_command(SilcClient client, SilcClientConnection conn,
 
 static void
 silc_command(SilcClient client, SilcClientConnection conn,
-            SilcClientCommandContext cmd_context, int success,
-            SilcCommand command)
+            SilcClientCommandContext cmd_context, bool success,
+            SilcCommand command, SilcStatus status)
 {
 
 }
 {
 
 }
@@ -103,7 +103,7 @@ silc_command(SilcClient client, SilcClientConnection conn,
 
 static void
 silc_command_reply(SilcClient client, SilcClientConnection conn,
 
 static void
 silc_command_reply(SilcClient client, SilcClientConnection conn,
-                  SilcCommandPayload cmd_payload, int success,
+                  SilcCommandPayload cmd_payload, bool success,
                   SilcCommand command, SilcStatus status, ...)
 {
 
                   SilcCommand command, SilcStatus status, ...)
 {
 
index 8097b7e7baf722b14820049b49ff2aa70ad793f6..eb9cce3b0a5451d724f79b371f55c409d2956b3e 100644 (file)
           "You are not connected to a server, use /SERVER to connect");
 
 /* Command operation that is called at the end of all commands. 
           "You are not connected to a server, use /SERVER to connect");
 
 /* Command operation that is called at the end of all commands. 
-   Usage: COMMAND; */
-#define COMMAND cmd->client->internal->ops->command(cmd->client, cmd->conn, \
-  cmd, TRUE, cmd->command->cmd)
+   Usage: COMMAND(status); */
+#define COMMAND(status) cmd->client->internal->ops->command(cmd->client, \
+  cmd->conn, cmd, TRUE, cmd->command->cmd, (status))
 
 
-/* Error to application. Usage: COMMAND_ERROR; */
-#define COMMAND_ERROR cmd->client->internal->ops->command(cmd->client, \
-  cmd->conn, cmd, FALSE, cmd->command->cmd)
+/* Error to application. Usage: COMMAND_ERROR(status); */
+#define COMMAND_ERROR(status)                          \
+  cmd->client->internal->ops->command(cmd->client,     \
+  cmd->conn, cmd, FALSE, cmd->command->cmd, (status))
 
 #define SAY cmd->client->internal->ops->say
 
 
 #define SAY cmd->client->internal->ops->say
 
@@ -217,7 +218,7 @@ SILC_CLIENT_CMD_FUNC(whois)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
     goto out;
   }
 
@@ -251,7 +252,7 @@ SILC_CLIENT_CMD_FUNC(whois)
   silc_buffer_free(buffer);
 
   /* Notify application */
   silc_buffer_free(buffer);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -269,14 +270,15 @@ SILC_CLIENT_CMD_FUNC(whowas)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 2 || cmd->argc > 3) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /WHOWAS <nickname>[@<server>] [<count>]");
     goto out;
   }
 
   if (cmd->argc < 2 || cmd->argc > 3) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /WHOWAS <nickname>[@<server>] [<count>]");
-    COMMAND_ERROR;
+    COMMAND_ERROR((cmd->argc < 2 ? SILC_STATUS_ERR_NOT_ENOUGH_PARAMS :
+                  SILC_STATUS_ERR_TOO_MANY_PARAMS));
     goto out;
   }
 
     goto out;
   }
 
@@ -300,7 +302,7 @@ SILC_CLIENT_CMD_FUNC(whowas)
   silc_buffer_free(buffer);
 
   /* Notify application */
   silc_buffer_free(buffer);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -321,6 +323,7 @@ SILC_CLIENT_CMD_FUNC(identify)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
     goto out;
   }
 
@@ -375,9 +378,9 @@ SILC_CLIENT_CMD_FUNC(nick_change)
     silc_client_nickname_format(cmd->client, conn, conn->local_entry);
     silc_idcache_add(conn->client_cache, strdup(cmd->argv[1]), 
                     conn->local_entry->id, conn->local_entry, 0, NULL);
     silc_client_nickname_format(cmd->client, conn, conn->local_entry);
     silc_idcache_add(conn->client_cache, strdup(cmd->argv[1]), 
                     conn->local_entry->id, conn->local_entry, 0, NULL);
-    COMMAND;
+    COMMAND(SILC_STATUS_OK);
   } else {
   } else {
-    COMMAND_ERROR;
+    COMMAND_ERROR(status);
   }
 
   silc_client_command_free(cmd);
   }
 
   silc_client_command_free(cmd);
@@ -394,14 +397,14 @@ SILC_CLIENT_CMD_FUNC(nick)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /NICK <nickname>");
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /NICK <nickname>");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -419,7 +422,7 @@ SILC_CLIENT_CMD_FUNC(nick)
          "Your nickname is %s", conn->nickname);
     }
 
          "Your nickname is %s", conn->nickname);
     }
 
-    COMMAND;
+    COMMAND(SILC_STATUS_OK);
     goto out;
   }
 
     goto out;
   }
 
@@ -462,7 +465,7 @@ SILC_CLIENT_CMD_FUNC(list)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
     goto out;
   }
 
@@ -492,7 +495,7 @@ SILC_CLIENT_CMD_FUNC(list)
     silc_buffer_free(idp);
 
   /* Notify application */
     silc_buffer_free(idp);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -511,14 +514,15 @@ SILC_CLIENT_CMD_FUNC(topic)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 2 || cmd->argc > 3) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO,
        "Usage: /TOPIC <channel> [<topic>]");
     goto out;
   }
 
   if (cmd->argc < 2 || cmd->argc > 3) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO,
        "Usage: /TOPIC <channel> [<topic>]");
-    COMMAND_ERROR;
+    COMMAND_ERROR((cmd->argc < 2 ? SILC_STATUS_ERR_NOT_ENOUGH_PARAMS :
+                  SILC_STATUS_ERR_TOO_MANY_PARAMS));
     goto out;
   }
 
     goto out;
   }
 
@@ -526,7 +530,7 @@ SILC_CLIENT_CMD_FUNC(topic)
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
       goto out;
     }
     name = conn->current_channel->channel_name;
       goto out;
     }
     name = conn->current_channel->channel_name;
@@ -537,7 +541,7 @@ SILC_CLIENT_CMD_FUNC(topic)
   if (!conn->current_channel) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "You are not on that channel");
   if (!conn->current_channel) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "You are not on that channel");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
     goto out;
   }
 
     goto out;
   }
 
@@ -545,7 +549,7 @@ SILC_CLIENT_CMD_FUNC(topic)
   if (!silc_idcache_find_by_name_one(conn->channel_cache, name, &id_cache)) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "You are not on that channel");
   if (!silc_idcache_find_by_name_one(conn->channel_cache, name, &id_cache)) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "You are not on that channel");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
     goto out;
   }
 
     goto out;
   }
 
@@ -569,7 +573,7 @@ SILC_CLIENT_CMD_FUNC(topic)
   silc_buffer_free(idp);
 
   /* Notify application */
   silc_buffer_free(idp);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -592,7 +596,7 @@ SILC_CLIENT_CMD_FUNC(invite)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
     goto out;
   }
 
@@ -600,7 +604,7 @@ SILC_CLIENT_CMD_FUNC(invite)
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO,
        "Usage: /INVITE <channel> [<nickname>[@server>]"
        "[+|-[<nickname>[@<server>[!<username>[@hostname>]]]]]");
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO,
        "Usage: /INVITE <channel> [<nickname>[@server>]"
        "[+|-[<nickname>[@<server>[!<username>[@hostname>]]]]]");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -608,7 +612,7 @@ SILC_CLIENT_CMD_FUNC(invite)
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
       goto out;
     }
 
       goto out;
     }
 
@@ -620,7 +624,7 @@ SILC_CLIENT_CMD_FUNC(invite)
     if (!channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are on that channel");
     if (!channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are on that channel");
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
       goto out;
     }
   }
       goto out;
     }
   }
@@ -638,7 +642,7 @@ SILC_CLIENT_CMD_FUNC(invite)
                                            cmd->argv[2], TRUE);
       if (!client_entry) {
        if (cmd->pending) {
                                            cmd->argv[2], TRUE);
       if (!client_entry) {
        if (cmd->pending) {
-         COMMAND_ERROR;
+         COMMAND_ERROR(SILC_STATUS_ERR_NO_SUCH_NICK);
          goto out;
        }
       
          goto out;
        }
       
@@ -686,7 +690,7 @@ SILC_CLIENT_CMD_FUNC(invite)
   silc_buffer_free(chidp);
 
   /* Notify application */
   silc_buffer_free(chidp);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_free(nickname);
 
  out:
   silc_free(nickname);
@@ -719,7 +723,7 @@ SILC_CLIENT_CMD_FUNC(quit)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
     goto out;
   }
 
@@ -748,7 +752,7 @@ SILC_CLIENT_CMD_FUNC(quit)
                         1, 0, SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
 
   /* Notify application */
                         1, 0, SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -817,14 +821,14 @@ SILC_CLIENT_CMD_FUNC(kill)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /KILL <nickname> [<comment>]");
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /KILL <nickname> [<comment>]");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -839,7 +843,7 @@ SILC_CLIENT_CMD_FUNC(kill)
                                  cmd->argv[1], TRUE);
   if (!target) {
     if (cmd->pending) {
                                  cmd->argv[1], TRUE);
   if (!target) {
     if (cmd->pending) {
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NO_SUCH_NICK);
       goto out;
     }
 
       goto out;
     }
 
@@ -871,7 +875,7 @@ SILC_CLIENT_CMD_FUNC(kill)
   silc_buffer_free(idp);
 
   /* Notify application */
   silc_buffer_free(idp);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
   /* Register a pending callback that will actually remove the killed
      client from our cache. */
 
   /* Register a pending callback that will actually remove the killed
      client from our cache. */
@@ -896,7 +900,7 @@ SILC_CLIENT_CMD_FUNC(info)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
     goto out;
   }
 
@@ -917,7 +921,7 @@ SILC_CLIENT_CMD_FUNC(info)
     silc_free(name);
 
   /* Notify application */
     silc_free(name);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -936,7 +940,7 @@ SILC_CLIENT_CMD_FUNC(ping)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
     goto out;
   }
 
@@ -953,7 +957,7 @@ SILC_CLIENT_CMD_FUNC(ping)
                      SILC_ID_SERVER);
   if (!id) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
                      SILC_ID_SERVER);
   if (!id) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
     goto out;
   }
 
@@ -976,7 +980,7 @@ SILC_CLIENT_CMD_FUNC(ping)
   }
   
   /* Notify application */
   }
   
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -995,12 +999,12 @@ SILC_CLIENT_CMD_FUNC(join)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 2) {
     goto out;
   }
 
   if (cmd->argc < 2) {
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
   
     goto out;
   }
   
@@ -1071,7 +1075,7 @@ SILC_CLIENT_CMD_FUNC(join)
   silc_free(passphrase);
 
   /* Notify application */
   silc_free(passphrase);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -1087,14 +1091,15 @@ SILC_CLIENT_CMD_FUNC(motd)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 1 || cmd->argc > 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO,
        "Usage: /MOTD [<server>]");
     goto out;
   }
 
   if (cmd->argc < 1 || cmd->argc > 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO,
        "Usage: /MOTD [<server>]");
-    COMMAND_ERROR;
+    COMMAND_ERROR((cmd->argc < 1 ? SILC_STATUS_ERR_NOT_ENOUGH_PARAMS :
+                  SILC_STATUS_ERR_TOO_MANY_PARAMS));
     goto out;
   }
 
     goto out;
   }
 
@@ -1112,7 +1117,7 @@ SILC_CLIENT_CMD_FUNC(motd)
   silc_buffer_free(buffer);
 
   /* Notify application */
   silc_buffer_free(buffer);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -1132,14 +1137,14 @@ SILC_CLIENT_CMD_FUNC(umode)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /UMODE +|-<modes>");
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /UMODE +|-<modes>");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -1220,7 +1225,7 @@ SILC_CLIENT_CMD_FUNC(umode)
        mode &= ~SILC_UMODE_BLOCK_PRIVMSG;
       break;
     default:
        mode &= ~SILC_UMODE_BLOCK_PRIVMSG;
       break;
     default:
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_UNKNOWN_MODE);
       goto out;
       break;
     }
       goto out;
       break;
     }
@@ -1241,7 +1246,7 @@ SILC_CLIENT_CMD_FUNC(umode)
   silc_buffer_free(idp);
 
   /* Notify application */
   silc_buffer_free(idp);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -1263,14 +1268,14 @@ SILC_CLIENT_CMD_FUNC(cmode)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 3) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /CMODE <channel> +|-<modes> [{ <arguments>}]");
     goto out;
   }
 
   if (cmd->argc < 3) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /CMODE <channel> +|-<modes> [{ <arguments>}]");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -1278,7 +1283,7 @@ SILC_CLIENT_CMD_FUNC(cmode)
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
       goto out;
     }
 
       goto out;
     }
 
@@ -1290,7 +1295,7 @@ SILC_CLIENT_CMD_FUNC(cmode)
     if (!channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are on that channel");
     if (!channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are on that channel");
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
       goto out;
     }
   }
       goto out;
     }
   }
@@ -1361,7 +1366,7 @@ SILC_CLIENT_CMD_FUNC(cmode)
        if (cmd->argc < 4) {
          SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
              "Usage: /CMODE <channel> +|-<modes> [{ <arguments>}]");
        if (cmd->argc < 4) {
          SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
              "Usage: /CMODE <channel> +|-<modes> [{ <arguments>}]");
-         COMMAND_ERROR;
+         COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
          goto out;
        }
        ll = atoi(cmd->argv[3]);
          goto out;
        }
        ll = atoi(cmd->argv[3]);
@@ -1379,7 +1384,7 @@ SILC_CLIENT_CMD_FUNC(cmode)
        if (cmd->argc < 4) {
          SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
              "Usage: /CMODE <channel> +|-<modes> [{ <arguments>}]");
        if (cmd->argc < 4) {
          SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
              "Usage: /CMODE <channel> +|-<modes> [{ <arguments>}]");
-         COMMAND_ERROR;
+         COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
          goto out;
        }
        arg = cmd->argv[3];
          goto out;
        }
        arg = cmd->argv[3];
@@ -1395,7 +1400,7 @@ SILC_CLIENT_CMD_FUNC(cmode)
        if (cmd->argc < 4) {
          SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
              "Usage: /CMODE <channel> +|-<modes> [{ <arguments>}]");
        if (cmd->argc < 4) {
          SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
              "Usage: /CMODE <channel> +|-<modes> [{ <arguments>}]");
-         COMMAND_ERROR;
+         COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
          goto out;
        }
        arg = cmd->argv[3];
          goto out;
        }
        arg = cmd->argv[3];
@@ -1411,7 +1416,7 @@ SILC_CLIENT_CMD_FUNC(cmode)
        if (cmd->argc < 4) {
          SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
              "Usage: /CMODE <channel> +|-<modes> [{ <arguments>}]");
        if (cmd->argc < 4) {
          SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
              "Usage: /CMODE <channel> +|-<modes> [{ <arguments>}]");
-         COMMAND_ERROR;
+         COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
          goto out;
        }
        arg = cmd->argv[3];
          goto out;
        }
        arg = cmd->argv[3];
@@ -1428,7 +1433,7 @@ SILC_CLIENT_CMD_FUNC(cmode)
        if (cmd->argc < 4) {
          SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
              "Usage: /CMODE <channel> +|-<modes> [{ <arguments>}]");
        if (cmd->argc < 4) {
          SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
              "Usage: /CMODE <channel> +|-<modes> [{ <arguments>}]");
-         COMMAND_ERROR;
+         COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
          goto out;
        }
 
          goto out;
        }
 
@@ -1451,7 +1456,7 @@ SILC_CLIENT_CMD_FUNC(cmode)
       }
       break;
     default:
       }
       break;
     default:
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_UNKNOWN_MODE);
       goto out;
       break;
     }
       goto out;
       break;
     }
@@ -1483,7 +1488,7 @@ SILC_CLIENT_CMD_FUNC(cmode)
     silc_buffer_free(auth);
 
   /* Notify application */
     silc_buffer_free(auth);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -1507,14 +1512,14 @@ SILC_CLIENT_CMD_FUNC(cumode)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 4) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /CUMODE <channel> +|-<modes> <nickname>[@<server>]");
     goto out;
   }
 
   if (cmd->argc < 4) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /CUMODE <channel> +|-<modes> <nickname>[@<server>]");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -1522,7 +1527,7 @@ SILC_CLIENT_CMD_FUNC(cumode)
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
       goto out;
     }
 
       goto out;
     }
 
@@ -1534,7 +1539,7 @@ SILC_CLIENT_CMD_FUNC(cumode)
     if (!channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are on that channel");
     if (!channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are on that channel");
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
       goto out;
     }
   }
       goto out;
     }
   }
@@ -1550,7 +1555,7 @@ SILC_CLIENT_CMD_FUNC(cumode)
                                        cmd->argv[3], TRUE);
   if (!client_entry) {
     if (cmd->pending) {
                                        cmd->argv[3], TRUE);
   if (!client_entry) {
     if (cmd->pending) {
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NO_SUCH_NICK);
       goto out;
     }
 
       goto out;
     }
 
@@ -1622,7 +1627,7 @@ SILC_CLIENT_CMD_FUNC(cumode)
        mode &= ~SILC_CHANNEL_UMODE_BLOCK_MESSAGES;
       break;
     default:
        mode &= ~SILC_CHANNEL_UMODE_BLOCK_MESSAGES;
       break;
     default:
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_UNKNOWN_MODE);
       goto out;
       break;
     }
       goto out;
       break;
     }
@@ -1651,7 +1656,7 @@ SILC_CLIENT_CMD_FUNC(cumode)
     silc_buffer_free(auth);
   
   /* Notify application */
     silc_buffer_free(auth);
   
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_free(nickname);
 
  out:
   silc_free(nickname);
@@ -1674,14 +1679,14 @@ SILC_CLIENT_CMD_FUNC(kick)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 3) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /KICK <channel> <nickname> [<comment>]");
     goto out;
   }
 
   if (cmd->argc < 3) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /KICK <channel> <nickname> [<comment>]");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -1689,7 +1694,7 @@ SILC_CLIENT_CMD_FUNC(kick)
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
       goto out;
     }
     name = conn->current_channel->channel_name;
       goto out;
     }
     name = conn->current_channel->channel_name;
@@ -1700,7 +1705,7 @@ SILC_CLIENT_CMD_FUNC(kick)
   if (!conn->current_channel) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "You are not on that channel");
   if (!conn->current_channel) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "You are not on that channel");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
     goto out;
   }
 
     goto out;
   }
 
@@ -1708,7 +1713,7 @@ SILC_CLIENT_CMD_FUNC(kick)
   if (!silc_idcache_find_by_name_one(conn->channel_cache, name, &id_cache)) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "You are not on that channel");
   if (!silc_idcache_find_by_name_one(conn->channel_cache, name, &id_cache)) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "You are not on that channel");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
     goto out;
   }
 
     goto out;
   }
 
@@ -1726,7 +1731,7 @@ SILC_CLIENT_CMD_FUNC(kick)
   if (!target) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "No such client: %s", cmd->argv[2]);
   if (!target) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "No such client: %s", cmd->argv[2]);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NO_SUCH_NICK);
     goto out;
   }
 
     goto out;
   }
 
@@ -1750,7 +1755,7 @@ SILC_CLIENT_CMD_FUNC(kick)
   silc_buffer_free(idp2);
 
   /* Notify application */
   silc_buffer_free(idp2);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_free(nickname);
 
  out:
   silc_free(nickname);
@@ -1788,7 +1793,7 @@ static void silc_client_command_oper_send(unsigned char *data,
   silc_buffer_free(auth);
 
   /* Notify application */
   silc_buffer_free(auth);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 }
 
 /* OPER command. Used to obtain server operator privileges. */
 }
 
 /* OPER command. Used to obtain server operator privileges. */
@@ -1800,14 +1805,14 @@ SILC_CLIENT_CMD_FUNC(oper)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /OPER <username> [-pubkey]");
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /OPER <username> [-pubkey]");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -1857,7 +1862,7 @@ static void silc_client_command_silcoper_send(unsigned char *data,
   silc_buffer_free(auth);
 
   /* Notify application */
   silc_buffer_free(auth);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 }
 
 /* SILCOPER command. Used to obtain router operator privileges. */
 }
 
 /* SILCOPER command. Used to obtain router operator privileges. */
@@ -1869,14 +1874,14 @@ SILC_CLIENT_CMD_FUNC(silcoper)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /SILCOPER <username> [-pubkey]");
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /SILCOPER <username> [-pubkey]");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -1907,7 +1912,7 @@ SILC_CLIENT_CMD_FUNC(ban)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
     goto out;
   }
 
@@ -1915,7 +1920,7 @@ SILC_CLIENT_CMD_FUNC(ban)
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /BAN <channel> "
        "[+|-[<nickname>[@<server>[!<username>[@hostname>]]]]]");
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /BAN <channel> "
        "[+|-[<nickname>[@<server>[!<username>[@hostname>]]]]]");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -1923,7 +1928,7 @@ SILC_CLIENT_CMD_FUNC(ban)
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
       goto out;
     }
 
       goto out;
     }
 
@@ -1934,8 +1939,8 @@ SILC_CLIENT_CMD_FUNC(ban)
     channel = silc_client_get_channel(cmd->client, conn, name);
     if (!channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
     channel = silc_client_get_channel(cmd->client, conn, name);
     if (!channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
-         "You are on that channel");
-      COMMAND_ERROR;
+         "You are noton that channel");
+      COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
       goto out;
     }
   }
       goto out;
     }
   }
@@ -1963,7 +1968,7 @@ SILC_CLIENT_CMD_FUNC(ban)
   silc_buffer_free(chidp);
 
   /* Notify application */
   silc_buffer_free(chidp);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -1979,7 +1984,7 @@ SILC_CLIENT_CMD_FUNC(detach)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
     goto out;
   }
 
@@ -1990,7 +1995,7 @@ SILC_CLIENT_CMD_FUNC(detach)
   silc_buffer_free(buffer);
 
   /* Notify application */
   silc_buffer_free(buffer);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -2009,14 +2014,14 @@ SILC_CLIENT_CMD_FUNC(leave)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc != 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /LEAVE <channel>");
     goto out;
   }
 
   if (cmd->argc != 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /LEAVE <channel>");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -2024,7 +2029,7 @@ SILC_CLIENT_CMD_FUNC(leave)
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
       goto out;
     }
     name = conn->current_channel->channel_name;
       goto out;
     }
     name = conn->current_channel->channel_name;
@@ -2037,7 +2042,7 @@ SILC_CLIENT_CMD_FUNC(leave)
   if (!channel) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "You are not on that channel");
   if (!channel) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "You are not on that channel");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
     goto out;
   }
 
     goto out;
   }
 
@@ -2059,7 +2064,7 @@ SILC_CLIENT_CMD_FUNC(leave)
   silc_buffer_free(idp);
 
   /* Notify application */
   silc_buffer_free(idp);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
   if (conn->current_channel == channel)
     conn->current_channel = NULL;
 
   if (conn->current_channel == channel)
     conn->current_channel = NULL;
@@ -2082,14 +2087,14 @@ SILC_CLIENT_CMD_FUNC(users)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc != 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /USERS <channel>");
     goto out;
   }
 
   if (cmd->argc != 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /USERS <channel>");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -2097,7 +2102,7 @@ SILC_CLIENT_CMD_FUNC(users)
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
     if (!conn->current_channel) {
       SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
          "You are not on any channel");
-      COMMAND_ERROR;
+      COMMAND_ERROR(SILC_STATUS_ERR_NOT_ON_CHANNEL);
       goto out;
     }
     name = conn->current_channel->channel_name;
       goto out;
     }
     name = conn->current_channel->channel_name;
@@ -2115,7 +2120,7 @@ SILC_CLIENT_CMD_FUNC(users)
   silc_buffer_free(buffer);
 
   /* Notify application */
   silc_buffer_free(buffer);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -2137,14 +2142,14 @@ SILC_CLIENT_CMD_FUNC(getkey)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 2) {
     client->internal->ops->say(client, conn, SILC_CLIENT_MESSAGE_INFO, 
                     "Usage: /GETKEY <nickname or server name>");
     goto out;
   }
 
   if (cmd->argc < 2) {
     client->internal->ops->say(client, conn, SILC_CLIENT_MESSAGE_INFO, 
                     "Usage: /GETKEY <nickname or server name>");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -2205,11 +2210,11 @@ SILC_CLIENT_CMD_FUNC(getkey)
             silc_client_status_message(SILC_STATUS_ERR_NO_SUCH_NICK));
          SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, "%s", 
            silc_client_status_message(error));
             silc_client_status_message(SILC_STATUS_ERR_NO_SUCH_NICK));
          SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, "%s", 
            silc_client_status_message(error));
-         COMMAND_ERROR;
+         COMMAND_ERROR(SILC_STATUS_ERR_NO_SUCH_NICK);
          goto out;
        }
 
          goto out;
        }
 
-       COMMAND_ERROR;
+       COMMAND_ERROR(error);
        goto out;
       }
     }
        goto out;
       }
     }
@@ -2227,7 +2232,7 @@ SILC_CLIENT_CMD_FUNC(getkey)
   silc_buffer_free(idp);
 
   /* Notify application */
   silc_buffer_free(idp);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_free(nickname);
 
  out:
   silc_free(nickname);
@@ -2311,14 +2316,14 @@ SILC_CLIENT_CMD_FUNC(connect)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /CONNECT <server> [<port>]");
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /CONNECT <server> [<port>]");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -2341,7 +2346,7 @@ SILC_CLIENT_CMD_FUNC(connect)
   silc_buffer_free(buffer);
 
   /* Notify application */
   silc_buffer_free(buffer);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -2360,14 +2365,14 @@ SILC_CLIENT_CMD_FUNC(close)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /CLOSE <server> [<port>]");
     goto out;
   }
 
   if (cmd->argc < 2) {
     SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, 
        "Usage: /CLOSE <server> [<port>]");
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
     goto out;
   }
 
     goto out;
   }
 
@@ -2390,7 +2395,7 @@ SILC_CLIENT_CMD_FUNC(close)
   silc_buffer_free(buffer);
 
   /* Notify application */
   silc_buffer_free(buffer);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
@@ -2404,7 +2409,7 @@ SILC_CLIENT_CMD_FUNC(shutdown)
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
 
   if (!cmd->conn) {
     SILC_NOT_CONNECTED(cmd->client, cmd->conn);
-    COMMAND_ERROR;
+    COMMAND_ERROR(SILC_STATUS_ERR_NOT_REGISTERED);
     goto out;
   }
 
     goto out;
   }
 
@@ -2413,7 +2418,7 @@ SILC_CLIENT_CMD_FUNC(shutdown)
                           SILC_COMMAND_PRIV_SHUTDOWN, 0, 0);
 
   /* Notify application */
                           SILC_COMMAND_PRIV_SHUTDOWN, 0, 0);
 
   /* Notify application */
-  COMMAND;
+  COMMAND(SILC_STATUS_OK);
 
  out:
   silc_client_command_free(cmd);
 
  out:
   silc_client_command_free(cmd);
index 918d266f2ef7943070c3e8b0efd95091ea2c94cf..7e0de3f350f9e83d12227896151280e4d7539309 100644 (file)
@@ -336,8 +336,8 @@ typedef struct {
      after application has called the command. Just to tell application
      that the command really was processed. */
   void (*command)(SilcClient client, SilcClientConnection conn, 
      after application has called the command. Just to tell application
      that the command really was processed. */
   void (*command)(SilcClient client, SilcClientConnection conn, 
-                 SilcClientCommandContext cmd_context, int success,
-                 SilcCommand command);
+                 SilcClientCommandContext cmd_context, bool success,
+                 SilcCommand command, SilcStatus status);
 
   /* Command reply handler. This function is called always in the command reply
      function. If error occurs it will be called as well. Normal scenario
 
   /* Command reply handler. This function is called always in the command reply
      function. If error occurs it will be called as well. Normal scenario
@@ -362,7 +362,7 @@ typedef struct {
      ID. For example, if Client ID is receives application receives 
      SilcClientEntry. */
   void (*command_reply)(SilcClient client, SilcClientConnection conn,
      ID. For example, if Client ID is receives application receives 
      SilcClientEntry. */
   void (*command_reply)(SilcClient client, SilcClientConnection conn,
-                       SilcCommandPayload cmd_payload, int success,
+                       SilcCommandPayload cmd_payload, bool success,
                        SilcCommand command, SilcStatus status, ...);
 
   /* Called to indicate that connection was either successfully established
                        SilcCommand command, SilcStatus status, ...);
 
   /* Called to indicate that connection was either successfully established