login: allow watching virtual machines with sd_get_machine_names()

This commit is contained in:
Lennart Poettering 2013-04-24 17:54:55 -03:00
parent a20affe2f0
commit e10375f2c0
3 changed files with 40 additions and 15 deletions

View File

@ -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>

View File

@ -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;

View File

@ -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. */