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, *cgroup;
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 assert_se(sd_pid_get_cgroup(0, &cgroup) == 0);
54 printf("cgroup = %s\n", cgroup);
57 display_session = NULL;
58 r = sd_uid_get_display(u2, &display_session);
59 assert_se(r >= 0 || r == -ENODATA);
60 printf("user's display session = %s\n", strna(display_session));
61 free(display_session);
63 assert_se(socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == 0);
64 sd_peer_get_session(pair[0], &pp);
65 sd_peer_get_session(pair[1], &qq);
66 assert_se(streq_ptr(pp, qq));
68 r = sd_uid_get_sessions(u2, false, &sessions);
70 assert_se(r == (int) strv_length(sessions));
71 assert_se(t = strv_join(sessions, ", "));
73 printf("sessions = %s\n", t);
76 assert_se(r == sd_uid_get_sessions(u2, false, NULL));
78 r = sd_uid_get_seats(u2, false, &seats);
80 assert_se(r == (int) strv_length(seats));
81 assert_se(t = strv_join(seats, ", "));
83 printf("seats = %s\n", t);
86 assert_se(r == sd_uid_get_seats(u2, false, NULL));
88 r = sd_session_is_active(session);
90 printf("active = %s\n", yes_no(r));
92 r = sd_session_is_remote(session);
94 printf("remote = %s\n", yes_no(r));
96 r = sd_session_get_state(session, &state);
98 printf("state = %s\n", state);
101 assert_se(sd_session_get_uid(session, &u) >= 0);
102 printf("uid = "UID_FMT"\n", u);
105 assert_se(sd_session_get_type(session, &type) >= 0);
106 printf("type = %s\n", type);
109 assert_se(sd_session_get_class(session, &class) >= 0);
110 printf("class = %s\n", class);
114 r = sd_session_get_display(session, &display);
115 assert_se(r >= 0 || r == -ENODATA);
116 printf("display = %s\n", strna(display));
120 r = sd_session_get_remote_user(session, &remote_user);
121 assert_se(r >= 0 || r == -ENODATA);
122 printf("remote_user = %s\n", strna(remote_user));
126 r = sd_session_get_remote_host(session, &remote_host);
127 assert_se(r >= 0 || r == -ENODATA);
128 printf("remote_host = %s\n", strna(remote_host));
131 assert_se(sd_session_get_seat(session, &seat) >= 0);
132 printf("seat = %s\n", seat);
134 r = sd_seat_can_multi_session(seat);
136 printf("can do multi session = %s\n", yes_no(r));
138 r = sd_seat_can_tty(seat);
140 printf("can do tty = %s\n", yes_no(r));
142 r = sd_seat_can_graphical(seat);
144 printf("can do graphical = %s\n", yes_no(r));
146 assert_se(sd_uid_get_state(u, &state) >= 0);
147 printf("state = %s\n", state);
149 assert_se(sd_uid_is_on_seat(u, 0, seat) > 0);
151 k = sd_uid_is_on_seat(u, 1, seat);
153 assert_se(!!r == !!r);
155 assert_se(sd_seat_get_active(seat, &session2, &u2) >= 0);
156 printf("session2 = %s\n", session2);
157 printf("uid2 = "UID_FMT"\n", u2);
159 r = sd_seat_get_sessions(seat, &sessions, &uids, &n);
161 printf("n_sessions = %i\n", r);
162 assert_se(r == (int) strv_length(sessions));
163 assert_se(t = strv_join(sessions, ", "));
165 printf("sessions = %s\n", t);
168 for (k = 0; k < (int) n; k++)
169 printf(" "UID_FMT, uids[k]);
173 assert_se(sd_seat_get_sessions(seat, NULL, NULL, NULL) == r);
180 r = sd_get_seats(&seats);
182 assert_se(r == (int) strv_length(seats));
183 assert_se(t = strv_join(seats, ", "));
185 printf("n_seats = %i\n", r);
186 printf("seats = %s\n", t);
189 assert_se(sd_get_seats(NULL) == r);
191 r = sd_seat_get_active(NULL, &t, NULL);
193 printf("active session on current seat = %s\n", t);
196 r = sd_get_sessions(&sessions);
198 assert_se(r == (int) strv_length(sessions));
199 assert_se(t = strv_join(sessions, ", "));
201 printf("n_sessions = %i\n", r);
202 printf("sessions = %s\n", t);
205 assert_se(sd_get_sessions(NULL) == r);
207 r = sd_get_uids(&uids);
211 for (k = 0; k < r; k++)
212 printf(" "UID_FMT, uids[k]);
216 printf("n_uids = %i\n", r);
217 assert_se(sd_get_uids(NULL) == r);
219 r = sd_get_machine_names(&machines);
221 assert_se(r == (int) strv_length(machines));
222 assert_se(t = strv_join(machines, ", "));
224 printf("n_machines = %i\n", r);
225 printf("machines = %s\n", t);
228 r = sd_login_monitor_new("session", &m);
231 for (n = 0; n < 5; n++) {
235 assert_se((pollfd.fd = sd_login_monitor_get_fd(m)) >= 0);
236 assert_se((pollfd.events = sd_login_monitor_get_events(m)) >= 0);
238 assert_se(sd_login_monitor_get_timeout(m, &timeout) >= 0);
240 nw = now(CLOCK_MONOTONIC);
243 timeout == (uint64_t) -1 ? -1 :
244 timeout > nw ? (int) ((timeout - nw) / 1000) :
249 sd_login_monitor_flush(m);
253 sd_login_monitor_unref(m);
256 int main(int argc, char* argv[]) {
257 elogind_set_program_name(argv[0]);
258 log_parse_environment();