chiark / gitweb /
bash-completion: --property support
[elogind.git] / src / login / sd-login.c
index 82fe2ce3e338b744fa043f1e2a2162df60ca5410..c97d75c000f5883b425b0c321a06da2aa7996c7f 100644 (file)
 #include <string.h>
 #include <errno.h>
 #include <sys/inotify.h>
+#include <sys/poll.h>
 
 #include "util.h"
 #include "cgroup-util.h"
 #include "macro.h"
 #include "sd-login.h"
 #include "strv.h"
+#include "fileio.h"
 
 _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;
 
-        r = cg_pid_get_cgroup(pid, NULL, &cgroup);
-        if (r < 0)
-                return r;
+        return cg_pid_get_session(pid, session);
+}
 
-        if (!startswith(cgroup, "/user/")) {
-                free(cgroup);
-                return -ENOENT;
-        }
+_public_ int sd_pid_get_unit(pid_t pid, char **unit) {
 
-        p = strchr(cgroup + 6, '/');
-        if (!p) {
-                free(cgroup);
-                return -ENOENT;
-        }
+        if (pid < 0)
+                return -EINVAL;
+        if (!unit)
+                return -EINVAL;
 
-        p++;
-        if (startswith(p, "shared/") || streq(p, "shared")) {
-                free(cgroup);
-                return -ENOENT;
-        }
+        return cg_pid_get_unit(pid, unit);
+}
 
-        p = strndup(p, strcspn(p, "/"));
-        free(cgroup);
+_public_ int sd_pid_get_user_unit(pid_t pid, char **unit) {
 
-        if (!p)
-                return -ENOMEM;
+        if (pid < 0)
+                return -EINVAL;
+        if (!unit)
+                return -EINVAL;
 
-        *session = p;
-        return 0;
+        return cg_pid_get_user_unit(pid, unit);
 }
 
-_public_ int sd_pid_get_unit(pid_t pid, char **unit) {
+_public_ int sd_pid_get_machine_name(pid_t pid, char **name) {
 
         if (pid < 0)
                 return -EINVAL;
-
-        if (!unit)
+        if (!name)
                 return -EINVAL;
 
-        return cg_pid_get_unit(pid, unit);
+        return cg_pid_get_machine_name(pid, name);
 }
 
 _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
@@ -93,7 +83,7 @@ _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
         if (!uid)
                 return -EINVAL;
 
-        r = cg_pid_get_cgroup(pid, &root, &cgroup);
+        r = cg_pid_get_path_shifted(pid, &root, &cgroup);
         if (r < 0)
                 return r;
 
@@ -196,7 +186,7 @@ _public_ int sd_uid_is_on_seat(uid_t uid, int require_active, const char *seat)
         }
 
         FOREACH_WORD(w, l, s, state) {
-                if (strncmp(t, w, l) == 0) {
+                if (strneq(t, w, l)) {
                         free(s);
                         free(t);
 
@@ -409,6 +399,10 @@ _public_ int sd_session_get_seat(const char *session, char **seat) {
         return session_get_string(session, "SEAT", seat);
 }
 
+_public_ int sd_session_get_tty(const char *session, char **tty) {
+        return session_get_string(session, "TTY", tty);
+}
+
 _public_ int sd_session_get_service(const char *session, char **service) {
         return session_get_string(session, "SERVICE", service);
 }
@@ -651,11 +645,12 @@ _public_ int sd_get_uids(uid_t **users) {
                 return -errno;
 
         for (;;) {
-                struct dirent buffer, *de;
+                struct dirent *de;
+                union dirent_storage buf;
                 int k;
                 uid_t uid;
 
-                k = readdir_r(d, &buffer, &de);
+                k = readdir_r(d, &buf.de, &de);
                 if (k != 0) {
                         r = -k;
                         goto finish;
@@ -723,7 +718,7 @@ _public_ int sd_login_monitor_new(const char *category, sd_login_monitor **m) {
 
         fd = inotify_init1(IN_NONBLOCK|IN_CLOEXEC);
         if (fd < 0)
-                return errno;
+                return -errno;
 
         if (!category || streq(category, "seat")) {
                 k = inotify_add_watch(fd, "/run/systemd/seats/", IN_MOVED_TO|IN_DELETE);
@@ -791,3 +786,29 @@ _public_ int sd_login_monitor_get_fd(sd_login_monitor *m) {
 
         return MONITOR_TO_FD(m);
 }
+
+_public_ int sd_login_monitor_get_events(sd_login_monitor *m) {
+
+        if (!m)
+                return -EINVAL;
+
+        /* For now we will only return POLLIN here, since we don't
+         * need anything else ever for inotify.  However, let's have
+         * this API to keep our options open should we later on need
+         * it. */
+        return POLLIN;
+}
+
+_public_ int sd_login_monitor_get_timeout(sd_login_monitor *m, uint64_t *timeout_usec) {
+
+        if (!m)
+                return -EINVAL;
+        if (!timeout_usec)
+                return -EINVAL;
+
+        /* For now we will only return (uint64_t) -1, since we don't
+         * need any timeout. However, let's have this API to keep our
+         * options open should we later on need it. */
+        *timeout_usec = (uint64_t) -1;
+        return 0;
+}