<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>
<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>
<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>
<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>
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;
}
char *state;
char *session2;
char *t;
- char **seats, **sessions;
+ char **seats, **sessions, **machines;
uid_t *uids;
unsigned n;
struct pollfd pollfd;
printf("n_uids = %i\n", r);
assert_se(sd_get_uids(NULL) == r);
- r = sd_login_monitor_new("session", &m);
+ 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;