[PATCH wayland] client: Allow absolute paths in WAYLAND_DISPLAY

Jonas Ã…dahl jadahl at gmail.com
Fri Nov 10 02:53:55 UTC 2017


On Thu, Nov 09, 2017 at 09:36:29AM -0600, Matt Hoosier wrote:
> From: Matt Hoosier <matt.hoosier at garmin.com>
> 
> In order to support system compositor instances, it is necessary to
> allow clients' wl_display_connect() to find the compositor's listening
> socket somewhere outside of XDG_RUNTIME_DIR. For a full account, see
> the discussion beginning here:
> 
> https://lists.freedesktop.org/archives/wayland-devel/2017-November/035664.html
> 
> This change adjusts the client-side connection logic so that, if
> WAYLAND_DISPLAY is formatted as an absolute pathname, the socket
> connection attempt is made to just $WAYLAND_DISPLAY rather than
> usual user-private location $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY.
> 
> This change is based on Davide Bettio's submission of the same concept
> at:
> 
> https://lists.freedesktop.org/archives/wayland-devel/2015-August/023838.html.
> ---
>  doc/man/wl_display_connect.xml | 11 ++++++++---
>  src/wayland-client.c           | 34 +++++++++++++++++++++++-----------
>  2 files changed, 31 insertions(+), 14 deletions(-)
> 
> diff --git a/doc/man/wl_display_connect.xml b/doc/man/wl_display_connect.xml
> index 7e6e05c..e86ee26 100644
> --- a/doc/man/wl_display_connect.xml
> +++ b/doc/man/wl_display_connect.xml
> @@ -55,14 +55,19 @@
>      <title>Description</title>
>      <para><function>wl_display_connect</function> connects to a Wayland socket
>            that was previously opened by a Wayland server. The server socket must
> -          be placed in <envar>XDG_RUNTIME_DIR</envar> for this function to
> -          find it. The <varname>name</varname> argument specifies the name of
> +          be placed in <envar>XDG_RUNTIME_DIR</envar> or exist at the absolute
> +          path referred to by <envar>WAYLAND_DISPLAY</envar> for this function
> +          to find it. The <varname>name</varname> argument specifies the name of

As mentioned in another E-mail to the old thread, this change is not
completely backward compatible and it should be made clear that one
cannot rely on a previously working valid applications to continue to
work without adaptations for supporting absolute socket paths.

To repeat, this is for applications (or other things dealing with
Wayland sockets, such as sandbox runtimes) that do their own processing
of the content of WAYLAND_DISPLAY.


Jonas

>            the socket or <constant>NULL</constant> to use the default (which is
>            <constant>"wayland-0"</constant>). The environment variable
>            <envar>WAYLAND_DISPLAY</envar> replaces the default value. If
>            <envar>WAYLAND_SOCKET</envar> is set, this function behaves like
>            <function>wl_display_connect_to_fd</function> with the file-descriptor
> -          number taken from the environment variable.</para>
> +          number taken from the environment variable. If
> +          <envar>WAYLAND_SOCKET</envar> is not set and <envar>WAYLAND_DISPLAY</envar>
> +          is an absolute path then <varname>name</varname> is ignored and the
> +          path stored in <envar>WAYLAND_DISPLAY</envar> is used as the Wayland
> +          socket to which the connection is attempted.</para>
>  
>      <para><function>wl_display_connect_to_fd</function> connects to a Wayland
>            socket with an explicit file-descriptor. The file-descriptor is passed
> diff --git a/src/wayland-client.c b/src/wayland-client.c
> index 3d7361e..2263d06 100644
> --- a/src/wayland-client.c
> +++ b/src/wayland-client.c
> @@ -858,8 +858,13 @@ connect_to_socket(const char *name)
>  	const char *runtime_dir;
>  	int name_size, fd;
>  
> +	if (name == NULL)
> +		name = getenv("WAYLAND_DISPLAY");
> +	if (name == NULL)
> +		name = "wayland-0";
> +
>  	runtime_dir = getenv("XDG_RUNTIME_DIR");
> -	if (!runtime_dir) {
> +	if (!runtime_dir && (name[0] != '/')) {
>  		wl_log("error: XDG_RUNTIME_DIR not set in the environment.\n");
>  		/* to prevent programs reporting
>  		 * "failed to create display: Success" */
> @@ -867,25 +872,32 @@ connect_to_socket(const char *name)
>  		return -1;
>  	}
>  
> -	if (name == NULL)
> -		name = getenv("WAYLAND_DISPLAY");
> -	if (name == NULL)
> -		name = "wayland-0";
> -
>  	fd = wl_os_socket_cloexec(PF_LOCAL, SOCK_STREAM, 0);
>  	if (fd < 0)
>  		return -1;
>  
>  	memset(&addr, 0, sizeof addr);
>  	addr.sun_family = AF_LOCAL;
> -	name_size =
> -		snprintf(addr.sun_path, sizeof addr.sun_path,
> -			 "%s/%s", runtime_dir, name) + 1;
> +	if (name[0] != '/') {
> +		name_size =
> +			snprintf(addr.sun_path, sizeof addr.sun_path,
> +			         "%s/%s", runtime_dir, name) + 1;
> +	} else {
> +		/* absolute path */
> +		name_size =
> +			snprintf(addr.sun_path, sizeof addr.sun_path,
> +			         "%s", name) + 1;
> +	}
>  
>  	assert(name_size > 0);
>  	if (name_size > (int)sizeof addr.sun_path) {
> -		wl_log("error: socket path \"%s/%s\" plus null terminator"
> -		       " exceeds 108 bytes\n", runtime_dir, name);
> +		if (name[0] != '/') {
> +			wl_log("error: socket path \"%s/%s\" plus null terminator"
> +			       " exceeds %i bytes\n", runtime_dir, name, (int) sizeof(addr.sun_path));
> +		} else {
> +			wl_log("error: socket path \"%s\" plus null terminator"
> +			       " exceeds %i bytes\n", name, (int) sizeof(addr.sun_path));
> +		}
>  		close(fd);
>  		/* to prevent programs reporting
>  		 * "failed to add socket: Success" */
> -- 
> 2.13.6
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list