From bb9f81c08d7be7c8364a354bb621f05531f1d5bb Mon Sep 17 00:00:00 2001 From: Christian Thaeter Date: Thu, 7 Aug 2008 13:23:07 +0200 Subject: [PATCH] fixed code to do whats specified, but needs refactoring even in case of an configuration error the returned value is primed with the default. The error condition needs still be cleared! Broken defaults would be unnoticed in case of a double error! --- src/backend/config.c | 1 + src/backend/config_typed.c | 50 +++++++++++++++++++++++--------------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/backend/config.c b/src/backend/config.c index a1df1fbf7..5e393e449 100644 --- a/src/backend/config.c +++ b/src/backend/config.c @@ -152,6 +152,7 @@ lumiera_config_get (const char* key, const char** value) else { TODO ("lookup key"); + ret = 0; /* assume that the lockup worked for now, value is still NULL, just no error set */ } } diff --git a/src/backend/config_typed.c b/src/backend/config_typed.c index bc5342e53..08db10f19 100644 --- a/src/backend/config_typed.c +++ b/src/backend/config_typed.c @@ -52,33 +52,43 @@ lumiera_config_number_get (const char* key, long long* value, const char* def) LUMIERA_RDLOCK_SECTION (config_typed, lumiera_global_config->rh, &lumiera_global_config->lock) { - if (lumiera_config_get (key, &raw_value)) + if (!lumiera_config_get (key, &raw_value)) { - /* not found, fall back to default */ - raw_value = def; - TODO ("register default, if given (writelock or mutex!)"); - } - - if (raw_value) - { - if (sscanf (raw_value, "%Li", value) == 1) - ret = 0; /* all ok */ - else + if (raw_value) { - if (def && raw_value != def) + /* got it, scan it */ + if (sscanf (raw_value, "%Li", value) == 1) + ret = 0; /* all ok */ + else { - /* we have a 2nd chance, using the default */ - if (sscanf (def, "%Li", value) == 1) - ret = 0; /* all ok */ - else - LUMIERA_ERROR_SET (config_typed, CONFIG_DEFAULT); + LUMIERA_ERROR_SET (config_typed, CONFIG_TYPE); + if (def) + /* even when we return an error code we still try to initialize value with our default while in error state */ + goto try_default; + } + } + else if (def) + { + /* not found, fall back to default */ + ret = 0; /* we presume that the default is ok */ + try_default: + + if (sscanf (def, "%Li", value) == 1) + { + TODO ("register default (writelock or mutex!)"); } else - LUMIERA_ERROR_SET (config_typed, CONFIG_TYPE); + { + /* default value is broken!! */ + /* note that this error gets ignored when we had a type error above */ + ret = -1; + LUMIERA_ERROR_SET (config_typed, CONFIG_DEFAULT); + } } + else + /* finally, no config, no default, give up */ + LUMIERA_ERROR_SET (config, CONFIG_NO_ENTRY); } - else - LUMIERA_ERROR_SET (config, CONFIG_NO_ENTRY); } return ret;