From 8503cd6859c3794809c62e1bd867d4f9321d9921 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Sat, 18 Feb 2012 00:29:25 -0500 Subject: [PATCH] Add wl_client_get_credentials() to get unix credentials for client --- src/wayland-server.c | 22 ++++++++++++++++++++++ src/wayland-server.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/src/wayland-server.c b/src/wayland-server.c index 8239291..fd14c7d 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -63,6 +63,7 @@ struct wl_client { uint32_t mask; struct wl_list link; struct wl_map objects; + struct ucred ucred; int error; }; @@ -286,6 +287,7 @@ WL_EXPORT struct wl_client * wl_client_create(struct wl_display *display, int fd) { struct wl_client *client; + socklen_t len; client = malloc(sizeof *client); if (client == NULL) @@ -296,6 +298,14 @@ wl_client_create(struct wl_display *display, int fd) client->source = wl_event_loop_add_fd(display->loop, fd, WL_EVENT_READABLE, wl_client_connection_data, client); + + len = sizeof client->ucred; + if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, + &client->ucred, &len) < 0) { + free(client); + return NULL; + } + client->connection = wl_connection_create(fd, wl_client_connection_update, client); if (client->connection == NULL) { @@ -319,6 +329,18 @@ wl_client_create(struct wl_display *display, int fd) } WL_EXPORT void +wl_client_get_credentials(struct wl_client *client, + pid_t *pid, uid_t *uid, gid_t *gid) +{ + if (pid) + *pid = client->ucred.pid; + if (uid) + *uid = client->ucred.uid; + if (gid) + *gid = client->ucred.gid; +} + +WL_EXPORT void wl_client_add_resource(struct wl_client *client, struct wl_resource *resource) { diff --git a/src/wayland-server.h b/src/wayland-server.h index 616df3b..67706b5 100644 --- a/src/wayland-server.h +++ b/src/wayland-server.h @@ -99,6 +99,8 @@ void wl_display_remove_global(struct wl_display *display, struct wl_client *wl_client_create(struct wl_display *display, int fd); void wl_client_destroy(struct wl_client *client); void wl_client_flush(struct wl_client *client); +void wl_client_get_credentials(struct wl_client *client, + pid_t *pid, uid_t *uid, gid_t *gid); struct wl_resource * wl_client_add_object(struct wl_client *client, -- 2.7.4