From 0e52b111f3731611ff6c5be2bf0bd849d4e012fb Mon Sep 17 00:00:00 2001 From: DDuarte Date: Tue, 29 Jul 2014 01:47:00 +0100 Subject: Core/Config: User-friendlyfy configuration parsing errors It will now print useful error messages that pinpoint the issue with the config file (missing file, bad syntax, etc) In memory of MitchesD that lost 18 hours finding a problem with his config because of a duplicated line. --- src/server/shared/Configuration/Config.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src/server/shared/Configuration/Config.cpp') diff --git a/src/server/shared/Configuration/Config.cpp b/src/server/shared/Configuration/Config.cpp index ecebf30182e..6b83f562520 100644 --- a/src/server/shared/Configuration/Config.cpp +++ b/src/server/shared/Configuration/Config.cpp @@ -25,7 +25,7 @@ using namespace boost::property_tree; -bool ConfigMgr::LoadInitial(std::string const& file) +bool ConfigMgr::LoadInitial(std::string const& file, std::string& error) { std::lock_guard lock(_configLock); @@ -34,25 +34,32 @@ bool ConfigMgr::LoadInitial(std::string const& file) try { ptree fullTree; - boost::property_tree::ini_parser::read_ini(file, fullTree); + ini_parser::read_ini(file, fullTree); if (fullTree.empty()) + { + error = "empty file (" + file + ")"; return false; + } // Since we're using only one section per config file, we skip the section and have direct property access _config = fullTree.begin()->second; } - catch (std::exception const& /*ex*/) + catch (ini_parser::ini_parser_error const& e) { + if (e.line() == 0) + error = e.message() + " (" + e.filename() + ")"; + else + error = e.message() + " (" + e.filename() + ":" + std::to_string(e.line()) + ")"; return false; } return true; } -bool ConfigMgr::Reload() +bool ConfigMgr::Reload(std::string& error) { - return LoadInitial(_filename.c_str()); + return LoadInitial(_filename.c_str(), error); } std::string ConfigMgr::GetStringDefault(std::string const& name, const std::string& def) -- cgit v1.2.3