summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoïc Yhuel <loic.yhuel@softathome.com>2019-11-14 14:13:17 +0100
committerLoïc Yhuel <loic.yhuel@softathome.com>2021-01-13 17:01:15 +0100
commitd32e77692ce7faada2a44c9a8ee2e2fc1bc7461d (patch)
tree77785c41bf6adf30b74e51136178da2e4641819d
parent69b8eaf3852839079e18a57c3b86fa71ddf72354 (diff)
downloadwayland-d32e77692ce7faada2a44c9a8ee2e2fc1bc7461d.tar.gz
server: Allow absolute paths in WAYLAND_DISPLAY
The compositor should handle absolute paths in WAYLAND_DISPLAY like the clients, ie not adding the XDG_RUNTIME_DIR prefix if it's an absolute path. This allows to create the wayland socket in a separate directory for system compositors if desired. Clients could then directly inherit the environment variable. Signed-off-by: Loïc Yhuel <loic.yhuel@softathome.com>
-rw-r--r--src/wayland-server.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/src/wayland-server.c b/src/wayland-server.c
index d8ccb22..d83bdec 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -1481,28 +1481,32 @@ static int
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");
- if (!runtime_dir) {
- wl_log("error: XDG_RUNTIME_DIR not set in the environment\n");
-
- /* to prevent programs reporting
- * "failed to add socket: Success" */
- errno = ENOENT;
- return -1;
+ const char *runtime_dir = "";
+ const char *separator = "";
+
+ if (name[0] != '/') {
+ runtime_dir = getenv("XDG_RUNTIME_DIR");
+ if (!runtime_dir) {
+ wl_log("error: XDG_RUNTIME_DIR not set in the environment\n");
+
+ /* to prevent programs reporting
+ * "failed to add socket: Success" */
+ errno = ENOENT;
+ return -1;
+ }
+ separator = "/";
}
s->addr.sun_family = AF_LOCAL;
name_size = snprintf(s->addr.sun_path, sizeof s->addr.sun_path,
- "%s/%s", runtime_dir, name) + 1;
+ "%s%s%s", runtime_dir, separator, name) + 1;
s->display_name = (s->addr.sun_path + name_size - 1) - strlen(name);
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);
+ wl_log("error: socket path \"%s%s%s\" plus null terminator"
+ " exceeds 108 bytes\n", runtime_dir, separator, name);
*s->addr.sun_path = 0;
/* to prevent programs reporting
* "failed to add socket: Success" */
@@ -1641,14 +1645,17 @@ wl_display_add_socket_fd(struct wl_display *display, int sock_fd)
* variable for the socket name. If WAYLAND_DISPLAY is 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.
+ * If the socket name is a relative path, 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.
+ *
+ * If the socket name is an absolute path, then it is used as-is for the
+ * the Unix socket.
*
- * The length of socket path, i.e., the path set in XDG_RUNTIME_DIR and the
- * socket name, must not exceed the maximum 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.
+ * The length of the computed socket path must not exceed the maximum length
+ * of a Unix socket path.
+ * The function also fails if the user does not have write permission in the
+ * directory or if the path is already in use.
*
* \memberof wl_display
*/