diff options
author | hunt <hunt> | 2007-08-20 17:55:03 +0000 |
---|---|---|
committer | hunt <hunt> | 2007-08-20 17:55:03 +0000 |
commit | 8c711d30367365fa6a036e468eba4401d26131a3 (patch) | |
tree | e277133ca28d48b7fb841d6866953576ec9dd544 | |
parent | 322566b3574d9cb452e20f9b74bc0b7d3d9dcfe6 (diff) | |
download | systemtap-steved-8c711d30367365fa6a036e468eba4401d26131a3.tar.gz systemtap-steved-8c711d30367365fa6a036e468eba4401d26131a3.tar.xz systemtap-steved-8c711d30367365fa6a036e468eba4401d26131a3.zip |
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().
-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 |