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_events</refname>
<refname>sd_login_monitor_get_timeout</refname> <refname>sd_login_monitor_get_timeout</refname>
<refname>sd_login_monitor</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> </refnamediv>
<refsynopsisdiv> <refsynopsisdiv>
@ -96,23 +96,26 @@
<title>Description</title> <title>Description</title>
<para><function>sd_login_monitor_new()</function> may <para><function>sd_login_monitor_new()</function> may
be used to monitor login sessions, users and seats. Via be used to monitor login sessions, users, seats and
a monitor object a file descriptor can be integrated virtual machines/containers. Via a monitor object a
into an application defined event loop which is woken file descriptor can be integrated into an application
up each time a user logs in, logs out or a seat is defined event loop which is woken up each time a user
added or removed, or a session, user, or seat changes logs in, logs out or a seat is added or removed, or a
state otherwise. The first parameter takes a string session, user, seat or virtual machine/container
which can be <literal>seat</literal> (to get 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 only notifications about seats being added, removed or
changed), <literal>session</literal> (to get only changed), <literal>session</literal> (to get only
notifications about sessions being created or removed 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 notifications when a user changes state in respect to
logins). If notifications shall be generated in all logins) or <literal>machine</literal> (to get only
these conditions, NULL may be passed. Note that in the notifications when a virtual machine or container is
future additional categories may be defined. The started or stopped). If notifications shall be
second parameter returns a monitor object and needs to generated in all these conditions, NULL may be
be freed with the 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 <function>sd_login_monitor_unref()</function> call
after use.</para> after use.</para>

View file

@ -677,6 +677,27 @@ _public_ int sd_login_monitor_new(const char *category, sd_login_monitor **m) {
good = true; 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) { if (!good) {
close_nointr(fd); close_nointr(fd);
return -EINVAL; return -EINVAL;

View file

@ -157,7 +157,8 @@ int sd_get_machine_names(char ***machines);
typedef struct sd_login_monitor sd_login_monitor; typedef struct sd_login_monitor sd_login_monitor;
/* Create a new monitor. Category must be NULL, "seat", "session", /* 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); int sd_login_monitor_new(const char *category, sd_login_monitor** ret);
/* Destroys the passed monitor. Returns NULL. */ /* Destroys the passed monitor. Returns NULL. */