summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2011-04-11 09:14:43 -0400
committerKristian Høgsberg <krh@bitplanet.net>2011-04-11 09:14:43 -0400
commit4d33e802e0eaff8a4580371b6e2d30832c3c6bbd (patch)
treea943579dd6a16761e78e51082bf9c9be2974e384
parent0b29a2fec7801d2530bd004ae68eb9242417bafd (diff)
Support passing the Wayland fd in the environment
-rw-r--r--wayland/wayland-client.c55
1 files changed, 38 insertions, 17 deletions
diff --git a/wayland/wayland-client.c b/wayland/wayland-client.c
index 1e9f915..c7db026 100644
--- a/wayland/wayland-client.c
+++ b/wayland/wayland-client.c
@@ -320,30 +320,17 @@ static const struct wl_display_listener display_listener = {
display_handle_key
};
-WL_EXPORT struct wl_display *
-wl_display_connect(const char *name)
+static int
+connect_to_socket(struct wl_display *display, const char *name)
{
- struct wl_display *display;
struct sockaddr_un addr;
socklen_t size;
const char *runtime_dir;
- const char *debug;
size_t name_size;
- debug = getenv("WAYLAND_DEBUG");
- if (debug)
- wl_debug = 1;
-
- display = malloc(sizeof *display);
- if (display == NULL)
- return NULL;
-
- memset(display, 0, sizeof *display);
display->fd = socket(PF_LOCAL, SOCK_STREAM, 0);
- if (display->fd < 0) {
- free(display);
- return NULL;
- }
+ if (display->fd < 0)
+ return -1;
runtime_dir = getenv("XDG_RUNTIME_DIR");
if (runtime_dir == NULL) {
@@ -368,6 +355,40 @@ wl_display_connect(const char *name)
if (connect(display->fd, (struct sockaddr *) &addr, size) < 0) {
close(display->fd);
+ return -1;
+ }
+
+ return 0;
+}
+
+WL_EXPORT struct wl_display *
+wl_display_connect(const char *name)
+{
+ struct wl_display *display;
+ const char *debug;
+ char *connection, *end;
+ int flags;
+
+ debug = getenv("WAYLAND_DEBUG");
+ if (debug)
+ wl_debug = 1;
+
+ display = malloc(sizeof *display);
+ if (display == NULL)
+ return NULL;
+
+ memset(display, 0, sizeof *display);
+ connection = getenv("WAYLAND_SOCKET");
+ if (connection) {
+ display->fd = strtol(connection, &end, 0);
+ if (*end != '\0') {
+ free(display);
+ return NULL;
+ }
+ flags = fcntl(display->fd, F_GETFD);
+ if (flags != -1)
+ fcntl(display->fd, F_SETFD, flags | FD_CLOEXEC);
+ } else if (connect_to_socket(display, name) < 0) {
free(display);
return NULL;
}