Started implementing protocol version 1.1 and narrowing down
[silc.git] / apps / irssi / src / silc / core / client_ops.c
index 11b33fc0c1422641e98e6b129a50d7b622ae7b87..a4008b78c8882fa13f610e7f8adee69dfe35e743 100644 (file)
 #include "fe-common/core/keyboard.h"
 #include "fe-common/silc/module-formats.h"
 
+#include "core.h"
+
 static void 
 silc_verify_public_key_internal(SilcClient client, SilcClientConnection conn,
                                const char *name, SilcSocketType conn_type, 
-                               unsigned char *pk, uint32 pk_len, 
+                               unsigned char *pk, SilcUInt32 pk_len, 
                                SilcSKEPKType pk_type,
                                SilcVerifyPublicKey completion, void *context);
 
@@ -79,7 +81,8 @@ void silc_say_error(char *msg, ...)
 
 void silc_channel_message(SilcClient client, SilcClientConnection conn,
                          SilcClientEntry sender, SilcChannelEntry channel,
-                         SilcMessageFlags flags, char *msg)
+                         SilcMessageFlags flags, const unsigned char *message,
+                         SilcUInt32 message_len)
 {
   SILC_SERVER_REC *server;
   SILC_NICK_REC *nick;
@@ -87,7 +90,7 @@ void silc_channel_message(SilcClient client, SilcClientConnection conn,
   
   SILC_LOG_DEBUG(("Start"));
 
-  if (!msg)
+  if (!message)
     return;
 
   server = conn == NULL ? NULL : conn->context;
@@ -106,13 +109,13 @@ void silc_channel_message(SilcClient client, SilcClientConnection conn,
   if (flags & SILC_MESSAGE_FLAG_ACTION)
     printformat_module("fe-common/silc", server, channel->channel_name,
                       MSGLEVEL_ACTIONS, SILCTXT_CHANNEL_ACTION, 
-                       nick == NULL ? "[<unknown>]" : nick->nick, msg);
+                       nick == NULL ? "[<unknown>]" : nick->nick, message);
   else if (flags & SILC_MESSAGE_FLAG_NOTICE)
     printformat_module("fe-common/silc", server, channel->channel_name,
                       MSGLEVEL_NOTICES, SILCTXT_CHANNEL_NOTICE, 
-                       nick == NULL ? "[<unknown>]" : nick->nick, msg);
+                       nick == NULL ? "[<unknown>]" : nick->nick, message);
   else
-    signal_emit("message public", 6, server, msg,
+    signal_emit("message public", 6, server, message,
                nick == NULL ? "[<unknown>]" : nick->nick,
                nick == NULL ? "" : nick->host == NULL ? "" : nick->host,
                chanrec->name, nick);
@@ -123,7 +126,8 @@ void silc_channel_message(SilcClient client, SilcClientConnection conn,
 
 void silc_private_message(SilcClient client, SilcClientConnection conn,
                          SilcClientEntry sender, SilcMessageFlags flags,
-                         char *msg)
+                         const unsigned char *message,
+                         SilcUInt32 message_len)
 {
   SILC_SERVER_REC *server;
   char userhost[256];
@@ -135,7 +139,7 @@ void silc_private_message(SilcClient client, SilcClientConnection conn,
   if (sender->username)
     snprintf(userhost, sizeof(userhost) - 1, "%s@%s",
             sender->username, sender->hostname);
-  signal_emit("message private", 4, server, msg,
+  signal_emit("message private", 4, server, message,
              sender->nickname ? sender->nickname : "[<unknown>]",
              sender->username ? userhost : NULL);
 }
@@ -156,11 +160,11 @@ void silc_notify(SilcClient client, SilcClientConnection conn,
   SILC_CHANNEL_REC *chanrec;
   SILC_NICK_REC *nickrec;
   SilcClientEntry client_entry, client_entry2;
-  SilcChannelEntry channel;
+  SilcChannelEntry channel, channel2;
   SilcServerEntry server_entry;
   SilcIdType idtype;
   void *entry;
-  uint32 mode;
+  SilcUInt32 mode;
   char userhost[512];
   char *name, *tmp;
   GSList *list1, *list_tmp;
@@ -332,15 +336,14 @@ void silc_notify(SilcClient client, SilcClientConnection conn,
     client_entry = va_arg(va, SilcClientEntry);
     client_entry2 = va_arg(va, SilcClientEntry);
     
-    nicklist_rename_unique(SERVER(server),
-                          client_entry, client_entry->nickname,
-                          client_entry2, client_entry2->nickname);
-    
     memset(userhost, 0, sizeof(userhost));
     snprintf(userhost, sizeof(userhost) - 1, "%s@%s",
             client_entry2->username, client_entry2->hostname);
+    nicklist_rename_unique(SERVER(server),
+                          client_entry, client_entry->nickname,
+                          client_entry2, client_entry2->nickname);
     signal_emit("message nick", 4, server, client_entry2->nickname, 
-               client_entry2->nickname, userhost);
+               client_entry->nickname, userhost);
     break;
 
   case SILC_NOTIFY_TYPE_CMODE_CHANGE:
@@ -352,7 +355,7 @@ void silc_notify(SilcClient client, SilcClientConnection conn,
 
     idtype = va_arg(va, int);
     entry = va_arg(va, void *);
-    mode = va_arg(va, uint32);
+    mode = va_arg(va, SilcUInt32);
     (void)va_arg(va, char *);
     (void)va_arg(va, char *);
     channel = va_arg(va, SilcChannelEntry);
@@ -382,6 +385,12 @@ void silc_notify(SilcClient client, SilcClientConnection conn,
                         MSGLEVEL_MODES, SILCTXT_CHANNEL_CMODE,
                         channel->channel_name, tmp ? tmp : "removed all",
                         server_entry->server_name);
+    } else {
+      channel2 = (SilcChannelEntry)entry;
+      printformat_module("fe-common/silc", server, channel->channel_name,
+                        MSGLEVEL_MODES, SILCTXT_CHANNEL_CMODE,
+                        channel->channel_name, tmp ? tmp : "removed all",
+                        channel2->channel_name);
     }
 
     silc_free(tmp);
@@ -394,16 +403,17 @@ void silc_notify(SilcClient client, SilcClientConnection conn,
 
     SILC_LOG_DEBUG(("Notify: CUMODE_CHANGE"));
 
-    client_entry = va_arg(va, SilcClientEntry);
-    mode = va_arg(va, uint32);
+    idtype = va_arg(va, int);
+    entry = va_arg(va, void *);
+    mode = va_arg(va, SilcUInt32);
     client_entry2 = va_arg(va, SilcClientEntry);
     channel = va_arg(va, SilcChannelEntry);
-    
+
     tmp = silc_client_chumode(mode);
     chanrec = silc_channel_find_entry(server, channel);
     if (chanrec != NULL) {
       SILC_NICK_REC *nick;
-      
+
       if (client_entry2 == server->conn->local_entry)
        chanrec->chanop = (mode & SILC_CHANNEL_UMODE_CHANOP) != 0;
       
@@ -414,19 +424,36 @@ void silc_notify(SilcClient client, SilcClientConnection conn,
        signal_emit("nick mode changed", 2, chanrec, nick);
       }
     }
-  
-    printformat_module("fe-common/silc", server, channel->channel_name,
-                      MSGLEVEL_MODES, SILCTXT_CHANNEL_CUMODE,
-                      channel->channel_name, client_entry2->nickname, 
-                      tmp ? tmp : "removed all",
-                      client_entry->nickname);
+
+    if (idtype == SILC_ID_CLIENT) {
+      client_entry = (SilcClientEntry)entry;
+      printformat_module("fe-common/silc", server, channel->channel_name,
+                        MSGLEVEL_MODES, SILCTXT_CHANNEL_CUMODE,
+                        channel->channel_name, client_entry2->nickname, 
+                        tmp ? tmp : "removed all",
+                        client_entry->nickname);
+    } else if (idtype == SILC_ID_SERVER) {
+      server_entry = (SilcServerEntry)entry;
+      printformat_module("fe-common/silc", server, channel->channel_name,
+                        MSGLEVEL_MODES, SILCTXT_CHANNEL_CUMODE,
+                        channel->channel_name, client_entry2->nickname, 
+                        tmp ? tmp : "removed all",
+                        server_entry->server_name);
+    } else {
+      channel2 = (SilcChannelEntry)entry;
+      printformat_module("fe-common/silc", server, channel->channel_name,
+                        MSGLEVEL_MODES, SILCTXT_CHANNEL_CUMODE,
+                        channel->channel_name, client_entry2->nickname, 
+                        tmp ? tmp : "removed all",
+                        channel2->channel_name);
+    }
 
     if (mode & SILC_CHANNEL_UMODE_CHANFO)
       printformat_module("fe-common/silc", 
                         server, channel->channel_name, MSGLEVEL_CRAP,
                         SILCTXT_CHANNEL_FOUNDER,
                         channel->channel_name, client_entry2->nickname);
-    
+
     silc_free(tmp);
     break;
 
@@ -460,8 +487,9 @@ void silc_notify(SilcClient client, SilcClientConnection conn,
     if (client_entry == conn->local_entry) {
       printformat_module("fe-common/silc", server, channel->channel_name,
                         MSGLEVEL_CRAP, SILCTXT_CHANNEL_KICKED_YOU, 
-                        client_entry2->nickname,
-                        channel->channel_name, tmp ? tmp : "");
+                        channel->channel_name, 
+                        client_entry ? client_entry2->nickname : "",
+                        tmp ? tmp : "");
       if (chanrec) {
        chanrec->kicked = TRUE;
        channel_destroy((CHANNEL_REC *)chanrec);
@@ -469,9 +497,9 @@ void silc_notify(SilcClient client, SilcClientConnection conn,
     } else {
       printformat_module("fe-common/silc", server, channel->channel_name,
                         MSGLEVEL_CRAP, SILCTXT_CHANNEL_KICKED, 
-                        client_entry->nickname,
-                        client_entry2->nickname,
-                        channel->channel_name, tmp ? tmp : "");
+                        client_entry->nickname, channel->channel_name, 
+                        client_entry2 ? client_entry2->nickname : "", 
+                        tmp ? tmp : "");
 
       if (chanrec) {
        SILC_NICK_REC *nickrec = silc_nicklist_find(chanrec, client_entry);
@@ -490,10 +518,12 @@ void silc_notify(SilcClient client, SilcClientConnection conn,
 
     client_entry = va_arg(va, SilcClientEntry);
     tmp = va_arg(va, char *);
+    client_entry2 = va_arg(va, SilcClientEntry);
   
     if (client_entry == conn->local_entry) {
       printformat_module("fe-common/silc", server, NULL,
                         MSGLEVEL_CRAP, SILCTXT_CHANNEL_KILLED_YOU, 
+                        client_entry2 ? client_entry2->nickname : "",
                         tmp ? tmp : "");
     } else {
       list1 = nicklist_get_same_unique(SERVER(server), client_entry);
@@ -507,10 +537,14 @@ void silc_notify(SilcClient client, SilcClientConnection conn,
       printformat_module("fe-common/silc", server, NULL,
                         MSGLEVEL_CRAP, SILCTXT_CHANNEL_KILLED, 
                         client_entry->nickname,
+                        client_entry2 ? client_entry2->nickname : "",
                         tmp ? tmp : "");
     }
     break;
 
+  case SILC_NOTIFY_TYPE_CHANNEL_CHANGE:
+    break;
+
   case SILC_NOTIFY_TYPE_SERVER_SIGNOFF:
     {
       /*
@@ -518,13 +552,13 @@ void silc_notify(SilcClient client, SilcClientConnection conn,
        */
       int i;
       SilcClientEntry *clients;
-      uint32 clients_count;
+      SilcUInt32 clients_count;
 
       SILC_LOG_DEBUG(("Notify: SIGNOFF"));
       
       (void)va_arg(va, void *);
       clients = va_arg(va, SilcClientEntry *);
-      clients_count = va_arg(va, uint32);
+      clients_count = va_arg(va, SilcUInt32);
   
       for (i = 0; i < clients_count; i++) {
        memset(userhost, 0, sizeof(userhost));
@@ -590,6 +624,9 @@ void silc_disconnect(SilcClient client, SilcClientConnection conn)
 
   SILC_LOG_DEBUG(("Start"));
 
+  if (!server || server->connection_lost)
+    return;
+
   if (server->conn && server->conn->local_entry) {
     nicklist_rename_unique(SERVER(server),
                           server->conn->local_entry, server->nick,
@@ -644,7 +681,7 @@ void silc_command(SilcClient client, SilcClientConnection conn,
 static void silc_client_join_get_users(SilcClient client,
                                       SilcClientConnection conn,
                                       SilcClientEntry *clients,
-                                      uint32 clients_count,
+                                      SilcUInt32 clients_count,
                                       void *context)
 {
   SilcChannelEntry channel = (SilcChannelEntry)context;
@@ -760,7 +797,7 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
     {
       char buf[1024], *nickname, *username, *realname, *nick;
       unsigned char *fingerprint;
-      uint32 idle, mode;
+      SilcUInt32 idle, mode;
       SilcBuffer channels;
       SilcClientEntry client_entry;
       
@@ -776,12 +813,13 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
       } else if (status == SILC_STATUS_ERR_NO_SUCH_CLIENT_ID) {
        /* Try to find the entry for the unknown client ID, since we
           might have, and print the nickname of it for user. */
-       uint32 tmp_len;
+       SilcUInt32 tmp_len;
        unsigned char *tmp =
          silc_argument_get_arg_type(silc_command_get_args(cmd_payload),
                                     2, &tmp_len);
        if (tmp) {
-         SilcClientID *client_id = silc_id_payload_parse_id(tmp, tmp_len);
+         SilcClientID *client_id = silc_id_payload_parse_id(tmp, tmp_len, 
+                                                            NULL);
          if (client_id) {
            client_entry = silc_client_get_client_by_id(client, conn,
                                                        client_id);
@@ -802,8 +840,8 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
       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);
+      mode = va_arg(vp, SilcUInt32);
+      idle = va_arg(vp, SilcUInt32);
       fingerprint = va_arg(vp, unsigned char *);
       
       silc_parse_userfqdn(nickname, &nick, NULL);
@@ -824,7 +862,7 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
          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;
+           SilcUInt32 name_len;
            char *name = silc_channel_get_name(entry, &name_len);
            
            if (m)
@@ -892,12 +930,13 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
       } else if (status == SILC_STATUS_ERR_NO_SUCH_CLIENT_ID) {
        /* Try to find the entry for the unknown client ID, since we
           might have, and print the nickname of it for user. */
-       uint32 tmp_len;
+       SilcUInt32 tmp_len;
        unsigned char *tmp =
          silc_argument_get_arg_type(silc_command_get_args(cmd_payload),
                                     2, &tmp_len);
        if (tmp) {
-         SilcClientID *client_id = silc_id_payload_parse_id(tmp, tmp_len);
+         SilcClientID *client_id = silc_id_payload_parse_id(tmp, tmp_len,
+                                                            NULL);
          if (client_id) {
            client_entry = silc_client_get_client_by_id(client, conn,
                                                        client_id);
@@ -973,24 +1012,24 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
   case SILC_COMMAND_JOIN: 
     {
       char *channel, *mode, *topic;
-      uint32 modei;
+      SilcUInt32 modei;
       SilcChannelEntry channel_entry;
       SilcBuffer client_id_list;
-      uint32 list_count;
+      SilcUInt32 list_count;
 
       if (!success)
        return;
 
       channel = va_arg(vp, char *);
       channel_entry = va_arg(vp, SilcChannelEntry);
-      modei = va_arg(vp, uint32);
-      (void)va_arg(vp, uint32);
+      modei = va_arg(vp, SilcUInt32);
+      (void)va_arg(vp, SilcUInt32);
       (void)va_arg(vp, unsigned char *);
       (void)va_arg(vp, unsigned char *);
       (void)va_arg(vp, unsigned char *);
       topic = va_arg(vp, char *);
       (void)va_arg(vp, unsigned char *);
-      list_count = va_arg(vp, uint32);
+      list_count = va_arg(vp, SilcUInt32);
       client_id_list = va_arg(vp, SilcBuffer);
 
       chanrec = silc_channel_find(server, channel);
@@ -1033,7 +1072,6 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
       nicklist_rename_unique(SERVER(server),
                             server->conn->local_entry, server->nick,
                             client, client->nickname);
-      
       signal_emit("message own_nick", 4, server, server->nick, old, "");
       g_free(old);
       break;
@@ -1070,12 +1108,12 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
     
   case SILC_COMMAND_UMODE:
     {
-      uint32 mode;
+      SilcUInt32 mode;
       
       if (!success)
        return;
       
-      mode = va_arg(vp, uint32);
+      mode = va_arg(vp, SilcUInt32);
       
       if (mode & SILC_UMODE_SERVER_OPERATOR &&
          !(server->umode & SILC_UMODE_SERVER_OPERATOR))
@@ -1088,6 +1126,7 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
                           MSGLEVEL_CRAP, SILCTXT_ROUTER_OPER);
 
       server->umode = mode;
+      signal_emit("user mode changed", 2, server, NULL);
     }
     break;
     
@@ -1095,6 +1134,9 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
     if (!success)
       return;
 
+    server->umode |= SILC_UMODE_SERVER_OPERATOR;
+    signal_emit("user mode changed", 2, server, NULL);
+
     printformat_module("fe-common/silc", server, NULL,
                       MSGLEVEL_CRAP, SILCTXT_SERVER_OPER);
     break;
@@ -1103,6 +1145,9 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
     if (!success)
       return;
 
+    server->umode |= SILC_UMODE_ROUTER_OPERATOR;
+    signal_emit("user mode changed", 2, server, NULL);
+
     printformat_module("fe-common/silc", server, NULL,
                       MSGLEVEL_CRAP, SILCTXT_ROUTER_OPER);
     break;
@@ -1180,14 +1225,14 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
       void *entry;
       SilcPublicKey public_key;
       unsigned char *pk;
-      uint32 pk_len;
+      SilcUInt32 pk_len;
       GetkeyContext getkey;
       char *name;
       
       if (!success)
        return;
       
-      id_type = va_arg(vp, uint32);
+      id_type = va_arg(vp, SilcUInt32);
       entry = va_arg(vp, void *);
       public_key = va_arg(vp, SilcPublicKey);
 
@@ -1281,7 +1326,7 @@ typedef struct {
   char *entity;
   char *entity_name;
   unsigned char *pk;
-  uint32 pk_len;
+  SilcUInt32 pk_len;
   SilcSKEPKType pk_type;
   SilcVerifyPublicKey completion;
   void *context;
@@ -1325,7 +1370,7 @@ static void verify_public_key_completion(const char *line, void *context)
 static void 
 silc_verify_public_key_internal(SilcClient client, SilcClientConnection conn,
                                const char *name, SilcSocketType conn_type, 
-                               unsigned char *pk, uint32 pk_len, 
+                               unsigned char *pk, SilcUInt32 pk_len, 
                                SilcSKEPKType pk_type,
                                SilcVerifyPublicKey completion, void *context)
 {
@@ -1364,21 +1409,21 @@ silc_verify_public_key_internal(SilcClient client, SilcClientConnection conn,
     if (!name) {
       snprintf(file, sizeof(file) - 1, "%skey_%s_%d.pub", entity, 
               conn->sock->ip, conn->sock->port);
-      snprintf(filename, sizeof(filename) - 1, "%s/.silc/%skeys/%s", 
-              pw->pw_dir, entity, file);
+      snprintf(filename, sizeof(filename) - 1, "%s/%skeys/%s", 
+              get_irssi_dir(), entity, file);
       
       snprintf(file, sizeof(file) - 1, "%skey_%s_%d.pub", entity, 
               conn->sock->hostname, conn->sock->port);
-      snprintf(filename2, sizeof(filename2) - 1, "%s/.silc/%skeys/%s", 
-              pw->pw_dir, entity, file);
+      snprintf(filename2, sizeof(filename2) - 1, "%s/%skeys/%s", 
+              get_irssi_dir(), entity, file);
       
       ipf = filename;
       hostf = filename2;
     } else {
       snprintf(file, sizeof(file) - 1, "%skey_%s_%d.pub", entity, 
               name, conn->sock->port);
-      snprintf(filename, sizeof(filename) - 1, "%s/.silc/%skeys/%s", 
-              pw->pw_dir, entity, file);
+      snprintf(filename, sizeof(filename) - 1, "%s/%skeys/%s", 
+              get_irssi_dir(), entity, file);
       
       ipf = filename;
     }
@@ -1390,8 +1435,8 @@ silc_verify_public_key_internal(SilcClient client, SilcClientConnection conn,
        fingerprint[i] = '_';
     
     snprintf(file, sizeof(file) - 1, "%skey_%s.pub", entity, fingerprint);
-    snprintf(filename, sizeof(filename) - 1, "%s/.silc/%skeys/%s", 
-            pw->pw_dir, entity, file);
+    snprintf(filename, sizeof(filename) - 1, "%s/%skeys/%s", 
+            get_irssi_dir(), entity, file);
     silc_free(fingerprint);
 
     ipf = filename;
@@ -1438,7 +1483,7 @@ silc_verify_public_key_internal(SilcClient client, SilcClientConnection conn,
     /* The key already exists, verify it. */
     SilcPublicKey public_key;
     unsigned char *encpk;
-    uint32 encpk_len;
+    SilcUInt32 encpk_len;
 
     /* Load the key file, try for both IP filename and hostname filename */
     if (!silc_pkcs_load_public_key(ipf, &public_key, 
@@ -1529,7 +1574,7 @@ silc_verify_public_key_internal(SilcClient client, SilcClientConnection conn,
 void 
 silc_verify_public_key(SilcClient client, SilcClientConnection conn,
                       SilcSocketType conn_type, unsigned char *pk, 
-                      uint32 pk_len, SilcSKEPKType pk_type,
+                      SilcUInt32 pk_len, SilcSKEPKType pk_type,
                       SilcVerifyPublicKey completion, void *context)
 {
   silc_verify_public_key_internal(client, conn, NULL, conn_type, pk,
@@ -1610,7 +1655,7 @@ static void silc_get_auth_method_callback(SilcClient client,
    is found and FALSE if not. `conn' may be NULL. */
 
 void silc_get_auth_method(SilcClient client, SilcClientConnection conn,
-                         char *hostname, uint16 port,
+                         char *hostname, SilcUInt16 port,
                          SilcGetAuthMeth completion, void *context)
 {
   InternalGetAuthMethod internal;
@@ -1677,7 +1722,7 @@ void silc_failure(SilcClient client, SilcClientConnection conn,
   }
 
   if (protocol->protocol->type == SILC_PROTOCOL_CLIENT_CONNECTION_AUTH) {
-    uint32 err = (uint32)failure;
+    SilcUInt32 err = (SilcUInt32)failure;
 
     if (err == SILC_AUTH_FAILED)
       printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP, 
@@ -1694,7 +1739,7 @@ void silc_failure(SilcClient client, SilcClientConnection conn,
 
 int silc_key_agreement(SilcClient client, SilcClientConnection conn,
                       SilcClientEntry client_entry, const char *hostname,
-                      uint16 port, SilcKeyAgreementCallback *completion,
+                      SilcUInt16 port, SilcKeyAgreementCallback *completion,
                       void **context)
 {
   char portstr[12];
@@ -1722,8 +1767,8 @@ int silc_key_agreement(SilcClient client, SilcClientConnection conn,
 }
 
 void silc_ftp(SilcClient client, SilcClientConnection conn,
-             SilcClientEntry client_entry, uint32 session_id,
-             const char *hostname, uint16 port)
+             SilcClientEntry client_entry, SilcUInt32 session_id,
+             const char *hostname, SilcUInt16 port)
 {
   SILC_SERVER_REC *server;
   char portstr[12];