#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) {
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;
}
FOREACH_WORD(w, l, s, state) {
- if (strncmp(t, w, l) == 0) {
+ if (strneq(t, w, l)) {
free(s);
free(t);
}
_public_ int sd_uid_get_sessions(uid_t uid, int require_active, char ***sessions) {
- return uid_get_array(uid, require_active == 2 ? "ONLINE_SESSIONS" : (require_active ? "ACTIVE_SESSIONS" : "SESSIONS"), sessions);
+ return uid_get_array(
+ uid,
+ require_active == 0 ? "ONLINE_SESSIONS" :
+ require_active > 0 ? "ACTIVE_SESSIONS" :
+ "SESSIONS",
+ sessions);
}
_public_ int sd_uid_get_seats(uid_t uid, int require_active, char ***seats) {
- return uid_get_array(uid, require_active == 2 ? "ONLINE_SEATS" : (require_active ? "ACTIVE_SEATS" : "SEATS"), seats);
+ return uid_get_array(
+ uid,
+ require_active == 0 ? "ONLINE_SEATS" :
+ require_active > 0 ? "ACTIVE_SEATS" :
+ "SEATS",
+ seats);
}
static int file_of_session(const char *session, char **_p) {
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);
}
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;
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);
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;
+}