X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibelogind%2Fsd-login%2Fsd-login.c;h=7630e6265334f3f7d60e4248bd0b728648650faa;hb=18b9ec874ae92e1b9b7daf91eee8b378a314f92a;hp=03d9cdbcb3ee10346a2ff121448fa31da362240a;hpb=9627cf72cb14c83d0f40902779a73fe756c50efe;p=elogind.git diff --git a/src/libelogind/sd-login/sd-login.c b/src/libelogind/sd-login/sd-login.c index 03d9cdbcb..7630e6265 100644 --- a/src/libelogind/sd-login/sd-login.c +++ b/src/libelogind/sd-login/sd-login.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,21 +17,33 @@ along with systemd; If not, see . ***/ -#include -#include #include -#include #include +#include +#include +#include -#include "util.h" +#include "sd-login.h" + +#include "alloc-util.h" #include "cgroup-util.h" -#include "macro.h" -#include "strv.h" +#include "dirent-util.h" +#include "escape.h" +#include "fd-util.h" #include "fileio.h" -#include "login-util.h" -#include "formats-util.h" +#include "format-util.h" +#include "fs-util.h" #include "hostname-util.h" -#include "sd-login.h" +#include "io-util.h" +#include "login-util.h" +#include "macro.h" +#include "parse-util.h" +#include "path-util.h" +#include "socket-util.h" +#include "string-util.h" +#include "strv.h" +#include "user-util.h" +#include "util.h" /* Error codes: * @@ -46,86 +56,106 @@ */ _public_ int sd_pid_get_session(pid_t pid, char **session) { + int r; assert_return(pid >= 0, -EINVAL); assert_return(session, -EINVAL); - return cg_pid_get_session(pid, session); + r = cg_pid_get_session(pid, session); + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; } _public_ int sd_pid_get_unit(pid_t pid, char **unit) { +#if 0 /// UNNEEDED by elogind + int r; +#endif // 0 assert_return(pid >= 0, -EINVAL); assert_return(unit, -EINVAL); -/// elogind does not support systemd units -#if 0 - return cg_pid_get_unit(pid, unit); +#if 0 /// elogind does not support systemd units + r = cg_pid_get_unit(pid, unit); + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; #else return -ESRCH; #endif // 0 } _public_ int sd_pid_get_user_unit(pid_t pid, char **unit) { +#if 0 /// UNNEEDED by elogind + int r; +#endif // 0 assert_return(pid >= 0, -EINVAL); assert_return(unit, -EINVAL); -/// elogind does not support systemd units -#if 0 - return cg_pid_get_user_unit(pid, unit); +#if 0 /// elogind does not support systemd units + r = cg_pid_get_user_unit(pid, unit); + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; #else return -ESRCH; #endif // 0 } _public_ int sd_pid_get_machine_name(pid_t pid, char **name) { +#if 0 /// UNNEEDED by elogind + int r; +#endif // 0 assert_return(pid >= 0, -EINVAL); assert_return(name, -EINVAL); -/// elogind does not support systemd units -#if 0 - return cg_pid_get_machine_name(pid, name); +#if 0 /// elogind does not support systemd units + r = cg_pid_get_machine_name(pid, name); + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; #else return -ESRCH; #endif // 0 } _public_ int sd_pid_get_slice(pid_t pid, char **slice) { +#if 0 /// UNNEEDED by elogind + int r; +#endif // 0 assert_return(pid >= 0, -EINVAL); assert_return(slice, -EINVAL); -/// elogind does not support systemd slices -#if 0 - return cg_pid_get_slice(pid, slice); +#if 0 /// elogind does not support systemd slices + r = cg_pid_get_slice(pid, slice); + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; #else return -ESRCH; #endif // 0 } _public_ int sd_pid_get_user_slice(pid_t pid, char **slice) { +#if 0 /// UNNEEDED by elogind + int r; +#endif // 0 assert_return(pid >= 0, -EINVAL); assert_return(slice, -EINVAL); -/// elogind does not support systemd slices -#if 0 - return cg_pid_get_user_slice(pid, slice); +#if 0 /// elogind does not support systemd slices + r = cg_pid_get_user_slice(pid, slice); + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; #else return -ESRCH; #endif // 0 } _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) { +#if 0 /// UNNEEDED by elogind + int r; +#endif // 0 assert_return(pid >= 0, -EINVAL); assert_return(uid, -EINVAL); -/// elogind does not support systemd slices -#if 0 - return cg_pid_get_owner_uid(pid, uid); +#if 0 /// elogind does not support systemd slices + r = cg_pid_get_owner_uid(pid, uid); + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; #else return -ESRCH; #endif // 0 @@ -144,7 +174,7 @@ _public_ int sd_pid_get_cgroup(pid_t pid, char **cgroup) { /* The internal APIs return the empty string for the root * cgroup, let's return the "/" in the public APIs instead, as - * that's easier and less ambigious for people to grok. */ + * that's easier and less ambiguous for people to grok. */ if (isempty(c)) { free(c); c = strdup("/"); @@ -168,8 +198,7 @@ _public_ int sd_peer_get_session(int fd, char **session) { if (r < 0) return r; -/// elogind does not support systemd scopes -#if 0 +#if 0 /// elogind does not support systemd scopes return cg_pid_get_session(ucred.pid, session); #else return -ESRCH; @@ -187,8 +216,7 @@ _public_ int sd_peer_get_owner_uid(int fd, uid_t *uid) { if (r < 0) return r; -/// elogind does not support systemd units -#if 0 +#if 0 /// elogind does not support systemd units return cg_pid_get_owner_uid(ucred.pid, uid); #else return -ESRCH; @@ -206,8 +234,7 @@ _public_ int sd_peer_get_unit(int fd, char **unit) { if (r < 0) return r; -/// elogind does not support systemd units -#if 0 +#if 0 /// elogind does not support systemd units return cg_pid_get_unit(ucred.pid, unit); #else return -ESRCH; @@ -225,8 +252,7 @@ _public_ int sd_peer_get_user_unit(int fd, char **unit) { if (r < 0) return r; -/// elogind does not support systemd units -#if 0 +#if 0 /// elogind does not support systemd units return cg_pid_get_user_unit(ucred.pid, unit); #else return -ESRCH; @@ -244,8 +270,7 @@ _public_ int sd_peer_get_machine_name(int fd, char **machine) { if (r < 0) return r; -/// elogind does not support systemd units -#if 0 +#if 0 /// elogind does not support systemd units return cg_pid_get_machine_name(ucred.pid, machine); #else return -ESRCH; @@ -263,8 +288,7 @@ _public_ int sd_peer_get_slice(int fd, char **slice) { if (r < 0) return r; -/// elogind does not support systemd slices -#if 0 +#if 0 /// elogind does not support systemd slices return cg_pid_get_slice(ucred.pid, slice); #else return -ESRCH; @@ -282,8 +306,7 @@ _public_ int sd_peer_get_user_slice(int fd, char **slice) { if (r < 0) return r; -/// elogind does not support systemd slices -#if 0 +#if 0 /// elogind does not support systemd slices return cg_pid_get_user_slice(ucred.pid, slice); #else return -ESRCH; @@ -742,7 +765,7 @@ _public_ int sd_seat_get_sessions(const char *seat, char ***sessions, uid_t **ui r = parse_env_file(p, NEWLINE, "SESSIONS", &s, - "ACTIVE_SESSIONS", &t, + "UIDS", &t, NULL); if (r == -ENOENT) return -ENXIO; @@ -778,7 +801,7 @@ _public_ int sd_seat_get_sessions(const char *seat, char ***sessions, uid_t **ui r = parse_uid(k, b + i); if (r < 0) - continue; + return r; i++; } @@ -839,36 +862,50 @@ _public_ int sd_seat_can_graphical(const char *seat) { } _public_ int sd_get_seats(char ***seats) { - return get_files_in_directory("/run/systemd/seats/", seats); + int r; + + r = get_files_in_directory("/run/systemd/seats/", seats); + if (r == -ENOENT) { + if (seats) + *seats = NULL; + return 0; + } + return r; } _public_ int sd_get_sessions(char ***sessions) { - return get_files_in_directory("/run/systemd/sessions/", sessions); + int r; + + r = get_files_in_directory("/run/systemd/sessions/", sessions); + if (r == -ENOENT) { + if (sessions) + *sessions = NULL; + return 0; + } + return r; } _public_ int sd_get_uids(uid_t **users) { _cleanup_closedir_ DIR *d; + struct dirent *de; int r = 0; unsigned n = 0; _cleanup_free_ uid_t *l = NULL; d = opendir("/run/systemd/users/"); - if (!d) + if (!d) { + if (errno == ENOENT) { + if (users) + *users = NULL; + return 0; + } return -errno; + } - for (;;) { - struct dirent *de; + FOREACH_DIRENT_ALL(de, d, return -errno) { int k; uid_t uid; - errno = 0; - de = readdir(d); - if (!de && errno != 0) - return -errno; - - if (!de) - break; - dirent_ensure_type(d, de); if (!dirent_is_file(de)) @@ -911,6 +948,10 @@ _public_ int sd_get_machine_names(char ***machines) { assert_return(machines, -EINVAL); r = get_files_in_directory("/run/systemd/machines/", &l); + if (r == -ENOENT) { + *machines = NULL; + return 0; + } if (r < 0) return r; @@ -985,9 +1026,7 @@ _public_ int sd_machine_get_ifindices(const char *machine, int **ifindices) { *(char*) (mempcpy(buf, word, l)) = 0; - if (safe_atoi(buf, &ifi) < 0) - continue; - if (ifi <= 0) + if (parse_ifindex(buf, &ifi) < 0) continue; if (!GREEDY_REALLOC(ni, allocated, nr+1)) { @@ -1072,7 +1111,8 @@ _public_ int sd_login_monitor_new(const char *category, sd_login_monitor **m) { _public_ sd_login_monitor* sd_login_monitor_unref(sd_login_monitor *m) { int fd; - assert_return(m, NULL); + if (!m) + return NULL; fd = MONITOR_TO_FD(m); close_nointr(fd);