diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 6c791aba..9ebb61ce 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -1215,7 +1215,7 @@ init_drm(struct drm_compositor *ec, struct udev_device *device) } filename = udev_device_get_devnode(device); - fd = weston_launcher_open(&ec->base, filename, O_RDWR); + fd = weston_launcher_open(ec->base.launcher, filename, O_RDWR); if (fd < 0) { /* Probably permissions error */ weston_log("couldn't open %s, skipping\n", @@ -2241,7 +2241,7 @@ drm_restore(struct weston_compositor *ec) { struct drm_compositor *d = (struct drm_compositor *) ec; - if (weston_launcher_drm_set_master(&d->base, d->drm.fd, 0) < 0) + if (weston_launcher_drm_set_master(d->base.launcher, d->drm.fd, 0) < 0) weston_log("failed to drop master: %m\n"); tty_reset(d->tty); } @@ -2265,7 +2265,7 @@ drm_destroy(struct weston_compositor *ec) if (d->gbm) gbm_device_destroy(d->gbm); - if (weston_launcher_drm_set_master(&d->base, d->drm.fd, 0) < 0) + if (weston_launcher_drm_set_master(d->base.launcher, d->drm.fd, 0) < 0) weston_log("failed to drop master: %m\n"); tty_destroy(d->tty); @@ -2317,7 +2317,8 @@ vt_func(struct weston_compositor *compositor, int event) case TTY_ENTER_VT: weston_log("entering VT\n"); compositor->focus = 1; - if (weston_launcher_drm_set_master(&ec->base, ec->drm.fd, 1)) { + if (weston_launcher_drm_set_master(ec->base.launcher, + ec->drm.fd, 1)) { weston_log("failed to set master: %m\n"); wl_display_terminate(compositor->wl_display); } @@ -2356,7 +2357,8 @@ vt_func(struct weston_compositor *compositor, int event) output->crtc_id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - if (weston_launcher_drm_set_master(&ec->base, ec->drm.fd, 0) < 0) + if (weston_launcher_drm_set_master(ec->base.launcher, + ec->drm.fd, 0) < 0) weston_log("failed to drop master: %m\n"); break; @@ -2571,9 +2573,8 @@ drm_compositor_create(struct wl_display *display, } /* Check if we run drm-backend using weston-launch */ - ec->base.launcher_sock = - weston_environment_get_fd("WESTON_LAUNCHER_SOCK"); - if (ec->base.launcher_sock == -1 && geteuid() != 0) { + ec->base.launcher = weston_launcher_connect(&ec->base); + if (ec->base.launcher == NULL && geteuid() != 0) { weston_log("fatal: drm backend should be run " "using weston-launch binary or as root\n"); goto err_compositor; @@ -2691,7 +2692,8 @@ err_sprite: err_udev_dev: udev_device_unref(drm_device); err_tty: - if (weston_launcher_drm_set_master(&ec->base, ec->drm.fd, 0) < 0) + if (weston_launcher_drm_set_master(ec->base.launcher, + ec->drm.fd, 0) < 0) weston_log("failed to drop master: %m\n"); tty_destroy(ec->tty); err_udev: diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c index 6f5e62e3..495c3a3b 100644 --- a/src/compositor-fbdev.c +++ b/src/compositor-fbdev.c @@ -887,9 +887,8 @@ fbdev_compositor_create(struct wl_display *display, int *argc, char *argv[], goto out_free; /* Check if we run fbdev-backend using weston-launch */ - compositor->base.launcher_sock = - weston_environment_get_fd("WESTON_LAUNCHER_SOCK"); - if (compositor->base.launcher_sock == -1 && geteuid() != 0) { + compositor->base.launcher = weston_launcher_connect(&compositor->base); + if (compositor->base.launcher == NULL && geteuid() != 0) { weston_log("fatal: fbdev backend should be run " "using weston-launch binary or as root\n"); goto out_compositor; diff --git a/src/compositor.h b/src/compositor.h index a523c834..0feca411 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -590,7 +590,7 @@ struct weston_compositor { void (*ping_handler)(struct weston_surface *surface, uint32_t serial); - int launcher_sock; + struct weston_launcher *launcher; uint32_t output_id_pool; diff --git a/src/launcher-util.c b/src/launcher-util.c index 6f6ee116..8c3b496f 100644 --- a/src/launcher-util.c +++ b/src/launcher-util.c @@ -1,5 +1,6 @@ /* * Copyright © 2012 Benjamin Franzke + * Copyright © 2013 Intel Corporation * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided @@ -32,6 +33,7 @@ #include #include #include +#include #include @@ -41,11 +43,15 @@ union cmsg_data { unsigned char b[4]; int fd; }; +struct weston_launcher { + struct weston_compositor *compositor; + int fd; +}; + int -weston_launcher_open(struct weston_compositor *compositor, +weston_launcher_open(struct weston_launcher *launcher, const char *path, int flags) { - int sock = compositor->launcher_sock; int n, ret = -1; struct msghdr msg; struct cmsghdr *cmsg; @@ -55,7 +61,7 @@ weston_launcher_open(struct weston_compositor *compositor, ssize_t len; struct weston_launcher_open *message; - if (sock == -1) + if (launcher == NULL) return open(path, flags | O_CLOEXEC); n = sizeof(*message) + strlen(path) + 1; @@ -68,7 +74,7 @@ weston_launcher_open(struct weston_compositor *compositor, strcpy(message->path, path); do { - len = send(sock, message, n, 0); + len = send(launcher->fd, message, n, 0); } while (len < 0 && errno == EINTR); free(message); @@ -81,7 +87,7 @@ weston_launcher_open(struct weston_compositor *compositor, msg.msg_controllen = sizeof control; do { - len = recvmsg(sock, &msg, MSG_CMSG_CLOEXEC); + len = recvmsg(launcher->fd, &msg, MSG_CMSG_CLOEXEC); } while (len < 0 && errno == EINTR); if (len != sizeof ret || @@ -106,7 +112,7 @@ weston_launcher_open(struct weston_compositor *compositor, } int -weston_launcher_drm_set_master(struct weston_compositor *compositor, +weston_launcher_drm_set_master(struct weston_launcher *launcher, int drm_fd, char master) { struct msghdr msg; @@ -118,7 +124,7 @@ weston_launcher_drm_set_master(struct weston_compositor *compositor, struct weston_launcher_set_master message; union cmsg_data *data; - if (compositor->launcher_sock == -1) { + if (launcher == NULL) { if (master) return drmSetMaster(drm_fd); else @@ -146,13 +152,13 @@ weston_launcher_drm_set_master(struct weston_compositor *compositor, message.set_master = master; do { - len = sendmsg(compositor->launcher_sock, &msg, 0); + len = sendmsg(launcher->fd, &msg, 0); } while (len < 0 && errno == EINTR); if (len < 0) return -1; do { - len = recv(compositor->launcher_sock, &ret, sizeof ret, 0); + len = recv(launcher->fd, &ret, sizeof ret, 0); } while (len < 0 && errno == EINTR); if (len < 0) return -1; @@ -160,3 +166,29 @@ weston_launcher_drm_set_master(struct weston_compositor *compositor, return ret; } +struct weston_launcher * +weston_launcher_connect(struct weston_compositor *compositor) +{ + struct weston_launcher *launcher; + int fd; + + fd = weston_environment_get_fd("WESTON_LAUNCHER_SOCK"); + if (fd == -1) + return NULL; + + launcher = malloc(sizeof *launcher); + if (launcher == NULL) + return NULL; + + launcher->compositor = compositor; + launcher->fd = fd; + + return launcher; +} + +void +weston_launcher_destroy(struct weston_launcher *launcher) +{ + close(launcher->fd); + free(launcher); +} diff --git a/src/launcher-util.h b/src/launcher-util.h index c79b47c9..a3a70411 100644 --- a/src/launcher-util.h +++ b/src/launcher-util.h @@ -27,11 +27,19 @@ #include "compositor.h" +struct weston_launcher; + +struct weston_launcher * +weston_launcher_connect(struct weston_compositor *compositor); + +void +weston_launcher_destroy(struct weston_launcher *launcher); + int -weston_launcher_open(struct weston_compositor *compositor, +weston_launcher_open(struct weston_launcher *launcher, const char *path, int flags); int -weston_launcher_drm_set_master(struct weston_compositor *compositor, +weston_launcher_drm_set_master(struct weston_launcher *launcher, int drm_fd, char master); #endif diff --git a/src/udev-seat.c b/src/udev-seat.c index 4c051c9b..4ef7ff33 100644 --- a/src/udev-seat.c +++ b/src/udev-seat.c @@ -75,7 +75,7 @@ device_added(struct udev_device *udev_device, struct udev_input *input) /* Use non-blocking mode so that we can loop on read on * evdev_device_data() until all events on the fd are * read. mtdev_get() also expects this. */ - fd = weston_launcher_open(c, devnode, O_RDWR | O_NONBLOCK); + fd = weston_launcher_open(c->launcher, devnode, O_RDWR | O_NONBLOCK); if (fd < 0) { weston_log("opening input device '%s' failed.\n", devnode); return 0;