From: Sangjin Lee <lsj...@samsung.com> Currently the server can add a socket by name. To support an embedded compositor in a Simplified Mandatory Access Control Kernel (Smack) enabled environment, the embedded compositor should use the socket that it gets from the system or session compositor.
Signed-off-by: Sangjin Lee <lsj...@samsung.com> Acked-by: Sung-Jin Park <sj76.p...@samsung.com> Reviewed-by: Bryce Harrington <br...@osg.samsung.com> Signed-off-by: Bryce Harrington <br...@osg.samsung.com> --- src/wayland-os.c | 12 ++++++++ src/wayland-os.h | 2 ++ src/wayland-server-core.h | 6 ++++ src/wayland-server.c | 76 ++++++++++++++++++++++++++++++----------------- 4 files changed, 68 insertions(+), 28 deletions(-) diff --git a/src/wayland-os.c b/src/wayland-os.c index 93b6f5f..31114f6 100644 --- a/src/wayland-os.c +++ b/src/wayland-os.c @@ -27,6 +27,7 @@ #include <sys/types.h> #include <sys/socket.h> +#include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> @@ -73,6 +74,17 @@ wl_os_socket_cloexec(int domain, int type, int protocol) } int +wl_os_socket_check_cloexec(int fd) +{ + struct stat buf; + + if (fd < 0 || fstat(fd, &buf) < 0 || !S_ISSOCK(buf.st_mode)) + return -1; + + return set_cloexec_or_close(fd); +} + +int wl_os_dupfd_cloexec(int fd, long minfd) { int newfd; diff --git a/src/wayland-os.h b/src/wayland-os.h index f51efaa..e3e7bf0 100644 --- a/src/wayland-os.h +++ b/src/wayland-os.h @@ -41,6 +41,8 @@ wl_os_epoll_create_cloexec(void); int wl_os_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen); +int +wl_os_socket_check_cloexec(int fd); /* * The following are for wayland-os.c and the unit tests. diff --git a/src/wayland-server-core.h b/src/wayland-server-core.h index 85b4b9e..9710609 100644 --- a/src/wayland-server-core.h +++ b/src/wayland-server-core.h @@ -128,9 +128,15 @@ wl_display_get_event_loop(struct wl_display *display); int wl_display_add_socket(struct wl_display *display, const char *name); +int +wl_display_add_socket_fd(struct wl_display *display, const char *name, int sock_fd); + const char * wl_display_add_socket_auto(struct wl_display *display); +const char * +wl_display_add_socket_fd_auto(struct wl_display *display, int sock_fd); + void wl_display_terminate(struct wl_display *display); diff --git a/src/wayland-server.c b/src/wayland-server.c index 0f04f66..bac98bf 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -1133,8 +1133,12 @@ _wl_display_add_socket(struct wl_display *display, struct wl_socket *s) { socklen_t size; - s->fd = wl_os_socket_cloexec(PF_LOCAL, SOCK_STREAM, 0); - if (s->fd < 0) { + if (s->fd == -1) { + s->fd = wl_os_socket_cloexec(PF_LOCAL, SOCK_STREAM, 0); + if (s->fd < 0) { + return -1; + } + } else if (wl_os_socket_check_cloexec(s->fd) < 0) { return -1; } @@ -1161,7 +1165,7 @@ _wl_display_add_socket(struct wl_display *display, struct wl_socket *s) } WL_EXPORT const char * -wl_display_add_socket_auto(struct wl_display *display) +wl_display_add_socket_fd_auto(struct wl_display *display, int sock_fd) { struct wl_socket *s; int displayno = 0; @@ -1185,6 +1189,8 @@ wl_display_add_socket_auto(struct wl_display *display) if (wl_socket_lock(s) < 0) continue; + s->fd = sock_fd; + if (_wl_display_add_socket(display, s) < 0) { wl_socket_destroy(s); return NULL; @@ -1199,32 +1205,14 @@ wl_display_add_socket_auto(struct wl_display *display) return NULL; } -/** Add a socket to Wayland display for the clients to connect. - * - * \param display Wayland display to which the socket should be added. - * \param name Name of the Unix socket. - * \return 0 if success. -1 if failed. - * - * 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. - * - * 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 length of socket path, i.e., 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. - * - * \memberof wl_display - */ +WL_EXPORT const char * +wl_display_add_socket_auto(struct wl_display *display) +{ + return wl_display_add_socket_fd_auto(display, -1); +} + WL_EXPORT int -wl_display_add_socket(struct wl_display *display, const char *name) +wl_display_add_socket_fd(struct wl_display *display, const char *name, int sock_fd) { struct wl_socket *s; @@ -1247,6 +1235,8 @@ wl_display_add_socket(struct wl_display *display, const char *name) return -1; } + s->fd = sock_fd; + if (_wl_display_add_socket(display, s) < 0) { wl_socket_destroy(s); return -1; @@ -1255,6 +1245,36 @@ wl_display_add_socket(struct wl_display *display, const char *name) return 0; } +/** Add a socket to Wayland display for the clients to connect. + * + * \param display Wayland display to which the socket should be added. + * \param name Name of the Unix socket. + * \return 0 if success. -1 if failed. + * + * 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. + * + * 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 length of socket path, i.e., 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. + * + * \memberof wl_display + */ +WL_EXPORT int +wl_display_add_socket(struct wl_display *display, const char *name) +{ + return wl_display_add_socket_fd(display, name, -1); +} + WL_EXPORT void wl_display_add_destroy_listener(struct wl_display *display, struct wl_listener *listener) -- 1.9.1 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel