return -ENODATA;
}
+#if 0 /// UNNEEDED by elogind
int cg_install_release_agent(const char *controller, const char *agent) {
_cleanup_free_ char *fs = NULL, *contents = NULL;
const char *sc;
return r;
sc = strstrip(contents);
+
if (isempty(sc)) {
r = write_string_file(fs, agent, 0);
if (r < 0)
return 0;
}
+#endif // 0
int cg_is_empty(const char *controller, const char *path) {
_cleanup_fclose_ FILE *f = NULL;
}
int cg_get_root_path(char **path) {
-#if 0 /// elogind does not support systemd scopes and slices
char *p, *e;
int r;
if (r < 0)
return r;
+#if 0 /// elogind does not support systemd scopes and slices
e = endswith(p, "/" SPECIAL_INIT_SCOPE);
if (!e)
e = endswith(p, "/" SPECIAL_SYSTEM_SLICE); /* legacy */
if (!e)
e = endswith(p, "/system"); /* even more legacy */
+#else
+ e = endswith(p, "/elogind");
+#endif // 0
if (e)
*e = 0;
*path = p;
return 0;
-#else
- assert(path);
- return cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 1, path);
-#endif // 0
}
int cg_shift_path(const char *cgroup, const char *root, const char **shifted) {
int cg_set_xattr(const char *controller, const char *path, const char *name, const void *value, size_t size, int flags);
int cg_get_xattr(const char *controller, const char *path, const char *name, void *value, size_t size);
-#endif // 0
int cg_install_release_agent(const char *controller, const char *agent);
int cg_uninstall_release_agent(const char *controller);
+#endif // 0
int cg_is_empty(const char *controller, const char *path);
int cg_is_empty_recursive(const char *controller, const char *path);
/* 1. Determine hierarchy */
m->cgroup_root = mfree(m->cgroup_root);
+#if 0 /// elogind is not init and must therefore search for PID 1 instead of self.
r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &m->cgroup_root);
+#else
+ r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 1, &m->cgroup_root);
+#endif // 0
if (r < 0)
return log_error_errno(r, "Cannot determine cgroup we are running in: %m");
if (!m->test_run) {
const char *scope_path;
+#if 0 /// elogind is not init, and does not install the agent here.
/* 3. Install agent */
if (cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER) > 0) {
/* In the unified hierarchy we can get
* cgroup empty notifications via inotify. */
-#if 0 /// elogind does not support the unified hierarchy, yet.
m->cgroup_inotify_event_source = sd_event_source_unref(m->cgroup_inotify_event_source);
safe_close(m->cgroup_inotify_fd);
(void) sd_event_source_set_description(m->cgroup_inotify_event_source, "cgroup-inotify");
-#else
- return log_error_errno(EOPNOTSUPP, "Unified cgroup hierarchy not supported: %m");
-#endif // 0
} else if (MANAGER_IS_SYSTEM(m)) {
-
/* On the legacy hierarchy we only get
* notifications via cgroup agents. (Which
* isn't really reliable, since it does not
log_debug("Release agent already installed.");
}
-#if 0 /// elogind is not meant to run in systemd init scope
/* 4. Make sure we are in the special "init.scope" unit in the root slice. */
scope_path = strjoina(m->cgroup_root, "/" SPECIAL_INIT_SCOPE);
r = cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, scope_path, 0);
#else
- if (streq(SYSTEMD_CGROUP_CONTROLLER, "name=elogind"))
+ /* Note:
+ * This method is in core, and normally called by systemd
+ * being init. As elogind is never init, we can not install
+ * our agent here. We do so when mounting our cgroup file
+ * system, so only if elogind is its own tiny controller.
+ * Further, elogind is not meant to run in systemd init scope. */
+ if (MANAGER_IS_SYSTEM(m))
// we are our own cgroup controller
scope_path = strjoina("");
else if (streq(m->cgroup_root, "/elogind"))
return log_error_errno(r, "Failed to create %s control group: %m", scope_path);
log_debug_elogind("Created control group \"%s\"", scope_path);
+#if 0 /// elogind is not a "sub-controller" like systemd, so migration is not needed.
/* also, move all other userspace processes remaining
* in the root cgroup into that scope. */
r = cg_migrate(SYSTEMD_CGROUP_CONTROLLER, m->cgroup_root, SYSTEMD_CGROUP_CONTROLLER, scope_path, 0);
if (r < 0)
log_warning_errno(r, "Couldn't move remaining userspace processes, ignoring: %m");
+#endif // 0
/* 5. And pin it, so that it cannot be unmounted */
safe_close(m->pin_cgroupfs_fd);
is_efi_boot, MNT_NONE },
#endif
#else
- { "cgroup", "/sys/fs/cgroup/elogind", "cgroup", "none,name=elogind,xattr", MS_NOSUID|MS_NOEXEC|MS_NODEV,
+ { "cgroup", "/sys/fs/cgroup/elogind", "cgroup", "none,name=elogind,release_agent="SYSTEMD_CGROUP_AGENT_PATH",xattr", MS_NOSUID|MS_NOEXEC|MS_NODEV,
cg_is_legacy_wanted, MNT_IN_CONTAINER },
- { "cgroup", "/sys/fs/cgroup/elogind", "cgroup", "none,name=elogind", MS_NOSUID|MS_NOEXEC|MS_NODEV,
+ { "cgroup", "/sys/fs/cgroup/elogind", "cgroup", "none,name=elogind,release_agent="SYSTEMD_CGROUP_AGENT_PATH, MS_NOSUID|MS_NOEXEC|MS_NODEV,
cg_is_legacy_wanted, MNT_FATAL|MNT_IN_CONTAINER },
#endif // 0
};
#define CGROUPS_AGENT_RCVBUF_SIZE (8*1024*1024)
-static int signal_agent_released(sd_bus_message *message, void *userdata, sd_bus_error *error) {
- _cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
- Manager *m = userdata;
- const char *cgroup;
- uid_t sender_uid;
- int r;
-
- assert(message);
- assert(m);
-
- /* only accept org.freedesktop.login1.Agent from UID=0 */
- r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_EUID, &creds);
- if (r < 0)
- return r;
-
- r = sd_bus_creds_get_euid(creds, &sender_uid);
- if (r < 0 || sender_uid != 0)
- return 0;
-
- /* parse 'cgroup-empty' notification */
- r = sd_bus_message_read(message, "s", &cgroup);
- if (r < 0) {
- bus_log_parse_error(r);
- return 0;
- }
-
- manager_notify_cgroup_empty(m, cgroup);
-
- return 0;
-}
-
-/// Add-On for manager_connect_bus()
-/// Original: src/core/dbus.c:bus_setup_system()
-void elogind_bus_setup_system(Manager* m) {
- int r;
-
- assert(m);
- assert(m->bus);
-
- /* if we are a user instance we get the Released message via the system bus */
- if (MANAGER_IS_USER(m)) {
- r = sd_bus_add_match(
- m->bus,
- NULL,
- "type='signal',"
- "interface='org.freedesktop.login1.Agent',"
- "member='Released',"
- "path='/org/freedesktop.login1/agent'",
- signal_agent_released, m);
- if (r < 0)
- log_warning_errno(r, "Failed to register Released match on system bus: %m");
- }
-
- log_debug("Successfully connected to system bus.");
-}
-
static int manager_dispatch_cgroups_agent_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
Manager *m = userdata;
char buf[PATH_MAX+1];
m->hybrid_sleep_state = NULL;
/* If elogind should be its own controller, mount its cgroup */
- if (streq(SYSTEMD_CGROUP_CONTROLLER, "name=elogind")) {
+ if (streq(SYSTEMD_CGROUP_CONTROLLER, "_elogind")) {
m->is_system = true;
r = mount_setup(true);
} else
/// Add-Ons for manager_connect_bus()
-void elogind_bus_setup_system(Manager* m);
int elogind_setup_cgroups_agent(Manager *m);
/// Add-On for manager_free()
#if 0 /// elogind has to setup its release agent
return 0;
#else
- elogind_bus_setup_system(m);
r = elogind_setup_cgroups_agent(m);
return r;