login: add new call sd_get_machine_names() to get a list of current virtual machines and containers
This commit is contained in:
parent
e8a7a31539
commit
a20affe2f0
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue