systemd/let-vconsole-setup-get-properties-only-once-to-copy-them.patch

85 lines
3.3 KiB
Diff
Raw Normal View History

From: Werner Fink <werner@suse.de>
Date: Wed Sep 23 12:37:23 UTC 2015
Subject: Do not bother vistual console to much with GIO/PIO
This avoids broken virtual console mapping due stressed ioctl API
for the virtual consoles (boo#904214)
---
src/vconsole/vconsole-setup.c | 39 +++++++++++++++++++++++++--------------
1 file changed, 25 insertions(+), 14 deletions(-)
--- a/src/vconsole/vconsole-setup.c
+++ b/src/vconsole/vconsole-setup.c 2015-09-23 12:34:33.854018750 +0000
@@ -202,8 +202,13 @@ static void font_copy_to_all_vcs(int fd)
unsigned short map16[E_TABSZ];
struct unimapdesc unimapd;
struct unipair unipairs[USHRT_MAX];
+ struct console_font_op cfo = {};
int i, r;
+ bool hasmap8;
+ bool hasmap16;
+ bool hasunimap;
+
/* get active, and 16 bit mask of used VT numbers */
r = ioctl(fd, VT_GETSTATE, &vcs);
if (r < 0) {
@@ -211,10 +216,22 @@ static void font_copy_to_all_vcs(int fd)
return;
}
+ /* copy font from active VT, where the font was uploaded to */
+ cfo.op = KD_FONT_OP_COPY;
+ cfo.height = vcs.v_active-1; /* tty1 == index 0 */
+
+ hasmap8 = (ioctl(fd, GIO_SCRNMAP, map8) >= 0);
+ hasmap16 = (ioctl(fd, GIO_UNISCRNMAP, map16) >= 0);
+
+ /* unimapd is a ushort count and a pointer to an
+ * array of struct unipair { ushort, ushort } */
+ unimapd.entries = unipairs;
+ unimapd.entry_ct = USHRT_MAX;
+ hasunimap = (ioctl(fd, GIO_UNIMAP, &unimapd) >= 0);
+
for (i = 1; i <= 15; i++) {
char vcname[strlen("/dev/vcs") + DECIMAL_STR_MAX(int)];
_cleanup_close_ int vcfd = -1;
- struct console_font_op cfo = {};
if (i == vcs.v_active)
continue;
@@ -229,25 +246,19 @@ static void font_copy_to_all_vcs(int fd)
if (vcfd < 0)
continue;
- /* copy font from active VT, where the font was uploaded to */
- cfo.op = KD_FONT_OP_COPY;
- cfo.height = vcs.v_active-1; /* tty1 == index 0 */
+ /* copy font from active VT to vcs */
(void) ioctl(vcfd, KDFONTOP, &cfo);
- /* copy map of 8bit chars */
- if (ioctl(fd, GIO_SCRNMAP, map8) >= 0)
+ /* copy map of 8bit chars to vcs */
+ if (hasmap8)
(void) ioctl(vcfd, PIO_SCRNMAP, map8);
- /* copy map of 8bit chars -> 16bit Unicode values */
- if (ioctl(fd, GIO_UNISCRNMAP, map16) >= 0)
+ /* copy map of 8bit chars -> 16bit Unicode values to vcs */
+ if (hasmap16)
(void) ioctl(vcfd, PIO_UNISCRNMAP, map16);
- /* copy unicode translation table */
- /* unimapd is a ushort count and a pointer to an
- array of struct unipair { ushort, ushort } */
- unimapd.entries = unipairs;
- unimapd.entry_ct = USHRT_MAX;
- if (ioctl(fd, GIO_UNIMAP, &unimapd) >= 0) {
+ /* copy unicode translation table to vcs */
+ if (hasunimap) {
struct unimapinit adv = { 0, 0, 0 };
(void) ioctl(vcfd, PIO_UNIMAPCLR, &adv);