jwrdegoede pushed to xorg-x11-server (f22). "Fix "start -- vt7" not working (#1203780)"
notifications at fedoraproject.org
notifications at fedoraproject.org
Mon May 11 14:27:42 UTC 2015
From 943ff7334233f04fc2311945822cac537673a493 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede at redhat.com>
Date: Mon, 11 May 2015 16:27:34 +0200
Subject: Fix "start -- vt7" not working (#1203780)
diff --git a/0001-linux-Add-linux_get_vtno-and-linux_get_keeptty-helpe.patch b/0001-linux-Add-linux_get_vtno-and-linux_get_keeptty-helpe.patch
new file mode 100644
index 0000000..6fa9112
--- /dev/null
+++ b/0001-linux-Add-linux_get_vtno-and-linux_get_keeptty-helpe.patch
@@ -0,0 +1,236 @@
+From cd7063aa899b56d407b57eab06b51925c913399d Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Wed, 21 Jan 2015 09:31:39 +0100
+Subject: [PATCH 1/2] linux: Add linux_get_vtno and linux_get_keeptty helpers
+
+systemd-logind integration does not work when starting X on a new tty, as
+that detaches X from the current session and after hat systemd-logind revokes
+all rights on any already open fds and refuses to open new fds for X.
+
+This means that currently e.g. "startx -- vt7" breaks, and breaks badly,
+requiring ssh access to the system to kill X.
+
+The fix for this is easy, we must not use systemd-logind integration when
+not using KeepTty, or iow we may only use systemd-logind integration together
+with KeepTty.
+
+But the final KeepTty value is not known until the code to chose which vtno to
+run on has been called, which currently happens after intializing
+systemd-logind.
+
+This commit is step 1 in fixing the "startx -- vt7" breakage, it factors out
+the linux xf86OpenConsole bits which set xf86Info.vtno and keepTty so that
+these can be called earlier. Calling this earlier is safe as this code has
+no side effects other than setting xf86Info.vtno and keepTty.
+
+Note this basically only moves a large chunk of xf86OpenConsole() into
+linux_get_vtno() without changing a single line of it, this is hard to see
+in the diff because the identation level has changed.
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+---
+Changes in v2:
+-Rename linux_get_vtno to linux_parse_vt_settings
+---
+ hw/xfree86/os-support/linux/linux.h | 32 +++++++++
+ hw/xfree86/os-support/linux/lnx_init.c | 122 ++++++++++++++++++++-------------
+ 2 files changed, 105 insertions(+), 49 deletions(-)
+ create mode 100644 hw/xfree86/os-support/linux/linux.h
+
+diff --git a/hw/xfree86/os-support/linux/linux.h b/hw/xfree86/os-support/linux/linux.h
+new file mode 100644
+index 0000000..8cb8e3d
+--- /dev/null
++++ b/hw/xfree86/os-support/linux/linux.h
+@@ -0,0 +1,32 @@
++/*
++ * Copyright © 2015 Red Hat, Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ *
++ * Author: Hans de Goede <hdegoede at redhat.com>
++ */
++
++#ifndef XF86_LINUX_H
++#define XF86_LINUX_H
++
++void linux_parse_vt_settings(void);
++int linux_get_keeptty(void);
++
++#endif
+diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c
+index 9485307..22c61bf 100644
+--- a/hw/xfree86/os-support/linux/lnx_init.c
++++ b/hw/xfree86/os-support/linux/lnx_init.c
+@@ -31,6 +31,7 @@
+ #include <X11/Xmd.h>
+
+ #include "compiler.h"
++#include "linux.h"
+
+ #include "xf86.h"
+ #include "xf86Priv.h"
+@@ -80,71 +81,94 @@ switch_to(int vt, const char *from)
+ #pragma GCC diagnostic ignored "-Wformat-nonliteral"
+
+ void
+-xf86OpenConsole(void)
++linux_parse_vt_settings(void)
+ {
+ int i, fd = -1, ret, current_vt = -1;
+- struct vt_mode VT;
+ struct vt_stat vts;
+ struct stat st;
+ MessageType from = X_PROBED;
+ const char *tty0[] = { "/dev/tty0", "/dev/vc/0", NULL };
+- const char *vcs[] = { "/dev/vc/%d", "/dev/tty%d", NULL };
+
+- if (serverGeneration == 1) {
+- /*
+- * setup the virtual terminal manager
+- */
+- if (xf86Info.vtno != -1) {
+- from = X_CMDLINE;
+- }
+- else {
++ /* Only do this once */
++ static int vt_settings_parsed = 0;
+
+- i = 0;
+- while (tty0[i] != NULL) {
+- if ((fd = open(tty0[i], O_WRONLY, 0)) >= 0)
+- break;
+- i++;
+- }
++ if (vt_settings_parsed)
++ return;
+
+- if (fd < 0)
+- FatalError("xf86OpenConsole: Cannot open /dev/tty0 (%s)\n",
+- strerror(errno));
++ /*
++ * setup the virtual terminal manager
++ */
++ if (xf86Info.vtno != -1) {
++ from = X_CMDLINE;
++ }
++ else {
+
+- if (xf86Info.ShareVTs) {
+- SYSCALL(ret = ioctl(fd, VT_GETSTATE, &vts));
+- if (ret < 0)
+- FatalError("xf86OpenConsole: Cannot find the current"
+- " VT (%s)\n", strerror(errno));
+- xf86Info.vtno = vts.v_active;
+- }
+- else {
+- SYSCALL(ret = ioctl(fd, VT_OPENQRY, &xf86Info.vtno));
+- if (ret < 0)
+- FatalError("xf86OpenConsole: Cannot find a free VT: "
+- "%s\n", strerror(errno));
+- if (xf86Info.vtno == -1)
+- FatalError("xf86OpenConsole: Cannot find a free VT\n");
+- }
+- close(fd);
++ i = 0;
++ while (tty0[i] != NULL) {
++ if ((fd = open(tty0[i], O_WRONLY, 0)) >= 0)
++ break;
++ i++;
+ }
+
+- xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno);
++ if (fd < 0)
++ FatalError("parse_vt_settings: Cannot open /dev/tty0 (%s)\n",
++ strerror(errno));
+
+- /* Some of stdin / stdout / stderr maybe redirected to a file */
+- for (i = STDIN_FILENO; i <= STDERR_FILENO; i++) {
+- ret = fstat(i, &st);
+- if (ret == 0 && S_ISCHR(st.st_mode) && major(st.st_rdev) == 4) {
+- current_vt = minor(st.st_rdev);
+- break;
+- }
++ if (xf86Info.ShareVTs) {
++ SYSCALL(ret = ioctl(fd, VT_GETSTATE, &vts));
++ if (ret < 0)
++ FatalError("parse_vt_settings: Cannot find the current"
++ " VT (%s)\n", strerror(errno));
++ xf86Info.vtno = vts.v_active;
+ }
++ else {
++ SYSCALL(ret = ioctl(fd, VT_OPENQRY, &xf86Info.vtno));
++ if (ret < 0)
++ FatalError("parse_vt_settings: Cannot find a free VT: "
++ "%s\n", strerror(errno));
++ if (xf86Info.vtno == -1)
++ FatalError("parse_vt_settings: Cannot find a free VT\n");
++ }
++ close(fd);
++ }
++
++ xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno);
+
+- if (!KeepTty && current_vt == xf86Info.vtno) {
+- xf86Msg(X_PROBED,
+- "controlling tty is VT number %d, auto-enabling KeepTty\n",
+- current_vt);
+- KeepTty = TRUE;
++ /* Some of stdin / stdout / stderr maybe redirected to a file */
++ for (i = STDIN_FILENO; i <= STDERR_FILENO; i++) {
++ ret = fstat(i, &st);
++ if (ret == 0 && S_ISCHR(st.st_mode) && major(st.st_rdev) == 4) {
++ current_vt = minor(st.st_rdev);
++ break;
+ }
++ }
++
++ if (!KeepTty && current_vt == xf86Info.vtno) {
++ xf86Msg(X_PROBED,
++ "controlling tty is VT number %d, auto-enabling KeepTty\n",
++ current_vt);
++ KeepTty = TRUE;
++ }
++
++ vt_settings_parsed = 1;
++}
++
++int
++linux_get_keeptty(void)
++{
++ return KeepTty;
++}
++
++void
++xf86OpenConsole(void)
++{
++ int i, ret;
++ struct vt_stat vts;
++ struct vt_mode VT;
++ const char *vcs[] = { "/dev/vc/%d", "/dev/tty%d", NULL };
++
++ if (serverGeneration == 1) {
++ linux_parse_vt_settings();
+
+ if (!KeepTty) {
+ pid_t ppid = getppid();
+--
+2.3.6
+
diff --git a/0002-systemd-logind-Only-use-systemd-logind-integration-t.patch b/0002-systemd-logind-Only-use-systemd-logind-integration-t.patch
new file mode 100644
index 0000000..f3abb4c
--- /dev/null
+++ b/0002-systemd-logind-Only-use-systemd-logind-integration-t.patch
@@ -0,0 +1,70 @@
+From 4c5a293c20394bad6abb695aaa0d8ef374ed1080 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Wed, 21 Jan 2015 10:13:20 +0100
+Subject: [PATCH 2/2] systemd-logind: Only use systemd-logind integration
+ together with keeptty
+
+systemd-logind integration does not work when starting X on a new tty, as
+that detaches X from the current session and after hat systemd-logind revokes
+all rights any already open fds and refuses to open new fds for X.
+
+This means that currently e.g. "startx -- vt7" breaks, and breaks badly,
+requiring ssh access to the system to kill X.
+
+The fix for this is easy, we must not use systemd-logind integration when
+not using KeepTty, or iow we may only use systemd-logind integration together
+with KeepTty.
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+---
+ hw/xfree86/man/Xorg.man | 6 +++---
+ hw/xfree86/os-support/linux/systemd-logind.c | 9 +++++++++
+ 2 files changed, 12 insertions(+), 3 deletions(-)
+
+diff --git a/hw/xfree86/man/Xorg.man b/hw/xfree86/man/Xorg.man
+index 3ff6aef..0864a58 100644
+--- a/hw/xfree86/man/Xorg.man
++++ b/hw/xfree86/man/Xorg.man
+@@ -271,9 +271,9 @@ is ignored if
+ is anything other than \(oqPCI\(cq.
+ .TP 8
+ .B \-keeptty
+-Prevent the server from detaching its initial controlling terminal.
+-This option is only useful when debugging the server. Not all platforms
+-support (or can use) this option.
++Prevent the server from detaching its initial controlling terminal. If you
++want to use systemd-logind integration you must specify this option.
++Not all platorms support (or can use) this option.
+ .TP 8
+ .BI \-keyboard " keyboard-name"
+ Use the xorg.conf(__filemansuffix__) file
+diff --git a/hw/xfree86/os-support/linux/systemd-logind.c b/hw/xfree86/os-support/linux/systemd-logind.c
+index 4ad41a3..72f1ae3 100644
+--- a/hw/xfree86/os-support/linux/systemd-logind.c
++++ b/hw/xfree86/os-support/linux/systemd-logind.c
+@@ -34,6 +34,7 @@
+
+ #include "os.h"
+ #include "dbus-core.h"
++#include "linux.h"
+ #include "xf86.h"
+ #include "xf86platformBus.h"
+ #include "xf86Xinput.h"
+@@ -596,6 +597,14 @@ static struct dbus_core_hook core_hook = {
+ int
+ systemd_logind_init(void)
+ {
++ linux_parse_vt_settings();
++ if (!linux_get_keeptty()) {
++ LogMessage(X_INFO,
++ "systemd-logind: logind integration requires -keeptty and "
++ "-keeptty was not provided, disabling logind integration\n");
++ return 1;
++ }
++
+ return dbus_core_add_hook(&core_hook);
+ }
+
+--
+2.3.6
+
diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec
index 3d545ff..6da071c 100644
--- a/xorg-x11-server.spec
+++ b/xorg-x11-server.spec
@@ -45,7 +45,7 @@
Summary: X.Org X11 X server
Name: xorg-x11-server
Version: 1.17.1
-Release: 10%{?gitdate:.%{gitdate}}%{dist}
+Release: 11%{?gitdate:.%{gitdate}}%{dist}
URL: http://www.x.org
License: MIT
Group: User Interface/X
@@ -115,6 +115,10 @@ Patch10003: 0001-include-Fix-endianness-setup.patch
# rhbz1205725, submitted upstream
Patch10004: 0001-modesetting-Fix-software-cursor-fallback.patch
+# rhbz1203780, submitted upstream
+Patch10005: 0001-linux-Add-linux_get_vtno-and-linux_get_keeptty-helpe.patch
+Patch10006: 0002-systemd-logind-Only-use-systemd-logind-integration-t.patch
+
%global moduledir %{_libdir}/xorg/modules
%global drimoduledir %{_libdir}/dri
%global sdkdir %{_includedir}/xorg
@@ -648,6 +652,9 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete
%changelog
+* Mon May 11 2015 Hans de Goede <hdegoede at redhat.com> - 1.17.1-11
+- Fix "start -- vt7" not working (#1203780)
+
* Sat May 02 2015 Adel Gadllah <adel.gadllah at gmail.com> - 1.17.1-10
- modesetting: Fix software cursor fallback (#1205725)
--
cgit v0.10.2
http://pkgs.fedoraproject.org/cgit/xorg-x11-server.git/commit/?h=f22&id=943ff7334233f04fc2311945822cac537673a493
More information about the scm-commits
mailing list