summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-04-24 17:54:55 -0300
committerLennart Poettering <lennart@poettering.net>2013-04-24 19:02:13 -0300
commite10375f2c0f5dd0dc8508f3ca165eb8aa63c64fb (patch)
tree56ac57f76308167c9fba789c52e268c9e2fcc2b0
parenta20affe2f0fb4c8d488155a0b860549e9389f32a (diff)
login: allow watching virtual machines with sd_get_machine_names()
-rw-r--r--man/sd_login_monitor_new.xml31
-rw-r--r--src/login/sd-login.c21
-rw-r--r--src/systemd/sd-login.h3
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. */