chiark / gitweb /
manager: add DefaultEnvironment option
[elogind.git] / src / core / cgroup-attr.c
index aed4e99d864d6bf74f6a98d26e086af06f14247f..7e3e08eabb2e952d2700580bbb7d81ee557f88b3 100644 (file)
 #include "cgroup-attr.h"
 #include "cgroup-util.h"
 #include "list.h"
+#include "fileio.h"
 
 int cgroup_attribute_apply(CGroupAttribute *a, CGroupBonding *b) {
-        int r;
         _cleanup_free_ char *path = NULL, *v = NULL;
+        int r;
 
         assert(a);
 
@@ -33,8 +34,8 @@ int cgroup_attribute_apply(CGroupAttribute *a, CGroupBonding *b) {
         if (!b)
                 return 0;
 
-        if (a->map_callback) {
-                r = a->map_callback(a->controller, a->name, a->value, &v);
+        if (a->semantics && a->semantics->map_write) {
+                r = a->semantics->map_write(a->semantics, a->value, &v);
                 if (r < 0)
                         return r;
         }
@@ -43,7 +44,7 @@ int cgroup_attribute_apply(CGroupAttribute *a, CGroupBonding *b) {
         if (r < 0)
                 return r;
 
-        r = write_one_line_file(path, v ? v : a->value);
+        r = write_string_file(path, v ? v : a->value);
         if (r < 0)
                 log_warning("Failed to write '%s' to %s: %s", v ? v : a->value, path, strerror(-r));
 
@@ -65,6 +66,29 @@ int cgroup_attribute_apply_list(CGroupAttribute *first, CGroupBonding *b) {
         return r;
 }
 
+bool cgroup_attribute_matches(CGroupAttribute *a, const char *controller, const char *name) {
+        assert(a);
+
+        if (controller) {
+                if (streq(a->controller, controller) && (!name || streq(a->name, name)))
+                        return true;
+
+        } else if (!name)
+                return true;
+        else if (streq(a->name, name)) {
+                size_t x, y;
+                x = strlen(a->controller);
+                y = strlen(name);
+
+                if (y > x &&
+                    memcmp(a->controller, name, x) == 0 &&
+                    name[x] == '.')
+                        return true;
+        }
+
+        return false;
+}
+
 CGroupAttribute *cgroup_attribute_find_list(
                 CGroupAttribute *first,
                 const char *controller,
@@ -73,24 +97,9 @@ CGroupAttribute *cgroup_attribute_find_list(
 
         assert(name);
 
-        LIST_FOREACH(by_unit, a, first) {
-
-
-                if (controller) {
-                        if (streq(a->controller, controller) && streq(a->name, name))
-                                return a;
-
-                } else if (streq(a->name, name)) {
-                        size_t x, y;
-                        x = strlen(a->controller);
-                        y = strlen(name);
-
-                        if (y > x &&
-                            memcmp(a->controller, name, x) == 0 &&
-                            name[x] == '.')
-                                return a;
-                }
-        }
+        LIST_FOREACH(by_unit, a, first)
+                if (cgroup_attribute_matches(a, controller, name))
+                        return a;
 
         return NULL;
 }
@@ -113,3 +122,11 @@ void cgroup_attribute_free_list(CGroupAttribute *first) {
         LIST_FOREACH_SAFE(by_unit, a, n, first)
                 cgroup_attribute_free(a);
 }
+
+void cgroup_attribute_free_some(CGroupAttribute *first, const char *controller, const char *name) {
+        CGroupAttribute *a, *n;
+
+        LIST_FOREACH_SAFE(by_unit, a, n, first)
+                if (cgroup_attribute_matches(a, controller, name))
+                        cgroup_attribute_free(a);
+}