chiark / gitweb /
systemd: enable/disable instances of template
[elogind.git] / src / shared / unit-name.c
index 67a760ace68afef2d76a6595dce29f8f3f54b5d5..e8328c321a05363c5ef4fe3f901e126731944618 100644 (file)
@@ -48,7 +48,17 @@ static const char* const unit_type_table[_UNIT_TYPE_MAX] = {
 
 DEFINE_STRING_TABLE_LOOKUP(unit_type, UnitType);
 
-bool unit_name_is_valid_no_type(const char *n, bool template_ok) {
+static const char* const unit_load_state_table[_UNIT_LOAD_STATE_MAX] = {
+        [UNIT_STUB] = "stub",
+        [UNIT_LOADED] = "loaded",
+        [UNIT_ERROR] = "error",
+        [UNIT_MERGED] = "merged",
+        [UNIT_MASKED] = "masked"
+};
+
+DEFINE_STRING_TABLE_LOOKUP(unit_load_state, UnitLoadState);
+
+bool unit_name_is_valid(const char *n, bool template_ok) {
         const char *e, *i, *at;
 
         /* Valid formats:
@@ -66,6 +76,9 @@ bool unit_name_is_valid_no_type(const char *n, bool template_ok) {
         if (!e || e == n)
                 return false;
 
+        if (unit_type_from_string(e + 1) < 0)
+                return false;
+
         for (i = n, at = NULL; i < e; i++) {
 
                 if (*i == '@' && !at)
@@ -169,7 +182,7 @@ char *unit_name_change_suffix(const char *n, const char *suffix) {
         size_t a, b;
 
         assert(n);
-        assert(unit_name_is_valid_no_type(n, true));
+        assert(unit_name_is_valid(n, true));
         assert(suffix);
 
         assert_se(e = strrchr(n, '.'));
@@ -195,7 +208,7 @@ char *unit_name_build(const char *prefix, const char *instance, const char *suff
         if (!instance)
                 return strappend(prefix, suffix);
 
-        return join(prefix, "@", instance, suffix, NULL);
+        return strjoin(prefix, "@", instance, suffix, NULL);
 }
 
 static char *do_escape_char(char c, char *t) {
@@ -328,6 +341,18 @@ bool unit_name_is_template(const char *n) {
         return p[1] == '.';
 }
 
+bool unit_name_is_instance(const char *n) {
+        const char *p;
+
+        assert(n);
+
+        p = strchr(n, '@');
+        if (!p)
+                return false;
+
+        return p[1] != '.';
+}
+
 char *unit_name_replace_instance(const char *f, const char *i) {
         const char *p, *e;
         char *r, *k;
@@ -412,7 +437,7 @@ char *unit_name_from_path_instance(const char *prefix, const char *path, const c
         if (!p)
                 return NULL;
 
-        r = join(prefix, "@", p, suffix, NULL);
+        r = strjoin(prefix, "@", p, suffix, NULL);
         free(p);
 
         return r;
@@ -485,3 +510,15 @@ char *unit_name_mangle(const char *name) {
 
         return r;
 }
+
+UnitType unit_name_to_type(const char *n) {
+        const char *e;
+
+        assert(n);
+
+        e = strrchr(n, '.');
+        if (!e)
+                return _UNIT_TYPE_INVALID;
+
+        return unit_type_from_string(e + 1);
+}