From 605a376f6abbd27bee3e0bcd15ba7cc3ceb41e6a Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Thu, 20 Jul 2000 10:17:25 +0000 Subject: [PATCH] Added dynamic protocol registering/unregistering support. The patch was provided by cras. --- CHANGES | 5 +++ apps/silc/client.c | 9 +++++ apps/silc/protocol.c | 34 ++++++++++++------- apps/silc/protocol.h | 2 ++ apps/silcd/protocol.c | 35 +++++++++++++------- apps/silcd/protocol.h | 2 ++ apps/silcd/server.c | 9 +++++ lib/silccore/silcprotocol.c | 65 +++++++++++++++++++++++++++++++++---- lib/silccore/silcprotocol.h | 15 +++++---- 9 files changed, 141 insertions(+), 35 deletions(-) diff --git a/CHANGES b/CHANGES index f82a3156..79fbf61d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ +Thu Jul 20 13:15:01 EEST 2000 Pekka Riikonen + + * Added dynamic protocol registering support. Now protocols can + registered and unregistered on the fly. Patch by cras. + Wed Jul 19 19:08:46 EEST 2000 Pekka Riikonen * Added lib/contrib directory to hold routines that some platforms diff --git a/apps/silc/client.c b/apps/silc/client.c index 9ec43ec7..b3a6d391 100644 --- a/apps/silc/client.c +++ b/apps/silc/client.c @@ -20,6 +20,10 @@ /* * $Id$ * $Log$ + * Revision 1.13 2000/07/20 10:17:25 priikone + * Added dynamic protocol registering/unregistering support. The + * patch was provided by cras. + * * Revision 1.12 2000/07/19 07:07:34 priikone * Save packet on private message's command context. * @@ -178,6 +182,9 @@ int silc_client_init(SilcClient client) goto err1; } + /* Register protocols */ + silc_client_protocols_register(); + /* Initialize the scheduler */ silc_schedule_init(client->io_queue, client->timeout_queue, client->generic_queue, 5000); @@ -247,6 +254,8 @@ void silc_client_stop(SilcClient client) silc_schedule_stop(); silc_schedule_uninit(); + silc_client_protocols_unregister(); + SILC_LOG_DEBUG(("Client client")); } diff --git a/apps/silc/protocol.c b/apps/silc/protocol.c index a86b29e0..34259706 100644 --- a/apps/silc/protocol.c +++ b/apps/silc/protocol.c @@ -23,6 +23,10 @@ /* * $Id$ * $Log$ + * Revision 1.8 2000/07/20 10:17:25 priikone + * Added dynamic protocol registering/unregistering support. The + * patch was provided by cras. + * * Revision 1.7 2000/07/19 07:07:47 priikone * Added version detection support to SKE. * @@ -56,17 +60,6 @@ SILC_TASK_CALLBACK(silc_client_protocol_key_exchange); extern char *silc_version_string; -/* SILC client protocol list */ -const SilcProtocolObject silc_protocol_list[] = -{ - { SILC_PROTOCOL_CLIENT_CONNECTION_AUTH, - silc_client_protocol_connection_auth }, - { SILC_PROTOCOL_CLIENT_KEY_EXCHANGE, - silc_client_protocol_key_exchange }, - - { SILC_PROTOCOL_CLIENT_NONE, NULL }, -}; - /* * Key Exhange protocol functions */ @@ -483,3 +476,22 @@ SILC_TASK_CALLBACK(silc_client_protocol_connection_auth) } } +/* Registers protocols used in client */ + +void silc_client_protocols_register(void) +{ + silc_protocol_register(SILC_PROTOCOL_CLIENT_CONNECTION_AUTH, + silc_client_protocol_connection_auth); + silc_protocol_register(SILC_PROTOCOL_CLIENT_KEY_EXCHANGE, + silc_client_protocol_key_exchange); +} + +/* Unregisters protocols */ + +void silc_client_protocols_unregister(void) +{ + silc_protocol_unregister(SILC_PROTOCOL_CLIENT_CONNECTION_AUTH, + silc_client_protocol_connection_auth); + silc_protocol_unregister(SILC_PROTOCOL_CLIENT_KEY_EXCHANGE, + silc_client_protocol_key_exchange); +} diff --git a/apps/silc/protocol.h b/apps/silc/protocol.h index f78bcfd7..684995dd 100644 --- a/apps/silc/protocol.h +++ b/apps/silc/protocol.h @@ -69,5 +69,7 @@ typedef struct { } SilcClientConnAuthInternalContext; /* Prototypes */ +void silc_client_protocols_register(void); +void silc_client_protocols_unregister(void); #endif diff --git a/apps/silcd/protocol.c b/apps/silcd/protocol.c index 0f91d2d0..fe613930 100644 --- a/apps/silcd/protocol.c +++ b/apps/silcd/protocol.c @@ -23,6 +23,10 @@ /* * $Id$ * $Log$ + * Revision 1.9 2000/07/20 10:17:25 priikone + * Added dynamic protocol registering/unregistering support. The + * patch was provided by cras. + * * Revision 1.8 2000/07/19 07:08:09 priikone * Added version detection support to SKE. * @@ -65,17 +69,6 @@ SILC_TASK_CALLBACK(silc_server_protocol_key_exchange); extern char *silc_version_string; -/* SILC client protocol list */ -const SilcProtocolObject silc_protocol_list[] = -{ - { SILC_PROTOCOL_SERVER_CONNECTION_AUTH, - silc_server_protocol_connection_auth }, - { SILC_PROTOCOL_SERVER_KEY_EXCHANGE, - silc_server_protocol_key_exchange }, - - { SILC_PROTOCOL_SERVER_NONE, NULL }, -}; - /* * Key Exhange protocol functions */ @@ -924,3 +917,23 @@ SILC_TASK_CALLBACK(silc_server_protocol_connection_auth) break; } } + +/* Registers protocols used in server. */ + +void silc_server_protocols_register(void) +{ + silc_protocol_register(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, + silc_server_protocol_connection_auth); + silc_protocol_register(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, + silc_server_protocol_key_exchange); +} + +/* Unregisters protocols */ + +void silc_server_protocols_unregister(void) +{ + silc_protocol_unregister(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, + silc_server_protocol_connection_auth); + silc_protocol_unregister(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, + silc_server_protocol_key_exchange); +} diff --git a/apps/silcd/protocol.h b/apps/silcd/protocol.h index 9859647c..67d76a63 100644 --- a/apps/silcd/protocol.h +++ b/apps/silcd/protocol.h @@ -78,5 +78,7 @@ typedef struct { } SilcServerConnAuthInternalContext; /* Prototypes */ +void silc_server_protocols_register(void); +void silc_server_protocols_unregister(void); #endif diff --git a/apps/silcd/server.c b/apps/silcd/server.c index c17d2c7f..58633697 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -25,6 +25,10 @@ /* * $Id$ * $Log$ + * Revision 1.11 2000/07/20 10:17:25 priikone + * Added dynamic protocol registering/unregistering support. The + * patch was provided by cras. + * * Revision 1.10 2000/07/17 11:47:30 priikone * Added command lagging support. Added idle counting support. * @@ -315,6 +319,9 @@ int silc_server_init(SilcServer server) goto err1; } + /* Register protocols */ + silc_server_protocols_register(); + /* Initialize the scheduler */ silc_schedule_init(server->io_queue, server->timeout_queue, server->generic_queue, @@ -367,6 +374,8 @@ void silc_server_stop(SilcServer server) silc_schedule_stop(); silc_schedule_uninit(); + silc_server_protocols_unregister(); + SILC_LOG_DEBUG(("Server stopped")); } diff --git a/lib/silccore/silcprotocol.c b/lib/silccore/silcprotocol.c index cda59efc..7c33c1af 100644 --- a/lib/silccore/silcprotocol.c +++ b/lib/silccore/silcprotocol.c @@ -23,6 +23,10 @@ /* * $Id$ * $Log$ + * Revision 1.3 2000/07/20 10:17:25 priikone + * Added dynamic protocol registering/unregistering support. The + * patch was provided by cras. + * * Revision 1.2 2000/07/05 06:06:35 priikone * Global cosmetic change. * @@ -35,6 +39,55 @@ #include "silcincludes.h" #include "silcprotocol.h" +/* Dynamically registered protocols */ +SilcProtocolObject *silc_protocol_list = NULL; + +/* Dynamically registers new protocol. The protocol is added into protocol + list and can be unregistered with silc_protocol_unregister. */ + +void silc_protocol_register(SilcProtocolType type, + SilcProtocolCallback callback) +{ + SilcProtocolObject *new; + + new = silc_calloc(1, sizeof(*new)); + new->type = type; + new->callback = callback; + + if (!silc_protocol_list) + silc_protocol_list = new; + else { + new->next = silc_protocol_list; + silc_protocol_list = new; + } +} + +/* Unregisters protocol. The unregistering is done by both protocol type + and the protocol callback. */ + +void silc_protocol_unregister(SilcProtocolType type, + SilcProtocolCallback callback) +{ + SilcProtocolObject *protocol, *prev; + + protocol = silc_protocol_list; + prev = NULL; + while (protocol && (protocol->type != type && + protocol->callback != callback)) { + prev = protocol; + protocol = protocol->next; + } + + if (protocol) { + if (prev) + prev->next = protocol->next; + else + silc_protocol_list = protocol->next; + + silc_free(protocol); + } +} + /* Allocates a new protocol object. The new allocated and initialized protocol is returned to the new_protocol argument. The argument context is the context to be sent as argument for the protocol. The callback @@ -43,21 +96,21 @@ void silc_protocol_alloc(SilcProtocolType type, SilcProtocol *new_protocol, void *context, SilcProtocolFinalCallback callback) { - int i; + SilcProtocolObject *protocol; SILC_LOG_DEBUG(("Allocating new protocol type %d", type)); - for (i = 0; silc_protocol_list[i].callback; i++) - if (silc_protocol_list[i].type == type) - break; + protocol = silc_protocol_list; + while (protocol && protocol->type != type) + protocol = protocol->next; - if (!silc_protocol_list[i].callback) { + if (!protocol) { SILC_LOG_ERROR(("Requested protocol does not exists")); return; } *new_protocol = silc_calloc(1, sizeof(**new_protocol)); - (*new_protocol)->protocol = (SilcProtocolObject *)&silc_protocol_list[i]; + (*new_protocol)->protocol = protocol; (*new_protocol)->state = SILC_PROTOCOL_STATE_UNKNOWN; (*new_protocol)->context = context; (*new_protocol)->execute = silc_protocol_execute; diff --git a/lib/silccore/silcprotocol.h b/lib/silccore/silcprotocol.h index f04ffd79..fd564fcb 100644 --- a/lib/silccore/silcprotocol.h +++ b/lib/silccore/silcprotocol.h @@ -91,15 +91,17 @@ typedef unsigned char SilcProtocolState; */ typedef SilcTaskCallback SilcProtocolCallback; -typedef struct { +typedef struct SilcProtocolObjectStruct { SilcProtocolType type; SilcProtocolCallback callback; + + struct SilcProtocolObjectStruct *next; } SilcProtocolObject; typedef SilcTaskCallback SilcProtocolFinalCallback; typedef SilcTaskCallback SilcProtocolExecute; -typedef struct SilcProtocolObjectStruct { +typedef struct SilcProtocolStruct { SilcProtocolObject *protocol; SilcProtocolState state; void *context; @@ -110,12 +112,11 @@ typedef struct SilcProtocolObjectStruct { SilcProtocolFinalCallback final_callback; } *SilcProtocol; -/* Definition for SILC protocol list. This list includes all the - protocols in the SILC. SILC server and client defined own list of - protocols. */ -extern const SilcProtocolObject silc_protocol_list[]; - /* Prototypes */ +void silc_protocol_register(SilcProtocolType type, + SilcProtocolCallback callback); +void silc_protocol_unregister(SilcProtocolType type, + SilcProtocolCallback callback); void silc_protocol_alloc(SilcProtocolType type, SilcProtocol *new_protocol, void *context, SilcProtocolFinalCallback callback); void silc_protocol_free(SilcProtocol protocol); -- 2.43.0