X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Funit-name.c;h=d0e71f24039c7602d30fd7fd4074d083c701d8a8;hp=bc8094d1129e85d36466e34f51d29b2f9de0920c;hb=6ef9eeed61a291cc42b7d911f5cf5a4deca742a3;hpb=6270c1bd8f83e9985458c63688f452be7626766f diff --git a/src/shared/unit-name.c b/src/shared/unit-name.c index bc8094d11..d0e71f240 100644 --- a/src/shared/unit-name.c +++ b/src/shared/unit-name.c @@ -24,6 +24,7 @@ #include #include "path-util.h" +#include "bus-label.h" #include "util.h" #include "unit-name.h" #include "def.h" @@ -35,13 +36,14 @@ static const char* const unit_type_table[_UNIT_TYPE_MAX] = { [UNIT_SERVICE] = "service", [UNIT_SOCKET] = "socket", + [UNIT_BUSNAME] = "busname", [UNIT_TARGET] = "target", + [UNIT_SNAPSHOT] = "snapshot", [UNIT_DEVICE] = "device", [UNIT_MOUNT] = "mount", [UNIT_AUTOMOUNT] = "automount", - [UNIT_SNAPSHOT] = "snapshot", - [UNIT_TIMER] = "timer", [UNIT_SWAP] = "swap", + [UNIT_TIMER] = "timer", [UNIT_PATH] = "path", [UNIT_SLICE] = "slice", [UNIT_SCOPE] = "scope" @@ -60,7 +62,7 @@ static const char* const unit_load_state_table[_UNIT_LOAD_STATE_MAX] = { DEFINE_STRING_TABLE_LOOKUP(unit_load_state, UnitLoadState); -bool unit_name_is_valid(const char *n, bool template_ok) { +bool unit_name_is_valid(const char *n, enum template_valid template_ok) { const char *e, *i, *at; /* Valid formats: @@ -70,6 +72,7 @@ bool unit_name_is_valid(const char *n, bool template_ok) { */ assert(n); + assert(IN_SET(template_ok, TEMPLATE_VALID, TEMPLATE_INVALID)); if (strlen(n) >= UNIT_NAME_MAX) return false; @@ -94,7 +97,7 @@ bool unit_name_is_valid(const char *n, bool template_ok) { if (at == n) return false; - if (!template_ok && at+1 == e) + if (!template_ok == TEMPLATE_VALID && at+1 == e) return false; } @@ -184,7 +187,7 @@ char *unit_name_change_suffix(const char *n, const char *suffix) { size_t a, b; assert(n); - assert(unit_name_is_valid(n, true)); + assert(unit_name_is_valid(n, TEMPLATE_VALID)); assert(suffix); assert(suffix[0] == '.'); @@ -291,7 +294,7 @@ char *unit_name_unescape(const char *f) { } char *unit_name_path_escape(const char *f) { - char *p, *e; + _cleanup_free_ char *p; assert(f); @@ -301,15 +304,10 @@ char *unit_name_path_escape(const char *f) { path_kill_slashes(p); - if (streq(p, "/") || streq(p, "")) { - free(p); + if (streq(p, "/") || streq(p, "")) return strdup("-"); - } - - e = unit_name_escape(p[0] == '/' ? p + 1 : p); - free(p); - return e; + return unit_name_escape(p[0] == '/' ? p + 1 : p); } char *unit_name_path_unescape(const char *f) { @@ -334,7 +332,7 @@ char *unit_name_path_unescape(const char *f) { } bool unit_name_is_template(const char *n) { - const char *p; + const char *p, *e; assert(n); @@ -342,11 +340,15 @@ bool unit_name_is_template(const char *n) { if (!p) return false; - return p[1] == '.'; + e = strrchr(p+1, '.'); + if (!e) + return false; + + return e == p + 1; } bool unit_name_is_instance(const char *n) { - const char *p; + const char *p, *e; assert(n); @@ -354,7 +356,11 @@ bool unit_name_is_instance(const char *n) { if (!p) return false; - return p[1] != '.'; + e = strrchr(p+1, '.'); + if (!e) + return false; + + return e > p + 1; } char *unit_name_replace_instance(const char *f, const char *i) { @@ -407,7 +413,7 @@ char *unit_name_template(const char *f) { } char *unit_name_from_path(const char *path, const char *suffix) { - char *p, *r; + _cleanup_free_ char *p = NULL; assert(path); assert(suffix); @@ -416,14 +422,11 @@ char *unit_name_from_path(const char *path, const char *suffix) { if (!p) return NULL; - r = strappend(p, suffix); - free(p); - - return r; + return strappend(p, suffix); } char *unit_name_from_path_instance(const char *prefix, const char *path, const char *suffix) { - char *p, *r; + _cleanup_free_ char *p = NULL; assert(prefix); assert(path); @@ -433,14 +436,11 @@ char *unit_name_from_path_instance(const char *prefix, const char *path, const c if (!p) return NULL; - r = strjoin(prefix, "@", p, suffix, NULL); - free(p); - - return r; + return strjoin(prefix, "@", p, suffix, NULL); } char *unit_name_to_path(const char *name) { - char *w, *e; + _cleanup_free_ char *w = NULL; assert(name); @@ -448,10 +448,7 @@ char *unit_name_to_path(const char *name) { if (!w) return NULL; - e = unit_name_path_unescape(w); - free(w); - - return e; + return unit_name_path_unescape(w); } char *unit_dbus_path_from_name(const char *name) { @@ -459,7 +456,7 @@ char *unit_dbus_path_from_name(const char *name) { assert(name); - e = bus_path_escape(name); + e = bus_label_escape(name); if (!e) return NULL; @@ -474,7 +471,7 @@ int unit_name_from_dbus_path(const char *path, char **name) { if (!e) return -EINVAL; - n = bus_path_unescape(e); + n = bus_label_unescape(e); if (!n) return -ENOMEM; @@ -482,14 +479,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, enum unit_name_mangle allow_globs) { char *r, *t; const char *f; + const char* valid_chars = allow_globs == MANGLE_GLOB ? "@" VALID_CHARS "[]!-*?" : "@" VALID_CHARS; assert(name); - - /* Try to turn a string that might not be a unit name into a - * sensible unit name. */ + assert(IN_SET(allow_globs, MANGLE_GLOB, MANGLE_NOGLOB)); if (is_device_path(name)) return unit_name_from_path(name, ".device"); @@ -500,14 +501,14 @@ char *unit_name_mangle(const char *name) { /* We'll only escape the obvious characters here, to play * safe. */ - r = new(char, strlen(name) * 4 + 1 + sizeof(".service")-1); + r = new(char, strlen(name) * 4 + strlen(".service") + 1); if (!r) return NULL; 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; @@ -521,7 +522,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, enum unit_name_mangle allow_globs, const char *suffix) { char *r, *t; const char *f; @@ -529,9 +535,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;