mirror of
https://github.com/systemd/systemd.git
synced 2025-03-31 14:50:15 +03:00
strv: Add strv_shell_escape
This modifies the strv in-place, replacing strings with their escaped version. It's mostly just a convenience function for when you need to join a strv together because it's passed as a string to something, and the separator needs escaping.
This commit is contained in:
parent
61ee693981
commit
04c14b2541
@ -694,6 +694,26 @@ char **strv_reverse(char **l) {
|
||||
return l;
|
||||
}
|
||||
|
||||
char **strv_shell_escape(char **l, const char *bad) {
|
||||
char **s;
|
||||
|
||||
/* Escapes every character in every string in l that is in bad,
|
||||
* edits in-place, does not roll-back on error. */
|
||||
|
||||
STRV_FOREACH(s, l) {
|
||||
char *v;
|
||||
|
||||
v = shell_escape(*s, bad);
|
||||
if (!v)
|
||||
return NULL;
|
||||
|
||||
free(*s);
|
||||
*s = v;
|
||||
}
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
bool strv_fnmatch(char* const* patterns, const char *s, int flags) {
|
||||
char* const* p;
|
||||
|
||||
|
@ -145,6 +145,7 @@ void strv_print(char **l);
|
||||
}))
|
||||
|
||||
char **strv_reverse(char **l);
|
||||
char **strv_shell_escape(char **l, const char *bad);
|
||||
|
||||
bool strv_fnmatch(char* const* patterns, const char *s, int flags);
|
||||
|
||||
|
@ -557,6 +557,18 @@ static void test_strv_reverse(void) {
|
||||
assert_se(streq_ptr(d[3], NULL));
|
||||
}
|
||||
|
||||
static void test_strv_shell_escape(void) {
|
||||
_cleanup_strv_free_ char **v = NULL;
|
||||
|
||||
v = strv_new("foo:bar", "bar,baz", "wal\\do", NULL);
|
||||
assert_se(v);
|
||||
assert_se(strv_shell_escape(v, ",:"));
|
||||
assert_se(streq_ptr(v[0], "foo\\:bar"));
|
||||
assert_se(streq_ptr(v[1], "bar\\,baz"));
|
||||
assert_se(streq_ptr(v[2], "wal\\\\do"));
|
||||
assert_se(streq_ptr(v[3], NULL));
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
test_specifier_printf();
|
||||
test_strv_foreach();
|
||||
@ -614,6 +626,7 @@ int main(int argc, char *argv[]) {
|
||||
test_strv_equal();
|
||||
test_strv_is_uniq();
|
||||
test_strv_reverse();
|
||||
test_strv_shell_escape();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user