|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From 8e9371905c743cf997b2e8fa7fe3238f81f741fe Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From: David Herrmann <dh.herrmann@gmail.com>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Date: Wed, 27 Aug 2014 18:38:01 +0200
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Subject: [PATCH] terminal: add systemd-evcat input debugging tool
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Like systemd-subterm, this new systemd-evcat tool should only be used to
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
debug libsystemd-terminal. systemd-evcat attaches to the running session
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
and pushes all evdev devices attached to the current session into an
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
idev-session. All events of the created idev-devices are then printed to
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
stdout for input-event debugging.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
.gitignore | 1 +
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Makefile.am | 14 ++
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/libsystemd-terminal/evcat.c | 499 ++++++++++++++++++++++++++++++++++++++++
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
3 files changed, 514 insertions(+)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
create mode 100644 src/libsystemd-terminal/evcat.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/.gitignore b/.gitignore
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 8aed0b9ba6..f8650870a3 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/.gitignore
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/.gitignore
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -69,6 +69,7 @@
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/systemd-detect-virt
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/systemd-efi-boot-generator
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/systemd-escape
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+/systemd-evcat
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/systemd-firstboot
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/systemd-fsck
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/systemd-fstab-generator
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/Makefile.am b/Makefile.am
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 35a4c44a9f..e091febc1f 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/Makefile.am
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/Makefile.am
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -2954,6 +2954,7 @@ noinst_LTLIBRARIES += \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
libsystemd-terminal.la
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
noinst_PROGRAMS += \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ systemd-evcat \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
systemd-subterm
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
unifontdatadir=$(datadir)/unifont
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -2995,6 +2996,19 @@ libsystemd_terminal_la_LIBADD = \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
libsystemd-shared.la \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
$(TERMINAL_LIBS)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+systemd_evcat_CFLAGS = \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ $(AM_CFLAGS) \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ $(TERMINAL_CFLAGS)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+systemd_evcat_SOURCES = \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ src/libsystemd-terminal/evcat.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+systemd_evcat_LDADD = \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ libsystemd-terminal.la \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ libsystemd-internal.la \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ libsystemd-shared.la \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ $(TERMINAL_LIBS)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
systemd_subterm_SOURCES = \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/libsystemd-terminal/subterm.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/libsystemd-terminal/evcat.c b/src/libsystemd-terminal/evcat.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
new file mode 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 0000000000..590a30d873
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- /dev/null
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/libsystemd-terminal/evcat.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -0,0 +1,499 @@
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+/***
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ This file is part of systemd.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ Copyright (C) 2014 David Herrmann <dh.herrmann@gmail.com>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ systemd is free software; you can redistribute it and/or modify it
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ under the terms of the GNU Lesser General Public License as published by
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ the Free Software Foundation; either version 2.1 of the License, or
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ (at your option) any later version.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ systemd is distributed in the hope that it will be useful, but
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ Lesser General Public License for more details.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ You should have received a copy of the GNU Lesser General Public License
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+***/
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+/*
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * Event Catenation
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * The evcat tool catenates input events of all requested devices and prints
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * them to standard-output. It's only meant for debugging of input-related
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * problems.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <assert.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <errno.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <getopt.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <libevdev/libevdev.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <linux/kd.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <linux/vt.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <stdarg.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <stdbool.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <stdio.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <stdlib.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <string.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <sys/ioctl.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <sys/stat.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <systemd/sd-bus.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <systemd/sd-event.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <systemd/sd-login.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <termios.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <unistd.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include <xkbcommon/xkbcommon.h>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include "build.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include "bus-util.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include "event-util.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include "idev.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include "macro.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include "sysview.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include "term-internal.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#include "util.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+typedef struct Evcat Evcat;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+struct Evcat {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ char *session;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ char *seat;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ sd_event *event;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ sd_bus *bus;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ sysview_context *sysview;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ idev_context *idev;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ idev_session *idev_session;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ bool managed : 1;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+};
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static Evcat *evcat_free(Evcat *e) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!e)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e->idev_session = idev_session_free(e->idev_session);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e->idev = idev_context_unref(e->idev);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e->sysview = sysview_context_free(e->sysview);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e->bus = sd_bus_unref(e->bus);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e->event = sd_event_unref(e->event);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ free(e->seat);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ free(e->session);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ free(e);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ tcflush(0, TCIOFLUSH);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+DEFINE_TRIVIAL_CLEANUP_FUNC(Evcat*, evcat_free);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static bool is_managed(const char *session) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ unsigned int vtnr;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ struct stat st;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ long mode;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ /* Using logind's Controller API is highly fragile if there is already
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * a session controller running. If it is registered as controller
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * itself, TakeControl will simply fail. But if its a legacy controller
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * that does not use logind's controller API, we must never register
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * our own controller. Otherwise, we really mess up the VT. Therefore,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * only run in managed mode if there's no-one else. */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (geteuid() == 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!isatty(1))
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!session)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sd_session_get_vt(session, &vtnr);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0 || vtnr < 1 || vtnr > 63)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ mode = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = ioctl(1, KDGETMODE, &mode);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0 || mode != KD_TEXT)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = fstat(1, &st);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0 || minor(st.st_rdev) != vtnr)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return true;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static int evcat_new(Evcat **out) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ _cleanup_(evcat_freep) Evcat *e = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(out);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e = new0(Evcat, 1);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!e)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return log_oom();
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sd_pid_get_session(getpid(), &e->session);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_error("Cannot retrieve logind session: %s", strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sd_session_get_seat(e->session, &e->seat);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_error("Cannot retrieve seat of logind session: %s", strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e->managed = is_managed(e->session);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sd_event_default(&e->event);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sd_bus_open_system(&e->bus);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sd_bus_attach_event(e->bus, e->event, SD_EVENT_PRIORITY_NORMAL);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sigprocmask_many(SIG_BLOCK, SIGTERM, SIGINT, -1);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sd_event_add_signal(e->event, NULL, SIGTERM, NULL, NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sd_event_add_signal(e->event, NULL, SIGINT, NULL, NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sysview_context_new(&e->sysview,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ SYSVIEW_CONTEXT_SCAN_LOGIND |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ SYSVIEW_CONTEXT_SCAN_EVDEV,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e->event,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e->bus,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = idev_context_new(&e->idev, e->event, e->bus);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ *out = e;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static void kdata_print(idev_data *data) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ idev_data_keyboard *k = &data->keyboard;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ char buf[128];
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ uint32_t i, c;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ int cwidth;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ /* Key-press state: UP/DOWN/REPEAT */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" %-6s", k->value == 0 ? "UP" :
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ k->value == 1 ? "DOWN" :
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ "REPEAT");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ /* Keycode that triggered the event */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" | %5u", (unsigned)k->keycode);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ /* Well-known name of the keycode */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" | %-20s", libevdev_event_code_get_name(EV_KEY, k->keycode) ? : "<unknown>");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ /* Well-known modifiers */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" | %-5s", (k->mods & IDEV_KBDMOD_SHIFT) ? "SHIFT" : "");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" %-4s", (k->mods & IDEV_KBDMOD_CTRL) ? "CTRL" : "");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" %-3s", (k->mods & IDEV_KBDMOD_ALT) ? "ALT" : "");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" %-5s", (k->mods & IDEV_KBDMOD_LINUX) ? "LINUX" : "");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" %-4s", (k->mods & IDEV_KBDMOD_CAPS) ? "CAPS" : "");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ /* Resolved symbols */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" |");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ for (i = 0; i < k->n_syms; ++i) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ buf[0] = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ xkb_keysym_get_name(k->keysyms[i], buf, sizeof(buf));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (is_locale_utf8()) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ c = k->codepoints[i];
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (c < 0x110000 && c > 0x20 && (c < 0x7f || c > 0x9f)) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ /* "%4lc" doesn't work well, so hard-code it */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ cwidth = mk_wcwidth(c);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ while (cwidth++ < 2)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" ");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" '%lc':", (wchar_t)c);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ } else {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" ");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf(" XKB_KEY_%-30s", buf);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf("\n");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static bool kdata_is_exit(idev_data *data) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ idev_data_keyboard *k = &data->keyboard;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (k->value != 1)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (k->n_syms != 1)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return k->codepoints[0] == 'q';
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static int evcat_idev_fn(idev_session *session, void *userdata, idev_event *ev) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ Evcat *e = userdata;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ switch (ev->type) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case IDEV_EVENT_DEVICE_ADD:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ idev_device_enable(ev->device_add.device);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case IDEV_EVENT_DEVICE_REMOVE:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ idev_device_disable(ev->device_remove.device);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case IDEV_EVENT_DEVICE_DATA:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ switch (ev->device_data.data.type) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case IDEV_DATA_KEYBOARD:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (kdata_is_exit(&ev->device_data.data))
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ sd_event_exit(e->event, 0);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ else
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ kdata_print(&ev->device_data.data);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static int evcat_sysview_fn(sysview_context *c, void *userdata, sysview_event *ev) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ unsigned int flags, type;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ Evcat *e = userdata;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ sysview_device *d;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ const char *name;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ switch (ev->type) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case SYSVIEW_EVENT_SESSION_FILTER:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (streq_ptr(e->session, ev->session_filter.id))
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 1;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case SYSVIEW_EVENT_SESSION_ADD:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(!e->idev_session);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ name = sysview_session_get_name(ev->session_add.session);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ flags = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (e->managed)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ flags |= IDEV_SESSION_MANAGED;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = idev_session_new(&e->idev_session,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e->idev,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ flags,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ name,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ evcat_idev_fn,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_error("Cannot create idev session: %s", strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ idev_session_enable(e->idev_session);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (e->managed) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sysview_session_take_control(ev->session_add.session);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_error("Cannot request session control: %s", strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case SYSVIEW_EVENT_SESSION_REMOVE:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ idev_session_disable(e->idev_session);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e->idev_session = idev_session_free(e->idev_session);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ sd_event_exit(e->event, 0);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case SYSVIEW_EVENT_SESSION_ATTACH:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ d = ev->session_attach.device;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ type = sysview_device_get_type(d);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (type == SYSVIEW_DEVICE_EVDEV) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = idev_session_add_evdev(e->idev_session, sysview_device_get_ud(d));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_error("Cannot add evdev device to idev: %s", strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case SYSVIEW_EVENT_SESSION_DETACH:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ d = ev->session_detach.device;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ type = sysview_device_get_type(d);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (type == SYSVIEW_DEVICE_EVDEV) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = idev_session_remove_evdev(e->idev_session, sysview_device_get_ud(d));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_error("Cannot remove evdev device from idev: %s", strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case SYSVIEW_EVENT_SESSION_CONTROL:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = ev->session_control.error;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_error("Cannot acquire session control: %s", strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = ioctl(1, KDSKBMODE, K_UNICODE);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_error("Cannot set K_UNICODE on stdout: %m");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = ioctl(1, KDSETMODE, KD_TEXT);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_error("Cannot set KD_TEXT on stdout: %m");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf("\n");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static int evcat_run(Evcat *e) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ struct termios in_attr, saved_attr;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(e);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!e->managed && geteuid() > 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_warning("You run in unmanaged mode without being root. This is likely to produce no output..");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf("evcat - Read and catenate events from selected input devices\n"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ " Running on seat '%s' in user-session '%s'\n"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ " Exit by pressing ^C or 'q'\n\n",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ e->seat ? : "seat0", e->session ? : "<none>");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sysview_context_start(e->sysview, evcat_sysview_fn, e);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ goto out;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = tcgetattr(0, &in_attr);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ goto out;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ saved_attr = in_attr;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ in_attr.c_lflag &= ~ECHO;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = tcsetattr(0, TCSANOW, &in_attr);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ goto out;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = sd_event_loop(e->event);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ tcsetattr(0, TCSANOW, &saved_attr);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf("exiting..\n");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+out:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ sysview_context_stop(e->sysview);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static int help(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ printf("%s [OPTIONS...]\n\n"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ "Read and catenate events from selected input devices.\n\n"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ " -h --help Show this help\n"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ " --version Show package version\n"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ , program_invocation_short_name);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static int parse_argv(int argc, char *argv[]) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ enum {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ ARG_VERSION = 0x100,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ };
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ static const struct option options[] = {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ { "help", no_argument, NULL, 'h' },
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ { "version", no_argument, NULL, ARG_VERSION },
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ {},
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ };
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ int c;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(argc >= 0);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(argv);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ switch (c) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case 'h':
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ help();
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case ARG_VERSION:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ puts(PACKAGE_STRING);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ puts(SYSTEMD_FEATURES);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ case '?':
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return -EINVAL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ default:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert_not_reached("Unhandled option");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (argc > optind) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_error("Too many arguments");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return -EINVAL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 1;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+int main(int argc, char *argv[]) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ _cleanup_(evcat_freep) Evcat *e = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_set_target(LOG_TARGET_AUTO);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_parse_environment();
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_open();
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ setlocale(LC_ALL, "");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!is_locale_utf8())
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_warning("Locale is not set to UTF-8. Codepoints will not be printed!");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = parse_argv(argc, argv);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r <= 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = evcat_new(&e);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = evcat_run(e);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+finish:
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|