diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-04-24 17:54:55 -0300 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-04-24 19:02:13 -0300 |
commit | e10375f2c0f5dd0dc8508f3ca165eb8aa63c64fb (patch) | |
tree | 56ac57f76308167c9fba789c52e268c9e2fcc2b0 | |
parent | a20affe2f0fb4c8d488155a0b860549e9389f32a (diff) |
login: allow watching virtual machines with sd_get_machine_names()
-rw-r--r-- | man/sd_login_monitor_new.xml | 31 | ||||
-rw-r--r-- | src/login/sd-login.c | 21 | ||||
-rw-r--r-- | src/systemd/sd-login.h | 3 |
3 files changed, 40 insertions, 15 deletions
diff --git a/man/sd_login_monitor_new.xml b/man/sd_login_monitor_new.xml index b187ad0dbe..26af0ea247 100644 --- a/man/sd_login_monitor_new.xml +++ b/man/sd_login_monitor_new.xml @@ -50,7 +50,7 @@ <refname>sd_login_monitor_get_events</refname> <refname>sd_login_monitor_get_timeout</refname> <refname>sd_login_monitor</refname> - <refpurpose>Monitor login sessions, seats and users</refpurpose> + <refpurpose>Monitor login sessions, seats, users and virtual machines/containers</refpurpose> </refnamediv> <refsynopsisdiv> @@ -96,23 +96,26 @@ <title>Description</title> <para><function>sd_login_monitor_new()</function> may - be used to monitor login sessions, users and seats. Via - a monitor object a file descriptor can be integrated - into an application defined event loop which is woken - up each time a user logs in, logs out or a seat is - added or removed, or a session, user, or seat changes - state otherwise. The first parameter takes a string - which can be <literal>seat</literal> (to get + be used to monitor login sessions, users, seats and + virtual machines/containers. Via a monitor object a + file descriptor can be integrated into an application + defined event loop which is woken up each time a user + logs in, logs out or a seat is added or removed, or a + session, user, seat or virtual machine/container + changes state otherwise. The first parameter takes a + string which can be <literal>seat</literal> (to get only notifications about seats being added, removed or changed), <literal>session</literal> (to get only notifications about sessions being created or removed - or changed) or <literal>uid</literal> (to get only + or changed), <literal>uid</literal> (to get only notifications when a user changes state in respect to - logins). If notifications shall be generated in all - these conditions, NULL may be passed. Note that in the - future additional categories may be defined. The - second parameter returns a monitor object and needs to - be freed with the + logins) or <literal>machine</literal> (to get only + notifications when a virtual machine or container is + started or stopped). If notifications shall be + generated in all these conditions, NULL may be + passed. Note that in the future additional categories + may be defined. The second parameter returns a monitor + object and needs to be freed with the <function>sd_login_monitor_unref()</function> call after use.</para> diff --git a/src/login/sd-login.c b/src/login/sd-login.c index 35deb85f2d..bc8cd8ae8c 100644 --- a/src/login/sd-login.c +++ b/src/login/sd-login.c @@ -677,6 +677,27 @@ _public_ int sd_login_monitor_new(const char *category, sd_login_monitor **m) { good = true; } + if (!category || streq(category, "machine")) { + _cleanup_free_ char *md = NULL, *p = NULL; + int r; + + r = cg_get_machine_path(&md); + if (r < 0) + return r; + + r = cg_get_path(SYSTEMD_CGROUP_CONTROLLER, md, NULL, &p); + if (r < 0) + return r; + + k = inotify_add_watch(fd, p, IN_MOVED_TO|IN_CREATE|IN_DELETE); + if (k < 0) { + close_nointr_nofail(fd); + return -errno; + } + + good = true; + } + if (!good) { close_nointr(fd); return -EINVAL; diff --git a/src/systemd/sd-login.h b/src/systemd/sd-login.h index 2415039410..4855e327a1 100644 --- a/src/systemd/sd-login.h +++ b/src/systemd/sd-login.h @@ -157,7 +157,8 @@ int sd_get_machine_names(char ***machines); typedef struct sd_login_monitor sd_login_monitor; /* Create a new monitor. Category must be NULL, "seat", "session", - * "uid" to get monitor events for the specific category (or all). */ + * "uid", "machine" to get monitor events for the specific category + * (or all). */ int sd_login_monitor_new(const char *category, sd_login_monitor** ret); /* Destroys the passed monitor. Returns NULL. */ |