From 67af3659fac3050b422198700643f5ee13932ebd Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 5 Jun 2023 12:04:39 +0200 Subject: [PATCH] server: add wl_display_remove_socket_fd() Undoes wl_display_add_socket_fd(). Useful for protocols such as: https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/68 Signed-off-by: Simon Ser --- src/wayland-server-core.h | 3 +++ src/wayland-server.c | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/wayland-server-core.h b/src/wayland-server-core.h index cc08de58..757f6a1f 100644 --- a/src/wayland-server-core.h +++ b/src/wayland-server-core.h @@ -205,6 +205,9 @@ wl_display_add_socket_auto(struct wl_display *display); int wl_display_add_socket_fd(struct wl_display *display, int sock_fd); +int +wl_display_remove_socket_fd(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 31b597e4..a0e118e8 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -1358,6 +1358,7 @@ wl_socket_destroy(struct wl_socket *s) if (s->fd_lock >= 0) close(s->fd_lock); + wl_list_remove(&s->link); free(s); } @@ -1372,6 +1373,7 @@ wl_socket_alloc(void) s->fd = -1; s->fd_lock = -1; + wl_list_init(&s->link); return s; } @@ -2040,7 +2042,8 @@ wl_display_add_socket_auto(struct wl_display *display) * with both bind() and listen() already called. * * On success, the socket fd ownership is transferred to libwayland: - * libwayland will close the socket when the display is destroyed. + * libwayland will close the socket when the display is destroyed or when + * wl_display_remove_socket_fd() is called. * * \memberof wl_display */ @@ -2076,6 +2079,37 @@ wl_display_add_socket_fd(struct wl_display *display, int sock_fd) return 0; } +/** Remove a socket fd from the Wayland display. + * + * \param display Wayland display from which the socket should be removed. + * \param sock_fd The socket file descriptor to be removed. + * \return 0 if success. -1 if failed. + * + * Remove a socket fd previously added via wl_display_add_socket_fd(). + * + * \memberof wl_display + * \since 1.25.90 + */ +WL_EXPORT int +wl_display_remove_socket_fd(struct wl_display *display, int sock_fd) +{ + struct wl_socket *s; + bool found; + + found = false; + wl_list_for_each(s, &display->socket_list, link) { + if (s->fd == sock_fd) { + found = true; + break; + } + } + if (!found) + return -1; + + wl_socket_destroy(s); + return 0; +} + /** Add a socket to Wayland display for the clients to connect. * * \param display Wayland display to which the socket should be added.