From d1b4526323faddfba05c984c10826cfc7bb1bc0cfb67ebe781ce8996af7e0e33 Mon Sep 17 00:00:00 2001 From: OBS User buildservice-autocommit Date: Thu, 18 Feb 2010 14:16:14 +0000 Subject: [PATCH] Updating link to change in openSUSE:Factory/kbd revision 34.0 OBS-URL: https://build.opensuse.org/package/show/Base:System/kbd?expand=0&rev=8372611b39a1daa092849b3dfe558f1d --- kbd-1.12-chvt-userwait.patch | 141 +++++++++++++++++++++++++++++++++++ kbd.changes | 8 ++ kbd.spec | 4 +- 3 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 kbd-1.12-chvt-userwait.patch diff --git a/kbd-1.12-chvt-userwait.patch b/kbd-1.12-chvt-userwait.patch new file mode 100644 index 0000000..cce1063 --- /dev/null +++ b/kbd-1.12-chvt-userwait.patch @@ -0,0 +1,141 @@ +chvt: add --userwait option + +From: Daniel Drake + +At http://bugs.gentoo.org/159729 we see chvt hanging in some scenario's. As +the solution to this is not immediately obvious, add a --userwait option +which repeatedly tries changing the terminal until the change has taken place. + +Index: kbd-1.14.1/man/man1/chvt.1 +=================================================================== +--- kbd-1.14.1.orig/man/man1/chvt.1 ++++ kbd-1.14.1/man/man1/chvt.1 +@@ -4,6 +4,9 @@ + chvt \- change foreground virtual terminal + .SH SYNOPSIS + .B chvt ++[ ++.B --userwait ++] + .I N + .SH DESCRIPTION + The command +@@ -21,3 +24,10 @@ The key combination + (with + .I N + in the range 1-12) usually has a similar effect. ++.LP ++The ++.B --userwait ++option causes the system to loop in userspace waiting for the new terminal ++to become active, as opposed to the kernel-side ++.I VT_WAITACTIVE ++ioctl. +Index: kbd-1.14.1/src/chvt.c +=================================================================== +--- kbd-1.14.1.orig/src/chvt.c ++++ kbd-1.14.1/src/chvt.c +@@ -7,13 +7,43 @@ + #include + #include + #include ++#include ++#include + #include "getfd.h" + #include "nls.h" + #include "version.h" + ++#define USER_WAIT_SLEEP_US 100000 ++#define USER_WAIT_MAX_ITERATIONS 50 ++ ++static int fd; ++ ++static void chvt(int num) ++{ ++ if (ioctl(fd,VT_ACTIVATE,num)) { ++ perror("VT_ACTIVATE"); ++ exit(1); ++ } ++} ++ ++static int fgconsole(void) ++{ ++ struct vt_stat vtstat; ++ if (ioctl(fd, VT_GETSTATE, &vtstat)) { ++ perror("VT_GETSTATE"); ++ exit(1); ++ } ++ return vtstat.v_active; ++} ++ + int + main(int argc, char *argv[]) { +- int fd, num; ++ int c, num; ++ int user_wait = 0; ++ const struct option long_opts[] = { ++ { "version", no_argument, NULL, 'V' }, ++ { "userwait", no_argument, NULL, 'u' }, ++ }; + + set_progname(argv[0]); + +@@ -21,22 +51,46 @@ main(int argc, char *argv[]) { + bindtextdomain(PACKAGE_NAME, LOCALEDIR); + textdomain(PACKAGE_NAME); + +- if (argc == 2 && !strcmp(argv[1], "-V")) +- print_version_and_exit(); ++ while ((c = getopt_long(argc, argv, "Vu", long_opts, NULL)) != -1) { ++ switch (c) { ++ case 'V': ++ print_version_and_exit(); ++ case 'u': ++ user_wait = 1; ++ break; ++ } ++ } + +- if (argc != 2) { +- fprintf(stderr, _("usage: chvt N\n")); ++ if (optind >= argc) { ++ fprintf(stderr, _("usage: chvt [--userwait] N\n")); + exit(1); + } ++ + fd = getfd(NULL); +- num = atoi(argv[1]); +- if (ioctl(fd,VT_ACTIVATE,num)) { +- perror("chvt: VT_ACTIVATE"); +- exit(1); +- } +- if (ioctl(fd,VT_WAITACTIVE,num)) { +- perror("VT_WAITACTIVE"); +- exit(1); ++ num = atoi(argv[optind++]); ++ chvt(num); ++ ++ if (user_wait) { ++ int active = 0; ++ int i; ++ for (i = 0; i < USER_WAIT_MAX_ITERATIONS; i++) { ++ if (fgconsole() == num) { ++ active = 1; ++ break; ++ } ++ ++ chvt(num); ++ usleep(USER_WAIT_SLEEP_US); ++ } ++ if (!active) { ++ fprintf(stderr, _("VT change timed out\n")); ++ exit(1); ++ } ++ } else { ++ if (ioctl(fd,VT_WAITACTIVE,num)) { ++ perror("VT_WAITACTIVE"); ++ exit(1); ++ } + } + exit(0); + } diff --git a/kbd.changes b/kbd.changes index 18ff279..acc9bb0 100644 --- a/kbd.changes +++ b/kbd.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Tue Feb 16 11:14:18 PST 2010 - vuntz@opensuse.org + +- Add kbd-1.12-chvt-userwait.patch, taken from Gentoo to add a + --userwait option to chvt. This can be used to avoid situation + where chvt can hang forever waiting for the vt switch: the wait + is done in userspace, and has a timeout of 5 seconds. (bnc#575123) + ------------------------------------------------------------------- Thu Feb 4 12:22:49 UTC 2010 - jengelh@medozas.de diff --git a/kbd.spec b/kbd.spec index 7d6077d..74c618f 100644 --- a/kbd.spec +++ b/kbd.spec @@ -24,7 +24,7 @@ License: GPLv2+ Group: System/Console AutoReqProv: on Version: 1.14.1 -Release: 22 +Release: 23 Summary: Keyboard and Font Utilities Source: kbd-%{version}.tar.bz2 Source1: kbd_fonts.tar.bz2 @@ -53,6 +53,7 @@ Patch9: kbd-1.14.1-setfont-no-cruft.patch Patch10: kbd-1.14.1-dumpkeys-C-opt.patch Patch11: kbd-1.14.1-defkeymap.patch Patch12: kbd-remove-kbio.diff +Patch13: kbd-1.12-chvt-userwait.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build PreReq: %fillup_prereq %insserv_prereq BuildRequires: bison flex @@ -89,6 +90,7 @@ Authors: %patch10 %patch11 -p1 %patch -P 12 -p1 +%patch13 -p1 %build for i in `find data/keymaps/mac -type f` ; do