1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2011 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
25 #include "systemd/sd-login.h"
29 #include "formats-util.h"
31 static void test_login(void) {
32 _cleanup_close_pair_ int pair[2] = { -1, -1 };
33 _cleanup_free_ char *pp = NULL, *qq = NULL;
36 char *seat, *type, *class, *display, *remote_user, *remote_host, *display_session;
41 char **seats, **sessions, **machines;
45 sd_login_monitor *m = NULL;
47 assert_se(sd_pid_get_session(0, &session) == 0);
48 printf("session = %s\n", session);
50 assert_se(sd_pid_get_owner_uid(0, &u2) == 0);
51 printf("user = "UID_FMT"\n", u2);
53 display_session = NULL;
54 r = sd_uid_get_display(u2, &display_session);
55 assert_se(r >= 0 || r == -ENXIO);
56 printf("user's display session = %s\n", strna(display_session));
57 free(display_session);
59 assert_se(socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == 0);
60 sd_peer_get_session(pair[0], &pp);
61 sd_peer_get_session(pair[1], &qq);
62 assert_se(streq_ptr(pp, qq));
64 r = sd_uid_get_sessions(u2, false, &sessions);
66 assert_se(r == (int) strv_length(sessions));
67 assert_se(t = strv_join(sessions, ", "));
69 printf("sessions = %s\n", t);
72 assert_se(r == sd_uid_get_sessions(u2, false, NULL));
74 r = sd_uid_get_seats(u2, false, &seats);
76 assert_se(r == (int) strv_length(seats));
77 assert_se(t = strv_join(seats, ", "));
79 printf("seats = %s\n", t);
82 assert_se(r == sd_uid_get_seats(u2, false, NULL));
84 r = sd_session_is_active(session);
86 printf("active = %s\n", yes_no(r));
88 r = sd_session_is_remote(session);
90 printf("remote = %s\n", yes_no(r));
92 r = sd_session_get_state(session, &state);
94 printf("state = %s\n", state);
97 assert_se(sd_session_get_uid(session, &u) >= 0);
98 printf("uid = "UID_FMT"\n", u);
101 assert_se(sd_session_get_type(session, &type) >= 0);
102 printf("type = %s\n", type);
105 assert_se(sd_session_get_class(session, &class) >= 0);
106 printf("class = %s\n", class);
110 r = sd_session_get_display(session, &display);
111 assert_se(r >= 0 || r == -ENXIO);
112 printf("display = %s\n", strna(display));
116 r = sd_session_get_remote_user(session, &remote_user);
117 assert_se(r >= 0 || r == -ENXIO);
118 printf("remote_user = %s\n", strna(remote_user));
122 r = sd_session_get_remote_host(session, &remote_host);
123 assert_se(r >= 0 || r == -ENXIO);
124 printf("remote_host = %s\n", strna(remote_host));
127 assert_se(sd_session_get_seat(session, &seat) >= 0);
128 printf("seat = %s\n", seat);
130 r = sd_seat_can_multi_session(seat);
132 printf("can do multi session = %s\n", yes_no(r));
134 r = sd_seat_can_tty(seat);
136 printf("can do tty = %s\n", yes_no(r));
138 r = sd_seat_can_graphical(seat);
140 printf("can do graphical = %s\n", yes_no(r));
142 assert_se(sd_uid_get_state(u, &state) >= 0);
143 printf("state = %s\n", state);
145 assert_se(sd_uid_is_on_seat(u, 0, seat) > 0);
147 k = sd_uid_is_on_seat(u, 1, seat);
149 assert_se(!!r == !!r);
151 assert_se(sd_seat_get_active(seat, &session2, &u2) >= 0);
152 printf("session2 = %s\n", session2);
153 printf("uid2 = "UID_FMT"\n", u2);
155 r = sd_seat_get_sessions(seat, &sessions, &uids, &n);
157 printf("n_sessions = %i\n", r);
158 assert_se(r == (int) strv_length(sessions));
159 assert_se(t = strv_join(sessions, ", "));
161 printf("sessions = %s\n", t);
164 for (k = 0; k < (int) n; k++)
165 printf(" "UID_FMT, uids[k]);
169 assert_se(sd_seat_get_sessions(seat, NULL, NULL, NULL) == r);
176 r = sd_get_seats(&seats);
178 assert_se(r == (int) strv_length(seats));
179 assert_se(t = strv_join(seats, ", "));
181 printf("n_seats = %i\n", r);
182 printf("seats = %s\n", t);
185 assert_se(sd_get_seats(NULL) == r);
187 r = sd_seat_get_active(NULL, &t, NULL);
189 printf("active session on current seat = %s\n", t);
192 r = sd_get_sessions(&sessions);
194 assert_se(r == (int) strv_length(sessions));
195 assert_se(t = strv_join(sessions, ", "));
197 printf("n_sessions = %i\n", r);
198 printf("sessions = %s\n", t);
201 assert_se(sd_get_sessions(NULL) == r);
203 r = sd_get_uids(&uids);
207 for (k = 0; k < r; k++)
208 printf(" "UID_FMT, uids[k]);
212 printf("n_uids = %i\n", r);
213 assert_se(sd_get_uids(NULL) == r);
215 r = sd_get_machine_names(&machines);
217 assert_se(r == (int) strv_length(machines));
218 assert_se(t = strv_join(machines, ", "));
220 printf("n_machines = %i\n", r);
221 printf("machines = %s\n", t);
224 r = sd_login_monitor_new("session", &m);
227 for (n = 0; n < 5; n++) {
231 assert_se((pollfd.fd = sd_login_monitor_get_fd(m)) >= 0);
232 assert_se((pollfd.events = sd_login_monitor_get_events(m)) >= 0);
234 assert_se(sd_login_monitor_get_timeout(m, &timeout) >= 0);
236 nw = now(CLOCK_MONOTONIC);
239 timeout == (uint64_t) -1 ? -1 :
240 timeout > nw ? (int) ((timeout - nw) / 1000) :
245 sd_login_monitor_flush(m);
249 sd_login_monitor_unref(m);
252 int main(int argc, char* argv[]) {
253 elogind_set_program_name(argv[0]);
254 log_parse_environment();