chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
path: follow symbolic link for parent path
[elogind.git]
/
src
/
shared
/
cgroup-util.c
diff --git
a/src/shared/cgroup-util.c
b/src/shared/cgroup-util.c
index 1aa81c2cd18f1700a75631a4d6b9b1659dba3e9b..1bcba0188758b5ee19cc7a155ec050122d0ad7ab 100644
(file)
--- a/
src/shared/cgroup-util.c
+++ b/
src/shared/cgroup-util.c
@@
-161,7
+161,7
@@
int cg_kill(const char *controller, const char *path, int sig, bool sigcont, boo
* tasks list, to properly handle forking processes */
if (!s) {
* tasks list, to properly handle forking processes */
if (!s) {
- s = allocated_set = set_new(
trivial_hash_func, trivial_compare_func
);
+ s = allocated_set = set_new(
NULL
);
if (!s)
return -ENOMEM;
}
if (!s)
return -ENOMEM;
}
@@
-195,7
+195,7
@@
int cg_kill(const char *controller, const char *path, int sig, bool sigcont, boo
if (ret >= 0 && errno != ESRCH)
ret = -errno;
} else {
if (ret >= 0 && errno != ESRCH)
ret = -errno;
} else {
- if (sigcont)
+ if (sigcont
&& sig != SIGKILL
)
kill(pid, SIGCONT);
if (ret == 0)
kill(pid, SIGCONT);
if (ret == 0)
@@
-239,7
+239,7
@@
int cg_kill_recursive(const char *controller, const char *path, int sig, bool si
assert(sig >= 0);
if (!s) {
assert(sig >= 0);
if (!s) {
- s = allocated_set = set_new(
trivial_hash_func, trivial_compare_func
);
+ s = allocated_set = set_new(
NULL
);
if (!s)
return -ENOMEM;
}
if (!s)
return -ENOMEM;
}
@@
-290,7
+290,7
@@
int cg_migrate(const char *cfrom, const char *pfrom, const char *cto, const char
assert(cto);
assert(pto);
assert(cto);
assert(pto);
- s = set_new(
trivial_hash_func, trivial_compare_func
);
+ s = set_new(
NULL
);
if (!s)
return -ENOMEM;
if (!s)
return -ENOMEM;
@@
-472,9
+472,7
@@
static int join_path(const char *controller, const char *path, const char *suffi
if (!t)
return -ENOMEM;
if (!t)
return -ENOMEM;
- path_kill_slashes(t);
-
- *fs = t;
+ *fs = path_kill_slashes(t);
return 0;
}
return 0;
}
@@
-509,7
+507,7
@@
static int check_hierarchy(const char *p) {
assert(p);
/* Check if this controller actually really exists */
assert(p);
/* Check if this controller actually really exists */
- cc = alloca(s
izeof("/sys/fs/cgroup/") + strlen(p)
);
+ cc = alloca(s
trlen("/sys/fs/cgroup/") + strlen(p) + 1
);
strcpy(stpcpy(cc, "/sys/fs/cgroup/"), p);
if (access(cc, F_OK) < 0)
return -errno;
strcpy(stpcpy(cc, "/sys/fs/cgroup/"), p);
if (access(cc, F_OK) < 0)
return -errno;
@@
-643,9
+641,9
@@
int cg_attach(const char *controller, const char *path, pid_t pid) {
if (pid == 0)
pid = getpid();
if (pid == 0)
pid = getpid();
- snprintf(c, sizeof(c),
"%lu\n", (unsigned long)
pid);
+ snprintf(c, sizeof(c),
PID_FMT"\n",
pid);
- return write_string_file(fs, c);
+ return write_string_file
_no_create
(fs, c);
}
int cg_attach_fallback(const char *controller, const char *path, pid_t pid) {
}
int cg_attach_fallback(const char *controller, const char *path, pid_t pid) {
@@
-684,7
+682,7
@@
int cg_set_group_access(
assert(path);
assert(path);
- if (mode !=
(mode_t) -1
)
+ if (mode !=
MODE_INVALID
)
mode &= 0777;
r = cg_get_path(controller, path, NULL, &fs);
mode &= 0777;
r = cg_get_path(controller, path, NULL, &fs);
@@
-706,10
+704,10
@@
int cg_set_task_access(
assert(path);
assert(path);
- if (mode ==
(mode_t) -1 && uid == (uid_t) -1 && gid == (gid_t) -1
)
+ if (mode ==
MODE_INVALID && uid == UID_INVALID && gid == GID_INVALID
)
return 0;
return 0;
- if (mode !=
(mode_t) -1
)
+ if (mode !=
MODE_INVALID
)
mode &= 0666;
r = cg_get_path(controller, path, "cgroup.procs", &fs);
mode &= 0666;
r = cg_get_path(controller, path, "cgroup.procs", &fs);
@@
-755,9
+753,9
@@
int cg_pid_get_path(const char *controller, pid_t pid, char **path) {
cs = strlen(controller);
FOREACH_LINE(line, f, return -errno) {
cs = strlen(controller);
FOREACH_LINE(line, f, return -errno) {
- char *l, *p, *
w, *
e;
+ char *l, *p, *e;
size_t k;
size_t k;
- c
har
*state;
+ c
onst char *word,
*state;
bool found = false;
truncate_nl(line);
bool found = false;
truncate_nl(line);
@@
-773,16
+771,16
@@
int cg_pid_get_path(const char *controller, pid_t pid, char **path) {
*e = 0;
*e = 0;
- FOREACH_WORD_SEPARATOR(w, k, l, ",", state) {
+ FOREACH_WORD_SEPARATOR(w
ord
, k, l, ",", state) {
- if (k == cs && memcmp(w, controller, cs) == 0) {
+ if (k == cs && memcmp(w
ord
, controller, cs) == 0) {
found = true;
break;
}
if (k == 5 + cs &&
found = true;
break;
}
if (k == 5 + cs &&
- memcmp(w, "name=", 5) == 0 &&
- memcmp(w+5, controller, cs) == 0) {
+ memcmp(w
ord
, "name=", 5) == 0 &&
+ memcmp(w
ord
+5, controller, cs) == 0) {
found = true;
break;
}
found = true;
break;
}
@@
-819,7
+817,7
@@
int cg_install_release_agent(const char *controller, const char *agent) {
sc = strstrip(contents);
if (sc[0] == 0) {
sc = strstrip(contents);
if (sc[0] == 0) {
- r = write_string_file(fs, agent);
+ r = write_string_file
_no_create
(fs, agent);
if (r < 0)
return r;
} else if (!streq(sc, agent))
if (r < 0)
return r;
} else if (!streq(sc, agent))
@@
-839,7
+837,7
@@
int cg_install_release_agent(const char *controller, const char *agent) {
sc = strstrip(contents);
if (streq(sc, "0")) {
sc = strstrip(contents);
if (streq(sc, "0")) {
- r = write_string_file(fs, "1");
+ r = write_string_file
_no_create
(fs, "1");
if (r < 0)
return r;
if (r < 0)
return r;
@@
-860,7
+858,7
@@
int cg_uninstall_release_agent(const char *controller) {
if (r < 0)
return r;
if (r < 0)
return r;
- r = write_string_file(fs, "0");
+ r = write_string_file
_no_create
(fs, "0");
if (r < 0)
return r;
if (r < 0)
return r;
@@
-871,7
+869,7
@@
int cg_uninstall_release_agent(const char *controller) {
if (r < 0)
return r;
if (r < 0)
return r;
- r = write_string_file(fs, "");
+ r = write_string_file
_no_create
(fs, "");
if (r < 0)
return r;
if (r < 0)
return r;
@@
-957,8
+955,7
@@
int cg_split_spec(const char *spec, char **controller, char **path) {
if (!t)
return -ENOMEM;
if (!t)
return -ENOMEM;
- path_kill_slashes(t);
- *path = t;
+ *path = path_kill_slashes(t);
}
if (controller)
}
if (controller)
@@
-1041,19
+1038,18
@@
int cg_mangle_path(const char *path, char **result) {
assert(path);
assert(result);
assert(path);
assert(result);
- /* First check if it already is a filesystem path */
+ /* First
,
check if it already is a filesystem path */
if (path_startswith(path, "/sys/fs/cgroup")) {
t = strdup(path);
if (!t)
return -ENOMEM;
if (path_startswith(path, "/sys/fs/cgroup")) {
t = strdup(path);
if (!t)
return -ENOMEM;
- path_kill_slashes(t);
- *result = t;
+ *result = path_kill_slashes(t);
return 0;
}
return 0;
}
- /* Otherwise treat it as cg spec */
+ /* Otherwise
,
treat it as cg spec */
r = cg_split_spec(path, &c, &p);
if (r < 0)
return r;
r = cg_split_spec(path, &c, &p);
if (r < 0)
return r;
@@
-1310,9
+1306,8
@@
int cg_pid_get_machine_name(pid_t pid, char **machine) {
}
int cg_path_get_session(const char *path, char **session) {
}
int cg_path_get_session(const char *path, char **session) {
- const char *e, *n, *x;
+ const char *e, *n, *x
, *y
;
char *s;
char *s;
- size_t l;
assert(path);
assert(path);
@@
-1329,17
+1324,14
@@
int cg_path_get_session(const char *path, char **session) {
x = startswith(s, "session-");
if (!x)
return -ENOENT;
x = startswith(s, "session-");
if (!x)
return -ENOENT;
- if (!endswith(x, ".scope"))
- return -ENOENT;
-
- l = strlen(x);
- if (l <= 6)
+ y = endswith(x, ".scope");
+ if (!y || x == y)
return -ENOENT;
if (session) {
char *r;
return -ENOENT;
if (session) {
char *r;
- r = strndup(x,
l - 6
);
+ r = strndup(x,
y - x
);
if (!r)
return -ENOMEM;
if (!r)
return -ENOMEM;
@@
-1595,7
+1587,7
@@
int cg_set_attribute(const char *controller, const char *path, const char *attri
if (r < 0)
return r;
if (r < 0)
return r;
- return write_string_file(p, value);
+ return write_string_file
_no_create
(p, value);
}
static const char mask_names[] =
}
static const char mask_names[] =
@@
-1632,7
+1624,7
@@
int cg_create_everywhere(CGroupControllerMask supported, CGroupControllerMask ma
return 0;
}
return 0;
}
-int cg_attach_everywhere(CGroupControllerMask supported, const char *path, pid_t pid) {
+int cg_attach_everywhere(CGroupControllerMask supported, const char *path, pid_t pid
, cg_migrate_callback_t path_callback, void *userdata
) {
CGroupControllerMask bit = 1;
const char *n;
int r;
CGroupControllerMask bit = 1;
const char *n;
int r;
@@
-1642,8
+1634,18
@@
int cg_attach_everywhere(CGroupControllerMask supported, const char *path, pid_t
return r;
NULSTR_FOREACH(n, mask_names) {
return r;
NULSTR_FOREACH(n, mask_names) {
- if (supported & bit)
+
+ if (supported & bit) {
+ const char *p = NULL;
+
+ if (path_callback)
+ p = path_callback(bit, userdata);
+
+ if (!p)
+ p = path;
+
cg_attach_fallback(n, path, pid);
cg_attach_fallback(n, path, pid);
+ }
bit <<= 1;
}
bit <<= 1;
}
@@
-1651,7
+1653,7
@@
int cg_attach_everywhere(CGroupControllerMask supported, const char *path, pid_t
return 0;
}
return 0;
}
-int cg_attach_many_everywhere(CGroupControllerMask supported, const char *path, Set* pids) {
+int cg_attach_many_everywhere(CGroupControllerMask supported, const char *path, Set* pids
, cg_migrate_callback_t path_callback, void *userdata
) {
Iterator i;
void *pidp;
int r = 0;
Iterator i;
void *pidp;
int r = 0;
@@
-1660,7
+1662,7
@@
int cg_attach_many_everywhere(CGroupControllerMask supported, const char *path,
pid_t pid = PTR_TO_LONG(pidp);
int q;
pid_t pid = PTR_TO_LONG(pidp);
int q;
- q = cg_attach_everywhere(supported, path, pid);
+ q = cg_attach_everywhere(supported, path, pid
, path_callback, userdata
);
if (q < 0)
r = q;
}
if (q < 0)
r = q;
}