chiark / gitweb /
Verify validity of session name when received from outside
[elogind.git] / src / login / sd-login.c
index bc8cd8ae8c1c38eaab310d30b5ec851a77526ff8..71d8c2942e192ef3b3e8ec6c52a280daf629afc5 100644 (file)
@@ -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,6 +73,16 @@ _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_slice(pid_t pid, char **slice) {
+
+        if (pid < 0)
+                return -EINVAL;
+        if (!slice)
+                return -EINVAL;
+
+        return cg_pid_get_slice(pid, slice);
+}
+
 _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
 
         if (pid < 0)
@@ -216,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)
@@ -245,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;
 
@@ -337,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);
 }
@@ -591,41 +620,8 @@ _public_ int sd_get_uids(uid_t **users) {
         return r;
 }
 
-int sd_get_machine_names(char ***machines) {
-        _cleanup_closedir_ DIR *d = NULL;
-        _cleanup_strv_free_ char **l = NULL;
-        _cleanup_free_ char *md = NULL;
-        char *n;
-        int c = 0, r;
-
-        r = cg_get_machine_path(&md);
-        if (r < 0)
-                return r;
-
-        r = cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER, md, &d);
-        if (r < 0)
-                return r;
-
-        while ((r = cg_read_subgroup(d, &n)) > 0) {
-
-                r = strv_push(&l, n);
-                if (r < 0) {
-                        free(n);
-                        return -ENOMEM;
-                }
-
-                c++;
-        }
-
-        if (r < 0)
-                return r;
-
-        if (machines) {
-                *machines = l;
-                l = NULL;
-        }
-
-        return c;
+_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) {
@@ -678,18 +674,7 @@ _public_ int sd_login_monitor_new(const char *category, sd_login_monitor **m) {
         }
 
         if (!category || streq(category, "machine")) {
-                _cleanup_free_ char *md = NULL, *p = NULL;
-                int r;
-
-                r = cg_get_machine_path(&md);
-                if (r < 0)
-                        return r;
-
-                r = cg_get_path(SYSTEMD_CGROUP_CONTROLLER, md, NULL, &p);
-                if (r < 0)
-                        return r;
-
-                k = inotify_add_watch(fd, p, IN_MOVED_TO|IN_CREATE|IN_DELETE);
+                k = inotify_add_watch(fd, "/run/systemd/machines/", IN_MOVED_TO|IN_DELETE);
                 if (k < 0) {
                         close_nointr_nofail(fd);
                         return -errno;