diff options
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/unit-name.c | 23 | ||||
-rw-r--r-- | src/shared/unit-name.h | 4 | ||||
-rw-r--r-- | src/shared/util.h | 14 |
3 files changed, 27 insertions, 14 deletions
diff --git a/src/shared/unit-name.c b/src/shared/unit-name.c index 178efefdbf..832b926813 100644 --- a/src/shared/unit-name.c +++ b/src/shared/unit-name.c @@ -481,15 +481,18 @@ int unit_name_from_dbus_path(const char *path, char **name) { return 0; } -char *unit_name_mangle(const char *name) { + +/** + * Try to turn a string that might not be a unit name into a + * sensible unit name. + */ +char *unit_name_mangle(const char *name, bool allow_globs) { char *r, *t; const char *f; + const char* valid_chars = allow_globs ? "@" VALID_CHARS "[]!-*?" : "@" VALID_CHARS; assert(name); - /* Try to turn a string that might not be a unit name into a - * sensible unit name. */ - if (is_device_path(name)) return unit_name_from_path(name, ".device"); @@ -506,7 +509,7 @@ char *unit_name_mangle(const char *name) { for (f = name, t = r; *f; f++) { if (*f == '/') *(t++) = '-'; - else if (!strchr("@" VALID_CHARS, *f)) + else if (!strchr(valid_chars, *f)) t = do_escape_char(*f, t); else *(t++) = *f; @@ -520,7 +523,12 @@ char *unit_name_mangle(const char *name) { return r; } -char *unit_name_mangle_with_suffix(const char *name, const char *suffix) { + +/** + * Similar to unit_name_mangle(), but is called when we know + * that this is about a specific unit type. + */ +char *unit_name_mangle_with_suffix(const char *name, bool allow_globs, const char *suffix) { char *r, *t; const char *f; @@ -528,9 +536,6 @@ char *unit_name_mangle_with_suffix(const char *name, const char *suffix) { assert(suffix); assert(suffix[0] == '.'); - /* Similar to unit_name_mangle(), but is called when we know - * that this is about snapshot units. */ - r = new(char, strlen(name) * 4 + strlen(suffix) + 1); if (!r) return NULL; diff --git a/src/shared/unit-name.h b/src/shared/unit-name.h index 57719d5448..362ff0c00c 100644 --- a/src/shared/unit-name.h +++ b/src/shared/unit-name.h @@ -98,7 +98,7 @@ char *unit_name_to_path(const char *name); char *unit_dbus_path_from_name(const char *name); int unit_name_from_dbus_path(const char *path, char **name); -char *unit_name_mangle(const char *name); -char *unit_name_mangle_with_suffix(const char *name, const char *suffix); +char *unit_name_mangle(const char *name, bool allow_globs); +char *unit_name_mangle_with_suffix(const char *name, bool allow_globs, const char *suffix); int build_subslice(const char *slice, const char*name, char **subslice); diff --git a/src/shared/util.h b/src/shared/util.h index b37072f24a..f6d2cedd88 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -47,9 +47,10 @@ /* What is interpreted as whitespace? */ #define WHITESPACE " \t\n\r" -#define NEWLINE "\n\r" -#define QUOTES "\"\'" -#define COMMENTS "#;" +#define NEWLINE "\n\r" +#define QUOTES "\"\'" +#define COMMENTS "#;" +#define GLOB_CHARS "*?[" #define FORMAT_BYTES_MAX 8 @@ -627,6 +628,13 @@ bool path_is_safe(const char *p) _pure_; bool string_is_safe(const char *p) _pure_; bool string_has_cc(const char *p) _pure_; +/** + * Check if a string contains any glob patterns. + */ +_pure_ static inline bool string_is_glob(const char *p) { + return !!strpbrk(p, GLOB_CHARS); +} + void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *, void *), void *arg); |