This is used for nested compositor architectures.

Signed-off-by: Imran Zaman <imran.za...@gmail.com>
---
 src/wayland-server.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/src/wayland-server.c b/src/wayland-server.c
index 09e8903..721fabe 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -39,6 +39,8 @@
 #include <fcntl.h>
 #include <sys/file.h>
 #include <sys/stat.h>
+#include <sys/types.h>
+#include <grp.h>
 #include <ffi.h>
 
 #include "wayland-private.h"
@@ -1117,6 +1119,10 @@ static int
 _wl_display_add_socket(struct wl_display *display, struct wl_socket *s)
 {
        socklen_t size;
+       const char *socket_mode_str;
+       const char *socket_group_str;
+       const struct group *socket_group;
+       unsigned socket_mode;
 
        s->fd = wl_os_socket_cloexec(PF_LOCAL, SOCK_STREAM, 0);
        if (s->fd < 0) {
@@ -1134,6 +1140,27 @@ _wl_display_add_socket(struct wl_display *display, 
struct wl_socket *s)
                return -1;
        }
 
+       socket_group_str = getenv("WAYLAND_SERVER_GROUP");
+       if (socket_group_str != NULL) {
+               socket_group = getgrnam(socket_group_str);
+               if (socket_group != NULL) {
+                       if (chown(s->addr.sun_path,
+                               -1, socket_group->gr_gid) != 0)
+                               wl_log("chown(\"%s\") failed: %s",
+                                       s->addr.sun_path,
+                                       strerror(errno));
+               }
+       }
+       socket_mode_str = getenv("WAYLAND_SERVER_MODE");
+       if (socket_mode_str != NULL) {
+               if (sscanf(socket_mode_str, "%o", &socket_mode) > 0)
+                       if (chmod(s->addr.sun_path, socket_mode) != 0) {
+                               wl_log("chmod(\"%s\") failed: %s",
+                                       s->addr.sun_path,
+                                       strerror(errno));
+                       }
+       }
+
        s->source = wl_event_loop_add_fd(display->loop, s->fd,
                                         WL_EVENT_READABLE,
                                         socket_data, display);
-- 
1.9.1

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

Reply via email to