mirror of
https://github.com/systemd/systemd.git
synced 2025-02-04 21:47:31 +03:00
basic/escape: add helper for quoting command lines
This commit is contained in:
parent
5ca75ec9fc
commit
eeb91d29b0
@ -8,6 +8,7 @@
|
||||
#include "escape.h"
|
||||
#include "hexdecoct.h"
|
||||
#include "macro.h"
|
||||
#include "strv.h"
|
||||
#include "utf8.h"
|
||||
|
||||
int cescape_char(char c, char *buf) {
|
||||
@ -542,3 +543,23 @@ char* shell_maybe_quote(const char *s, ShellEscapeFlags flags) {
|
||||
|
||||
return str_realloc(buf);
|
||||
}
|
||||
|
||||
char* quote_command_line(char **argv) {
|
||||
_cleanup_free_ char *result = NULL;
|
||||
|
||||
assert(argv);
|
||||
|
||||
char **a;
|
||||
STRV_FOREACH(a, argv) {
|
||||
_cleanup_free_ char *t = NULL;
|
||||
|
||||
t = shell_maybe_quote(*a, SHELL_ESCAPE_EMPTY);
|
||||
if (!t)
|
||||
return NULL;
|
||||
|
||||
if (!strextend_with_separator(&result, " ", t))
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return TAKE_PTR(result);
|
||||
}
|
||||
|
@ -68,3 +68,4 @@ char* escape_non_printable_full(const char *str, size_t console_width, XEscapeFl
|
||||
|
||||
char* shell_escape(const char *s, const char *bad);
|
||||
char* shell_maybe_quote(const char *s, ShellEscapeFlags flags);
|
||||
char* quote_command_line(char **argv);
|
||||
|
@ -203,6 +203,29 @@ static void test_shell_maybe_quote(void) {
|
||||
test_shell_maybe_quote_one("głąb\002\003rząd", SHELL_ESCAPE_POSIX, "$'głąb\\002\\003rząd'");
|
||||
}
|
||||
|
||||
static void test_quote_command_line_one(char **argv, const char *expected) {
|
||||
_cleanup_free_ char *s;
|
||||
|
||||
assert_se(s = quote_command_line(argv));
|
||||
log_info("%s", s);
|
||||
assert_se(streq(s, expected));
|
||||
}
|
||||
|
||||
static void test_quote_command_line(void) {
|
||||
log_info("/* %s */", __func__);
|
||||
|
||||
test_quote_command_line_one(STRV_MAKE("true", "true"),
|
||||
"true true");
|
||||
test_quote_command_line_one(STRV_MAKE("true", "with a space"),
|
||||
"true \"with a space\"");
|
||||
test_quote_command_line_one(STRV_MAKE("true", "with a 'quote'"),
|
||||
"true \"with a 'quote'\"");
|
||||
test_quote_command_line_one(STRV_MAKE("true", "with a \"quote\""),
|
||||
"true \"with a \\\"quote\\\"\"");
|
||||
test_quote_command_line_one(STRV_MAKE("true", "$dollar"),
|
||||
"true \"\\$dollar\"");
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
test_setup_logging(LOG_DEBUG);
|
||||
|
||||
@ -213,6 +236,7 @@ int main(int argc, char *argv[]) {
|
||||
test_cunescape();
|
||||
test_shell_escape();
|
||||
test_shell_maybe_quote();
|
||||
test_quote_command_line();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user