Rather than just trying wayland-0 and bailing out if it's in use.
---
 src/wayland-server.c | 29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/wayland-server.c b/src/wayland-server.c
index 3390171..ba13168 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -1078,11 +1078,31 @@ open_socket_for_name(struct wl_socket *s, const char 
*name)
        return 0;
 }
 
+static int
+open_default_socket(struct wl_socket *s)
+{
+       char socket_name[16] = "";
+       int sockno = 0;
+
+       /* A reasonable number of maximum default sockets. If
+        * you need more than this, set WAYLAND_DISPLAY explicitly. */
+       const int MAX_SOCKNO = 32;
+
+       do {
+               snprintf(socket_name, sizeof socket_name, "wayland-%d", sockno);
+               if (open_socket_for_name(s, socket_name) >= 0)
+                       return 0;
+       } while (sockno++ < MAX_SOCKNO);
+
+       return -1;
+}
+
 WL_EXPORT int
 wl_display_add_socket(struct wl_display *display, const char *name)
 {
        struct wl_socket *s;
        socklen_t size;
+       int ret;
 
        s = malloc(sizeof *s);
        if (s == NULL)
@@ -1090,10 +1110,13 @@ wl_display_add_socket(struct wl_display *display, const 
char *name)
 
        if (name == NULL)
                name = getenv("WAYLAND_DISPLAY");
-       if (name == NULL)
-               name = "wayland-0";
 
-       if (open_socket_for_name(s, name) < 0) {
+       if (name)
+               ret = open_socket_for_name(s, name);
+       else
+               ret = open_default_socket(s);
+
+       if (ret < 0) {
                free(s);
                return -1;
        }
-- 
1.9.0

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to