summaryrefslogtreecommitdiff
path: root/src/wayland/weston-launch.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wayland/weston-launch.c')
-rw-r--r--src/wayland/weston-launch.c84
1 files changed, 16 insertions, 68 deletions
diff --git a/src/wayland/weston-launch.c b/src/wayland/weston-launch.c
index 240cfef16..ae713ed23 100644
--- a/src/wayland/weston-launch.c
+++ b/src/wayland/weston-launch.c
@@ -166,69 +166,6 @@ setenv_fd(const char *env, int fd)
}
static int
-handle_setdrmfd(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
-{
- struct weston_launcher_reply reply;
- struct cmsghdr *cmsg;
- union cmsg_data *data;
- struct stat s;
-
- reply.header.opcode = WESTON_LAUNCHER_DRM_SET_FD;
- reply.ret = -1;
-
- if (wl->drm_fd != -1) {
- error(0, 0, "DRM FD already set");
- reply.ret = -EINVAL;
- goto out;
- }
-
- cmsg = CMSG_FIRSTHDR(msg);
- if (!cmsg ||
- cmsg->cmsg_level != SOL_SOCKET ||
- cmsg->cmsg_type != SCM_RIGHTS) {
- error(0, 0, "invalid control message");
- reply.ret = -EINVAL;
- goto out;
- }
-
- data = (union cmsg_data *) CMSG_DATA(cmsg);
- if (data->fd < 0) {
- error(0, 0, "missing drm fd in socket request");
- reply.ret = -EINVAL;
- goto out;
- }
-
- if (fstat(data->fd, &s) < 0) {
- reply.ret = -errno;
- goto out;
- }
-
- if (major(s.st_rdev) != DRM_MAJOR) {
- fprintf(stderr, "FD is not for DRM\n");
- reply.ret = -EPERM;
- goto out;
- }
-
- wl->drm_fd = data->fd;
- reply.ret = drmSetMaster(data->fd);
- if (reply.ret < 0)
- reply.ret = -errno;
-
- if (wl->verbose)
- fprintf(stderr, "mutter-launch: set drm FD, ret: %d, fd: %d\n",
- reply.ret, data->fd);
-
-out:
- do {
- len = send(wl->sock[0], &reply, sizeof reply, 0);
- } while (len < 0 && errno == EINTR);
- if (len < 0)
- return -1;
-
- return 0;
-}
-
-static int
handle_confirm_vt_switch(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
{
struct weston_launcher_reply reply;
@@ -323,6 +260,7 @@ handle_open(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
struct iovec iov;
struct weston_launcher_open *message;
union cmsg_data *data;
+ int dev_major;
reply.header.opcode = WESTON_LAUNCHER_OPEN;
reply.ret = -1;
@@ -339,13 +277,22 @@ handle_open(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
goto err0;
}
- if (major(s.st_rdev) != INPUT_MAJOR) {
- fprintf(stderr, "Device %s is not an input device\n",
+ dev_major = major(s.st_rdev);
+
+ if (dev_major != INPUT_MAJOR ||
+ dev_major != DRM_MAJOR) {
+ fprintf(stderr, "Device %s is not an input or DRM device\n",
message->path);
reply.ret = -EPERM;
goto err0;
}
+ if (dev_major == DRM_MAJOR && wl->drm_fd != -1) {
+ fprintf(stderr, "Already have a DRM device open\n");
+ reply.ret = -EPERM;
+ goto err0;
+ }
+
fd = open(message->path, message->flags);
if (fd < 0) {
fprintf(stderr, "Error opening device %s: %m\n",
@@ -354,6 +301,10 @@ handle_open(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
goto err0;
}
+ if (dev_major == DRM_MAJOR) {
+ wl->drm_fd = fd;
+ }
+
err0:
memset(&nmsg, 0, sizeof nmsg);
nmsg.msg_iov = &iov;
@@ -419,9 +370,6 @@ handle_socket_msg(struct weston_launch *wl)
case WESTON_LAUNCHER_OPEN:
ret = handle_open(wl, &msg, len);
break;
- case WESTON_LAUNCHER_DRM_SET_FD:
- ret = handle_setdrmfd(wl, &msg, len);
- break;
case WESTON_LAUNCHER_CONFIRM_VT_SWITCH:
ret = handle_confirm_vt_switch(wl, &msg, len);
break;