chiark / gitweb /
Standarize on one spelling of symlink error message
[elogind.git] / src / core / cgroup-attr.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2011 Lennart Poettering
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include "cgroup-attr.h"
23 #include "cgroup-util.h"
24 #include "list.h"
25 #include "fileio.h"
26
27 int cgroup_attribute_apply(CGroupAttribute *a, CGroupBonding *b) {
28         _cleanup_free_ char *path = NULL, *v = NULL;
29         int r;
30
31         assert(a);
32
33         b = cgroup_bonding_find_list(b, a->controller);
34         if (!b)
35                 return 0;
36
37         if (a->semantics && a->semantics->map_write) {
38                 r = a->semantics->map_write(a->semantics, a->value, &v);
39                 if (r < 0)
40                         return r;
41         }
42
43         r = cg_get_path(a->controller, b->path, a->name, &path);
44         if (r < 0)
45                 return r;
46
47         r = write_string_file(path, v ? v : a->value);
48         if (r < 0)
49                 log_warning("Failed to write '%s' to %s: %s", v ? v : a->value, path, strerror(-r));
50
51         return r;
52 }
53
54 int cgroup_attribute_apply_list(CGroupAttribute *first, CGroupBonding *b) {
55         CGroupAttribute *a;
56         int r = 0;
57
58         LIST_FOREACH(by_unit, a, first) {
59                 int k;
60
61                 k = cgroup_attribute_apply(a, b);
62                 if (r == 0)
63                         r = k;
64         }
65
66         return r;
67 }
68
69 bool cgroup_attribute_matches(CGroupAttribute *a, const char *controller, const char *name) {
70         assert(a);
71
72         if (controller) {
73                 if (streq(a->controller, controller) && (!name || streq(a->name, name)))
74                         return true;
75
76         } else if (!name)
77                 return true;
78         else if (streq(a->name, name)) {
79                 size_t x, y;
80                 x = strlen(a->controller);
81                 y = strlen(name);
82
83                 if (y > x &&
84                     memcmp(a->controller, name, x) == 0 &&
85                     name[x] == '.')
86                         return true;
87         }
88
89         return false;
90 }
91
92 CGroupAttribute *cgroup_attribute_find_list(
93                 CGroupAttribute *first,
94                 const char *controller,
95                 const char *name) {
96         CGroupAttribute *a;
97
98         assert(name);
99
100         LIST_FOREACH(by_unit, a, first)
101                 if (cgroup_attribute_matches(a, controller, name))
102                         return a;
103
104         return NULL;
105 }
106
107 void cgroup_attribute_free(CGroupAttribute *a) {
108         assert(a);
109
110         if (a->unit)
111                 LIST_REMOVE(CGroupAttribute, by_unit, a->unit->cgroup_attributes, a);
112
113         free(a->controller);
114         free(a->name);
115         free(a->value);
116         free(a);
117 }
118
119 void cgroup_attribute_free_list(CGroupAttribute *first) {
120         CGroupAttribute *a, *n;
121
122         LIST_FOREACH_SAFE(by_unit, a, n, first)
123                 cgroup_attribute_free(a);
124 }
125
126 void cgroup_attribute_free_some(CGroupAttribute *first, const char *controller, const char *name) {
127         CGroupAttribute *a, *n;
128
129         LIST_FOREACH_SAFE(by_unit, a, n, first)
130                 if (cgroup_attribute_matches(a, controller, name))
131                         cgroup_attribute_free(a);
132 }