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.
+
+ 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)) {
+    sock->version = r_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;
-  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);
+    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
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).
  *
- *    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
@@ -168,9 +165,12 @@ typedef enum {
  *      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 {
@@ -179,21 +179,25 @@ struct SilcSocketConnectionStruct {
   void *user_data;
   SilcProtocol protocol;
   SilcUInt32 flags;
-  SilcUInt8 sock_error;
   int users;
 
-  char *hostname;
-  char *ip;
-  SilcUInt16 port;
+  SilcSocketConnectionHB hb;
 
   SilcBuffer inbuf;
   SilcBuffer outbuf;
 
-  SilcSocketConnectionHB hb;
+  char *hostname;
+  char *ip;
+  SilcUInt16 port;
+  SilcUInt8 sock_error;
+  SilcUInt8 version;
 };
 
 /* 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