summaryrefslogtreecommitdiff
path: root/shared/systemd/src/basic/strv.c
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2020-10-05 17:10:24 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2020-10-05 17:10:24 +0200
commitfa7f83b26aaa0b5a8bebf508f01a25ac26b94c83 (patch)
tree0d705706e823301ac9460e82f605d6629de054a4 /shared/systemd/src/basic/strv.c
parent6220b08c78391008ef3779368e02b28a04d35b23 (diff)
parentaaf882b8592a279a76222cc6ff4223729650aa37 (diff)
downloadNetworkManager-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.c21
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;