summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-11-18 13:21:15 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2009-11-18 13:21:15 +0100
commit2ccbb0e4bce7c22a44e67f2de9e5a155bd0aed86 (patch)
tree4ea69f9bf08405c742da54409508fa30d925c957
parentc76bab5d699030a22ab85b67422e5092d92fa376 (diff)
downloadabrt-2ccbb0e4bce7c22a44e67f2de9e5a155bd0aed86.tar.gz
abrt-2ccbb0e4bce7c22a44e67f2de9e5a155bd0aed86.tar.xz
abrt-2ccbb0e4bce7c22a44e67f2de9e5a155bd0aed86.zip
add support for \" escaping in config file
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--lib/Plugins/RunApp.cpp4
-rw-r--r--lib/Utils/stringops.cpp25
-rw-r--r--src/Daemon/PluginManager.cpp6
-rw-r--r--src/Daemon/Settings.cpp61
-rw-r--r--src/Daemon/abrt.conf4
5 files changed, 69 insertions, 31 deletions
diff --git a/lib/Plugins/RunApp.cpp b/lib/Plugins/RunApp.cpp
index a2aa6987..f7cbc018 100644
--- a/lib/Plugins/RunApp.cpp
+++ b/lib/Plugins/RunApp.cpp
@@ -52,6 +52,7 @@ void CActionRunApp::Run(const char *pActionDir, const char *pArgs)
*/
//Can do it using chdir() in child if we'd open-code popen
string cd_and_cmd = ssprintf("cd '%s'; %s", pActionDir, cmd);
+ VERB1 log("RunApp: executing '%s'", cd_and_cmd.c_str());
FILE *fp = popen(cd_and_cmd.c_str(), "r");
if (fp == NULL)
{
@@ -65,7 +66,8 @@ void CActionRunApp::Run(const char *pActionDir, const char *pArgs)
char line[1024];
while (fgets(line, 1024, fp) != NULL)
{
- output += line;
+ if (args.size() > FILENAME)
+ output += line;
}
pclose(fp);
diff --git a/lib/Utils/stringops.cpp b/lib/Utils/stringops.cpp
index 1b3793fc..dc71b5bd 100644
--- a/lib/Utils/stringops.cpp
+++ b/lib/Utils/stringops.cpp
@@ -3,24 +3,33 @@
void parse_args(const char *psArgs, vector_string_t& pArgs, int quote)
{
unsigned ii;
- bool is_quote = false;
+ bool inside_quotes = false;
std::string item;
for (ii = 0; psArgs[ii]; ii++)
{
- if (quote != -1 && psArgs[ii] == quote)
+ if (quote != -1)
{
- is_quote = !is_quote;
+ if (psArgs[ii] == quote)
+ {
+ inside_quotes = !inside_quotes;
+ continue;
+ }
+ /* inside quotes we support escaping with \x */
+ if (inside_quotes && psArgs[ii] == '\\' && psArgs[ii+1])
+ {
+ ii++;
+ item += psArgs[ii];
+ continue;
+ }
}
- else if (psArgs[ii] == ',' && !is_quote)
+ if (psArgs[ii] == ',' && !inside_quotes)
{
pArgs.push_back(item);
item.clear();
+ continue;
}
- else
- {
- item += psArgs[ii];
- }
+ item += psArgs[ii];
}
if (item.size() != 0)
diff --git a/src/Daemon/PluginManager.cpp b/src/Daemon/PluginManager.cpp
index 5865e42c..3867ec9b 100644
--- a/src/Daemon/PluginManager.cpp
+++ b/src/Daemon/PluginManager.cpp
@@ -150,10 +150,10 @@ void CPluginManager::LoadPlugins()
void CPluginManager::UnLoadPlugins()
{
- map_abrt_plugins_t::iterator it_p = m_mapABRTPlugins.begin();
- while (it_p != m_mapABRTPlugins.end())
+ map_abrt_plugins_t::iterator it;
+ while ((it = m_mapABRTPlugins.begin()) != m_mapABRTPlugins.end())
{
- UnLoadPlugin(it_p->first.c_str());
+ UnLoadPlugin(it->first.c_str());
}
}
diff --git a/src/Daemon/Settings.cpp b/src/Daemon/Settings.cpp
index 7f419ec5..18767281 100644
--- a/src/Daemon/Settings.cpp
+++ b/src/Daemon/Settings.cpp
@@ -78,8 +78,11 @@ static set_string_t ParseList(const char* pList)
return set;
}
+/* (What format do we parse here?) */
static vector_pair_string_string_t ParseListWithArgs(const char *pValue)
{
+ VERB3 log(" ParseListWithArgs(%s)", pValue);
+
vector_pair_string_string_t pluginsWithArgs;
unsigned int ii;
std::string item;
@@ -88,39 +91,55 @@ static vector_pair_string_string_t ParseListWithArgs(const char *pValue)
bool is_arg = false;
for (ii = 0; pValue[ii]; ii++)
{
- if (pValue[ii] == '\"')
+ if (is_quote && pValue[ii] == '\\' && pValue[ii+1])
+ {
+ item += pValue[ii];
+ ii++;
+ item += pValue[ii];
+ continue;
+ }
+ if (pValue[ii] == '"')
{
is_quote = !is_quote;
item += pValue[ii];
+ continue;
+ }
+ if (is_quote)
+ {
+ item += pValue[ii];
+ continue;
}
- else if (pValue[ii] == '(' && !is_quote)
+ if (pValue[ii] == '(')
{
action = item;
item = "";
is_arg = true;
+ continue;
}
- else if (pValue[ii] == ')' && is_arg && !is_quote)
+ if (pValue[ii] == ')' && is_arg)
{
+ VERB3 log(" adding (%s,%s)", action.c_str(), item.c_str());
pluginsWithArgs.push_back(make_pair(action, item));
item = "";
is_arg = false;
action = "";
+ continue;
}
- else if (pValue[ii] == ',' && !is_quote && !is_arg)
+ if (pValue[ii] == ',' && !is_arg)
{
if (item != "")
{
+ VERB3 log(" adding (%s,%s)", item.c_str(), "");
pluginsWithArgs.push_back(make_pair(item, ""));
item = "";
}
+ continue;
}
- else
- {
- item += pValue[ii];
- }
+ item += pValue[ii];
}
if (item != "")
{
+ VERB3 log(" adding (%s,%s)", item.c_str(), "");
pluginsWithArgs.push_back(make_pair(item, ""));
}
return pluginsWithArgs;
@@ -255,42 +274,50 @@ void LoadSettings()
std::string value;
for (ii = 0; ii < line.length(); ii++)
{
+ if (is_quote && line[ii] == '\\' && ii+1 < line.length())
+ {
+ value += line[ii];
+ ii++;
+ value += line[ii];
+ continue;
+ }
if (isspace(line[ii]) && !is_quote)
{
continue;
}
- else if (line[ii] == '#' && !is_quote && key == "")
+ if (line[ii] == '#' && !is_quote && key == "")
{
break;
}
- else if (line[ii] == '[' && !is_quote)
+ if (line[ii] == '[' && !is_quote)
{
is_section = true;
section = "";
+ continue;
}
- else if (line[ii] == '\"')
+ if (line[ii] == '"')
{
is_quote = !is_quote;
value += line[ii];
+ continue;
}
- else if (is_section)
+ if (is_section)
{
if (line[ii] == ']')
{
break;
}
section += line[ii];
+ continue;
}
- else if (line[ii] == '=' && !is_quote)
+ if (line[ii] == '=' && !is_quote)
{
is_key = false;
key = value;
value = "";
+ continue;
}
- else
- {
- value += line[ii];
- }
+ value += line[ii];
}
if (!is_key && !is_quote)
{
diff --git a/src/Daemon/abrt.conf b/src/Daemon/abrt.conf
index f24ec4a8..028f582d 100644
--- a/src/Daemon/abrt.conf
+++ b/src/Daemon/abrt.conf
@@ -17,14 +17,14 @@ Database = SQLite3
MaxCrashReportsSize = 1000
# Vector of actions and reporters which are activated immediately after a crash occurs
#ActionsAndReporters = Mailx("[abrt] new crash was detected")
-# TODO: teach parser to escape \". Should be: x"`cat component`" = x"xorg-x11-server-Xorg"
-ActionsAndReporters = RunApp("test x`cat component` = xxorg-x11-server-Xorg && cp /var/log/Xorg*.log .")
+ActionsAndReporters = RunApp("test x\"`cat component`\" = x\"xorg-x11-server-Xorg\" && cp /var/log/Xorg.0.log .")
# Reporters association with analyzers
[ AnalyzerActionsAndReporters ]
Kerneloops = KerneloopsReporter
CCpp = Bugzilla, Logger
Python = Bugzilla, Logger
+#CCpp:xorg-x11-apps = RunApp("date", "date.txt")
# Repeated calling of Action plugins
[ Cron ]