chiark / gitweb /
logind: introduce a state for session, being one of online, active, closing
[elogind.git] / src / login / sd-login.c
index c100a7b4f2bee14080cce7383415ed8a956ac854..223e121bed3614a6fd2f4ad39e5e4ec954b9fd37 100644 (file)
@@ -6,16 +6,16 @@
   Copyright 2011 Lennart Poettering
 
   systemd is free software; you can redistribute it and/or modify it
   Copyright 2011 Lennart Poettering
 
   systemd is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
+  under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
   (at your option) any later version.
 
   systemd is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   (at your option) any later version.
 
   systemd is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  General Public License for more details.
+  Lesser General Public License for more details.
 
 
-  You should have received a copy of the GNU General Public License
+  You should have received a copy of the GNU Lesser General Public License
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
 #include "sd-login.h"
 #include "strv.h"
 
 #include "sd-login.h"
 #include "strv.h"
 
-static int pid_get_cgroup(pid_t pid, char **root, char **cgroup) {
-        char *cg_process, *cg_init, *p;
-        int r;
-
-        if (pid == 0)
-                pid = getpid();
-
-        if (pid <= 0)
-                return -EINVAL;
-
-        r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, pid, &cg_process);
-        if (r < 0)
-                return r;
-
-        r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, 1, &cg_init);
-        if (r < 0) {
-                free(cg_process);
-                return r;
-        }
-
-        if (endswith(cg_init, "/system"))
-                cg_init[strlen(cg_init)-7] = 0;
-        else if (streq(cg_init, "/"))
-                cg_init[0] = 0;
-
-        if (startswith(cg_process, cg_init))
-                p = cg_process + strlen(cg_init);
-        else
-                p = cg_process;
-
-        free(cg_init);
-
-        if (cgroup) {
-                char* c;
-
-                c = strdup(p);
-                if (!c) {
-                        free(cg_process);
-                        return -ENOMEM;
-                }
-
-                *cgroup = c;
-        }
-
-        if (root) {
-                cg_process[p-cg_process] = 0;
-                *root = cg_process;
-        } else
-                free(cg_process);
-
-        return 0;
-}
-
 _public_ int sd_pid_get_session(pid_t pid, char **session) {
         int r;
         char *cgroup, *p;
 
 _public_ int sd_pid_get_session(pid_t pid, char **session) {
         int r;
         char *cgroup, *p;
 
+        if (pid < 0)
+                return -EINVAL;
+
         if (!session)
                 return -EINVAL;
 
         if (!session)
                 return -EINVAL;
 
-        r = pid_get_cgroup(pid, NULL, &cgroup);
+        r = cg_pid_get_cgroup(pid, NULL, &cgroup);
         if (r < 0)
                 return r;
 
         if (r < 0)
                 return r;
 
@@ -122,55 +72,14 @@ _public_ int sd_pid_get_session(pid_t pid, char **session) {
 }
 
 _public_ int sd_pid_get_unit(pid_t pid, char **unit) {
 }
 
 _public_ int sd_pid_get_unit(pid_t pid, char **unit) {
-        int r;
-        char *cgroup, *p, *at, *b;
-        size_t k;
 
 
-        if (!unit)
+        if (pid < 0)
                 return -EINVAL;
 
                 return -EINVAL;
 
-        r = pid_get_cgroup(pid, NULL, &cgroup);
-        if (r < 0)
-                return r;
-
-        if (!startswith(cgroup, "/system/")) {
-                free(cgroup);
-                return -ENOENT;
-        }
-
-        p = cgroup + 8;
-        k = strcspn(p, "/");
-
-        at = memchr(p, '@', k);
-        if (at && at[1] == '.') {
-                size_t j;
-
-                /* This is a templated service */
-                if (p[k] != '/') {
-                        free(cgroup);
-                        return -EIO;
-                }
-
-                j = strcspn(p+k+1, "/");
-
-                b = malloc(k + j + 1);
-
-                if (b) {
-                        memcpy(b, p, at - p + 1);
-                        memcpy(b + (at - p) + 1, p + k + 1, j);
-                        memcpy(b + (at - p) + 1 + j, at + 1, k - (at - p) - 1);
-                        b[k+j] = 0;
-                }
-        } else
-                  b = strndup(p, k);
-
-        free(cgroup);
-
-        if (!b)
-                return -ENOMEM;
+        if (!unit)
+                return -EINVAL;
 
 
-        *unit = b;
-        return 0;
+        return cg_pid_get_unit(pid, unit);
 }
 
 _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
 }
 
 _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
@@ -178,10 +87,13 @@ _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
         char *root, *cgroup, *p, *cc;
         struct stat st;
 
         char *root, *cgroup, *p, *cc;
         struct stat st;
 
+        if (pid < 0)
+                return -EINVAL;
+
         if (!uid)
                 return -EINVAL;
 
         if (!uid)
                 return -EINVAL;
 
-        r = pid_get_cgroup(pid, &root, &cgroup);
+        r = cg_pid_get_cgroup(pid, &root, &cgroup);
         if (r < 0)
                 return r;
 
         if (r < 0)
                 return r;
 
@@ -405,6 +317,30 @@ _public_ int sd_session_is_active(const char *session) {
         return r;
 }
 
         return r;
 }
 
+_public_ int sd_session_get_state(const char *session, char **state) {
+        char *p, *s = NULL;
+        int r;
+
+        if (!state)
+                return -EINVAL;
+
+        r = file_of_session(session, &p);
+        if (r < 0)
+                return r;
+
+        r = parse_env_file(p, NEWLINE, "STATE", &s, NULL);
+        free(p);
+
+        if (r < 0) {
+                free(s);
+                return r;
+        } else if (!s)
+                return -EIO;
+
+        *state = s;
+        return 0;
+}
+
 _public_ int sd_session_get_uid(const char *session, uid_t *uid) {
         int r;
         char *p, *s = NULL;
 _public_ int sd_session_get_uid(const char *session, uid_t *uid) {
         int r;
         char *p, *s = NULL;
@@ -475,6 +411,10 @@ _public_ int sd_session_get_class(const char *session, char **class) {
         return session_get_string(session, "CLASS", class);
 }
 
         return session_get_string(session, "CLASS", class);
 }
 
+_public_ int sd_session_get_display(const char *session, char **display) {
+        return session_get_string(session, "DISPLAY", display);
+}
+
 static int file_of_seat(const char *seat, char **_p) {
         char *p;
         int r;
 static int file_of_seat(const char *seat, char **_p) {
         char *p;
         int r;