[PATCH] Handle -displayfd and an explicit display number sensibly

Kristian Høgsberg krh at bitplanet.net
Mon Mar 24 12:56:06 PDT 2014


On Wed, Mar 19, 2014 at 7:26 AM, Jon TURNEY <jon.turney at dronecode.org.uk> wrote:
> Handle -displayfd and an explicit display number sensibly, e.g. use the
> explicitly specified display number, and write it to the displayfd

I  don't think the two options were meant to be used together, but I
can see how that would be useful.  Non-signal based ready notification
while letting the parent process pick the display is useful for
Xwayland as well.

> Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
> ---
>  dix/globals.c    |  3 ++-
>  include/opaque.h |  1 +
>  os/connection.c  | 11 +++++------
>  os/utils.c       |  2 +-
>  4 files changed, 9 insertions(+), 8 deletions(-)
>
> diff --git a/dix/globals.c b/dix/globals.c
> index 9738e9c..5a21f07 100644
> --- a/dix/globals.c
> +++ b/dix/globals.c
> @@ -127,7 +127,8 @@ int defaultColorVisualClass = -1;
>  int monitorResolution = 0;
>
>  const char *display;
> -int displayfd;
> +int displayfd = 0;

The parent process creates the fd in our process environment and could
pick 0 as the display fd.  Let's initialize to -1 which is never a
valid fd.

> +Bool explicit_display = FALSE;
>  char *ConnectionInfo;
>
>  CARD32 TimeOutValue = DEFAULT_TIMEOUT * MILLI_PER_SECOND;
> diff --git a/include/opaque.h b/include/opaque.h
> index 73d40c3..0d917b0 100644
> --- a/include/opaque.h
> +++ b/include/opaque.h
> @@ -51,6 +51,7 @@ extern _X_EXPORT int defaultScreenSaverBlanking;
>  extern _X_EXPORT int defaultScreenSaverAllowExposures;
>  extern _X_EXPORT const char *display;
>  extern _X_EXPORT int displayfd;
> +extern _X_EXPORT Bool explicit_display;
>
>  extern _X_EXPORT int defaultBackingStore;
>  extern _X_EXPORT Bool disableBackingStore;
> diff --git a/os/connection.c b/os/connection.c
> index ddf4f0a..23a4f6a 100644
> --- a/os/connection.c
> +++ b/os/connection.c
> @@ -351,8 +351,8 @@ void
>  NotifyParentProcess(void)
>  {
>  #if !defined(WIN32)
> -    if (dynamic_display[0]) {
> -        write(displayfd, dynamic_display, strlen(dynamic_display));
> +    if (displayfd) {
> +        write(displayfd, display, strlen(display));
>          write(displayfd, "\n", 1);
>          close(displayfd);
>      }
> @@ -404,15 +404,14 @@ CreateWellKnownSockets(void)
>      FD_ZERO(&WellKnownConnections);
>
>      /* display is initialized to "0" by main(). It is then set to the display
> -     * number if specified on the command line, or to NULL when the -displayfd
> -     * option is used. */
> -    if (display) {
> +     * number if specified on the command line. */
> +    if ((displayfd == 0) || explicit_display) {
>          if (TryCreateSocket(atoi(display), &partial) &&
>              ListenTransCount >= 1)
>              if (!PartialNetwork && partial)
>                  FatalError ("Failed to establish all listening sockets");
>      }
> -    else { /* -displayfd */
> +    else { /* -displayfd and no explicit display number */
>          Bool found = 0;
>          for (i = 0; i < 65535 - X_TCP_PORT; i++) {
>              if (TryCreateSocket(i, &partial) && !partial) {
> diff --git a/os/utils.c b/os/utils.c
> index 497779b..8ea6e7a 100644
> --- a/os/utils.c
> +++ b/os/utils.c
> @@ -666,6 +666,7 @@ ProcessCommandLine(int argc, char *argv[])
>          else if (argv[i][0] == ':') {
>              /* initialize display */
>              display = argv[i];
> +            explicit_display = TRUE;
>              display++;
>              if (!VerifyDisplayName(display)) {
>                  ErrorF("Bad display name: %s\n", display);
> @@ -736,7 +737,6 @@ ProcessCommandLine(int argc, char *argv[])
>          else if (strcmp(argv[i], "-displayfd") == 0) {
>              if (++i < argc) {
>                  displayfd = atoi(argv[i]);
> -                display = NULL;
>  #ifdef LOCK_SERVER
>                  nolock = TRUE;
>  #endif
> --
> 1.8.3.4
>
> _______________________________________________
> 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