Systemd/src/libsystemd/sd-login/test-login.c
Lennart Poettering f5aaf57562 sd-login: add new sd_pid_get_cgroup() API
This adds a new sd_pid_get_cgroup() call to sd-login which may be used
to query the control path of a process. This is useful for programs when
making use of delegation units, in order to figure out which subtree has
been delegated.

In light of the unified control group hierarchy this is finally safe to
do, hence let's add a proper API for it, to make it easier to use this.
2015-09-05 14:56:23 +02:00

264 lines
7.9 KiB
C

/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd.
Copyright 2011 Lennart Poettering
systemd is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
systemd is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
#include <poll.h>
#include <string.h>
#include "systemd/sd-login.h"
#include "util.h"
#include "strv.h"
#include "formats-util.h"
static void test_login(void) {
_cleanup_close_pair_ int pair[2] = { -1, -1 };
_cleanup_free_ char *pp = NULL, *qq = NULL;
int r, k;
uid_t u, u2;
char *seat, *type, *class, *display, *remote_user, *remote_host, *display_session, *cgroup;
char *session;
char *state;
char *session2;
char *t;
char **seats, **sessions, **machines;
uid_t *uids;
unsigned n;
struct pollfd pollfd;
sd_login_monitor *m = NULL;
assert_se(sd_pid_get_session(0, &session) == 0);
printf("session = %s\n", session);
assert_se(sd_pid_get_owner_uid(0, &u2) == 0);
printf("user = "UID_FMT"\n", u2);
assert_se(sd_pid_get_cgroup(0, &cgroup) == 0);
printf("cgroup = %s\n", cgroup);
free(cgroup);
display_session = NULL;
r = sd_uid_get_display(u2, &display_session);
assert_se(r >= 0 || r == -ENODATA);
printf("user's display session = %s\n", strna(display_session));
free(display_session);
assert_se(socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == 0);
sd_peer_get_session(pair[0], &pp);
sd_peer_get_session(pair[1], &qq);
assert_se(streq_ptr(pp, qq));
r = sd_uid_get_sessions(u2, false, &sessions);
assert_se(r >= 0);
assert_se(r == (int) strv_length(sessions));
assert_se(t = strv_join(sessions, ", "));
strv_free(sessions);
printf("sessions = %s\n", t);
free(t);
assert_se(r == sd_uid_get_sessions(u2, false, NULL));
r = sd_uid_get_seats(u2, false, &seats);
assert_se(r >= 0);
assert_se(r == (int) strv_length(seats));
assert_se(t = strv_join(seats, ", "));
strv_free(seats);
printf("seats = %s\n", t);
free(t);
assert_se(r == sd_uid_get_seats(u2, false, NULL));
r = sd_session_is_active(session);
assert_se(r >= 0);
printf("active = %s\n", yes_no(r));
r = sd_session_is_remote(session);
assert_se(r >= 0);
printf("remote = %s\n", yes_no(r));
r = sd_session_get_state(session, &state);
assert_se(r >= 0);
printf("state = %s\n", state);
free(state);
assert_se(sd_session_get_uid(session, &u) >= 0);
printf("uid = "UID_FMT"\n", u);
assert_se(u == u2);
assert_se(sd_session_get_type(session, &type) >= 0);
printf("type = %s\n", type);
free(type);
assert_se(sd_session_get_class(session, &class) >= 0);
printf("class = %s\n", class);
free(class);
display = NULL;
r = sd_session_get_display(session, &display);
assert_se(r >= 0 || r == -ENODATA);
printf("display = %s\n", strna(display));
free(display);
remote_user = NULL;
r = sd_session_get_remote_user(session, &remote_user);
assert_se(r >= 0 || r == -ENODATA);
printf("remote_user = %s\n", strna(remote_user));
free(remote_user);
remote_host = NULL;
r = sd_session_get_remote_host(session, &remote_host);
assert_se(r >= 0 || r == -ENODATA);
printf("remote_host = %s\n", strna(remote_host));
free(remote_host);
assert_se(sd_session_get_seat(session, &seat) >= 0);
printf("seat = %s\n", seat);
r = sd_seat_can_multi_session(seat);
assert_se(r >= 0);
printf("can do multi session = %s\n", yes_no(r));
r = sd_seat_can_tty(seat);
assert_se(r >= 0);
printf("can do tty = %s\n", yes_no(r));
r = sd_seat_can_graphical(seat);
assert_se(r >= 0);
printf("can do graphical = %s\n", yes_no(r));
assert_se(sd_uid_get_state(u, &state) >= 0);
printf("state = %s\n", state);
assert_se(sd_uid_is_on_seat(u, 0, seat) > 0);
k = sd_uid_is_on_seat(u, 1, seat);
assert_se(k >= 0);
assert_se(!!r == !!r);
assert_se(sd_seat_get_active(seat, &session2, &u2) >= 0);
printf("session2 = %s\n", session2);
printf("uid2 = "UID_FMT"\n", u2);
r = sd_seat_get_sessions(seat, &sessions, &uids, &n);
assert_se(r >= 0);
printf("n_sessions = %i\n", r);
assert_se(r == (int) strv_length(sessions));
assert_se(t = strv_join(sessions, ", "));
strv_free(sessions);
printf("sessions = %s\n", t);
free(t);
printf("uids =");
for (k = 0; k < (int) n; k++)
printf(" "UID_FMT, uids[k]);
printf("\n");
free(uids);
assert_se(sd_seat_get_sessions(seat, NULL, NULL, NULL) == r);
free(session);
free(state);
free(session2);
free(seat);
r = sd_get_seats(&seats);
assert_se(r >= 0);
assert_se(r == (int) strv_length(seats));
assert_se(t = strv_join(seats, ", "));
strv_free(seats);
printf("n_seats = %i\n", r);
printf("seats = %s\n", t);
free(t);
assert_se(sd_get_seats(NULL) == r);
r = sd_seat_get_active(NULL, &t, NULL);
assert_se(r >= 0);
printf("active session on current seat = %s\n", t);
free(t);
r = sd_get_sessions(&sessions);
assert_se(r >= 0);
assert_se(r == (int) strv_length(sessions));
assert_se(t = strv_join(sessions, ", "));
strv_free(sessions);
printf("n_sessions = %i\n", r);
printf("sessions = %s\n", t);
free(t);
assert_se(sd_get_sessions(NULL) == r);
r = sd_get_uids(&uids);
assert_se(r >= 0);
printf("uids =");
for (k = 0; k < r; k++)
printf(" "UID_FMT, uids[k]);
printf("\n");
free(uids);
printf("n_uids = %i\n", r);
assert_se(sd_get_uids(NULL) == r);
r = sd_get_machine_names(&machines);
assert_se(r >= 0);
assert_se(r == (int) strv_length(machines));
assert_se(t = strv_join(machines, ", "));
strv_free(machines);
printf("n_machines = %i\n", r);
printf("machines = %s\n", t);
free(t);
r = sd_login_monitor_new("session", &m);
assert_se(r >= 0);
for (n = 0; n < 5; n++) {
usec_t timeout, nw;
zero(pollfd);
assert_se((pollfd.fd = sd_login_monitor_get_fd(m)) >= 0);
assert_se((pollfd.events = sd_login_monitor_get_events(m)) >= 0);
assert_se(sd_login_monitor_get_timeout(m, &timeout) >= 0);
nw = now(CLOCK_MONOTONIC);
r = poll(&pollfd, 1,
timeout == (uint64_t) -1 ? -1 :
timeout > nw ? (int) ((timeout - nw) / 1000) :
0);
assert_se(r >= 0);
sd_login_monitor_flush(m);
printf("Wake!\n");
}
sd_login_monitor_unref(m);
}
int main(int argc, char* argv[]) {
log_parse_environment();
log_open();
test_login();
return 0;
}