[PATCH v2 1/2] linux: Add linux_get_vtno and linux_get_keeptty helpers

Peter Hutterer peter.hutterer at who-t.net
Tue May 5 23:41:44 PDT 2015


On Thu, Apr 30, 2015 at 02:24:28PM +0200, Hans de Goede wrote:
> 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>

Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
pls change the subject line over to linux_parse_vt_settings as well though,
and in the commit message (second-to-last line).

Cheers,
   Peter

> ---
> 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
> 
> _______________________________________________
> 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