login: add new call sd_get_machine_names() to get a list of current virtual machines and containers

This commit is contained in:
Lennart Poettering 2013-04-24 17:54:17 -03:00
parent e8a7a31539
commit a20affe2f0
5 changed files with 75 additions and 9 deletions

View File

@ -46,7 +46,8 @@
<refname>sd_get_seats</refname>
<refname>sd_get_sessions</refname>
<refname>sd_get_uids</refname>
<refpurpose>Determine available seats, sessions and logged in users</refpurpose>
<refname>sd_get_machine_names</refname>
<refpurpose>Determine available seats, sessions, logged in users and virtual machines/containers</refpurpose>
</refnamediv>
<refsynopsisdiv>
@ -68,6 +69,11 @@
<paramdef>uid_t** <parameter>users</parameter></paramdef>
</funcprototype>
<funcprototype>
<funcdef>int <function>sd_get_machine_names</function></funcdef>
<paramdef>char*** <parameter>machines</parameter></paramdef>
</funcprototype>
</funcsynopsis>
</refsynopsisdiv>
@ -90,6 +96,11 @@
<para>Similar, <function>sd_get_uids()</function> may
be used to determine all Unix users who currently have login sessions.</para>
<para>Similar,
<function>sd_get_machine_names()</function> may be
used to determine all current virtual machines and
containers on the system.</para>
<para>Note that the returned lists are not sorted and in an undefined order.</para>
</refsect1>
@ -97,18 +108,20 @@
<title>Return Value</title>
<para>On success <function>sd_get_seats()</function>,
<function>sd_get_sessions()</function> and
<function>sd_get_uids()</function> return the number
of entries in the arrays. On failure, these calls
return a negative errno-style error code.</para>
<function>sd_get_sessions()</function>,
<function>sd_get_uids()</function> and
<function>sd_get_machine_names()</function> return the
number of entries in the arrays. On failure, these
calls return a negative errno-style error code.</para>
</refsect1>
<refsect1>
<title>Notes</title>
<para>The <function>sd_get_seats()</function>,
<function>sd_get_sessions()</function> and
<function>sd_get_uids()</function> interfaces
<function>sd_get_sessions()</function>,
<function>sd_get_uids()</function> and
<function>sd_get_machine_names()</function> interfaces
are available as shared library, which can be compiled
and linked to with the
<literal>libsystemd-login</literal>

View File

@ -70,3 +70,8 @@ global:
sd_pid_get_user_unit;
sd_pid_get_machine_name;
} LIBSYSTEMD_LOGIN_201;
LIBSYSTEMD_LOGIN_203 {
global:
sd_get_machine_names;
} LIBSYSTEMD_LOGIN_202;

View File

@ -591,6 +591,43 @@ _public_ int sd_get_uids(uid_t **users) {
return r;
}
int sd_get_machine_names(char ***machines) {
_cleanup_closedir_ DIR *d = NULL;
_cleanup_strv_free_ char **l = NULL;
_cleanup_free_ char *md = NULL;
char *n;
int c = 0, r;
r = cg_get_machine_path(&md);
if (r < 0)
return r;
r = cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER, md, &d);
if (r < 0)
return r;
while ((r = cg_read_subgroup(d, &n)) > 0) {
r = strv_push(&l, n);
if (r < 0) {
free(n);
return -ENOMEM;
}
c++;
}
if (r < 0)
return r;
if (machines) {
*machines = l;
l = NULL;
}
return c;
}
static inline int MONITOR_TO_FD(sd_login_monitor *m) {
return (int) (unsigned long) m - 1;
}

View File

@ -35,7 +35,7 @@ int main(int argc, char* argv[]) {
char *state;
char *session2;
char *t;
char **seats, **sessions;
char **seats, **sessions, **machines;
uid_t *uids;
unsigned n;
struct pollfd pollfd;
@ -180,10 +180,18 @@ int main(int argc, char* argv[]) {
printf("n_uids = %i\n", r);
assert_se(sd_get_uids(NULL) == r);
r = sd_get_machine_names(&machines);
assert_se(r >= 0);
assert_se(r == (int) strv_length(machines));
assert_se(t = strv_join(machines, ", "));
strv_free(machines);
printf("n_machines = %i\n", r);
printf("machines = %s\n", t);
free(t);
r = sd_login_monitor_new("session", &m);
assert_se(r >= 0);
for (n = 0; n < 5; n++) {
usec_t timeout, nw;

View File

@ -150,6 +150,9 @@ int sd_get_sessions(char ***sessions);
* users. If users is NULL only returns the number of users. */
int sd_get_uids(uid_t **users);
/* Get all running virtual machines/containers */
int sd_get_machine_names(char ***machines);
/* Monitor object */
typedef struct sd_login_monitor sd_login_monitor;