diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2020-10-05 17:10:24 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2020-10-05 17:10:24 +0200 |
commit | fa7f83b26aaa0b5a8bebf508f01a25ac26b94c83 (patch) | |
tree | 0d705706e823301ac9460e82f605d6629de054a4 /shared/systemd/src/basic/strv.c | |
parent | 6220b08c78391008ef3779368e02b28a04d35b23 (diff) | |
parent | aaf882b8592a279a76222cc6ff4223729650aa37 (diff) | |
download | NetworkManager-fa7f83b26aaa0b5a8bebf508f01a25ac26b94c83.tar.gz |
systemd: merge branch systemd into master
Diffstat (limited to 'shared/systemd/src/basic/strv.c')
-rw-r--r-- | shared/systemd/src/basic/strv.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/shared/systemd/src/basic/strv.c b/shared/systemd/src/basic/strv.c index fcb31d1ef5..30d3af460a 100644 --- a/shared/systemd/src/basic/strv.c +++ b/shared/systemd/src/basic/strv.c @@ -373,7 +373,7 @@ int strv_split_colon_pairs(char ***t, const char *s) { } #endif /* NM_IGNORED */ -char *strv_join_prefix(char * const *l, const char *separator, const char *prefix) { +char *strv_join_full(char * const *l, const char *separator, const char *prefix, bool unescape_separators) { char * const *s; char *r, *e; size_t n, k, m; @@ -384,11 +384,17 @@ char *strv_join_prefix(char * const *l, const char *separator, const char *prefi k = strlen(separator); m = strlen_ptr(prefix); + if (unescape_separators) /* If there separator is multi-char, we won't know how to escape it. */ + assert(k == 1); + n = 0; STRV_FOREACH(s, l) { if (s != l) n += k; - n += m + strlen(*s); + + bool needs_escaping = unescape_separators && strchr(*s, separator[0]); + + n += m + strlen(*s) * (1 + needs_escaping); } r = new(char, n+1); @@ -403,7 +409,16 @@ char *strv_join_prefix(char * const *l, const char *separator, const char *prefi if (prefix) e = stpcpy(e, prefix); - e = stpcpy(e, *s); + bool needs_escaping = unescape_separators && strchr(*s, separator[0]); + + if (needs_escaping) + for (size_t i = 0; (*s)[i]; i++) { + if ((*s)[i] == separator[0]) + *(e++) = '\\'; + *(e++) = (*s)[i]; + } + else + e = stpcpy(e, *s); } *e = 0; |