X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Fsd-login.c;h=8a7838d566ed84cc556607cba3fcf0939356f34e;hb=1244d8d640a2644aa8dc8e588cd9c414b3d39163;hp=30e07a93223b69c415375cebc6b7deb2a2d03ed6;hpb=bef89518003a37f0fbd2f53beaa6bb7d01efed45;p=elogind.git diff --git a/src/login/sd-login.c b/src/login/sd-login.c index 30e07a932..8a7838d56 100644 --- a/src/login/sd-login.c +++ b/src/login/sd-login.c @@ -72,48 +72,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, *cc = NULL; - char *p; - 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) { @@ -370,6 +347,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); } @@ -624,6 +618,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; } @@ -673,6 +671,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;