+2007-08-20 Martin Hunt <hunt@redhat.com>
+ PR2424
+ From Lai Jiangshan <laijs@cn.fujitsu.com>
+
+ * util.cxx (cmdstr_quoted): New. Properly quote
+ command string.
+ * buildrun.cxx (run_pass): Call cmdstr_quoted().
+
2007-08-20 Frank Ch. Eigler <fche@elastic.org>
From Satoru MORIYA <satoru.moriya.br@hitachi.com>
staprun_cmd += "-d " + stringify(getpid()) + " ";
if (s.cmd != "")
- staprun_cmd += "-c \"" + s.cmd + "\" ";
+ staprun_cmd += "-c " + cmdstr_quoted(s.cmd) + " ";
if (s.target_pid)
staprun_cmd += "-t " + stringify(s.target_pid) + " ";
return false;
}
+
+const string cmdstr_quoted(const string& cmd)
+{
+ // original cmd : substr1
+ // or : substr1'substr2
+ // or : substr1'substr2'substr3......
+ // after quoted :
+ // every substr(even it's empty) is quoted by ''
+ // every single-quote(') is quoted by ""
+ // examples: substr1 --> 'substr1'
+ // substr1'substr2 --> 'substr1'"'"'substr2'
+
+ string quoted_cmd;
+ string quote("'");
+ string replace("'\"'\"'");
+ string::size_type pos = 0;
+
+ quoted_cmd += quote;
+ for (string::size_type quote_pos = cmd.find(quote, pos);
+ quote_pos != string::npos;
+ quote_pos = cmd.find(quote, pos)) {
+ quoted_cmd += cmd.substr(pos, quote_pos - pos);
+ quoted_cmd += replace;
+ pos = quote_pos + 1;
+ }
+ quoted_cmd += cmd.substr(pos, cmd.length() - pos);
+ quoted_cmd += quote;
+
+ return quoted_cmd;
+}
+
void tokenize(const std::string& str, std::vector<std::string>& tokens,
const std::string& delimiters);
bool find_executable(const char *name, std::string& retpath);
+const std::string cmdstr_quoted(const std::string& cmd);
// stringification generics