]> granicus.if.org Git - icinga2/commitdiff
Print DebugInfo for failed #includes
authorGunnar Beutner <gunnar.beutner@netways.de>
Sun, 3 Feb 2013 00:41:00 +0000 (01:41 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Sun, 3 Feb 2013 00:41:00 +0000 (01:41 +0100)
Fixes #3613

lib/config/config_parser.cc
lib/config/config_parser.yy
lib/config/configcompiler.cpp
lib/config/configcompiler.h

index 1a473b1f2b5c61d30a75bdf327c9044ec8d14773..8dbf738bf58de9cc7a1b019eda9510dc10f1c5b3 100644 (file)
@@ -1618,7 +1618,7 @@ yyreduce:
 /* Line 1806 of yacc.c  */
 #line 118 "config_parser.yy"
     {
-               context->HandleInclude((yyvsp[(2) - (2)].text), false);
+               context->HandleInclude((yyvsp[(2) - (2)].text), false, yylloc);
        }
     break;
 
@@ -1627,7 +1627,7 @@ yyreduce:
 /* Line 1806 of yacc.c  */
 #line 122 "config_parser.yy"
     {
-               context->HandleInclude((yyvsp[(2) - (2)].text), true);
+               context->HandleInclude((yyvsp[(2) - (2)].text), true, yylloc);
        }
     break;
 
index 9330e0a7576b4c2427b5c326d918adafe15b81c8..5c9a3a7f3530496b3b20183cf71dc2314d8b2a9e 100644 (file)
@@ -116,11 +116,11 @@ statement: object | type | include | library
 
 include: T_INCLUDE T_STRING
        {
-               context->HandleInclude($2, false);
+               context->HandleInclude($2, false, yylloc);
        }
        | T_INCLUDE T_STRING_ANGLE
        {
-               context->HandleInclude($2, true);
+               context->HandleInclude($2, true, yylloc);
        }
 
 library: T_LIBRARY T_STRING
index a4332b49362cf43225df57b740cf3092d8fb0af6..fd9c072989898e30f5e60f8d2fd39e7a4550c2d0 100644 (file)
@@ -114,13 +114,14 @@ String ConfigCompiler::GetPath(void) const
  *
  * @param include The path from the include directive.
  * @param search Whether to search global include dirs.
+ * @param debuginfo Debug information.
  */
-void ConfigCompiler::HandleInclude(const String& include, bool search)
+void ConfigCompiler::HandleInclude(const String& include, bool search, const DebugInfo& debuginfo)
 {
        String path = Utility::DirName(GetPath()) + "/" + include;
 
        vector<ConfigType::Ptr> types;
-       m_HandleInclude(path, search, &m_ResultObjects, &types);
+       m_HandleInclude(path, search, &m_ResultObjects, &types, debuginfo);
 
        BOOST_FOREACH(const ConfigType::Ptr& type, types) {
                AddType(type);
@@ -202,9 +203,13 @@ void ConfigCompiler::CompileText(const String& path, const String& text,
  * configuration items.
  *
  * @param include The path from the include directive.
+ * @param search Whether to search include dirs.
+ * @param resultItems The resulting items.
+ * @param resultTypes The resulting types.
+ * @param debuginfo Debug information.
  */
 void ConfigCompiler::HandleFileInclude(const String& include, bool search,
-    vector<ConfigItem::Ptr> *resultItems, vector<ConfigType::Ptr> *resultTypes)
+    vector<ConfigItem::Ptr> *resultItems, vector<ConfigType::Ptr> *resultTypes, const DebugInfo& debuginfo)
 {
        String includePath = include;
 
@@ -229,8 +234,11 @@ void ConfigCompiler::HandleFileInclude(const String& include, bool search,
 
        vector<ConfigItem::Ptr> items;
 
-       if (!Utility::Glob(includePath, boost::bind(&ConfigCompiler::CompileFile, _1, resultItems, resultTypes)))
-               throw_exception(invalid_argument("Include file '" + include + "' does not exist (or no files found for pattern)."));
+       if (!Utility::Glob(includePath, boost::bind(&ConfigCompiler::CompileFile, _1, resultItems, resultTypes))) {
+               stringstream msgbuf;
+               msgbuf << "Include file '" + include + "' does not exist (or no files found for pattern): " << debuginfo;
+               throw_exception(invalid_argument(msgbuf.str()));
+       }
 }
 
 /**
index c697162c6af0ba71d58fd3af6321aa59c3363c25..006e5443286cca2d2f8adbf7b3acfc3a0d0d5376 100644 (file)
@@ -32,7 +32,8 @@ namespace icinga
 class I2_CONFIG_API ConfigCompiler
 {
 public:
-       typedef function<void (const String&, bool, vector<ConfigItem::Ptr> *, vector<ConfigType::Ptr> *)> HandleIncludeFunc;
+       typedef function<void (const String&, bool, vector<ConfigItem::Ptr> *,
+           vector<ConfigType::Ptr> *, const DebugInfo&)> HandleIncludeFunc;
 
        ConfigCompiler(const String& path, istream *input = &cin,
            HandleIncludeFunc includeHandler = &ConfigCompiler::HandleFileInclude);
@@ -54,10 +55,11 @@ public:
        String GetPath(void) const;
 
        static void HandleFileInclude(const String& include, bool search,
-           vector<ConfigItem::Ptr> *resultItems, vector<ConfigType::Ptr> *resultTypes);
+           vector<ConfigItem::Ptr> *resultItems, vector<ConfigType::Ptr> *resultTypes,
+           const DebugInfo& debuginfo);
        
        /* internally used methods */
-       void HandleInclude(const String& include, bool search);
+       void HandleInclude(const String& include, bool search, const DebugInfo& debuginfo);
        void HandleLibrary(const String& library);
        
        void AddObject(const ConfigItem::Ptr& object);