changed return type of get_configuration in main: return configuration and bool flag
authorChristian Herdtweck <christian.herdtweck@intra2net.com>
Thu, 22 Jan 2015 14:03:19 +0000 (15:03 +0100)
committerChristian Herdtweck <christian.herdtweck@intra2net.com>
Thu, 22 Jan 2015 14:03:19 +0000 (15:03 +0100)
this way, always get a valid configuration object with default values and some values set
  even if parsing other options failed. Important for --version where usually fail to read
  config file but do not need it anyway

src/main.cpp

index bcf8e65..f331d94 100644 (file)
@@ -60,7 +60,8 @@ const boost::posix_time::time_duration SIGNAL_CHECK_INTERVAL = boost::posix_time
 // Declarations
 //-----------------------------------------------------------------------------
 
-ConfigurationItem get_configuration(int, const char**);
+typedef std::pair<bool, ConfigurationItem> GetConfigReturnType;
+GetConfigReturnType get_configuration(int, const char**);
 LinkStatusItem get_status_notifier(const ConfigurationItem&);
 void init_logger();
 void set_log_output(const ConfigurationItem &);
@@ -105,22 +106,18 @@ struct signal_data_struct
 // Definitions
 //-----------------------------------------------------------------------------
 
-ConfigurationItem get_configuration(
+GetConfigReturnType get_configuration(
         int argc,
         const char *argv[]
 )
 {
-    ConfigurationItem configuration;
-
     ConfigurationReader config_reader;
     bool parsed_success = config_reader.parse( argc, argv );
-    if ( parsed_success )
-    {
-        Configuration config_obj = config_reader.get_configuration();
-        configuration.reset( new Configuration( config_obj ) );
-    }
+    Configuration config_obj = config_reader.get_configuration();
 
-    return configuration;
+    ConfigurationItem configuration( new Configuration( config_obj ) );
+    GetConfigReturnType return_val( parsed_success, configuration );
+    return return_val;
 }
 
 LinkStatusItem get_status_notifier(
@@ -455,12 +452,23 @@ int main( int argc, const char *argv[] )
     unsigned max_exceptions = 0;
     try
     {
-        ConfigurationItem configuration = get_configuration( argc, argv );
-        if ( configuration.get() == NULL )
+        GetConfigReturnType success_and_config = get_configuration( argc, argv );
+        ConfigurationItem configuration = success_and_config.second;
+
+        if ( configuration->get_print_version() )     // do this even if parsing of config failed
+        {
+            GlobalLogger.debug() << "Printing version info (" << VERSION_STRING << ") and exit" << endl;
+            cout << PROJECT_NAME << " version " << VERSION_STRING << endl;
+            return 0;
+        }
+
+        if ( ! success_and_config.first )
         {
-            GlobalLogger.error() << "no configuration!";
+            GlobalLogger.error() << "Could not read/parse configuration!";
+            GlobalLogger.debug() << "Return 1 immediately" << endl;
             return 1;
         }
+        GlobalLogger.debug() << "Start setup" << endl;
 
         int log_level = configuration->get_log_level();
         I2n::Logger::set_log_level( log_level );