1
0
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:
Richard Maw 2015-06-23 10:57:41 +00:00
parent 61ee693981
commit 04c14b2541
3 changed files with 34 additions and 0 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;
}