X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Fsd-login.c;h=71d8c2942e192ef3b3e8ec6c52a280daf629afc5;hb=4b549144d82ea0f368321d149215f577049fffa6;hp=45523921b5dcf03fb8904f0d77abd0c63a58e93c;hpb=d70964d0f61f1add3a71c83beb925fc1fa2fab6b;p=elogind.git diff --git a/src/login/sd-login.c b/src/login/sd-login.c index 45523921b..71d8c2942 100644 --- a/src/login/sd-login.c +++ b/src/login/sd-login.c @@ -31,6 +31,7 @@ #include "sd-login.h" #include "strv.h" #include "fileio.h" +#include "login-shared.h" _public_ int sd_pid_get_session(pid_t pid, char **session) { if (pid < 0) @@ -72,47 +73,25 @@ _public_ int sd_pid_get_machine_name(pid_t pid, char **name) { return cg_pid_get_machine_name(pid, name); } -_public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) { - int r; - _cleanup_free_ char *root = NULL, *cgroup = NULL, *p = NULL, *cc = NULL; - struct stat st; +_public_ int sd_pid_get_slice(pid_t pid, char **slice) { if (pid < 0) return -EINVAL; - - if (!uid) + if (!slice) return -EINVAL; - r = cg_pid_get_path_shifted(pid, &root, &cgroup); - if (r < 0) - return r; - - if (!startswith(cgroup, "/user/")) - return -ENOENT; - - p = strchr(cgroup + 6, '/'); - if (!p) - return -ENOENT; - - p++; - p += strcspn(p, "/"); - *p = 0; - - r = cg_get_path(SYSTEMD_CGROUP_CONTROLLER, root, cgroup, &cc); - - if (r < 0) - return -ENOMEM; + return cg_pid_get_slice(pid, slice); +} - r = lstat(cc, &st); +_public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) { - if (r < 0) - return -errno; + if (pid < 0) + return -EINVAL; - if (!S_ISDIR(st.st_mode)) - return -ENOTDIR; + if (!uid) + return -EINVAL; - *uid = st.st_uid; - return 0; + return cg_pid_get_owner_uid(pid, uid); } _public_ int sd_uid_get_state(uid_t uid, char**state) { @@ -248,17 +227,19 @@ static int file_of_session(const char *session, char **_p) { assert(_p); - if (session) + if (session) { + if (!session_id_valid(session)) + return -EINVAL; + p = strappend("/run/systemd/sessions/", session); - else { - char *buf; + } else { + _cleanup_free_ char *buf = NULL; r = sd_pid_get_session(0, &buf); if (r < 0) return r; p = strappend("/run/systemd/sessions/", buf); - free(buf); } if (!p) @@ -277,7 +258,6 @@ _public_ int sd_session_is_active(const char *session) { return r; r = parse_env_file(p, NEWLINE, "ACTIVE", &s, NULL); - if (r < 0) return r; @@ -369,6 +349,23 @@ _public_ int sd_session_get_tty(const char *session, char **tty) { return session_get_string(session, "TTY", tty); } +_public_ int sd_session_get_vt(const char *session, unsigned *vtnr) { + _cleanup_free_ char *vtnr_string; + unsigned u; + int r; + + r = session_get_string(session, "VTNr", &vtnr_string); + if (r < 0) + return r; + + r = safe_atou(vtnr_string, &u); + if (r < 0) + return r; + + *vtnr = u; + return 0; +} + _public_ int sd_session_get_service(const char *session, char **service) { return session_get_string(session, "SERVICE", service); } @@ -623,6 +620,10 @@ _public_ int sd_get_uids(uid_t **users) { return r; } +_public_ int sd_get_machine_names(char ***machines) { + return get_files_in_directory("/run/systemd/machines/", machines); +} + static inline int MONITOR_TO_FD(sd_login_monitor *m) { return (int) (unsigned long) m - 1; } @@ -672,6 +673,16 @@ _public_ int sd_login_monitor_new(const char *category, sd_login_monitor **m) { good = true; } + if (!category || streq(category, "machine")) { + k = inotify_add_watch(fd, "/run/systemd/machines/", IN_MOVED_TO|IN_DELETE); + if (k < 0) { + close_nointr_nofail(fd); + return -errno; + } + + good = true; + } + if (!good) { close_nointr(fd); return -EINVAL;