Projects
Mega:23.03
systemd
_service:tar_scm:backport-basic-escape-add-help...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:backport-basic-escape-add-helper-for-quoting-command-lines.patch of Package systemd
From 17d1b0d2dd109c5e413d8ef1eb5835344f9314b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> Date: Wed, 7 Jul 2021 16:27:51 +0200 Subject: [PATCH] basic/escape: add helper for quoting command lines (cherry picked from commit eeb91d29b0279d6bf8a3f1c4da54c9e9c0881a19) Conflict:NA Reference:https://github.com/systemd/systemd/commit/17d1b0d2dd109c5e413d8ef1eb5835344f9314b9 --- src/basic/escape.c | 21 +++++++++++++++++++++ src/basic/escape.h | 1 + src/test/test-escape.c | 24 ++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/src/basic/escape.c b/src/basic/escape.c index 2a3a0e31a1..fcade5a1b4 100644 --- a/src/basic/escape.c +++ b/src/basic/escape.c @@ -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); +} diff --git a/src/basic/escape.h b/src/basic/escape.h index 907b572bd4..e9d48d227a 100644 --- a/src/basic/escape.h +++ b/src/basic/escape.h @@ -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); diff --git a/src/test/test-escape.c b/src/test/test-escape.c index 991b135a33..8bda9cdc8d 100644 --- a/src/test/test-escape.c +++ b/src/test/test-escape.c @@ -192,6 +192,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); @@ -202,6 +225,7 @@ int main(int argc, char *argv[]) { test_cunescape(); test_shell_escape(); test_shell_maybe_quote(); + test_quote_command_line(); return 0; } -- 2.33.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2