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 deleted file mode 100644 index 6fa9112..0000000 --- a/0001-linux-Add-linux_get_vtno-and-linux_get_keeptty-helpe.patch +++ /dev/null @@ -1,236 +0,0 @@ -From cd7063aa899b56d407b57eab06b51925c913399d Mon Sep 17 00:00:00 2001 -From: Hans de Goede -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 ---- -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 -+ */ -+ -+#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 - - #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/0001-linux-Add-linux_parse_vt_settings-and-linux_get_keep.patch b/0001-linux-Add-linux_parse_vt_settings-and-linux_get_keep.patch new file mode 100644 index 0000000..7497b26 --- /dev/null +++ b/0001-linux-Add-linux_parse_vt_settings-and-linux_get_keep.patch @@ -0,0 +1,241 @@ +From 92bc12b7085ff80d4f5a2389b5a00cda501e27c7 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 21 Jan 2015 09:31:39 +0100 +Subject: [PATCH v2 1/3] linux: Add linux_parse_vt_settings 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_parse_vt_settings() 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 +Reviewed-by: Peter Hutterer +--- +Changes in v2: +-Rename linux_get_vtno to linux_parse_vt_settings +Changes in v3: +-Carry the rename of linux_get_vtno to linux_parse_vt_settings over into + the commit msg +--- + 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 ++ */ ++ ++#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 + + #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.4.0 + diff --git a/0002-linux-Add-a-may_fail-paramter-to-linux_parse_vt_sett.patch b/0002-linux-Add-a-may_fail-paramter-to-linux_parse_vt_sett.patch new file mode 100644 index 0000000..50ed714 --- /dev/null +++ b/0002-linux-Add-a-may_fail-paramter-to-linux_parse_vt_sett.patch @@ -0,0 +1,121 @@ +From 4237375e8c159ce95ec77868f74edacc896f8714 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 13 May 2015 13:17:09 +0200 +Subject: [PATCH v2 2/3] linux: Add a may_fail paramter to + linux_parse_vt_settings + +linux_parse_vt_settings() was split out of xf86OpenConsole so that it can +be called earlier during systemd-logind init, but it is possible to run +the xserver in such a way that xf86OpenConsole() is never used. + +The FatalError calls in linux_parse_vt_settings() may stop the Xorg xserver +from working when e.g. no /dev/tty0 is present in such a setup. + +This commit adds a may_fail parameter to linux_parse_vt_settings() which +can be used to make linux_parse_vt_settings() fail silenty with an error +return in this case, rather then calling FatalError(). + +Signed-off-by: Hans de Goede +--- + hw/xfree86/os-support/linux/linux.h | 2 +- + hw/xfree86/os-support/linux/lnx_init.c | 29 +++++++++++++++++++++-------- + 2 files changed, 22 insertions(+), 9 deletions(-) + +diff --git a/hw/xfree86/os-support/linux/linux.h b/hw/xfree86/os-support/linux/linux.h +index 8cb8e3d..83506fd 100644 +--- a/hw/xfree86/os-support/linux/linux.h ++++ b/hw/xfree86/os-support/linux/linux.h +@@ -26,7 +26,7 @@ + #ifndef XF86_LINUX_H + #define XF86_LINUX_H + +-void linux_parse_vt_settings(void); ++int linux_parse_vt_settings(int may_fail); + 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 22c61bf..12ddf91 100644 +--- a/hw/xfree86/os-support/linux/lnx_init.c ++++ b/hw/xfree86/os-support/linux/lnx_init.c +@@ -80,8 +80,8 @@ switch_to(int vt, const char *from) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wformat-nonliteral" + +-void +-linux_parse_vt_settings(void) ++int ++linux_parse_vt_settings(int may_fail) + { + int i, fd = -1, ret, current_vt = -1; + struct vt_stat vts; +@@ -93,7 +93,7 @@ linux_parse_vt_settings(void) + static int vt_settings_parsed = 0; + + if (vt_settings_parsed) +- return; ++ return 1; + + /* + * setup the virtual terminal manager +@@ -110,24 +110,36 @@ linux_parse_vt_settings(void) + i++; + } + +- if (fd < 0) ++ if (fd < 0) { ++ if (may_fail) ++ return 0; + FatalError("parse_vt_settings: Cannot open /dev/tty0 (%s)\n", + strerror(errno)); ++ } + + if (xf86Info.ShareVTs) { + SYSCALL(ret = ioctl(fd, VT_GETSTATE, &vts)); +- if (ret < 0) ++ if (ret < 0) { ++ if (may_fail) ++ return 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) ++ if (ret < 0) { ++ if (may_fail) ++ return 0; + FatalError("parse_vt_settings: Cannot find a free VT: " + "%s\n", strerror(errno)); +- if (xf86Info.vtno == -1) ++ } ++ if (xf86Info.vtno == -1) { ++ if (may_fail) ++ return 0; + FatalError("parse_vt_settings: Cannot find a free VT\n"); ++ } + } + close(fd); + } +@@ -151,6 +163,7 @@ linux_parse_vt_settings(void) + } + + vt_settings_parsed = 1; ++ return 1; + } + + int +@@ -168,7 +181,7 @@ xf86OpenConsole(void) + const char *vcs[] = { "/dev/vc/%d", "/dev/tty%d", NULL }; + + if (serverGeneration == 1) { +- linux_parse_vt_settings(); ++ linux_parse_vt_settings(FALSE); + + if (!KeepTty) { + pid_t ppid = getppid(); +-- +2.4.0 + diff --git a/0002-systemd-logind-Only-use-systemd-logind-integration-t.patch b/0002-systemd-logind-Only-use-systemd-logind-integration-t.patch deleted file mode 100644 index f3abb4c..0000000 --- a/0002-systemd-logind-Only-use-systemd-logind-integration-t.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 4c5a293c20394bad6abb695aaa0d8ef374ed1080 Mon Sep 17 00:00:00 2001 -From: Hans de Goede -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 ---- - 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/0003-systemd-logind-Only-use-systemd-logind-integration-t.patch b/0003-systemd-logind-Only-use-systemd-logind-integration-t.patch new file mode 100644 index 0000000..522f450 --- /dev/null +++ b/0003-systemd-logind-Only-use-systemd-logind-integration-t.patch @@ -0,0 +1,78 @@ +From 816c85d0e8fc517db3382bce4a94bc5d859b3eca Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 21 Jan 2015 10:13:20 +0100 +Subject: [PATCH v2 3/3] 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 +Reviewed-by: Peter Hutterer +--- +Changes in v2: +-Document that -keeptty must be passed for logind integration in man page +-Print an INFO message when disabling logind integration due to -keeptty + not being set +Changes in v3: +-Fix typo in manpage additions +-Use new may_fail parameter to linux_parse_vt_settings +--- + hw/xfree86/man/Xorg.man | 6 +++--- + hw/xfree86/os-support/linux/systemd-logind.c | 8 ++++++++ + 2 files changed, 11 insertions(+), 3 deletions(-) + +diff --git a/hw/xfree86/man/Xorg.man b/hw/xfree86/man/Xorg.man +index 3ff6aef..ddf1358 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 platforms 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..69e2f67 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,13 @@ static struct dbus_core_hook core_hook = { + int + systemd_logind_init(void) + { ++ if (linux_parse_vt_settings(TRUE) && !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.4.0 + diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 6da071c..a058b8f 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: 11%{?gitdate:.%{gitdate}}%{dist} +Release: 12%{?gitdate:.%{gitdate}}%{dist} URL: http://www.x.org License: MIT Group: User Interface/X @@ -116,8 +116,9 @@ Patch10003: 0001-include-Fix-endianness-setup.patch 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 +Patch10005: 0001-linux-Add-linux_parse_vt_settings-and-linux_get_keep.patch +Patch10006: 0002-linux-Add-a-may_fail-paramter-to-linux_parse_vt_sett.patch +Patch10007: 0003-systemd-logind-Only-use-systemd-logind-integration-t.patch %global moduledir %{_libdir}/xorg/modules %global drimoduledir %{_libdir}/dri @@ -652,6 +653,9 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete %changelog +* Tue May 19 2015 Hans de Goede - 1.17.1-12 +- Fix "start -- vt7" not working fix breaking headless setups (#1203780) + * Mon May 11 2015 Hans de Goede - 1.17.1-11 - Fix "start -- vt7" not working (#1203780)