chiark / gitweb /
libsystemd-login: add sd_session_get_remote_{host, user}
[elogind.git] / src / systemd / sd-login.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #ifndef foosdloginhfoo
4 #define foosdloginhfoo
5
6 /***
7   This file is part of systemd.
8
9   Copyright 2011 Lennart Poettering
10
11   systemd is free software; you can redistribute it and/or modify it
12   under the terms of the GNU Lesser General Public License as published by
13   the Free Software Foundation; either version 2.1 of the License, or
14   (at your option) any later version.
15
16   systemd is distributed in the hope that it will be useful, but
17   WITHOUT ANY WARRANTY; without even the implied warranty of
18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19   Lesser General Public License for more details.
20
21   You should have received a copy of the GNU Lesser General Public License
22   along with systemd; If not, see <http://www.gnu.org/licenses/>.
23 ***/
24
25 #include <sys/types.h>
26 #include <inttypes.h>
27
28 #include "_sd-common.h"
29
30 /*
31  * A few points:
32  *
33  * Instead of returning an empty string array or empty uid array, we
34  * may return NULL.
35  *
36  * Free the data the library returns with libc free(). String arrays
37  * are NULL terminated and you need to free the array itself in
38  * addition to the strings contained.
39  *
40  * We return error codes as negative errno, kernel-style. 0 or
41  * positive on success.
42  *
43  * These functions access data in /proc, /sys/fs/cgroup and /run. All
44  * of these are virtual file systems, hence the accesses are
45  * relatively cheap.
46  *
47  * See sd-login(3) for more information.
48  */
49
50 _SD_BEGIN_DECLARATIONS;
51
52 /* Get session from PID. Note that 'shared' processes of a user are
53  * not attached to a session, but only attached to a user. This will
54  * return an error for system processes and 'shared' processes of a
55  * user. */
56 int sd_pid_get_session(pid_t pid, char **session);
57
58 /* Get UID of the owner of the session of the PID (or in case the
59  * process is a 'shared' user process the UID of that user is
60  * returned). This will not return the UID of the process, but rather
61  * the UID of the owner of the cgroup the process is in. This will
62  * return an error for system processes. */
63 int sd_pid_get_owner_uid(pid_t pid, uid_t *uid);
64
65 /* Get systemd unit (i.e. service) name from PID, for system
66  * services. This will return an error for non-service processes. */
67 int sd_pid_get_unit(pid_t pid, char **unit);
68
69 /* Get systemd unit (i.e. service) name from PID, for user
70  * services. This will return an error for non-user-service
71  * processes. */
72 int sd_pid_get_user_unit(pid_t pid, char **unit);
73
74 /* Get machine name from PID, for processes assigned to VM or
75  * container. This will return an error for non-machine processes. */
76 int sd_pid_get_machine_name(pid_t pid, char **name);
77
78 /* Get slice name from PID. */
79 int sd_pid_get_slice(pid_t pid, char **name);
80
81 /* Get state from uid. Possible states: offline, lingering, online, active, closing */
82 int sd_uid_get_state(uid_t uid, char**state);
83
84 /* Return 1 if uid has session on seat. If require_active is true will
85  * look for active sessions only. */
86 int sd_uid_is_on_seat(uid_t uid, int require_active, const char *seat);
87
88 /* Return sessions of user. If require_active is true will look for
89  * active sessions only. Returns number of sessions as return
90  * value. If sessions is NULL will just return number of sessions. */
91 int sd_uid_get_sessions(uid_t uid, int require_active, char ***sessions);
92
93 /* Return seats of user is on. If require_active is true will look for
94  * active seats only.  Returns number of seats. If seats is NULL will
95  * just return number of seats.*/
96 int sd_uid_get_seats(uid_t uid, int require_active, char ***seats);
97
98 /* Return 1 if the session is active. */
99 int sd_session_is_active(const char *session);
100
101 /* Return 1 if the session is remote. */
102 int sd_session_is_remote(const char *session);
103
104 /* Get state from session. Possible states: online, active, closing
105  * (This function is a more generic version of
106  * sd_session_is_active().) */
107 int sd_session_get_state(const char *session, char **state);
108
109 /* Determine user id of session */
110 int sd_session_get_uid(const char *session, uid_t *uid);
111
112 /* Determine seat of session */
113 int sd_session_get_seat(const char *session, char **seat);
114
115 /* Determine the (PAM) service name this session was registered by. */
116 int sd_session_get_service(const char *session, char **service);
117
118 /* Determine the type of this session, i.e. one of "tty", "x11" or "unspecified". */
119 int sd_session_get_type(const char *session, char **type);
120
121 /* Determine the class of this session, i.e. one of "user", "greeter" or "lock-screen". */
122 int sd_session_get_class(const char *session, char **clazz);
123
124 /* Determine the X11 display of this session. */
125 int sd_session_get_display(const char *session, char **display);
126
127 /* Determine the remote host of this session. */
128 int sd_session_get_remote_host(const char *session, char **remote_host);
129
130 /* Determine the remote user of this session (if provided by PAM). */
131 int sd_session_get_remote_user(const char *session, char **remote_user);
132
133 /* Determine the TTY of this session. */
134 int sd_session_get_tty(const char *session, char **display);
135
136 /* Determine the VT number of this session. */
137 int sd_session_get_vt(const char *session, unsigned *vtnr);
138
139 /* Return active session and user of seat */
140 int sd_seat_get_active(const char *seat, char **session, uid_t *uid);
141
142 /* Return sessions and users on seat. Returns number of sessions as
143  * return value. If sessions is NULL returns only the number of
144  * sessions. */
145 int sd_seat_get_sessions(const char *seat, char ***sessions, uid_t **uid, unsigned *n_uids);
146
147 /* Return whether the seat is multi-session capable */
148 int sd_seat_can_multi_session(const char *seat);
149
150 /* Return whether the seat is TTY capable, i.e. suitable for showing console UIs */
151 int sd_seat_can_tty(const char *seat);
152
153 /* Return whether the seat is graphics capable, i.e. suitable for showing graphical UIs */
154 int sd_seat_can_graphical(const char *seat);
155
156 /* Get all seats, store in *seats. Returns the number of seats. If
157  * seats is NULL only returns number of seats. */
158 int sd_get_seats(char ***seats);
159
160 /* Get all sessions, store in *sessions. Returns the number of
161  * sessions. If sessions is NULL only returns number of sessions. */
162 int sd_get_sessions(char ***sessions);
163
164 /* Get all logged in users, store in *users. Returns the number of
165  * users. If users is NULL only returns the number of users. */
166 int sd_get_uids(uid_t **users);
167
168 /* Get all running virtual machines/containers */
169 int sd_get_machine_names(char ***machines);
170
171 /* Monitor object */
172 typedef struct sd_login_monitor sd_login_monitor;
173
174 /* Create a new monitor. Category must be NULL, "seat", "session",
175  * "uid", "machine" to get monitor events for the specific category
176  * (or all). */
177 int sd_login_monitor_new(const char *category, sd_login_monitor** ret);
178
179 /* Destroys the passed monitor. Returns NULL. */
180 sd_login_monitor* sd_login_monitor_unref(sd_login_monitor *m);
181
182 /* Flushes the monitor */
183 int sd_login_monitor_flush(sd_login_monitor *m);
184
185 /* Get FD from monitor */
186 int sd_login_monitor_get_fd(sd_login_monitor *m);
187
188 /* Get poll() mask to monitor */
189 int sd_login_monitor_get_events(sd_login_monitor *m);
190
191 /* Get timeout for poll(), as usec value relative to CLOCK_MONOTONIC's epoch */
192 int sd_login_monitor_get_timeout(sd_login_monitor *m, uint64_t *timeout_usec);
193
194 _SD_END_DECLARATIONS;
195
196 #endif