forked from pool/systemd
c14a1e98d3
- 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
232 lines
7.5 KiB
Diff
232 lines
7.5 KiB
Diff
From: Frederic Crozat <fcrozat@suse.com>
|
|
Date: Fri, 19 Aug 2011 15:29:49 +0000
|
|
Subject: handle disable_caplock and compose_table and kbd_rate
|
|
|
|
(bnc#746595)
|
|
---
|
|
src/vconsole/vconsole-setup.c | 156 +++++++++++++++++++++++++++++++++++++++++-
|
|
1 file changed, 153 insertions(+), 3 deletions(-)
|
|
|
|
Index: systemd-210/src/vconsole/vconsole-setup.c
|
|
===================================================================
|
|
--- systemd-210.orig/src/vconsole/vconsole-setup.c
|
|
+++ systemd-210/src/vconsole/vconsole-setup.c
|
|
@@ -40,6 +40,7 @@
|
|
#include "macro.h"
|
|
#include "virt.h"
|
|
#include "fileio.h"
|
|
+#include "strv.h"
|
|
|
|
static bool is_vconsole(int fd) {
|
|
unsigned char data[1];
|
|
@@ -99,8 +100,8 @@ static int enable_utf8(int fd) {
|
|
return r;
|
|
}
|
|
|
|
-static int keymap_load(const char *vc, const char *map, const char *map_toggle, bool utf8, pid_t *_pid) {
|
|
- const char *args[8];
|
|
+static int keymap_load(const char *vc, const char *map, const char *map_toggle, bool utf8, bool disable_capslock, pid_t *_pid) {
|
|
+ const char *args[9];
|
|
int i = 0;
|
|
pid_t pid;
|
|
|
|
@@ -119,6 +120,8 @@ static int keymap_load(const char *vc, c
|
|
args[i++] = map;
|
|
if (map_toggle)
|
|
args[i++] = map_toggle;
|
|
+ if (disable_capslock)
|
|
+ args[i++] = "disable.capslock";
|
|
args[i++] = NULL;
|
|
|
|
pid = fork();
|
|
@@ -212,6 +215,101 @@ static void font_copy_to_all_vcs(int fd)
|
|
}
|
|
}
|
|
|
|
+#ifdef HAVE_SYSV_COMPAT
|
|
+static int load_compose_table(const char *vc, const char *compose_table, pid_t *_pid) {
|
|
+ const char *args[1024];
|
|
+ int i = 0, j = 0;
|
|
+ pid_t pid;
|
|
+ char **strv_compose_table = NULL;
|
|
+ char *to_free[1024];
|
|
+
|
|
+ if (isempty(compose_table)) {
|
|
+ /* An empty map means no compose table*/
|
|
+ *_pid = 0;
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ args[i++] = KBD_LOADKEYS;
|
|
+ args[i++] = "-q";
|
|
+ args[i++] = "-C";
|
|
+ args[i++] = vc;
|
|
+
|
|
+ strv_compose_table = strv_split(compose_table, WHITESPACE);
|
|
+ if (strv_compose_table) {
|
|
+ bool compose_loaded = false;
|
|
+ bool compose_clear = false;
|
|
+ char **name;
|
|
+ char *arg;
|
|
+
|
|
+ STRV_FOREACH (name, strv_compose_table) {
|
|
+ if (streq(*name,"-c") || streq(*name,"clear")) {
|
|
+ compose_clear = true;
|
|
+ continue;
|
|
+ }
|
|
+ if (!compose_loaded) {
|
|
+ if (compose_clear)
|
|
+ args[i++] = "-c";
|
|
+ }
|
|
+ asprintf(&arg, "compose.%s",*name);
|
|
+ compose_loaded = true;
|
|
+ args[i++] = to_free[j++] = arg;
|
|
+
|
|
+ }
|
|
+ strv_free(strv_compose_table);
|
|
+ }
|
|
+ args[i++] = NULL;
|
|
+
|
|
+ if ((pid = fork()) < 0) {
|
|
+ log_error("Failed to fork: %m");
|
|
+ return -errno;
|
|
+ } else if (pid == 0) {
|
|
+ execv(args[0], (char **) args);
|
|
+ _exit(EXIT_FAILURE);
|
|
+ }
|
|
+
|
|
+ *_pid = pid;
|
|
+
|
|
+ for (i=0 ; i < j ; i++)
|
|
+ free (to_free[i]);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+#endif
|
|
+
|
|
+static int set_kbd_rate(const char *vc, const char *kbd_rate, const char *kbd_delay, pid_t *_pid) {
|
|
+ const char *args[7];
|
|
+ int i = 0;
|
|
+ pid_t pid;
|
|
+
|
|
+ if (isempty(kbd_rate) && isempty(kbd_delay)) {
|
|
+ *_pid = 0;
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ args[i++] = "/bin/kbdrate";
|
|
+ if (!isempty(kbd_rate)) {
|
|
+ args[i++] = "-r";
|
|
+ args[i++] = kbd_rate;
|
|
+ }
|
|
+ if (!isempty(kbd_delay)) {
|
|
+ args[i++] = "-d";
|
|
+ args[i++] = kbd_delay;
|
|
+ }
|
|
+ args[i++] = "-s";
|
|
+ args[i++] = NULL;
|
|
+
|
|
+ if ((pid = fork()) < 0) {
|
|
+ log_error("Failed to fork: %m");
|
|
+ return -errno;
|
|
+ } else if (pid == 0) {
|
|
+ execv(args[0], (char **) args);
|
|
+ _exit(EXIT_FAILURE);
|
|
+ }
|
|
+
|
|
+ *_pid = pid;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
int main(int argc, char **argv) {
|
|
const char *vc;
|
|
char *vc_keymap = NULL;
|
|
@@ -219,8 +317,16 @@ int main(int argc, char **argv) {
|
|
char *vc_font = NULL;
|
|
char *vc_font_map = NULL;
|
|
char *vc_font_unimap = NULL;
|
|
+#ifdef HAVE_SYSV_COMPAT
|
|
+ char *vc_kbd_delay = NULL;
|
|
+ char *vc_kbd_rate = NULL;
|
|
+ char *vc_kbd_disable_caps_lock = 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;
|
|
pid_t font_pid = 0, keymap_pid = 0;
|
|
bool font_copy = false;
|
|
int r = EXIT_FAILURE;
|
|
@@ -251,6 +357,28 @@ int main(int argc, char **argv) {
|
|
|
|
utf8 = is_locale_utf8();
|
|
|
|
+#ifdef HAVE_SYSV_COMPAT
|
|
+ r = parse_env_file("/etc/sysconfig/keyboard", NEWLINE,
|
|
+ "KEYTABLE", &vc_keymap,
|
|
+ "KBD_DELAY", &vc_kbd_delay,
|
|
+ "KBD_RATE", &vc_kbd_rate,
|
|
+ "KBD_DISABLE_CAPS_LOCK", &vc_kbd_disable_caps_lock,
|
|
+ "COMPOSETABLE", &vc_compose_table,
|
|
+ NULL);
|
|
+ if (r < 0 && r != -ENOENT)
|
|
+ log_warning("Failed to read /etc/sysconfig/keyboard: %s", strerror(-r));
|
|
+
|
|
+ r = parse_env_file("/etc/sysconfig/console", NEWLINE,
|
|
+ "CONSOLE_FONT", &vc_font,
|
|
+ "CONSOLE_SCREENMAP", &vc_font_map,
|
|
+ "CONSOLE_UNICODEMAP", &vc_font_unimap,
|
|
+ NULL);
|
|
+ if (r < 0 && r != -ENOENT)
|
|
+ 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;
|
|
+#endif
|
|
+
|
|
r = parse_env_file("/etc/vconsole.conf", NEWLINE,
|
|
"KEYMAP", &vc_keymap,
|
|
"KEYMAP_TOGGLE", &vc_keymap_toggle,
|
|
@@ -282,7 +410,12 @@ int main(int argc, char **argv) {
|
|
disable_utf8(fd);
|
|
|
|
r = EXIT_FAILURE;
|
|
- if (keymap_load(vc, vc_keymap, vc_keymap_toggle, utf8, &keymap_pid) >= 0 &&
|
|
+
|
|
+ if (keymap_load(vc, vc_keymap, vc_keymap_toggle, utf8, disable_capslock, &keymap_pid) >= 0 &&
|
|
+#ifdef HAVE_SYSV_COMPAT
|
|
+ load_compose_table(vc, vc_compose_table, &compose_table_pid) >= 0 &&
|
|
+ set_kbd_rate(vc, vc_kbd_rate, vc_kbd_delay, &kbd_rate_pid) >= 0 &&
|
|
+#endif
|
|
font_load(vc, vc_font, vc_font_map, vc_font_unimap, &font_pid) >= 0)
|
|
r = EXIT_SUCCESS;
|
|
|
|
@@ -290,6 +423,14 @@ finish:
|
|
if (keymap_pid > 0)
|
|
wait_for_terminate_and_warn(KBD_LOADKEYS, keymap_pid);
|
|
|
|
+#ifdef HAVE_SYSV_COMPAT
|
|
+ if (compose_table_pid > 0)
|
|
+ wait_for_terminate_and_warn(KBD_LOADKEYS, compose_table_pid);
|
|
+
|
|
+ if (kbd_rate_pid > 0)
|
|
+ wait_for_terminate_and_warn("/bin/kbdrate", kbd_rate_pid);
|
|
+#endif
|
|
+
|
|
if (font_pid > 0) {
|
|
wait_for_terminate_and_warn(KBD_SETFONT, font_pid);
|
|
if (font_copy)
|
|
@@ -300,6 +441,12 @@ finish:
|
|
free(vc_font);
|
|
free(vc_font_map);
|
|
free(vc_font_unimap);
|
|
+#ifdef HAVE_SYSV_COMPAT
|
|
+ free(vc_kbd_delay);
|
|
+ free(vc_kbd_rate);
|
|
+ free(vc_kbd_disable_caps_lock);
|
|
+ free(vc_compose_table);
|
|
+#endif
|
|
|
|
if (fd >= 0)
|
|
close_nointr_nofail(fd);
|