systemd/handle-numlock-value-in-etc-sysconfig-keyboard.patch
Dominique Leuenberger 62682e6e22 Accepting request 384339 from Base:System
- Fix patch patch handle-numlock-value-in-etc-sysconfig-keyboard.patch
  that is do not close a file descriptor twice (boo#973907) 

- Add two patches which address logind/networkd disappearing from
  dbus (and busctl) even while the units and processes continue
  running.
  0001-core-fix-bus-name-synchronization-after-daemon-reloa.patch
  0001-core-re-sync-bus-name-list-after-deserializing-durin.patch

- drop all compiler/linker option customizations:
  - -pipe option is used by default since day 0
  - get rid of cflags() function which is not needed
  - --hash-size has no impact specially in runtime
  IOW, use the default options for the compiler and the linker,
  there's no point in making systemd different from other package in
  this regards.

- use %make_build instead of 'make %{?_smp_mflags}'

- be more strict on own lib version requirements

- systemd should require udev with the exact same version

- Modify patch handle-numlock-value-in-etc-sysconfig-keyboard.patch
  to allow that open, seek, and read of /dev/mem may fail e.g.
  on XEN based virtual guests (bsc#961120) 

- require curl and bzip2 to build importd
- curl also causes building of journal-upload. That one has rather
  unusal certificate usage, set it's ca root to /etc/pki/systemd

OBS-URL: https://build.opensuse.org/request/show/384339
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/systemd?expand=0&rev=232
2016-04-08 07:35:10 +00:00

192 lines
6.5 KiB
Diff

Set NumLock according to /etc/sysconfig/keyboard.
https://bugzilla.novell.com/show_bug.cgi?id=746595
Authors:
Stanislav Brabec <sbrabec@suse.cz>
Cristian Rodríguez <crrodriguez@opensuse.org>
---
Makefile.am | 13 ++++++++++
rules/73-seat-numlock.rules | 8 ++++++
src/login/numlock-on.c | 34 ++++++++++++++++++++++++++
src/vconsole/vconsole-setup.c | 41 ++++++++++++++++++++++++++++++--
units/systemd-vconsole-setup.service.in | 2 -
5 files changed, 95 insertions(+), 3 deletions(-)
Index: systemd-228/Makefile.am
===================================================================
--- systemd-228.orig/Makefile.am
+++ systemd-228/Makefile.am
@@ -3825,6 +3825,19 @@ dist_udevrules_DATA += \
rules/60-persistent-v4l.rules
# ------------------------------------------------------------------------------
+numlock_on_SOURCES = \
+ src/login/numlock-on.c
+
+numlock_on_CFLAGS = \
+ $(AM_CFLAGS)
+
+udevlibexec_PROGRAMS += \
+ numlock-on
+
+dist_udevrules_DATA += \
+ rules/73-seat-numlock.rules
+
+# ------------------------------------------------------------------------------
mtd_probe_SOURCES = \
src/udev/mtd_probe/mtd_probe.c \
src/udev/mtd_probe/mtd_probe.h \
Index: systemd-228/rules/73-seat-numlock.rules
===================================================================
--- /dev/null
+++ systemd-228/rules/73-seat-numlock.rules
@@ -0,0 +1,8 @@
+# This file is part of SUSE customization of systemd.
+#
+# 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
+# (at your option) any later version.
+
+SUBSYSTEM=="tty", ACTION=="add", KERNEL=="tty[0-9]|tty1[0-2]", TEST=="/run/numlock-on", RUN+="numlock-on $env{DEVNAME}"
Index: systemd-228/src/login/numlock-on.c
===================================================================
--- /dev/null
+++ systemd-228/src/login/numlock-on.c
@@ -0,0 +1,34 @@
+/*
+ * numlock-on.c: Turn numlock-on
+ *
+ * This file may be freely copied under the terms of the GNU General
+ * Public License (GPL), version 2, or at your option any later
+ * version.
+
+ * Copyright (C) 2013 Stanislav Brabec, SUSE
+ *
+ * based on setleds.c, which is
+ * Copyright (C) 1994-1999 Andries E. Brouwer
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <linux/kd.h>
+
+int
+main(int argc, char **argv) {
+ char flags;
+
+ if (ioctl(0, KDGKBLED, &flags)) {
+ perror("KDGKBLED");
+ exit(1);
+ }
+
+ if (ioctl(0, KDSKBLED, flags | LED_NUM | (LED_NUM << 4))) {
+ perror("KDSKBLED");
+ exit(1);
+ }
+
+ exit(0);
+}
Index: systemd-228/src/vconsole/vconsole-setup.c
===================================================================
--- systemd-228.orig/src/vconsole/vconsole-setup.c
+++ systemd-228/src/vconsole/vconsole-setup.c
@@ -36,6 +36,7 @@
#include "fileio.h"
#include "macro.h"
#include "strv.h"
+#include "fs-util.h"
#include "io-util.h"
#include "locale-util.h"
#include "log.h"
@@ -46,6 +47,10 @@
#include "util.h"
#include "virt.h"
+#define BIOS_DATA_AREA 0x400
+#define BDA_KEYBOARD_STATUS_FLAGS_4 0x97
+#define BDA_KSF4_NUMLOCK_MASK 0x02
+
static bool is_vconsole(int fd) {
unsigned char data[1];
@@ -364,9 +369,10 @@ int main(int argc, char **argv) {
#ifdef HAVE_SYSV_COMPAT
_cleanup_free_ char
*vc_kbd_delay = NULL, *vc_kbd_rate = NULL,
- *vc_kbd_disable_caps_lock = NULL, *vc_compose_table = NULL;
+ *vc_kbd_disable_caps_lock = NULL, *vc_compose_table = NULL,
+ *vc_kbd_numlock = NULL;
#endif
- bool disable_capslock = false;
+ bool disable_capslock = false, numlock = false;
bool comp_ok, rate_ok;
_cleanup_close_ int fd = -1;
bool utf8, font_copy = false, font_ok, keyboard_ok;
@@ -404,6 +410,7 @@ int main(int argc, char **argv) {
"KBD_DELAY", &vc_kbd_delay,
"KBD_RATE", &vc_kbd_rate,
"KBD_DISABLE_CAPS_LOCK", &vc_kbd_disable_caps_lock,
+ "KBD_NUMLOCK", &vc_kbd_numlock,
"COMPOSETABLE", &vc_compose_table,
NULL);
if (r < 0 && r != -ENOENT)
@@ -421,6 +428,30 @@ int main(int argc, char **argv) {
disable_capslock = vc_kbd_disable_caps_lock &&
strcasecmp(vc_kbd_disable_caps_lock, "YES") == 0;
+ numlock = vc_kbd_numlock && strcaseeq(vc_kbd_numlock, "yes");
+#if defined(__i386__) || defined(__x86_64__)
+ if (vc_kbd_numlock && strcaseeq(vc_kbd_numlock, "bios")) {
+ int _cleanup_close_ fdmem;
+ char c;
+
+ errno = 0;
+ fdmem = open ("/dev/mem", O_RDONLY);
+ if (fdmem < 0)
+ goto finish;
+
+ if (lseek(fdmem, BIOS_DATA_AREA + BDA_KEYBOARD_STATUS_FLAGS_4, SEEK_SET) == (off_t) -1)
+ goto finish;
+
+ if (read(fdmem, &c, sizeof(char)) == -1)
+ goto finish;
+
+ if (c & BDA_KSF4_NUMLOCK_MASK)
+ numlock = true;
+ finish:
+ if (errno)
+ log_warning_errno(errno, "Failed to read /dev/mem: %m");
+ }
+#endif /* x86 */
#endif /* HAVE_SYSV_COMPAT */
r = parse_env_file("/etc/vconsole.conf", NEWLINE,
@@ -456,6 +487,10 @@ int main(int argc, char **argv) {
font_ok = font_load_and_wait(vc, vc_font, vc_font_map, vc_font_unimap) > 0;
keyboard_ok = keyboard_load_and_wait(vc, vc_keymap, vc_keymap_toggle,
utf8, disable_capslock) > 0;
+ if (numlock)
+ touch("/run/numlock-on");
+ else
+ unlink("/run/numlock-on");
#ifdef HAVE_SYSV_COMPAT
comp_ok = compose_load_and_wait(vc, vc_compose_table);
rate_ok = kbdrate_set_and_wait(vc, vc_kbd_rate, vc_kbd_delay);
Index: systemd-228/units/systemd-vconsole-setup.service.in
===================================================================
--- systemd-228.orig/units/systemd-vconsole-setup.service.in
+++ systemd-228/units/systemd-vconsole-setup.service.in
@@ -10,7 +10,7 @@ Description=Setup Virtual Console
Documentation=man:systemd-vconsole-setup.service(8) man:vconsole.conf(5)
DefaultDependencies=no
Conflicts=shutdown.target
-Before=sysinit.target shutdown.target
+Before=sysinit.target shutdown.target systemd-udev-trigger.service
ConditionPathExists=/dev/tty0
[Service]