From 3e70f7852074c590f19d586cf95af27f75ff5027 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Thu, 28 Mar 2002 17:12:43 +0000 Subject: [PATCH] updates. --- CHANGES | 11 +++++++++++ apps/silcd/server.c | 17 +++++++++++++---- apps/silcd/serverconfig.c | 32 ++++++++++++-------------------- apps/silcd/serverconfig.h | 5 ++--- apps/silcd/silcd.c | 2 +- lib/silcutil/silclog.c | 2 +- 6 files changed, 40 insertions(+), 29 deletions(-) diff --git a/CHANGES b/CHANGES index a8b37f51..f1c3b550 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,14 @@ +Thu Mar 28 19:02:05 EET 2002 Pekka Riikonen + + * Created new branch silc_protocol_1_0_branch. + + * Reverted the silc_log_quick change in lib/silcutil/silclog.c. + + * Changed the silc_server_config_* routines to be SilcServer + independent. They are now officially application specific code + and not part of generic server implementation. Affected files + are silcd/serverconfig.[ch], silcd/silcd.c, silcd/server.c. + Thu Mar 28 17:01:43 EET 2002 Pekka Riikonen * Added automatic referencing of config context in the diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 1aab542f..b785c518 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -87,6 +87,7 @@ void silc_server_free(SilcServer server) silc_dlist_uninit(server->sim); #endif + silc_server_config_unref(&server->config_ref); if (server->rng) silc_rng_free(server->rng); if (server->pkcs) @@ -149,6 +150,9 @@ bool silc_server_init(SilcServer server) assert(server); assert(server->config); + silc_server_config_ref(&server->config_ref, server->config, + server->config); + /* Set public and private keys */ if (!server->config->server_info || !server->config->server_info->public_key || @@ -362,22 +366,27 @@ bool silc_server_rehash(SilcServer server) { SilcServerConfig newconfig; + /* Our old config is gone now. We'll unreference our reference made in + silc_server_init and then destroy it since we are destroying it + underneath the application (layer which called silc_server_init). */ + silc_server_config_unref(&server->config_ref); + silc_server_config_destroy(server->config); + /* Reset the logging system */ silc_log_quick = TRUE; silc_log_flush_all(); /* Start the main rehash phase (read again the config file) */ SILC_LOG_INFO(("Rehashing server")); - newconfig = silc_server_config_alloc(server, server->config_file); + newconfig = silc_server_config_alloc(server->config_file); if (!newconfig) { SILC_LOG_ERROR(("Rehash FAILED.")); return FALSE; } - /* Destroy old config context. This is destroyed if no one is referencing - it at the moment. */ - silc_server_config_destroy(server->config); + /* Take new config context */ server->config = newconfig; + silc_server_config_ref(&server->config_ref, server->config, server->config); /* Set public and private keys */ if (!server->config->server_info || diff --git a/apps/silcd/serverconfig.c b/apps/silcd/serverconfig.c index eb743d83..8a8aea50 100644 --- a/apps/silcd/serverconfig.c +++ b/apps/silcd/serverconfig.c @@ -1195,11 +1195,11 @@ static void silc_server_config_set_defaults(SilcServerConfig config) } /* Allocates a new configuration object, opens configuration file and - * parses it. The parsed data is returned to the newly allocated - * configuration object. */ + parses it. The parsed data is returned to the newly allocated + configuration object. The SilcServerConfig must be freed by calling + the silc_server_config_destroy function. */ -SilcServerConfig silc_server_config_alloc(SilcServer server, - const char *filename) +SilcServerConfig silc_server_config_alloc(const char *filename) { SilcServerConfig config_new; SilcConfigEntity ent; @@ -1265,7 +1265,7 @@ SilcServerConfig silc_server_config_alloc(SilcServer server, /* Set default to configuration parameters */ silc_server_config_set_defaults(config_new); - silc_server_config_ref(&server->config_ref, config_new, config_new); + config_new->refcount = 1; return config_new; } @@ -1288,14 +1288,8 @@ void silc_server_config_ref(SilcServerConfigRef *ref, SilcServerConfig config, void silc_server_config_unref(SilcServerConfigRef *ref) { - SilcServerConfig config = ref->config; - if (ref->ref_ptr) { - config->refcount--; - SILC_LOG_DEBUG(("Unreferencing config [%p] refcnt %hu->%hu", config, - config->refcount + 1, config->refcount)); - if (!config->refcount) - silc_server_config_destroy(config); - } + if (ref->ref_ptr) + silc_server_config_destroy(ref->config); } /* Destroy a config object with all his children lists */ @@ -1304,13 +1298,11 @@ void silc_server_config_destroy(SilcServerConfig config) { void *tmp; - if (config->refcount > 0) { - config->refcount--; - SILC_LOG_DEBUG(("Unreferencing config [%p] refcnt %hu->%hu", config, - config->refcount + 1, config->refcount)); - if (config->refcount > 0) - return; - } + config->refcount--; + SILC_LOG_DEBUG(("Unreferencing config [%p] refcnt %hu->%hu", config, + config->refcount + 1, config->refcount)); + if (config->refcount > 0) + return; SILC_LOG_DEBUG(("Freeing config context")); diff --git a/apps/silcd/serverconfig.h b/apps/silcd/serverconfig.h index d2e0a40e..a842576b 100644 --- a/apps/silcd/serverconfig.h +++ b/apps/silcd/serverconfig.h @@ -150,7 +150,7 @@ typedef struct { void *tmp; /* Reference count (when this reaches zero, config object is destroyed) */ - SilcUInt16 refcount; + SilcInt16 refcount; /* The General section */ char *module_path; @@ -189,8 +189,7 @@ typedef struct { /* Prototypes */ /* Basic config operations */ -SilcServerConfig silc_server_config_alloc(SilcServer server, - const char *filename); +SilcServerConfig silc_server_config_alloc(const char *filename); void silc_server_config_destroy(SilcServerConfig config); void silc_server_config_ref(SilcServerConfigRef *ref, SilcServerConfig config, void *ref_ptr); diff --git a/apps/silcd/silcd.c b/apps/silcd/silcd.c index c2318925..ee328f93 100644 --- a/apps/silcd/silcd.c +++ b/apps/silcd/silcd.c @@ -268,7 +268,7 @@ int main(int argc, char **argv) goto fail; /* Read configuration files */ - silcd->config = silc_server_config_alloc(silcd, silcd_config_file); + silcd->config = silc_server_config_alloc(silcd_config_file); if (silcd->config == NULL) goto fail; silcd->config_file = silcd_config_file; diff --git a/lib/silcutil/silclog.c b/lib/silcutil/silclog.c index 3bd46b35..040f51e0 100644 --- a/lib/silcutil/silclog.c +++ b/lib/silcutil/silclog.c @@ -158,7 +158,7 @@ static bool silc_log_reset(SilcLog log) SILC_TASK_CALLBACK(silc_log_fflush_callback) { unsigned int u; - if (silc_log_quick) { + if (!silc_log_quick) { silc_log_flush_all(); SILC_FOREACH_LOG(u) silc_log_checksize(&silclogs[u]); -- 2.24.0