]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-login/test-login.c
559529ecf675922a3b5425916f8ffe95264dd2eb
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2011 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
26 #include "alloc-util.h"
28 #include "format-util.h"
30 #include "string-util.h"
34 static char* format_uids(char **buf
, uid_t
* uids
, int count
) {
36 size_t size
= (DECIMAL_STR_MAX(uid_t
) + 1) * count
+ 1;
38 assert_se(*buf
= malloc(size
));
40 for (k
= 0; k
< count
; k
++) {
41 sprintf(*buf
+ pos
, "%s"UID_FMT
"%n", k
> 0 ? " " : "", uids
[k
], &inc
);
45 assert_se(pos
< (ssize_t
)size
);
51 static void test_login(void) {
52 _cleanup_close_pair_
int pair
[2] = { -1, -1 };
53 _cleanup_free_
char *pp
= NULL
, *qq
= NULL
,
54 *display_session
= NULL
, *cgroup
= NULL
,
55 *display
= NULL
, *remote_user
= NULL
, *remote_host
= NULL
,
56 *type
= NULL
, *class = NULL
, *state
= NULL
, *state2
= NULL
,
57 *seat
= NULL
, *session
= NULL
,
58 *unit
= NULL
, *user_unit
= NULL
, *slice
= NULL
;
61 char *t
, **seats
, **sessions
;
63 r
= sd_pid_get_unit(0, &unit
);
64 assert_se(r
>= 0 || r
== -ENODATA
);
65 log_info("sd_pid_get_unit(0, …) → \"%s\"", strna(unit
));
67 r
= sd_pid_get_user_unit(0, &user_unit
);
68 assert_se(r
>= 0 || r
== -ENODATA
);
69 log_info("sd_pid_get_user_unit(0, …) → \"%s\"", strna(user_unit
));
71 r
= sd_pid_get_slice(0, &slice
);
72 assert_se(r
>= 0 || r
== -ENODATA
);
73 log_info("sd_pid_get_slice(0, …) → \"%s\"", strna(slice
));
75 r
= sd_pid_get_session(0, &session
);
77 log_warning_errno(r
, "sd_pid_get_session(0, …): %m");
79 log_info("Seems we are not running in a session, skipping some tests.");
81 log_info("sd_pid_get_session(0, …) → \"%s\"", session
);
83 assert_se(sd_pid_get_owner_uid(0, &u2
) == 0);
84 log_info("sd_pid_get_owner_uid(0, …) → "UID_FMT
, u2
);
86 assert_se(sd_pid_get_cgroup(0, &cgroup
) == 0);
87 log_info("sd_pid_get_cgroup(0, …) → \"%s\"", cgroup
);
89 r
= sd_uid_get_display(u2
, &display_session
);
90 assert_se(r
>= 0 || r
== -ENODATA
);
91 log_info("sd_uid_get_display("UID_FMT
", …) → \"%s\"",
92 u2
, strnull(display_session
));
94 assert_se(socketpair(AF_UNIX
, SOCK_STREAM
, 0, pair
) == 0);
95 sd_peer_get_session(pair
[0], &pp
);
96 sd_peer_get_session(pair
[1], &qq
);
97 assert_se(streq_ptr(pp
, qq
));
99 r
= sd_uid_get_sessions(u2
, false, &sessions
);
101 assert_se(r
== (int) strv_length(sessions
));
102 assert_se(t
= strv_join(sessions
, " "));
104 log_info("sd_uid_get_sessions("UID_FMT
", …) → [%i] \"%s\"", u2
, r
, t
);
107 assert_se(r
== sd_uid_get_sessions(u2
, false, NULL
));
109 r
= sd_uid_get_seats(u2
, false, &seats
);
111 assert_se(r
== (int) strv_length(seats
));
112 assert_se(t
= strv_join(seats
, " "));
114 log_info("sd_uid_get_seats("UID_FMT
", …) → [%i] \"%s\"", u2
, r
, t
);
117 assert_se(r
== sd_uid_get_seats(u2
, false, NULL
));
121 r
= sd_session_is_active(session
);
123 log_info("sd_session_is_active(\"%s\") → %s", session
, yes_no(r
));
125 r
= sd_session_is_remote(session
);
127 log_info("sd_session_is_remote(\"%s\") → %s", session
, yes_no(r
));
129 r
= sd_session_get_state(session
, &state
);
131 log_info("sd_session_get_state(\"%s\") → \"%s\"", session
, state
);
133 assert_se(sd_session_get_uid(session
, &u
) >= 0);
134 log_info("sd_session_get_uid(\"%s\") → "UID_FMT
, session
, u
);
137 assert_se(sd_session_get_type(session
, &type
) >= 0);
138 log_info("sd_session_get_type(\"%s\") → \"%s\"", session
, type
);
140 assert_se(sd_session_get_class(session
, &class) >= 0);
141 log_info("sd_session_get_class(\"%s\") → \"%s\"", session
, class);
143 r
= sd_session_get_display(session
, &display
);
144 assert_se(r
>= 0 || r
== -ENODATA
);
145 log_info("sd_session_get_display(\"%s\") → \"%s\"", session
, strna(display
));
147 r
= sd_session_get_remote_user(session
, &remote_user
);
148 assert_se(r
>= 0 || r
== -ENODATA
);
149 log_info("sd_session_get_remote_user(\"%s\") → \"%s\"",
150 session
, strna(remote_user
));
152 r
= sd_session_get_remote_host(session
, &remote_host
);
153 assert_se(r
>= 0 || r
== -ENODATA
);
154 log_info("sd_session_get_remote_host(\"%s\") → \"%s\"",
155 session
, strna(remote_host
));
157 r
= sd_session_get_seat(session
, &seat
);
161 log_info("sd_session_get_seat(\"%s\") → \"%s\"", session
, seat
);
163 r
= sd_seat_can_multi_session(seat
);
165 log_info("sd_session_can_multi_seat(\"%s\") → %s", seat
, yes_no(r
));
167 r
= sd_seat_can_tty(seat
);
169 log_info("sd_session_can_tty(\"%s\") → %s", seat
, yes_no(r
));
171 r
= sd_seat_can_graphical(seat
);
173 log_info("sd_session_can_graphical(\"%s\") → %s", seat
, yes_no(r
));
175 log_info_errno(r
, "sd_session_get_seat(\"%s\"): %m", session
);
176 assert_se(r
== -ENODATA
);
179 assert_se(sd_uid_get_state(u
, &state2
) >= 0);
180 log_info("sd_uid_get_state("UID_FMT
", …) → %s", u
, state2
);
184 _cleanup_free_
char *session2
= NULL
, *buf
= NULL
;
185 _cleanup_free_ uid_t
*uids
= NULL
;
188 assert_se(sd_uid_is_on_seat(u
, 0, seat
) > 0);
190 r
= sd_seat_get_active(seat
, &session2
, &u2
);
192 log_info("sd_seat_get_active(\"%s\", …) → \"%s\", "UID_FMT
, seat
, session2
, u2
);
194 r
= sd_uid_is_on_seat(u
, 1, seat
);
196 assert_se(!!r
== streq(session
, session2
));
198 r
= sd_seat_get_sessions(seat
, &sessions
, &uids
, &n
);
200 assert_se(r
== (int) strv_length(sessions
));
201 assert_se(t
= strv_join(sessions
, " "));
203 log_info("sd_seat_get_sessions(\"%s\", …) → %i, \"%s\", [%i] {%s}",
204 seat
, r
, t
, n
, format_uids(&buf
, uids
, n
));
207 assert_se(sd_seat_get_sessions(seat
, NULL
, NULL
, NULL
) == r
);
210 r
= sd_get_seats(&seats
);
212 assert_se(r
== (int) strv_length(seats
));
213 assert_se(t
= strv_join(seats
, ", "));
215 log_info("sd_get_seats(…) → [%i] \"%s\"", r
, t
);
218 assert_se(sd_get_seats(NULL
) == r
);
220 r
= sd_seat_get_active(NULL
, &t
, NULL
);
221 assert_se(IN_SET(r
, 0, -ENODATA
));
222 log_info("sd_seat_get_active(NULL, …) (active session on current seat) → %s", strnull(t
));
225 r
= sd_get_sessions(&sessions
);
227 assert_se(r
== (int) strv_length(sessions
));
228 assert_se(t
= strv_join(sessions
, ", "));
230 log_info("sd_get_sessions(…) → [%i] \"%s\"", r
, t
);
233 assert_se(sd_get_sessions(NULL
) == r
);
236 _cleanup_free_ uid_t
*uids
= NULL
;
237 _cleanup_free_
char *buf
= NULL
;
239 r
= sd_get_uids(&uids
);
241 log_info("sd_get_uids(…) → [%i] {%s}", r
, format_uids(&buf
, uids
, r
));
243 assert_se(sd_get_uids(NULL
) == r
);
247 _cleanup_strv_free_
char **machines
= NULL
;
248 _cleanup_free_
char *buf
= NULL
;
250 r
= sd_get_machine_names(&machines
);
252 assert_se(r
== (int) strv_length(machines
));
253 assert_se(buf
= strv_join(machines
, " "));
254 log_info("sd_get_machines(…) → [%i] \"%s\"", r
, buf
);
256 assert_se(sd_get_machine_names(NULL
) == r
);
260 static void test_monitor(void) {
261 sd_login_monitor
*m
= NULL
;
265 r
= sd_login_monitor_new("session", &m
);
268 for (n
= 0; n
< 5; n
++) {
269 struct pollfd pollfd
= {};
272 assert_se((pollfd
.fd
= sd_login_monitor_get_fd(m
)) >= 0);
273 assert_se((pollfd
.events
= sd_login_monitor_get_events(m
)) >= 0);
275 assert_se(sd_login_monitor_get_timeout(m
, &timeout
) >= 0);
277 nw
= now(CLOCK_MONOTONIC
);
280 timeout
== (uint64_t) -1 ? -1 :
281 timeout
> nw
? (int) ((timeout
- nw
) / 1000) :
286 sd_login_monitor_flush(m
);
290 sd_login_monitor_unref(m
);
293 int main(int argc
, char* argv
[]) {
294 log_parse_environment();
297 log_info("/* Information printed is from the live system */");
301 if (streq_ptr(argv
[1], "-m"))