[PATCH wayland] extend WAYLAND_DISPLAY semantic and make server socket path configurable using environment
Davide Bettio
davide.bettio at ispirata.com
Tue Feb 24 06:08:36 PST 2015
commit e8b37de8e084d4e50a12bd2911657d54c0ebd9ed
Author: Davide Bettio <davide.bettio at ispirata.com>
Date: Tue Feb 24 12:40:49 2015 +0100
* Extend WAYLAND_DISPLAY and name parameter semantics to support
absolute paths.
For example WAYLAND_DISPLAY="/my/path/wayland-2" or
connect_to_socket("/my/path/wayland-2").
* Introduce WAYLAND_SERVER_SOCKET_DIR to change socket directory
without changing XDG_RUNTIME_DIR.
This might be useful to change socket directory in case
wl_display_add_socket_auto is used.
For example this will change the socket path for weston without
using any command line argument.
This envvar is ignored when WAYLAND_SERVER_SOCKET is set to an
absolute path.
* Introduce WAYLAND_SERVER_SOCKET to change the path where the
server will create the socket.
It will be possible for a nested compositor to offer a socket
located in WAYLAND_SERVER_SOCKET path
while connecting to the main compositor socket that is located in
WAYLAND_DISPLAY path.
That's the reason why a futher WAYLAND_SERVER_SOCKET envvar has been
introduced.
Wayland clients will not see any new environment variable, while
compositors may have to deal
with 2 extra environment variables, this is due the fact that a
compositor might be a client of
another compositor and we must make sure that WAYLAND_DISPLAY is not
used for both client
and server purposes.
Signed-off-by: Davide Bettio <davide.bettio at ispirata.com>
diff --git a/doc/man/wl_display_connect.xml
b/doc/man/wl_display_connect.xml
index 7e6e05c..b78c53f 100644
--- a/doc/man/wl_display_connect.xml
+++ b/doc/man/wl_display_connect.xml
@@ -59,10 +59,10 @@
find it. The <varname>name</varname> argument specifies the
name of
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>
+ <envar>WAYLAND_DISPLAY</envar> replaces the default value,
and eventually uses
+ a different path too. 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>
<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 0f1405c..cc01573 100644
--- a/src/wayland-client.c
+++ b/src/wayland-client.c
@@ -768,14 +768,26 @@ connect_to_socket(const char *name)
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 108 bytes\n", runtime_dir, name);
+ } else {
+ wl_log("error: socket path \"%s\" plus null terminator"
+ " exceeds 108 bytes\n", name);
+ }
close(fd);
/* to prevent programs reporting
* "failed to add socket: Success" */
diff --git a/src/wayland-server.c b/src/wayland-server.c
index 0558634..39ba13f 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -1093,9 +1093,12 @@ wl_socket_init_for_display_name(struct wl_socket
*s, const char *name)
int name_size;
const char *runtime_dir;
- runtime_dir = getenv("XDG_RUNTIME_DIR");
+ runtime_dir = getenv("WAYLAND_SERVER_SOCKET_DIR");
if (!runtime_dir) {
- wl_log("error: XDG_RUNTIME_DIR not set in the environment\n");
+ runtime_dir = getenv("XDG_RUNTIME_DIR");
+ }
+ if (!runtime_dir) {
+ wl_log("error: XDG_RUNTIME_DIR or WAYLAND_SERVER_SOCKET_DIR not set
in the environment\n");
/* to prevent programs reporting
* "failed to add socket: Success" */
@@ -1104,15 +1107,28 @@ wl_socket_init_for_display_name(struct wl_socket
*s, const char *name)
}
s->addr.sun_family = AF_LOCAL;
- name_size = snprintf(s->addr.sun_path, sizeof s->addr.sun_path,
- "%s/%s", runtime_dir, name) + 1;
+ if (name[0] != '/') {
+ name_size = snprintf(s->addr.sun_path, sizeof s->addr.sun_path,
+ "%s/%s", runtime_dir, name) + 1;
+
+ s->display_name = (s->addr.sun_path + name_size - 1) - strlen(name);
+ } else {
+ //absolute path
+ name_size = snprintf(s->addr.sun_path, sizeof s->addr.sun_path,
+ "%s", name) + 1;
- s->display_name = (s->addr.sun_path + name_size - 1) - strlen(name);
+ s->display_name = strrchr(s->addr.sun_path, '/') + 1;
+ }
assert(name_size > 0);
if (name_size > (int)sizeof s->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 108 bytes\n", runtime_dir,
name);
+ } else {
+ wl_log("error: socket path \"%s\" plus null terminator"
+ " exceeds 108 bytes\n", name);
+ }
*s->addr.sun_path = 0;
/* to prevent programs reporting
* "failed to add socket: Success" */
@@ -1203,18 +1219,18 @@ wl_display_add_socket_auto(struct wl_display
*display)
* This adds a Unix socket to Wayland display which can be used by
clients to
* connect to Wayland display.
*
- * If NULL is passed as name, then it would look for WAYLAND_DISPLAY
env
- * variable for the socket name. If WAYLAND_DISPLAY is not set, then
default
- * wayland-0 is used.
+ * If NULL is passed as name, then it would look in order for
WAYLAND_SERVER_SOCKET
+ * and WAYLAND_SERVER env variable for the socket name. If
WAYLAND_DISPLAY and
+ * WAYLAND_SERVER_SOCKET are not set, then default wayland-0 is used.
*
- * The Unix socket will be created in the directory pointed to by
environment
- * variable XDG_RUNTIME_DIR. If XDG_RUNTIME_DIR is not set, then this
function
- * fails and returns -1.
+ * The Unix socket will be created in the directory pointed to by
either environment
+ * variable WAYLAND_SERVER_SOCKET_DIR or XDG_RUNTIME_DIR. If the none
of the is set,
+ * then this function fails and returns -1.
*
- * The length of socket path, i.e., the path set in XDG_RUNTIME_DIR and
the
+ * The length of socket path, e.g., the path set in XDG_RUNTIME_DIR and
the
* socket name, must not exceed the maxium length of a Unix socket
path.
* The function also fails if the user do not have write permission in
the
- * XDG_RUNTIME_DIR path or if the socket name is already in use.
+ * wayland socket path or if the socket name is already in use.
*
* \memberof wl_display
*/
@@ -1228,6 +1244,8 @@ wl_display_add_socket(struct wl_display *display,
const char *name)
return -1;
if (name == NULL)
+ name = getenv("WAYLAND_SERVER_SOCKET");
+ if (name == NULL)
name = getenv("WAYLAND_DISPLAY");
if (name == NULL)
name = "wayland-0";
More information about the wayland-devel
mailing list