chiark / gitweb /
login: add new public API call sd_login_monitor_get_events() to get poll() flags...
[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
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 /*
32  * A few points:
33  *
34  * Instead of returning an empty string array or empty uid array, we
35  * may return NULL.
36  *
37  * Free the data the library returns with libc free(). String arrays
38  * are NULL terminated and you need to free the array itself in
39  * addition to the strings contained.
40  *
41  * We return error codes as negative errno, kernel-style. 0 or
42  * positive on success.
43  *
44  * These functions access data in /proc, /sys/fs/cgroup and /run. All
45  * of these are virtual file systems, hence the accesses are
46  * relatively cheap.
47  *
48  * See sd-login(3) for more information.
49  */
50
51 /* Get session from PID. Note that 'shared' processes of a user are
52  * not attached to a session, but only attached to a user. This will
53  * return an error for system processes and 'shared' processes of a
54  * user. */
55 int sd_pid_get_session(pid_t pid, char **session);
56
57 /* Get UID of the owner of the session of the PID (or in case the
58  * process is a 'shared' user process the UID of that user is
59  * returned). This will not return the UID of the process, but rather
60  * the UID of the owner of the cgroup the process is in. This will
61  * return an error for system processes. */
62 int sd_pid_get_owner_uid(pid_t pid, uid_t *uid);
63
64 /* Get systemd unit (i.e. service) name from PID. This will return an
65  * error for non-service processes. */
66 int sd_pid_get_unit(pid_t, char **unit);
67
68 /* Get state from uid. Possible states: offline, lingering, online, active, closing */
69 int sd_uid_get_state(uid_t uid, char**state);
70
71 /* Return 1 if uid has session on seat. If require_active is true will
72  * look for active sessions only. */
73 int sd_uid_is_on_seat(uid_t uid, int require_active, const char *seat);
74
75 /* Return sessions of user. If require_active is true will look for
76  * active sessions only. Returns number of sessions as return
77  * value. If sessions is NULL will just return number of sessions. */
78 int sd_uid_get_sessions(uid_t uid, int require_active, char ***sessions);
79
80 /* Return seats of user is on. If require_active is true will look for
81  * active seats only.  Returns number of seats. If seats is NULL will
82  * just return number of seats.*/
83 int sd_uid_get_seats(uid_t uid, int require_active, char ***seats);
84
85 /* Return 1 if the session is a active. */
86 int sd_session_is_active(const char *session);
87
88 /* Get state from session. Possible states: online, active, closing
89  * (This function is a more generic version of
90  * sd_session_is_active().) */
91 int sd_session_get_state(const char *sessio, char **state);
92
93 /* Determine user id of session */
94 int sd_session_get_uid(const char *session, uid_t *uid);
95
96 /* Determine seat of session */
97 int sd_session_get_seat(const char *session, char **seat);
98
99 /* Determine the (PAM) service name this session was registered by. */
100 int sd_session_get_service(const char *session, char **service);
101
102 /* Determine the type of this session, i.e. one of "tty", "x11" or "unspecified". */
103 int sd_session_get_type(const char *session, char **type);
104
105 /* Determine the class of this session, i.e. one of "user", "greeter" or "lock-screen". */
106 int sd_session_get_class(const char *session, char **clazz);
107
108 /* Determine the X11 display of this session. */
109 int sd_session_get_display(const char *session, char **display);
110
111 /* Determine the TTY of this session. */
112 int sd_session_get_tty(const char *session, char **display);
113
114 /* Return active session and user of seat */
115 int sd_seat_get_active(const char *seat, char **session, uid_t *uid);
116
117 /* Return sessions and users on seat. Returns number of sessions as
118  * return value. If sessions is NULL returns only the number of
119  * sessions. */
120 int sd_seat_get_sessions(const char *seat, char ***sessions, uid_t **uid, unsigned *n_uids);
121
122 /* Return whether the seat is multi-session capable */
123 int sd_seat_can_multi_session(const char *seat);
124
125 /* Return whether the seat is TTY capable, i.e. suitable for showing console UIs */
126 int sd_seat_can_tty(const char *seat);
127
128 /* Return whether the seat is graphics capable, i.e. suitable for showing graphical UIs */
129 int sd_seat_can_graphical(const char *seat);
130
131 /* Get all seats, store in *seats. Returns the number of seats. If
132  * seats is NULL only returns number of seats. */
133 int sd_get_seats(char ***seats);
134
135 /* Get all sessions, store in *sessions. Returns the number of
136  * sessions. If sessions is NULL only returns number of sessions. */
137 int sd_get_sessions(char ***sessions);
138
139 /* Get all logged in users, store in *users. Returns the number of
140  * users. If users is NULL only returns the number of users. */
141 int sd_get_uids(uid_t **users);
142
143 /* Monitor object */
144 typedef struct sd_login_monitor sd_login_monitor;
145
146 /* Create a new monitor. Category must be NULL, "seat", "session",
147  * "uid" to get monitor events for the specific category (or all). */
148 int sd_login_monitor_new(const char *category, sd_login_monitor** ret);
149
150 /* Destroys the passed monitor. Returns NULL. */
151 sd_login_monitor* sd_login_monitor_unref(sd_login_monitor *m);
152
153 /* Flushes the monitor */
154 int sd_login_monitor_flush(sd_login_monitor *m);
155
156 /* Get FD from monitor */
157 int sd_login_monitor_get_fd(sd_login_monitor *m);
158
159 /* Get poll() mask to monitor */
160 int sd_login_monitor_get_events(sd_login_monitor *m);
161
162 #ifdef __cplusplus
163 }
164 #endif
165
166 #endif