X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fcgroup-util.c;h=1d545e0466dbb7ca03b4531c9949b2cfe93bd069;hb=d7bd3de0654669e65b9642c248c5fa6d1d9a9f61;hp=0e5da23ecd50f3eeaab48727505514a87fa924f6;hpb=6c12b52e19640747e96f89d85422941a23dc6b29;p=elogind.git diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c index 0e5da23ec..1d545e046 100644 --- a/src/shared/cgroup-util.c +++ b/src/shared/cgroup-util.c @@ -790,6 +790,32 @@ int cg_install_release_agent(const char *controller, const char *agent) { return 0; } +int cg_uninstall_release_agent(const char *controller) { + _cleanup_free_ char *fs = NULL; + int r; + + r = cg_get_path(controller, NULL, "notify_on_release", &fs); + if (r < 0) + return r; + + r = write_string_file(fs, "0"); + if (r < 0) + return r; + + free(fs); + fs = NULL; + + r = cg_get_path(controller, NULL, "release_agent", &fs); + if (r < 0) + return r; + + r = write_string_file(fs, ""); + if (r < 0) + return r; + + return 0; +} + int cg_is_empty(const char *controller, const char *path, bool ignore_self) { _cleanup_fclose_ FILE *f = NULL; pid_t pid = 0, self_pid; @@ -1100,7 +1126,7 @@ int cg_pid_get_path_shifted(pid_t pid, char **root, char **cgroup) { } int cg_path_decode_unit(const char *cgroup, char **unit){ - char *p, *e, *c, *s, *k; + char *e, *c, *s; assert(cgroup); assert(unit); @@ -1109,28 +1135,10 @@ int cg_path_decode_unit(const char *cgroup, char **unit){ c = strndupa(cgroup, e - cgroup); c = cg_unescape(c); - /* Could this be a valid unit name? */ - if (!unit_name_is_valid(c, true)) + if (!unit_name_is_valid(c, false)) return -EINVAL; - if (!unit_name_is_template(c)) - s = strdup(c); - else { - if (*e != '/') - return -EINVAL; - - e += strspn(e, "/"); - - p = strchrnul(e, '/'); - k = strndupa(e, p - e); - k = cg_unescape(k); - - if (!unit_name_is_valid(k, false)) - return -EINVAL; - - s = strdup(k); - } - + s = strdup(c); if (!s) return -ENOMEM; @@ -1178,23 +1186,6 @@ int cg_pid_get_unit(pid_t pid, char **unit) { return cg_path_get_unit(cgroup, unit); } -static const char *skip_user(const char *p) { - size_t n; - - assert(p); - - p += strspn(p, "/"); - - n = strcspn(p, "/"); - if (n <= 5 || memcmp(p + n - 5, ".user", 5) != 0) - return p; - - p += n; - p += strspn(p, "/"); - - return p; -} - static const char *skip_session(const char *p) { size_t n; @@ -1203,7 +1194,7 @@ static const char *skip_session(const char *p) { p += strspn(p, "/"); n = strcspn(p, "/"); - if (n <= 8 || memcmp(p + n - 8, ".session", 8) != 0) + if (n <= 12 || memcmp(p, "session-", 8) != 0 || memcmp(p + n - 6, ".scope", 6) != 0) return NULL; p += n; @@ -1212,23 +1203,6 @@ static const char *skip_session(const char *p) { return p; } -static const char *skip_systemd_label(const char *p) { - size_t n; - - assert(p); - - p += strspn(p, "/"); - - n = strcspn(p, "/"); - if (n < 8 || memcmp(p, "systemd-", 8) != 0) - return p; - - p += n; - p += strspn(p, "/"); - - return p; -} - int cg_path_get_user_unit(const char *path, char **unit) { const char *e; @@ -1242,16 +1216,13 @@ int cg_path_get_user_unit(const char *path, char **unit) { /* Skip slices, if there are any */ e = skip_slices(path); - /* Skip the user name, if there is one */ - e = skip_user(e); - - /* Skip the session ID, require that there is one */ + /* Skip the session scope, require that there is one */ e = skip_session(e); if (!e) return -ENOENT; - /* Skip the systemd cgroup, if there is one */ - e = skip_systemd_label(e); + /* And skip more slices */ + e = skip_slices(e); return cg_path_decode_unit(e, unit); } @@ -1272,6 +1243,7 @@ int cg_pid_get_user_unit(pid_t pid, char **unit) { int cg_path_get_machine_name(const char *path, char **machine) { const char *e, *n, *x; char *s, *r; + size_t l; assert(path); assert(machine); @@ -1286,11 +1258,17 @@ int cg_path_get_machine_name(const char *path, char **machine) { s = strndupa(e, n - e); s = cg_unescape(s); - x = endswith(s, ".machine"); + x = startswith(s, "machine-"); if (!x) return -ENOENT; + if (!endswith(x, ".scope")) + return -ENOENT; + + l = strlen(x); + if (l <= 6) + return -ENOENT; - r = strndup(s, x - s); + r = strndup(x, l - 6); if (!r) return -ENOMEM; @@ -1312,8 +1290,9 @@ int cg_pid_get_machine_name(pid_t pid, char **machine) { } int cg_path_get_session(const char *path, char **session) { - const char *e, *n; - char *s; + const char *e, *n, *x; + char *s, *r; + size_t l; assert(path); assert(session); @@ -1321,20 +1300,28 @@ int cg_path_get_session(const char *path, char **session) { /* Skip slices, if there are any */ e = skip_slices(path); - /* Skip the user name, if there is one */ - e = skip_user(e); - n = strchrnul(e, '/'); - if (n - e < 8) + if (e == n) return -ENOENT; - if (memcmp(n - 8, ".session", 8) != 0) + + s = strndupa(e, n - e); + s = cg_unescape(s); + + x = startswith(s, "session-"); + if (!x) + return -ENOENT; + if (!endswith(x, ".scope")) return -ENOENT; - s = strndup(e, n - e - 8); - if (!s) + l = strlen(x); + if (l <= 6) + return -ENOENT; + + r = strndup(x, l - 6); + if (!r) return -ENOMEM; - *session = s; + *session = r; return 0; } @@ -1352,22 +1339,25 @@ int cg_pid_get_session(pid_t pid, char **session) { } int cg_path_get_owner_uid(const char *path, uid_t *uid) { - const char *e, *n; + _cleanup_free_ char *slice = NULL; + const char *e; char *s; + int r; assert(path); assert(uid); - /* Skip slices, if there are any */ - e = skip_slices(path); + r = cg_path_get_slice(path, &slice); + if (r < 0) + return r; - n = strchrnul(e, '/'); - if (n - e < 5) + e = startswith(slice, "user-"); + if (!e) return -ENOENT; - if (memcmp(n - 5, ".user", 5) != 0) + if (!endswith(slice, ".slice")) return -ENOENT; - s = strndupa(e, n - e - 5); + s = strndupa(e, strlen(e) - 6); if (!s) return -ENOMEM;