diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | buildrun.cxx | 2 | ||||
-rw-r--r-- | util.cxx | 31 | ||||
-rw-r--r-- | util.h | 1 |
4 files changed, 41 insertions, 1 deletions
@@ -1,3 +1,11 @@ +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> diff --git a/buildrun.cxx b/buildrun.cxx index 221d0463..2fb3439c 100644 --- a/buildrun.cxx +++ b/buildrun.cxx @@ -139,7 +139,7 @@ run_pass (systemtap_session& s) 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) + " "; @@ -197,3 +197,34 @@ find_executable(const char *name, string& retpath) 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; +} + @@ -11,6 +11,7 @@ int create_dir(const char *dir); 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 |