summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-12-25 18:10:18 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-12-26 13:24:36 -0500
commite3e0314b56012f7febc279d268f2cadc1fcc0f25 (patch)
tree77167853e86557b2ec2e377ebdcebc91e1d13df4 /src/shared
parent8d5ba5a946388c965632713f6c1abfb3acba17f7 (diff)
systemctl: allow globbing in commands which take multiple unit names
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/unit-name.c23
-rw-r--r--src/shared/unit-name.h4
-rw-r--r--src/shared/util.h14
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);