diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-04-24 17:54:17 -0300 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-04-24 19:02:13 -0300 |
commit | a20affe2f0fb4c8d488155a0b860549e9389f32a (patch) | |
tree | 21dbbb3a84784688b8a1139e91648299e219771b | |
parent | e8a7a315391a6a07897122725cd707f4e9ce63d7 (diff) |
login: add new call sd_get_machine_names() to get a list of current virtual machines and containers
-rw-r--r-- | man/sd_get_seats.xml | 27 | ||||
-rw-r--r-- | src/login/libsystemd-login.sym | 5 | ||||
-rw-r--r-- | src/login/sd-login.c | 37 | ||||
-rw-r--r-- | src/login/test-login.c | 12 | ||||
-rw-r--r-- | src/systemd/sd-login.h | 3 |
5 files changed, 75 insertions, 9 deletions
diff --git a/man/sd_get_seats.xml b/man/sd_get_seats.xml index 4bdb5c3e9e..9bc866dc68 100644 --- a/man/sd_get_seats.xml +++ b/man/sd_get_seats.xml @@ -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> diff --git a/src/login/libsystemd-login.sym b/src/login/libsystemd-login.sym index f4cd209700..925fb91095 100644 --- a/src/login/libsystemd-login.sym +++ b/src/login/libsystemd-login.sym @@ -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; diff --git a/src/login/sd-login.c b/src/login/sd-login.c index 157b7e0fb4..35deb85f2d 100644 --- a/src/login/sd-login.c +++ b/src/login/sd-login.c @@ -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; } diff --git a/src/login/test-login.c b/src/login/test-login.c index e4d0c93378..945cb38be9 100644 --- a/src/login/test-login.c +++ b/src/login/test-login.c @@ -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; diff --git a/src/systemd/sd-login.h b/src/systemd/sd-login.h index 1083742beb..2415039410 100644 --- a/src/systemd/sd-login.h +++ b/src/systemd/sd-login.h @@ -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; |