updates
authorPekka Riikonen <priikone@silcnet.org>
Wed, 3 Apr 2002 06:48:40 +0000 (06:48 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Wed, 3 Apr 2002 06:48:40 +0000 (06:48 +0000)
TODO
apps/silcd/server_util.c
lib/silcclient/protocol.c
lib/silcutil/silcsockconn.h

diff --git a/TODO b/TODO
index 63cf1306d7a31513fcfba6dac51f60bd084008d6..d7ff4d8eb3d146811b16c4786ea78a071de06c4a 100644 (file)
--- a/TODO
+++ b/TODO
@@ -191,3 +191,8 @@ describe new stuff to be added to protocol versions 1.x.
 
  15. The LEAVE command reply should return the Channel ID of the channel
      that was parted.
 
  15. The LEAVE command reply should return the Channel ID of the channel
      that was parted.
+
+ 16. Add STATS command after all to the protocol for providing practically
+     same information client gets when connects to a server.  Normal
+     server would send this to router always when received from client.
+
index cc62e4caa38687032eeae7952dd2d01955fcb129..147346dea24c7ec8e68c1863c3b710aab77029ab 100644 (file)
@@ -924,6 +924,8 @@ bool silc_server_connection_allowed(SilcServer server,
   if (ske && silc_ske_parse_version(ske, &r_protocol_version, NULL,
                                    &r_software_version, NULL,
                                    &r_vendor_version)) {
   if (ske && silc_ske_parse_version(ske, &r_protocol_version, NULL,
                                    &r_software_version, NULL,
                                    &r_vendor_version)) {
+    sock->version = r_protocol_version;
+
     /* Match protocol version */
     if (l_protocol_version && r_protocol_version &&
        r_protocol_version < l_protocol_version) {
     /* Match protocol version */
     if (l_protocol_version && r_protocol_version &&
        r_protocol_version < l_protocol_version) {
index 932bd3abcf391f1b6d9af6ae1b3aec35f51b0abe..3c66d905817a8ccc36a2ae6c74f65c7c4c43cb06 100644 (file)
@@ -171,53 +171,36 @@ SilcSKEStatus silc_ske_check_version(SilcSKE ske, unsigned char *version,
 {
   SilcClientConnection conn = (SilcClientConnection)ske->sock->user_data;
   SilcClient client = (SilcClient)ske->user_data;
 {
   SilcClientConnection conn = (SilcClientConnection)ske->sock->user_data;
   SilcClient client = (SilcClient)ske->user_data;
-  SilcSKEStatus status = SILC_SKE_STATUS_OK;
-  char *cp;
-  int maj = 0, min = 0, build = 0, maj2 = 0, min2 = 0, build2 = 0;
-
-  /* Check for initial version string. Allowed "SILC-1.x-". */
-  if (!strstr(version, "SILC-1."))
-    status = SILC_SKE_STATUS_BAD_VERSION;
-
-  /* Check software version */
-
-  cp = version + 9;
-  if (!cp)
-    status = SILC_SKE_STATUS_BAD_VERSION;
+  SilcUInt32 l_protocol_version = 0, r_protocol_version = 0;
 
 
-  maj = atoi(cp);
-  cp = strchr(cp, '.');
-  if (cp) {
-    min = atoi(cp + 1);
-    cp++;
-  }
-  cp = strchr(cp, '.');
-  if (cp)
-    build = atoi(cp + 1);
-
-  cp = client->internal->silc_client_version + 9;
-  if (!cp)
-    status = SILC_SKE_STATUS_BAD_VERSION;
-
-  maj2 = atoi(cp);
-  cp = strchr(cp, '.');
-  if (cp) {
-    min2 = atoi(cp + 1);
-    cp++;
+  if (!silc_parse_version_string(version, &r_protocol_version, NULL, NULL,
+                                NULL, NULL)) {
+    client->internal->ops->say(client, conn, SILC_CLIENT_MESSAGE_AUDIT,
+                              "We don't support server version `%s'", 
+                              version);
+    return SILC_SKE_STATUS_BAD_VERSION;
   }
   }
-  cp = strchr(cp, '.');
-  if (cp)
-    build2 = atoi(cp + 1);
 
 
-  if (maj != maj2)
-    status = SILC_SKE_STATUS_BAD_VERSION;
+  if (!silc_parse_version_string(client->internal->silc_client_version, 
+                                &l_protocol_version, NULL, NULL,
+                                NULL, NULL)) {
+    client->internal->ops->say(client, conn, SILC_CLIENT_MESSAGE_AUDIT,
+                              "We don't support server version `%s'", 
+                              version);
+    return SILC_SKE_STATUS_BAD_VERSION;
+  }
 
 
-  if (status != SILC_SKE_STATUS_OK)
+  /* If remote is too new, don't connect */
+  if (l_protocol_version < r_protocol_version) {
     client->internal->ops->say(client, conn, SILC_CLIENT_MESSAGE_AUDIT,
                               "We don't support server version `%s'", 
                               version);
     client->internal->ops->say(client, conn, SILC_CLIENT_MESSAGE_AUDIT,
                               "We don't support server version `%s'", 
                               version);
+    return SILC_SKE_STATUS_BAD_VERSION;
+  }
+
+  ske->sock->version = r_protocol_version;
 
 
-  return status;
+  return SILC_SKE_STATUS_OK;
 }
 
 /* Callback that is called by the SKE to indicate that it is safe to
 }
 
 /* Callback that is called by the SKE to indicate that it is safe to
index 7f6ea5f9c35ec0a6f0a02218205ed69e49549802..d7acdf95834fec56ec665effca95ac3846eeb539 100644 (file)
@@ -153,12 +153,9 @@ typedef enum {
  *      Reference counter. When allocated it is set to one (1) and it won't
  *      be freed until it hits zero (0).
  *
  *      Reference counter. When allocated it is set to one (1) and it won't
  *      be freed until it hits zero (0).
  *
- *    char *hostname
- *    char *ip
- *    SilcUInt16 port
+ *    SilcSocketConnectionHB hb
  *
  *
- *      Resolved hostname, IP address and port of the connection who owns
- *      this object.
+ *      The heartbeat context.  If NULL, heartbeat is not performed.
  *
  *    SilcBuffer inbuf
  *    SilcBuffer outbuf
  *
  *    SilcBuffer inbuf
  *    SilcBuffer outbuf
@@ -168,9 +165,12 @@ typedef enum {
  *      inbuf buffer and outgoing data after encryption is put to the outbuf
  *      buffer.
  *
  *      inbuf buffer and outgoing data after encryption is put to the outbuf
  *      buffer.
  *
- *    SilcSocketConnectionHB hb
+ *    char *hostname
+ *    char *ip
+ *    SilcUInt16 port
  *
  *
- *      The heartbeat context.  If NULL, heartbeat is not performed.
+ *      Resolved hostname, IP address and port of the connection who owns
+ *      this object.
  *
  ***/
 struct SilcSocketConnectionStruct {
  *
  ***/
 struct SilcSocketConnectionStruct {
@@ -179,21 +179,25 @@ struct SilcSocketConnectionStruct {
   void *user_data;
   SilcProtocol protocol;
   SilcUInt32 flags;
   void *user_data;
   SilcProtocol protocol;
   SilcUInt32 flags;
-  SilcUInt8 sock_error;
   int users;
 
   int users;
 
-  char *hostname;
-  char *ip;
-  SilcUInt16 port;
+  SilcSocketConnectionHB hb;
 
   SilcBuffer inbuf;
   SilcBuffer outbuf;
 
 
   SilcBuffer inbuf;
   SilcBuffer outbuf;
 
-  SilcSocketConnectionHB hb;
+  char *hostname;
+  char *ip;
+  SilcUInt16 port;
+  SilcUInt8 sock_error;
+  SilcUInt8 version;
 };
 
 /* Macros */
 
 };
 
 /* Macros */
 
+/* Check for specific protocol version */
+#define SILC_PROTOCOL_VERSION(s, maj, min) (s->version == maj##min)
+
 /* Amount of bytes to be read from the socket connection at once. */
 #define SILC_SOCKET_READ_SIZE 16384
 
 /* Amount of bytes to be read from the socket connection at once. */
 #define SILC_SOCKET_READ_SIZE 16384