[PATCH wayland] client: Allow absolute paths in WAYLAND_DISPLAY

Matt Hoosier matt.hoosier at gmail.com
Fri Nov 10 17:14:42 UTC 2017


On Thu, Nov 9, 2017 at 8:53 PM, Jonas Ã…dahl <jadahl at gmail.com> wrote:
> 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.

Thanks. I misunderstood your request earlier. I thought you were just
calling for a very clear description of the situations in which the
absolute path would actually get used. I'm resubmitting momentarily
with the manpage for wl_display_connect() adjusted to note the version
of the Wayland client library this the behavior changes. A warning to
users who do manual construction of the socket path is spelled out.

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