SHA256
1
0
forked from pool/systemd
systemd/handle-numlock-value-in-etc-sysconfig-keyboard.patch
Stephan Kulow c14a1e98d3 Accepting request 242359 from Base:System
- Disable blkrrpart for SLES12 and below

- Add upstream patch
  1054-udev-exclude-MD-from-block-device-ownership-event-lo.patch
- Add with condition blkrrpart to be able to disable the patches
  1025, 1027, 1029, 1030, 1031, 1032, 1033, 1034, 1037, and 1054
  which uses the BLKRRPART ioctl for e.g. synthesize change events
  which may interfere with other tools like parted.

- Update
  handle-disable_caplock-and-compose_table-and-kbd_rate.patch, 
  handle-numlock-value-in-etc-sysconfig-keyboard.patch: read
  /etc/vconsole.conf after /etc/sysconfig/(keyboard,console)
  otherwise empty value in /etc/sysconfig/keyboard might override
  /etc/vconsole.conf values.
- Update :
  0001-journal-compress-return-early-in-uncompress_startswi.patch
  0002-util-don-t-consider-tabs-special-in-string_has_cc-an.patch
  0002-vconsole-setup-run-setfont-before-loadkeys.patch
  0003-core-never-consider-failure-when-reading-drop-ins-fa.patch
  0003-fsck-consider-a-fsck-implementation-linked-to-bin-tr.patch
  apply-ACL-for-nvidia-device-nodes.patch
  keep-crypt-password-prompt.patch
  log-target-null-instead-kmsg.patch
  parse-crypttab-for-noauto-option.patch
  set-and-use-default-logconsole.patch: fix all warnings in code
- Remove 0001-compress-fix-return-value.patch: not relevant to
  systemd v210 code.

- Also change udev-generate-peristent-rule to udev-generate-persistent-rule

OBS-URL: https://build.opensuse.org/request/show/242359
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/systemd?expand=0&rev=195
2014-07-26 10:19:44 +00:00

192 lines
6.3 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>
Index: systemd-210/src/vconsole/vconsole-setup.c
===================================================================
--- systemd-210.orig/src/vconsole/vconsole-setup.c
+++ systemd-210/src/vconsole/vconsole-setup.c
@@ -42,6 +42,10 @@
#include "fileio.h"
#include "strv.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];
@@ -321,12 +325,14 @@ int main(int argc, char **argv) {
char *vc_kbd_delay = NULL;
char *vc_kbd_rate = NULL;
char *vc_kbd_disable_caps_lock = NULL;
+ char *vc_kbd_numlock = NULL;
char *vc_compose_table = NULL;
pid_t kbd_rate_pid = 0, compose_table_pid = 0;
#endif
int fd = -1;
bool utf8;
bool disable_capslock = false;
+ bool numlock = false;
pid_t font_pid = 0, keymap_pid = 0;
bool font_copy = false;
int r = EXIT_FAILURE;
@@ -363,6 +369,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)
@@ -377,6 +384,36 @@ int main(int argc, char **argv) {
log_warning("Failed to read /etc/sysconfig/console: %s", strerror(-r));
disable_capslock = vc_kbd_disable_caps_lock && strcasecmp(vc_kbd_disable_caps_lock, "YES") == 0;
+#if defined(__i386__) || defined(__x86_64__)
+ if (vc_kbd_numlock && strcaseeq(vc_kbd_numlock, "bios")) {
+ int _cleanup_close_ fdmem;
+ char c;
+
+ fdmem = open ("/dev/mem", O_RDONLY);
+
+ if(fdmem < 0) {
+ r = EXIT_FAILURE;
+ log_error("Failed to open /dev/mem: %m");
+ goto finish;
+ }
+
+ if(lseek(fdmem, BIOS_DATA_AREA + BDA_KEYBOARD_STATUS_FLAGS_4, SEEK_SET) == (off_t) -1) {
+ r = EXIT_FAILURE;
+ log_error("Failed to seek /dev/mem: %m");
+ goto finish;
+ }
+
+ if(read (fdmem, &c, sizeof(char)) == -1) {
+ r = EXIT_FAILURE;
+ log_error("Failed to read /dev/mem: %m");
+ goto finish;
+ }
+
+ if (c & BDA_KSF4_NUMLOCK_MASK)
+ numlock = true;
+ } else
+#endif
+ numlock = vc_kbd_numlock && strcaseeq(vc_kbd_numlock, "yes");
#endif
r = parse_env_file("/etc/vconsole.conf", NEWLINE,
@@ -422,6 +459,10 @@ int main(int argc, char **argv) {
finish:
if (keymap_pid > 0)
wait_for_terminate_and_warn(KBD_LOADKEYS, keymap_pid);
+ if (numlock)
+ touch("/run/numlock-on");
+ else
+ unlink("/run/numlock-on");
#ifdef HAVE_SYSV_COMPAT
if (compose_table_pid > 0)
@@ -441,6 +482,7 @@ finish:
free(vc_font);
free(vc_font_map);
free(vc_font_unimap);
+ free(vc_kbd_numlock);
#ifdef HAVE_SYSV_COMPAT
free(vc_kbd_delay);
free(vc_kbd_rate);
Index: systemd-210/Makefile.am
===================================================================
--- systemd-210.orig/Makefile.am
+++ systemd-210/Makefile.am
@@ -2847,6 +2847,19 @@ dist_udevrules_DATA += \
rules/61-accelerometer.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
+
+# ------------------------------------------------------------------------------
if ENABLE_GUDEV
if ENABLE_GTK_DOC
SUBDIRS += \
Index: systemd-210/rules/73-seat-numlock.rules
===================================================================
--- /dev/null
+++ systemd-210/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-210/src/login/numlock-on.c
===================================================================
--- /dev/null
+++ systemd-210/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-210/units/systemd-vconsole-setup.service.in
===================================================================
--- systemd-210.orig/units/systemd-vconsole-setup.service.in
+++ systemd-210/units/systemd-vconsole-setup.service.in
@@ -11,7 +11,7 @@ Documentation=man:systemd-vconsole-setup
DefaultDependencies=no
Conflicts=shutdown.target
After=systemd-readahead-collect.service systemd-readahead-replay.service
-Before=sysinit.target shutdown.target
+Before=sysinit.target shutdown.target systemd-udev-trigger.service
ConditionPathExists=/dev/tty0
[Service]