sd-login: various modernizations (#37728)

This commit is contained in:
Lennart Poettering
2025-06-04 22:24:57 +02:00
committed by GitHub
4 changed files with 358 additions and 423 deletions

View File

@@ -915,7 +915,6 @@ int cg_pid_get_path_shifted(pid_t pid, const char *root, char **ret_cgroup) {
int cg_path_decode_unit(const char *cgroup, char **ret_unit) {
assert(cgroup);
assert(ret_unit);
size_t n = strcspn(cgroup, "/");
if (n < 3)
@@ -927,7 +926,10 @@ int cg_path_decode_unit(const char *cgroup, char **ret_unit) {
if (!unit_name_is_valid(c, UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE))
return -ENXIO;
return strdup_to(ret_unit, c);
if (ret_unit)
return strdup_to(ret_unit, c);
return 0;
}
static bool valid_slice_name(const char *p, size_t n) {
@@ -976,7 +978,6 @@ int cg_path_get_unit(const char *path, char **ret) {
int r;
assert(path);
assert(ret);
e = skip_slices(path);
@@ -988,7 +989,8 @@ int cg_path_get_unit(const char *path, char **ret) {
if (endswith(unit, ".slice"))
return -ENXIO;
*ret = TAKE_PTR(unit);
if (ret)
*ret = TAKE_PTR(unit);
return 0;
}
@@ -1157,7 +1159,6 @@ int cg_path_get_user_unit(const char *path, char **ret) {
const char *t;
assert(path);
assert(ret);
t = skip_user_prefix(path);
if (!t)
@@ -1172,8 +1173,6 @@ int cg_pid_get_user_unit(pid_t pid, char **ret_unit) {
_cleanup_free_ char *cgroup = NULL;
int r;
assert(ret_unit);
r = cg_pid_get_path_shifted(pid, NULL, &cgroup);
if (r < 0)
return r;
@@ -1198,8 +1197,6 @@ int cg_pid_get_machine_name(pid_t pid, char **ret_machine) {
_cleanup_free_ char *cgroup = NULL;
int r;
assert(ret_machine);
r = cg_pid_get_path_shifted(pid, NULL, &cgroup);
if (r < 0)
return r;
@@ -1332,7 +1329,6 @@ int cg_path_get_slice(const char *p, char **ret_slice) {
const char *e = NULL;
assert(p);
assert(ret_slice);
/* Finds the right-most slice unit from the beginning, but stops before we come to
* the first non-slice unit. */
@@ -1353,15 +1349,16 @@ int cg_path_get_slice(const char *p, char **ret_slice) {
if (e)
return cg_path_decode_unit(e, ret_slice);
return strdup_to(ret_slice, SPECIAL_ROOT_SLICE);
if (ret_slice)
return strdup_to(ret_slice, SPECIAL_ROOT_SLICE);
return 0;
}
int cg_pid_get_slice(pid_t pid, char **ret_slice) {
_cleanup_free_ char *cgroup = NULL;
int r;
assert(ret_slice);
r = cg_pid_get_path_shifted(pid, NULL, &cgroup);
if (r < 0)
return r;
@@ -1372,7 +1369,6 @@ int cg_pid_get_slice(pid_t pid, char **ret_slice) {
int cg_path_get_user_slice(const char *p, char **ret_slice) {
const char *t;
assert(p);
assert(ret_slice);
t = skip_user_prefix(p);
if (!t)
@@ -1387,8 +1383,6 @@ int cg_pid_get_user_slice(pid_t pid, char **ret_slice) {
_cleanup_free_ char *cgroup = NULL;
int r;
assert(ret_slice);
r = cg_pid_get_path_shifted(pid, NULL, &cgroup);
if (r < 0)
return r;

View File

@@ -535,7 +535,7 @@ int mkfifoat_atomic(int atfd, const char *path, mode_t mode) {
return 0;
}
int get_files_in_directory(const char *path, char ***list) {
int get_files_in_directory(const char *path, char ***ret_list) {
_cleanup_strv_free_ char **l = NULL;
_cleanup_closedir_ DIR *d = NULL;
size_t n = 0;
@@ -554,7 +554,7 @@ int get_files_in_directory(const char *path, char ***list) {
if (!dirent_is_file(de))
continue;
if (list) {
if (ret_list) {
/* one extra slot is needed for the terminating NULL */
if (!GREEDY_REALLOC(l, n + 2))
return -ENOMEM;
@@ -568,8 +568,8 @@ int get_files_in_directory(const char *path, char ***list) {
n++;
}
if (list)
*list = TAKE_PTR(l);
if (ret_list)
*ret_list = TAKE_PTR(l);
return n;
}

File diff suppressed because it is too large Load Diff

View File

@@ -45,90 +45,90 @@ _SD_BEGIN_DECLARATIONS;
* not attached to a session, but only attached to a user. This will
* return an error for system processes and 'shared' processes of a
* user. */
int sd_pid_get_session(pid_t pid, char **session);
int sd_pid_get_session(pid_t pid, char **ret_session);
/* Get UID of the owner of the session of the PID (or in case the
* process is a 'shared' user process, the UID of that user is
* returned). This will not return the UID of the process, but rather
* the UID of the owner of the cgroup that the process is in. This will
* return an error for system processes. */
int sd_pid_get_owner_uid(pid_t pid, uid_t *uid);
int sd_pid_get_owner_uid(pid_t pid, uid_t *ret_uid);
/* Get systemd non-slice unit (i.e. service) name from PID, for system
* services. This will return an error for non-service processes. */
int sd_pid_get_unit(pid_t pid, char **unit);
int sd_pid_get_unit(pid_t pid, char **ret_unit);
/* Get systemd non-slice unit (i.e. service) name from PID, for user
* services. This will return an error for non-user-service
* processes. */
int sd_pid_get_user_unit(pid_t pid, char **unit);
int sd_pid_get_user_unit(pid_t pid, char **ret_unit);
/* Get slice name from PID. */
int sd_pid_get_slice(pid_t pid, char **slice);
int sd_pid_get_slice(pid_t pid, char **ret_slice);
/* Get user slice name from PID. */
int sd_pid_get_user_slice(pid_t pid, char **slice);
int sd_pid_get_user_slice(pid_t pid, char **ret_slice);
/* Get machine name from PID, for processes assigned to a VM or
* container. This will return an error for non-machine processes. */
int sd_pid_get_machine_name(pid_t pid, char **machine);
int sd_pid_get_machine_name(pid_t pid, char **ret_machine);
/* Get the control group from a PID, relative to the root of the
* hierarchy. */
int sd_pid_get_cgroup(pid_t pid, char **cgroup);
int sd_pid_get_cgroup(pid_t pid, char **ret_cgroup);
/* Equivalent to the corresponding sd_pid_get* functions, but take a
* PIDFD instead of a PID, to ensure there can be no possible PID
* recycle issues before/after the calls. */
int sd_pidfd_get_session(int pidfd, char **session);
int sd_pidfd_get_owner_uid(int pidfd, uid_t *uid);
int sd_pidfd_get_unit(int pidfd, char **unit);
int sd_pidfd_get_user_unit(int pidfd, char **unit);
int sd_pidfd_get_slice(int pidfd, char **slice);
int sd_pidfd_get_user_slice(int pidfd, char **slice);
int sd_pidfd_get_machine_name(int pidfd, char **machine);
int sd_pidfd_get_cgroup(int pidfd, char **cgroup);
int sd_pidfd_get_session(int pidfd, char **ret_session);
int sd_pidfd_get_owner_uid(int pidfd, uid_t *ret_uid);
int sd_pidfd_get_unit(int pidfd, char **ret_unit);
int sd_pidfd_get_user_unit(int pidfd, char **ret_unit);
int sd_pidfd_get_slice(int pidfd, char **ret_slice);
int sd_pidfd_get_user_slice(int pidfd, char **ret_slice);
int sd_pidfd_get_machine_name(int pidfd, char **ret_machine);
int sd_pidfd_get_cgroup(int pidfd, char **ret_cgroup);
/* Similar to sd_pid_get_session(), but retrieves data about the peer
* of a connected AF_UNIX socket */
int sd_peer_get_session(int fd, char **session);
int sd_peer_get_session(int fd, char **ret_session);
/* Similar to sd_pid_get_owner_uid(), but retrieves data about the peer of
* a connected AF_UNIX socket */
int sd_peer_get_owner_uid(int fd, uid_t *uid);
int sd_peer_get_owner_uid(int fd, uid_t *ret_uid);
/* Similar to sd_pid_get_unit(), but retrieves data about the peer of
* a connected AF_UNIX socket */
int sd_peer_get_unit(int fd, char **unit);
int sd_peer_get_unit(int fd, char **ret_unit);
/* Similar to sd_pid_get_user_unit(), but retrieves data about the peer of
* a connected AF_UNIX socket */
int sd_peer_get_user_unit(int fd, char **unit);
int sd_peer_get_user_unit(int fd, char **ret_unit);
/* Similar to sd_pid_get_slice(), but retrieves data about the peer of
* a connected AF_UNIX socket */
int sd_peer_get_slice(int fd, char **slice);
int sd_peer_get_slice(int fd, char **ret_slice);
/* Similar to sd_pid_get_user_slice(), but retrieves data about the peer of
* a connected AF_UNIX socket */
int sd_peer_get_user_slice(int fd, char **slice);
int sd_peer_get_user_slice(int fd, char **ret_slice);
/* Similar to sd_pid_get_machine_name(), but retrieves data about the
* peer of a connected AF_UNIX socket */
int sd_peer_get_machine_name(int fd, char **machine);
int sd_peer_get_machine_name(int fd, char **ret_machine);
/* Similar to sd_pid_get_cgroup(), but retrieves data about the peer
* of a connected AF_UNIX socket. */
int sd_peer_get_cgroup(int fd, char **cgroup);
int sd_peer_get_cgroup(int fd, char **ret_cgroup);
/* Get state from UID. Possible states: offline, lingering, online, active, closing */
int sd_uid_get_state(uid_t uid, char **state);
int sd_uid_get_state(uid_t uid, char **ret_state);
/* Return primary session of user, if there is any */
int sd_uid_get_display(uid_t uid, char **session);
int sd_uid_get_display(uid_t uid, char **ret_display);
/* Determine the login time of user */
int sd_uid_get_login_time(uid_t uid, uint64_t *usec);
int sd_uid_get_login_time(uid_t uid, uint64_t *ret_usec);
/* Return 1 if UID has session on seat. If require_active is true, this will
* look for active sessions only. */
@@ -137,12 +137,12 @@ int sd_uid_is_on_seat(uid_t uid, int require_active, const char *seat);
/* Return sessions of user. If require_active is true, this will look for
* active sessions only. Returns the number of sessions.
* If sessions is NULL, this will just return the number of sessions. */
int sd_uid_get_sessions(uid_t uid, int require_active, char ***sessions);
int sd_uid_get_sessions(uid_t uid, int require_active, char ***ret_sessions);
/* Return seats of user is on. If require_active is true, this will look for
* active seats only. Returns the number of seats.
* If seats is NULL, this will just return the number of seats. */
int sd_uid_get_seats(uid_t uid, int require_active, char ***seats);
int sd_uid_get_seats(uid_t uid, int require_active, char ***ret_seats);
/* Return 1 if the session is active. */
int sd_session_is_active(const char *session);
@@ -152,49 +152,49 @@ int sd_session_is_remote(const char *session);
/* Get state from session. Possible states: online, active, closing.
* This function is a more generic version of sd_session_is_active(). */
int sd_session_get_state(const char *session, char **state);
int sd_session_get_state(const char *session, char **ret_state);
/* Determine user ID of session */
int sd_session_get_uid(const char *session, uid_t *uid);
int sd_session_get_uid(const char *session, uid_t *ret_uid);
/* Determine username of session */
int sd_session_get_username(const char *session, char **username);
int sd_session_get_username(const char *session, char **ret_username);
/* Determine seat of session */
int sd_session_get_seat(const char *session, char **seat);
int sd_session_get_seat(const char *session, char **ret_seat);
/* Determine the start time of session */
int sd_session_get_start_time(const char *session, uint64_t *usec);
int sd_session_get_start_time(const char *session, uint64_t *ret_usec);
/* Determine the (PAM) service name this session was registered by. */
int sd_session_get_service(const char *session, char **service);
int sd_session_get_service(const char *session, char **ret_service);
/* Determine the type of this session, i.e. one of "tty", "x11", "wayland", "mir", "web", or "unspecified". */
int sd_session_get_type(const char *session, char **type);
int sd_session_get_type(const char *session, char **ret_type);
/* Determine the class of this session, i.e. one of "user", "greeter" or "lock-screen". */
int sd_session_get_class(const char *session, char **clazz);
int sd_session_get_class(const char *session, char **ret_clazz);
/* Determine the desktop brand of this session, i.e. something like "GNOME", "KDE" or "systemd-console". */
int sd_session_get_desktop(const char *session, char **desktop);
int sd_session_get_desktop(const char *session, char **ret_desktop);
/* Determine the X11 display of this session. */
int sd_session_get_display(const char *session, char **display);
int sd_session_get_display(const char *session, char **ret_display);
/* Determine the leader process of this session. */
int sd_session_get_leader(const char *session, pid_t *leader);
int sd_session_get_leader(const char *session, pid_t *ret_leader);
/* Determine the remote host of this session. */
int sd_session_get_remote_host(const char *session, char **remote_host);
int sd_session_get_remote_host(const char *session, char **ret_remote_host);
/* Determine the remote user of this session (if provided by PAM). */
int sd_session_get_remote_user(const char *session, char **remote_user);
int sd_session_get_remote_user(const char *session, char **tre_remote_user);
/* Determine the TTY of this session. */
int sd_session_get_tty(const char *session, char **display);
int sd_session_get_tty(const char *session, char **ret_tty);
/* Determine the VT number of this session. */
int sd_session_get_vt(const char *session, unsigned *vtnr);
int sd_session_get_vt(const char *session, unsigned *ret_vtnr);
/* Return active session and user of seat */
int sd_seat_get_active(const char *seat, char **ret_session, uid_t *ret_uid);
@@ -217,25 +217,25 @@ int sd_seat_can_tty(const char *seat);
int sd_seat_can_graphical(const char *seat);
/* Return the class of machine */
int sd_machine_get_class(const char *machine, char **clazz);
int sd_machine_get_class(const char *machine, char **ret_clazz);
/* Return the list if host-side network interface indices of a machine */
int sd_machine_get_ifindices(const char *machine, int **ret_ifindices);
/* Get all seats, store in *seats. Returns the number of seats. If
* seats is NULL, this only returns the number of seats. */
int sd_get_seats(char ***seats);
int sd_get_seats(char ***ret_seats);
/* Get all sessions, store in *sessions. Returns the number of
* sessions. If sessions is NULL, this only returns the number of sessions. */
int sd_get_sessions(char ***sessions);
int sd_get_sessions(char ***ret_sessions);
/* Get all logged in users, store in *users. Returns the number of
* users. If users is NULL, this only returns the number of users. */
int sd_get_uids(uid_t **users);
int sd_get_uids(uid_t **ret_users);
/* Get all running virtual machines/containers */
int sd_get_machine_names(char ***machines);
int sd_get_machine_names(char ***ret_machines);
/* Monitor object */
typedef struct sd_login_monitor sd_login_monitor;
@@ -243,7 +243,7 @@ typedef struct sd_login_monitor sd_login_monitor;
/* Create a new monitor. Category must be NULL, "seat", "session",
* "uid", or "machine" to get monitor events for the specific category
* (or all). */
int sd_login_monitor_new(const char *category, sd_login_monitor** ret);
int sd_login_monitor_new(const char *category, sd_login_monitor **ret);
/* Destroys the passed monitor. Returns NULL. */
sd_login_monitor* sd_login_monitor_unref(sd_login_monitor *m);
@@ -258,7 +258,7 @@ int sd_login_monitor_get_fd(sd_login_monitor *m);
int sd_login_monitor_get_events(sd_login_monitor *m);
/* Get timeout for poll(), as usec value relative to CLOCK_MONOTONIC's epoch */
int sd_login_monitor_get_timeout(sd_login_monitor *m, uint64_t *timeout_usec);
int sd_login_monitor_get_timeout(sd_login_monitor *m, uint64_t *ret_timeout_usec);
_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_login_monitor, sd_login_monitor_unref);