chiark / gitweb /
logind: properly clean up user cgroups when they run empty
[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         assert_se(sd_session_get_uid(session, &u) >= 0);
75         printf("uid = %lu\n", (unsigned long) u);
76         assert_se(u == u2);
77
78         assert_se(sd_session_get_type(session, &type) >= 0);
79         printf("type = %s\n", type);
80         free(type);
81
82         assert_se(sd_session_get_class(session, &class) >= 0);
83         printf("class = %s\n", class);
84         free(class);
85
86         assert_se(sd_session_get_display(session, &display) >= 0);
87         printf("display = %s\n", display);
88         free(display);
89
90         assert_se(sd_session_get_seat(session, &seat) >= 0);
91         printf("seat = %s\n", seat);
92
93         r = sd_seat_can_multi_session(seat);
94         assert_se(r >= 0);
95         printf("can do multi session = %s\n", yes_no(r));
96
97         assert_se(sd_uid_get_state(u, &state) >= 0);
98         printf("state = %s\n", state);
99
100         assert_se(sd_uid_is_on_seat(u, 0, seat) > 0);
101
102         k = sd_uid_is_on_seat(u, 1, seat);
103         assert_se(k >= 0);
104         assert_se(!!r == !!r);
105
106         assert_se(sd_seat_get_active(seat, &session2, &u2) >= 0);
107         printf("session2 = %s\n", session2);
108         printf("uid2 = %lu\n", (unsigned long) u2);
109
110         r = sd_seat_get_sessions(seat, &sessions, &uids, &n);
111         assert_se(r >= 0);
112         printf("n_sessions = %i\n", r);
113         assert_se(r == (int) strv_length(sessions));
114         assert_se(t = strv_join(sessions, ", "));
115         strv_free(sessions);
116         printf("sessions = %s\n", t);
117         free(t);
118         printf("uids =");
119         for (k = 0; k < (int) n; k++)
120                 printf(" %lu", (unsigned long) uids[k]);
121         printf("\n");
122         free(uids);
123
124         assert_se(sd_seat_get_sessions(seat, NULL, NULL, NULL) == r);
125
126         free(session);
127         free(state);
128         free(session2);
129         free(seat);
130
131         r = sd_get_seats(&seats);
132         assert_se(r >= 0);
133         assert_se(r == (int) strv_length(seats));
134         assert_se(t = strv_join(seats, ", "));
135         strv_free(seats);
136         printf("n_seats = %i\n", r);
137         printf("seats = %s\n", t);
138         free(t);
139
140         assert_se(sd_get_seats(NULL) == r);
141
142         r = sd_seat_get_active(NULL, &t, NULL);
143         assert_se(r >= 0);
144         printf("active session on current seat = %s\n", t);
145         free(t);
146
147         r = sd_get_sessions(&sessions);
148         assert_se(r >= 0);
149         assert_se(r == (int) strv_length(sessions));
150         assert_se(t = strv_join(sessions, ", "));
151         strv_free(sessions);
152         printf("n_sessions = %i\n", r);
153         printf("sessions = %s\n", t);
154         free(t);
155
156         assert_se(sd_get_sessions(NULL) == r);
157
158         r = sd_get_uids(&uids);
159         assert_se(r >= 0);
160
161         printf("uids =");
162         for (k = 0; k < r; k++)
163                 printf(" %lu", (unsigned long) uids[k]);
164         printf("\n");
165         free(uids);
166
167         printf("n_uids = %i\n", r);
168         assert_se(sd_get_uids(NULL) == r);
169
170         r = sd_login_monitor_new("session", &m);
171         assert_se(r >= 0);
172
173         zero(pollfd);
174         pollfd.fd = sd_login_monitor_get_fd(m);
175         pollfd.events = POLLIN;
176
177         for (n = 0; n < 5; n++) {
178                 r = poll(&pollfd, 1, -1);
179                 assert_se(r >= 0);
180
181                 sd_login_monitor_flush(m);
182                 printf("Wake!\n");
183         }
184
185         sd_login_monitor_unref(m);
186
187         return 0;
188 }