diff options
-rw-r--r-- | Makefile-man.am | 15 | ||||
-rw-r--r-- | man/sd_session_is_active.xml | 50 | ||||
-rw-r--r-- | src/login/libsystemd-login.sym | 7 | ||||
-rw-r--r-- | src/login/sd-login.c | 28 | ||||
-rw-r--r-- | src/login/test-login.c | 14 | ||||
-rw-r--r-- | src/systemd/sd-login.h | 11 |
6 files changed, 120 insertions, 5 deletions
diff --git a/Makefile-man.am b/Makefile-man.am index d25d642279..7ca8b4f07e 100644 --- a/Makefile-man.am +++ b/Makefile-man.am @@ -908,8 +908,11 @@ MANPAGES_ALIAS += \ man/sd_seat_can_multi_session.3 \ man/sd_seat_can_tty.3 \ man/sd_seat_get_sessions.3 \ + man/sd_session_is_remote.3 \ man/sd_session_get_class.3 \ man/sd_session_get_display.3 \ + man/sd_session_get_remote_host.3 \ + man/sd_session_get_remote_user.3 \ man/sd_session_get_seat.3 \ man/sd_session_get_service.3 \ man/sd_session_get_state.3 \ @@ -939,8 +942,11 @@ man/sd_seat_can_graphical.3: man/sd_seat_get_active.3 man/sd_seat_can_multi_session.3: man/sd_seat_get_active.3 man/sd_seat_can_tty.3: man/sd_seat_get_active.3 man/sd_seat_get_sessions.3: man/sd_seat_get_active.3 +man/sd_session_is_remote.3: man/sd_session_is_active.3 man/sd_session_get_class.3: man/sd_session_is_active.3 man/sd_session_get_display.3: man/sd_session_is_active.3 +man/sd_session_get_remote_host.3: man/sd_session_is_active.3 +man/sd_session_get_remote_user.3: man/sd_session_is_active.3 man/sd_session_get_seat.3: man/sd_session_is_active.3 man/sd_session_get_service.3: man/sd_session_is_active.3 man/sd_session_get_state.3: man/sd_session_is_active.3 @@ -1006,6 +1012,9 @@ man/sd_seat_can_tty.html: man/sd_seat_get_active.html man/sd_seat_get_sessions.html: man/sd_seat_get_active.html $(html-alias) +man/sd_session_is_remote.html: man/sd_session_is_active.html + $(html-alias) + man/sd_session_get_class.html: man/sd_session_is_active.html $(html-alias) @@ -1021,6 +1030,12 @@ man/sd_session_get_service.html: man/sd_session_is_active.html man/sd_session_get_state.html: man/sd_session_is_active.html $(html-alias) +man/sd_session_get_remote_host.html: man/sd_session_is_active.html + $(html-alias) + +man/sd_session_get_remote_user.html: man/sd_session_is_active.html + $(html-alias) + man/sd_session_get_tty.html: man/sd_session_is_active.html $(html-alias) diff --git a/man/sd_session_is_active.xml b/man/sd_session_is_active.xml index 293ce71642..d94ae196ab 100644 --- a/man/sd_session_is_active.xml +++ b/man/sd_session_is_active.xml @@ -66,6 +66,11 @@ </funcprototype> <funcprototype> + <funcdef>int <function>sd_session_is_remote</function></funcdef> + <paramdef>const char* <parameter>session</parameter></paramdef> + </funcprototype> + + <funcprototype> <funcdef>int <function>sd_session_get_state</function></funcdef> <paramdef>const char* <parameter>session</parameter></paramdef> <paramdef>char** <parameter>state</parameter></paramdef> @@ -108,6 +113,18 @@ </funcprototype> <funcprototype> + <funcdef>int <function>sd_session_get_remote_host</function></funcdef> + <paramdef>const char* <parameter>session</parameter></paramdef> + <paramdef>char** <parameter>remote_host</parameter></paramdef> + </funcprototype> + + <funcprototype> + <funcdef>int <function>sd_session_get_remote_user</function></funcdef> + <paramdef>const char* <parameter>session</parameter></paramdef> + <paramdef>char** <parameter>remote_user</parameter></paramdef> + </funcprototype> + + <funcprototype> <funcdef>int <function>sd_session_get_tty</function></funcdef> <paramdef>const char* <parameter>session</parameter></paramdef> <paramdef>char** <parameter>tty</parameter></paramdef> @@ -130,6 +147,11 @@ (i.e. currently in the foreground and available for user input) or not.</para> + <para><function>sd_session_is_remote()</function> may + be used to determine whether the session identified by + the specified session identifier is a remote session + (i.e. its remote host is known) or not.</para> + <para><function>sd_session_get_state()</function> may be used to determine the state of the session identified by the specified session identifier. The @@ -201,6 +223,23 @@ <citerefentry><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry> call after use.</para> + <para><function>sd_session_get_remote_host()</function> + may be used to determine the remote hostname of the + session identified by the specified session + identifier. The returned string needs to be + freed with the libc + <citerefentry><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry> + call after use.</para> + + <para><function>sd_session_get_remote_user()</function> + may be used to determine the remote username of the + session identified by the specified session + identifier. The returned string needs to be + freed with the libc + <citerefentry><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry> + call after use. Note that this value is rarely known + to the system, and even then should not be relied on.</para> + <para><function>sd_session_get_tty()</function> may be used to determine the TTY device of the session identified by the specified session @@ -226,7 +265,8 @@ <title>Return Value</title> <para>If the test succeeds, - <function>sd_session_is_active()</function> returns a + <function>sd_session_is_active()</function> and + <function>sd_session_is_remote()</function> return a positive integer, if it fails 0. On success <function>sd_session_get_state()</function>, <function>sd_session_get_uid()</function>, @@ -234,7 +274,9 @@ <function>sd_session_get_service()</function>, <function>sd_session_get_type()</function>, <function>sd_session_get_class()</function>, - <function>sd_session_get_display()</function> and + <function>sd_session_get_display()</function>, + <function>sd_session_get_remote_user()</function>, + <function>sd_session_get_remote_host()</function> and <function>sd_session_get_tty()</function> return 0 or a positive integer. On failure, these calls return a negative errno-style error code.</para> @@ -250,7 +292,9 @@ <function>sd_session_get_service()</function>, <function>sd_session_get_type()</function>, <function>sd_session_get_class()</function>, - <function>sd_session_get_display()</function> and + <function>sd_session_get_display()</function>, + <function>sd_session_get_remote_host()</function>, + <function>sd_session_get_remote_user()</function> and <function>sd_session_get_tty()</function> interfaces are available as shared library, which can be compiled and linked to with the diff --git a/src/login/libsystemd-login.sym b/src/login/libsystemd-login.sym index 54aa91c609..1d3398253c 100644 --- a/src/login/libsystemd-login.sym +++ b/src/login/libsystemd-login.sym @@ -85,3 +85,10 @@ LIBSYSTEMD_LOGIN_207 { global: sd_session_get_vt; } LIBSYSTEMD_LOGIN_205; + +LIBSYSTEMD_LOGIN_209 { +global: + sd_session_is_remote; + sd_session_get_remote_user; + sd_session_get_remote_host; +} LIBSYSTEMD_LOGIN_207; diff --git a/src/login/sd-login.c b/src/login/sd-login.c index 2930b8751f..c795765620 100644 --- a/src/login/sd-login.c +++ b/src/login/sd-login.c @@ -254,6 +254,26 @@ _public_ int sd_session_is_active(const char *session) { return r; } +_public_ int sd_session_is_remote(const char *session) { + int r; + _cleanup_free_ char *p = NULL, *s = NULL; + + r = file_of_session(session, &p); + if (r < 0) + return r; + + r = parse_env_file(p, NEWLINE, "REMOTE", &s, NULL); + if (r < 0) + return r; + + if (!s) + return -EIO; + + r = parse_boolean(s); + + return r; +} + _public_ int sd_session_get_state(const char *session, char **state) { _cleanup_free_ char *p = NULL, *s = NULL; int r; @@ -364,6 +384,14 @@ _public_ int sd_session_get_display(const char *session, char **display) { return session_get_string(session, "DISPLAY", display); } +_public_ int sd_session_get_remote_user(const char *session, char **remote_user) { + return session_get_string(session, "REMOTE_USER", remote_user); +} + +_public_ int sd_session_get_remote_host(const char *session, char **remote_host) { + return session_get_string(session, "REMOTE_HOST", remote_host); +} + static int file_of_seat(const char *seat, char **_p) { char *p; int r; diff --git a/src/login/test-login.c b/src/login/test-login.c index 228ddb2933..ce88af80f0 100644 --- a/src/login/test-login.c +++ b/src/login/test-login.c @@ -30,7 +30,7 @@ static void test_login(void) { int r, k; uid_t u, u2; - char *seat, *type, *class, *display; + char *seat, *type, *class, *display, *remote_user, *remote_host; char *session; char *state; char *session2; @@ -71,6 +71,10 @@ static void test_login(void) { assert_se(r >= 0); printf("active = %s\n", yes_no(r)); + r = sd_session_is_remote(session); + assert_se(r >= 0); + printf("remote = %s\n", yes_no(r)); + r = sd_session_get_state(session, &state); assert_se(r >= 0); printf("state = %s\n", state); @@ -92,6 +96,14 @@ static void test_login(void) { printf("display = %s\n", display); free(display); + assert_se(sd_session_get_remote_user(session, &remote_user) >= 0); + printf("remote_user = %s\n", remote_user); + free(remote_user); + + assert_se(sd_session_get_remote_host(session, &remote_host) >= 0); + printf("remote_host = %s\n", remote_host); + free(remote_host); + assert_se(sd_session_get_seat(session, &seat) >= 0); printf("seat = %s\n", seat); diff --git a/src/systemd/sd-login.h b/src/systemd/sd-login.h index a230aff4c5..6de6932a75 100644 --- a/src/systemd/sd-login.h +++ b/src/systemd/sd-login.h @@ -95,9 +95,12 @@ int sd_uid_get_sessions(uid_t uid, int require_active, char ***sessions); * just return number of seats.*/ int sd_uid_get_seats(uid_t uid, int require_active, char ***seats); -/* Return 1 if the session is a active. */ +/* Return 1 if the session is active. */ int sd_session_is_active(const char *session); +/* Return 1 if the session is remote. */ +int sd_session_is_remote(const char *session); + /* Get state from session. Possible states: online, active, closing * (This function is a more generic version of * sd_session_is_active().) */ @@ -121,6 +124,12 @@ int sd_session_get_class(const char *session, char **clazz); /* Determine the X11 display of this session. */ int sd_session_get_display(const char *session, char **display); +/* Determine the remote host of this session. */ +int sd_session_get_remote_host(const char *session, char **remote_host); + +/* Determine the remote user of this session (if provided by PAM). */ +int sd_session_get_remote_user(const char *session, char **remote_user); + /* Determine the TTY of this session. */ int sd_session_get_tty(const char *session, char **display); |