X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibelogind%2Fsd-login%2Fsd-login.c;h=e3cc3628f50741151d029e731fd8e9f63ab88354;hb=701d4cf38514d96ea0618807ac3b08a9e52c60cd;hp=180bdd09ad2ff4e8132e5b3944e2ac57e82c6efb;hpb=abbb87ffdecf445d2bba18e1638f80c96098339e;p=elogind.git diff --git a/src/libelogind/sd-login/sd-login.c b/src/libelogind/sd-login/sd-login.c index 180bdd09a..e3cc3628f 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: * @@ -58,7 +68,11 @@ _public_ int sd_pid_get_unit(pid_t pid, char **unit) { assert_return(pid >= 0, -EINVAL); assert_return(unit, -EINVAL); +#if 0 /// elogind does not support systemd units return cg_pid_get_unit(pid, unit); +#else + return -ESRCH; +#endif // 0 } _public_ int sd_pid_get_user_unit(pid_t pid, char **unit) { @@ -66,7 +80,11 @@ _public_ int sd_pid_get_user_unit(pid_t pid, char **unit) { assert_return(pid >= 0, -EINVAL); assert_return(unit, -EINVAL); +#if 0 /// elogind does not support systemd units return cg_pid_get_user_unit(pid, unit); +#else + return -ESRCH; +#endif // 0 } _public_ int sd_pid_get_machine_name(pid_t pid, char **name) { @@ -74,7 +92,11 @@ _public_ int sd_pid_get_machine_name(pid_t pid, char **name) { assert_return(pid >= 0, -EINVAL); assert_return(name, -EINVAL); +#if 0 /// elogind does not support systemd units return cg_pid_get_machine_name(pid, name); +#else + return -ESRCH; +#endif // 0 } _public_ int sd_pid_get_slice(pid_t pid, char **slice) { @@ -82,7 +104,11 @@ _public_ int sd_pid_get_slice(pid_t pid, char **slice) { assert_return(pid >= 0, -EINVAL); assert_return(slice, -EINVAL); +#if 0 /// elogind does not support systemd slices return cg_pid_get_slice(pid, slice); +#else + return -ESRCH; +#endif // 0 } _public_ int sd_pid_get_user_slice(pid_t pid, char **slice) { @@ -90,7 +116,11 @@ _public_ int sd_pid_get_user_slice(pid_t pid, char **slice) { assert_return(pid >= 0, -EINVAL); assert_return(slice, -EINVAL); +#if 0 /// elogind does not support systemd slices return cg_pid_get_user_slice(pid, slice); +#else + return -ESRCH; +#endif // 0 } _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) { @@ -98,7 +128,37 @@ _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) { assert_return(pid >= 0, -EINVAL); assert_return(uid, -EINVAL); +#if 0 /// elogind does not support systemd slices return cg_pid_get_owner_uid(pid, uid); +#else + return -ESRCH; +#endif // 0 +} + +_public_ int sd_pid_get_cgroup(pid_t pid, char **cgroup) { + char *c; + int r; + + assert_return(pid >= 0, -EINVAL); + assert_return(cgroup, -EINVAL); + + r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &c); + if (r < 0) + return r; + + /* 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 ambiguous for people to grok. */ + if (isempty(c)) { + free(c); + c = strdup("/"); + if (!c) + return -ENOMEM; + + } + + *cgroup = c; + return 0; } _public_ int sd_peer_get_session(int fd, char **session) { @@ -112,7 +172,11 @@ _public_ int sd_peer_get_session(int fd, char **session) { if (r < 0) return r; +#if 0 /// elogind does not support systemd scopes return cg_pid_get_session(ucred.pid, session); +#else + return -ESRCH; +#endif // 0 } _public_ int sd_peer_get_owner_uid(int fd, uid_t *uid) { @@ -126,7 +190,11 @@ _public_ int sd_peer_get_owner_uid(int fd, uid_t *uid) { if (r < 0) return r; +#if 0 /// elogind does not support systemd units return cg_pid_get_owner_uid(ucred.pid, uid); +#else + return -ESRCH; +#endif // 0 } _public_ int sd_peer_get_unit(int fd, char **unit) { @@ -140,7 +208,11 @@ _public_ int sd_peer_get_unit(int fd, char **unit) { if (r < 0) return r; +#if 0 /// elogind does not support systemd units return cg_pid_get_unit(ucred.pid, unit); +#else + return -ESRCH; +#endif // 0 } _public_ int sd_peer_get_user_unit(int fd, char **unit) { @@ -154,7 +226,11 @@ _public_ int sd_peer_get_user_unit(int fd, char **unit) { if (r < 0) return r; +#if 0 /// elogind does not support systemd units return cg_pid_get_user_unit(ucred.pid, unit); +#else + return -ESRCH; +#endif // 0 } _public_ int sd_peer_get_machine_name(int fd, char **machine) { @@ -168,7 +244,11 @@ _public_ int sd_peer_get_machine_name(int fd, char **machine) { if (r < 0) return r; +#if 0 /// elogind does not support systemd units return cg_pid_get_machine_name(ucred.pid, machine); +#else + return -ESRCH; +#endif // 0 } _public_ int sd_peer_get_slice(int fd, char **slice) { @@ -182,7 +262,11 @@ _public_ int sd_peer_get_slice(int fd, char **slice) { if (r < 0) return r; +#if 0 /// elogind does not support systemd slices return cg_pid_get_slice(ucred.pid, slice); +#else + return -ESRCH; +#endif // 0 } _public_ int sd_peer_get_user_slice(int fd, char **slice) { @@ -196,7 +280,25 @@ _public_ int sd_peer_get_user_slice(int fd, char **slice) { if (r < 0) return r; +#if 0 /// elogind does not support systemd slices return cg_pid_get_user_slice(ucred.pid, slice); +#else + return -ESRCH; +#endif // 0 +} + +_public_ int sd_peer_get_cgroup(int fd, char **cgroup) { + struct ucred ucred; + int r; + + assert_return(fd >= 0, -EBADF); + assert_return(cgroup, -EINVAL); + + r = getpeercred(fd, &ucred); + if (r < 0) + return r; + + return sd_pid_get_cgroup(ucred.pid, cgroup); } static int file_of_uid(uid_t uid, char **p) { @@ -605,10 +707,10 @@ _public_ int sd_seat_get_active(const char *seat, char **session, uid_t *uid) { return r; if (session && !s) - return -ENOENT; + return -ENODATA; if (uid && !t) - return -ENOENT; + return -ENODATA; if (uid && t) { r = parse_uid(t, uid); @@ -743,6 +845,7 @@ _public_ int sd_get_sessions(char ***sessions) { _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; @@ -751,19 +854,10 @@ _public_ int sd_get_uids(uid_t **users) { if (!d) 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)) @@ -880,9 +974,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)) { @@ -967,7 +1059,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);