chiark / gitweb /
terminal: add system view interface
[elogind.git] / src / libsystemd-terminal / sysview.h
diff --git a/src/libsystemd-terminal/sysview.h b/src/libsystemd-terminal/sysview.h
new file mode 100644 (file)
index 0000000..de6ff37
--- /dev/null
@@ -0,0 +1,151 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+/***
+  This file is part of systemd.
+
+  Copyright (C) 2014 David Herrmann <dh.herrmann@gmail.com>
+
+  systemd is free software; you can redistribute it and/or modify it
+  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
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+/*
+ * System View
+ * The sysview interface scans and monitors the system for seats, sessions and
+ * devices. It basically mirrors the state of logind on the application side.
+ * It's meant as base for session services that require managed device access.
+ * The logind controller API is employed to allow unprivileged access to all
+ * devices of a user.
+ * Furthermore, the sysview interface can be used for system services that run
+ * in situations where logind is not available, but session-like services are
+ * needed. For instance, the initrd does not run logind but might require
+ * graphics access. It cannot run session services, though. The sysview
+ * interface pretends that a session is available and provides the same
+ * interface as to normal session services.
+ */
+
+#pragma once
+
+#include <inttypes.h>
+#include <libudev.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <systemd/sd-bus.h>
+#include <systemd/sd-event.h>
+#include "util.h"
+
+typedef struct sysview_event            sysview_event;
+typedef struct sysview_device           sysview_device;
+typedef struct sysview_session          sysview_session;
+typedef struct sysview_seat             sysview_seat;
+typedef struct sysview_context          sysview_context;
+
+/*
+ * Events
+ */
+
+enum {
+        SYSVIEW_EVENT_SEAT_ADD,
+        SYSVIEW_EVENT_SEAT_REMOVE,
+
+        SYSVIEW_EVENT_SESSION_FILTER,
+        SYSVIEW_EVENT_SESSION_ADD,
+        SYSVIEW_EVENT_SESSION_REMOVE,
+        SYSVIEW_EVENT_SESSION_ATTACH,
+        SYSVIEW_EVENT_SESSION_DETACH,
+        SYSVIEW_EVENT_SESSION_CONTROL,
+};
+
+struct sysview_event {
+        unsigned int type;
+
+        union {
+                struct {
+                        sysview_seat *seat;
+                } seat_add, seat_remove;
+
+                struct {
+                        const char *id;
+                        const char *seatid;
+                        const char *username;
+                        unsigned int uid;
+                } session_filter;
+
+                struct {
+                        sysview_session *session;
+                } session_add, session_remove;
+
+                struct {
+                        sysview_session *session;
+                        sysview_device *device;
+                } session_attach, session_detach;
+
+                struct {
+                        sysview_session *session;
+                        int error;
+                } session_control;
+        };
+};
+
+typedef int (*sysview_event_fn) (sysview_context *c, void *userdata, sysview_event *e);
+
+/*
+ * Devices
+ */
+
+enum {
+        SYSVIEW_DEVICE_EVDEV,
+        SYSVIEW_DEVICE_DRM,
+        SYSVIEW_DEVICE_CNT
+};
+
+unsigned int sysview_device_get_type(sysview_device *device);
+struct udev_device *sysview_device_get_ud(sysview_device *device);
+
+/*
+ * Sessions
+ */
+
+const char *sysview_session_get_name(sysview_session *session);
+
+int sysview_session_take_control(sysview_session *session);
+void sysview_session_release_control(sysview_session *session);
+
+/*
+ * Seats
+ */
+
+const char *sysview_seat_get_name(sysview_seat *seat);
+
+/*
+ * Contexts
+ */
+
+enum {
+        SYSVIEW_CONTEXT_SCAN_LOGIND             = (1 << 0),
+        SYSVIEW_CONTEXT_SCAN_EVDEV              = (1 << 1),
+        SYSVIEW_CONTEXT_SCAN_DRM                = (1 << 2),
+};
+
+int sysview_context_new(sysview_context **out,
+                        unsigned int flags,
+                        sd_event *event,
+                        sd_bus *sysbus,
+                        struct udev *ud);
+sysview_context *sysview_context_free(sysview_context *c);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(sysview_context*, sysview_context_free);
+
+bool sysview_context_is_running(sysview_context *c);
+int sysview_context_start(sysview_context *c, sysview_event_fn event_fn, void *userdata);
+void sysview_context_stop(sysview_context *c);