chiark / gitweb /
login: add new call sd_get_machine_names() to get a list of current virtual machines...
authorLennart Poettering <lennart@poettering.net>
Wed, 24 Apr 2013 20:54:17 +0000 (17:54 -0300)
committerLennart Poettering <lennart@poettering.net>
Wed, 24 Apr 2013 22:02:13 +0000 (19:02 -0300)
man/sd_get_seats.xml
src/login/libsystemd-login.sym
src/login/sd-login.c
src/login/test-login.c
src/systemd/sd-login.h

index 4bdb5c3e9e6e592bf3957584a82cfd7836b6dfc4..9bc866dc68811fde20a716994e109beb8d5bcd69 100644 (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>
                                 <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>
index f4cd2097007b1159704564c13391e20216e98845..925fb910952e83f1c6f6ed77920eacc07282fc52 100644 (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;
index 157b7e0fb4e13eb0b452414a8a2d7cddf4148cde..35deb85f2dbc58b7c3a4d16cd00ffc6338979f64 100644 (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;
 }
index e4d0c933786ff0c4e48b23cfd0c1e0bf8a190ddf..945cb38be9276c1d48f19cb9f99e48e93b4ad0ed 100644 (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,9 +180,17 @@ int main(int argc, char* argv[]) {
         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;
index 1083742beb007ff594b6653230bc8af883aafb2f..24150394100983c5126b11a1f65bce98ade6551f 100644 (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;