chiark / gitweb /
d0916ced6a11a6d1b67b4a72417ea42ad4755d6a
[elogind.git] / src / login / test-login.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2011 Lennart Poettering
7
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.
12
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.
17
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/>.
20 ***/
21
22 #include <sys/poll.h>
23 #include <string.h>
24
25 #include <systemd/sd-login.h>
26
27 #include "util.h"
28 #include "strv.h"
29
30 int main(int argc, char* argv[]) {
31         int r, k;
32         uid_t u, u2;
33         char *seat, *type, *class, *display;
34         char *session;
35         char *state;
36         char *session2;
37         char *t;
38         char **seats, **sessions;
39         uid_t *uids;
40         unsigned n;
41         struct pollfd pollfd;
42         sd_login_monitor *m;
43
44         assert_se(sd_pid_get_session(0, &session) == 0);
45         printf("session = %s\n", session);
46
47         assert_se(sd_pid_get_owner_uid(0, &u2) == 0);
48         printf("user = %lu\n", (unsigned long) u2);
49
50         r = sd_uid_get_sessions(u2, false, &sessions);
51         assert_se(r >= 0);
52         assert_se(r == (int) strv_length(sessions));
53         assert_se(t = strv_join(sessions, ", "));
54         strv_free(sessions);
55         printf("sessions = %s\n", t);
56         free(t);
57
58         assert_se(r == sd_uid_get_sessions(u2, false, NULL));
59
60         r = sd_uid_get_seats(u2, false, &seats);
61         assert_se(r >= 0);
62         assert_se(r == (int) strv_length(seats));
63         assert_se(t = strv_join(seats, ", "));
64         strv_free(seats);
65         printf("seats = %s\n", t);
66         free(t);
67
68         assert_se(r == sd_uid_get_seats(u2, false, NULL));
69
70         r = sd_session_is_active(session);
71         assert_se(r >= 0);
72         printf("active = %s\n", yes_no(r));
73
74         r = sd_session_get_state(session, &state);
75         assert_se(r >= 0);
76         printf("state = %s\n", state);
77         free(state);
78
79         assert_se(sd_session_get_uid(session, &u) >= 0);
80         printf("uid = %lu\n", (unsigned long) u);
81         assert_se(u == u2);
82
83         assert_se(sd_session_get_type(session, &type) >= 0);
84         printf("type = %s\n", type);
85         free(type);
86
87         assert_se(sd_session_get_class(session, &class) >= 0);
88         printf("class = %s\n", class);
89         free(class);
90
91         assert_se(sd_session_get_display(session, &display) >= 0);
92         printf("display = %s\n", display);
93         free(display);
94
95         assert_se(sd_session_get_seat(session, &seat) >= 0);
96         printf("seat = %s\n", seat);
97
98         r = sd_seat_can_multi_session(seat);
99         assert_se(r >= 0);
100         printf("can do multi session = %s\n", yes_no(r));
101
102         assert_se(sd_uid_get_state(u, &state) >= 0);
103         printf("state = %s\n", state);
104
105         assert_se(sd_uid_is_on_seat(u, 0, seat) > 0);
106
107         k = sd_uid_is_on_seat(u, 1, seat);
108         assert_se(k >= 0);
109         assert_se(!!r == !!r);
110
111         assert_se(sd_seat_get_active(seat, &session2, &u2) >= 0);
112         printf("session2 = %s\n", session2);
113         printf("uid2 = %lu\n", (unsigned long) u2);
114
115         r = sd_seat_get_sessions(seat, &sessions, &uids, &n);
116         assert_se(r >= 0);
117         printf("n_sessions = %i\n", r);
118         assert_se(r == (int) strv_length(sessions));
119         assert_se(t = strv_join(sessions, ", "));
120         strv_free(sessions);
121         printf("sessions = %s\n", t);
122         free(t);
123         printf("uids =");
124         for (k = 0; k < (int) n; k++)
125                 printf(" %lu", (unsigned long) uids[k]);
126         printf("\n");
127         free(uids);
128
129         assert_se(sd_seat_get_sessions(seat, NULL, NULL, NULL) == r);
130
131         free(session);
132         free(state);
133         free(session2);
134         free(seat);
135
136         r = sd_get_seats(&seats);
137         assert_se(r >= 0);
138         assert_se(r == (int) strv_length(seats));
139         assert_se(t = strv_join(seats, ", "));
140         strv_free(seats);
141         printf("n_seats = %i\n", r);
142         printf("seats = %s\n", t);
143         free(t);
144
145         assert_se(sd_get_seats(NULL) == r);
146
147         r = sd_seat_get_active(NULL, &t, NULL);
148         assert_se(r >= 0);
149         printf("active session on current seat = %s\n", t);
150         free(t);
151
152         r = sd_get_sessions(&sessions);
153         assert_se(r >= 0);
154         assert_se(r == (int) strv_length(sessions));
155         assert_se(t = strv_join(sessions, ", "));
156         strv_free(sessions);
157         printf("n_sessions = %i\n", r);
158         printf("sessions = %s\n", t);
159         free(t);
160
161         assert_se(sd_get_sessions(NULL) == r);
162
163         r = sd_get_uids(&uids);
164         assert_se(r >= 0);
165
166         printf("uids =");
167         for (k = 0; k < r; k++)
168                 printf(" %lu", (unsigned long) uids[k]);
169         printf("\n");
170         free(uids);
171
172         printf("n_uids = %i\n", r);
173         assert_se(sd_get_uids(NULL) == r);
174
175         r = sd_login_monitor_new("session", &m);
176         assert_se(r >= 0);
177
178         zero(pollfd);
179         pollfd.fd = sd_login_monitor_get_fd(m);
180         pollfd.events = POLLIN;
181
182         for (n = 0; n < 5; n++) {
183                 r = poll(&pollfd, 1, -1);
184                 assert_se(r >= 0);
185
186                 sd_login_monitor_flush(m);
187                 printf("Wake!\n");
188         }
189
190         sd_login_monitor_unref(m);
191
192         return 0;
193 }