From 88278c860f97b6f04a0ac259d3307c084c0eda46 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Wed, 3 Apr 2002 06:48:40 +0000 Subject: [PATCH] updates --- TODO | 5 +++ apps/silcd/server_util.c | 2 ++ lib/silcclient/protocol.c | 61 +++++++++++++------------------------ lib/silcutil/silcsockconn.h | 28 +++++++++-------- 4 files changed, 45 insertions(+), 51 deletions(-) diff --git a/TODO b/TODO index 63cf1306..d7ff4d8e 100644 --- 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. + diff --git a/apps/silcd/server_util.c b/apps/silcd/server_util.c index cc62e4ca..147346de 100644 --- a/apps/silcd/server_util.c +++ b/apps/silcd/server_util.c @@ -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) { diff --git a/lib/silcclient/protocol.c b/lib/silcclient/protocol.c index 932bd3ab..3c66d905 100644 --- a/lib/silcclient/protocol.c +++ b/lib/silcclient/protocol.c @@ -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 diff --git a/lib/silcutil/silcsockconn.h b/lib/silcutil/silcsockconn.h index 7f6ea5f9..d7acdf95 100644 --- a/lib/silcutil/silcsockconn.h +++ b/lib/silcutil/silcsockconn.h @@ -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 -- 2.24.0