summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2012-02-18 00:29:25 -0500
committerKristian Høgsberg <krh@bitplanet.net>2012-02-18 00:29:25 -0500
commit8503cd6859c3794809c62e1bd867d4f9321d9921 (patch)
tree4288186e5c1aedf605f59c3a8cc764b0703fad5c
parent5536031bfb7d70b462e65406bcae2a35738a9485 (diff)
Add wl_client_get_credentials() to get unix credentials for client
-rw-r--r--src/wayland-server.c22
-rw-r--r--src/wayland-server.h2
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,