From 178803b34e78ad31b7e66cf4dc1460b728f2a99c Mon Sep 17 00:00:00 2001 From: Tobias Bengfort Date: Sat, 28 Feb 2026 11:58:30 +0100 Subject: [PATCH] implement permissions_context_clone() --- include/permissions.h | 1 + src/permissions.c | 39 ++++++++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/include/permissions.h b/include/permissions.h index afd97c8c..9aa7c642 100644 --- a/include/permissions.h +++ b/include/permissions.h @@ -7,6 +7,7 @@ uint32_t permissions_from_interface_name(const char *s); int permissions_context_create(struct wl_display *display, uint32_t permissions); +bool permissions_context_clone(struct wl_client *client, int fd); bool permissions_check(const struct wl_client *client, const struct wl_interface *iface); #endif diff --git a/src/permissions.c b/src/permissions.c index a0f9b00a..f09964f4 100644 --- a/src/permissions.c +++ b/src/permissions.c @@ -54,6 +54,24 @@ permissions_get(const struct wl_client *client) return context->permissions; } +static bool +context_create(struct wl_display *display, uint32_t permissions, int fd) +{ + struct wl_client *client = wl_client_create(display, fd); + if (!client) { + wlr_log(WLR_ERROR, "failed to create client"); + return false; + } + + struct permissions_context *context = znew(*context); + context->permissions = permissions; + context->fd = fd; + context->destroy.notify = permissions_context_handle_destroy; + wl_client_add_destroy_listener(client, &context->destroy); + + return true; +} + uint32_t permissions_from_interface_name(const char *name) { @@ -113,23 +131,26 @@ permissions_context_create(struct wl_display *display, uint32_t permissions) return -1; } - struct wl_client *client = wl_client_create(display, sv[0]); - if (!client) { - wlr_log(WLR_ERROR, "failed to create client"); + if (!context_create(display, permissions, sv[0])) { close(sv[0]); close(sv[1]); return -1; } - struct permissions_context *context = znew(*context); - context->permissions = permissions; - context->fd = sv[0]; - context->destroy.notify = permissions_context_handle_destroy; - wl_client_add_destroy_listener(client, &context->destroy); - return sv[1]; } +bool +permissions_context_clone(struct wl_client *client, int fd) +{ + struct wl_display *display = wl_client_get_display(client); + uint32_t permissions = permissions_get(client); + if (permissions == 0) { + return false; + } + return context_create(display, permissions, fd); +} + bool permissions_check(const struct wl_client *client, const struct wl_interface *iface) {