[PATCH v3 2/3] linux: Add a may_fail paramter to linux_parse_vt_settings
Peter Hutterer
peter.hutterer at who-t.net
Thu May 28 20:18:43 PDT 2015
typo in the subject: parameter
On Tue, May 19, 2015 at 10:10:20AM +0200, Hans de Goede wrote:
> 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 <hdegoede at redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net> otherwise
Cheers,
Peter
> ---
> Changes in v3:
> -New patch in v3 of the patch-set
> ---
> 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.1
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list