diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2012-02-18 00:29:25 -0500 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-02-18 00:29:25 -0500 |
commit | 8503cd6859c3794809c62e1bd867d4f9321d9921 (patch) | |
tree | 4288186e5c1aedf605f59c3a8cc764b0703fad5c | |
parent | 5536031bfb7d70b462e65406bcae2a35738a9485 (diff) |
Add wl_client_get_credentials() to get unix credentials for client
-rw-r--r-- | src/wayland-server.c | 22 | ||||
-rw-r--r-- | src/wayland-server.h | 2 |
2 files changed, 24 insertions, 0 deletions
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, |