diff --git a/include/permissions.h b/include/permissions.h index 77d46762..c7136974 100644 --- a/include/permissions.h +++ b/include/permissions.h @@ -6,6 +6,7 @@ #include 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 df7c3f50..0c744a63 100644 --- a/src/permissions.c +++ b/src/permissions.c @@ -36,6 +36,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; +} + int permissions_context_create(struct wl_display *display, uint32_t permissions) { @@ -55,23 +73,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) {