launcher: Set make sure we're drm master when opening the drm device
In case we try to run on a tty where some other process is already
drm master, back off and exit with an error message.
diff --git a/src/launcher-util.c b/src/launcher-util.c
index 237f8c5..88eb06a 100644
--- a/src/launcher-util.c
+++ b/src/launcher-util.c
@@ -65,6 +65,26 @@
struct wl_event_source *vt_source;
};
+#ifdef BUILD_DRM_COMPOSITOR
+static int
+drm_drop_master(int drm_fd)
+{
+ if (drm_fd != -1)
+ return drmDropMaster(drm_fd);
+ return -EBADF;
+}
+static int
+drm_set_master(int drm_fd)
+{
+ if (drm_fd != -1)
+ return drmSetMaster(drm_fd);
+ return -EBADF;
+}
+#else
+static int drm_drop_master(int drm_fd) {return 0;}
+static int drm_set_master(int drm_fd) {return 0;}
+#endif
+
int
weston_launcher_open(struct weston_launcher *launcher,
const char *path, int flags)
@@ -81,7 +101,6 @@
if (launcher->fd == -1) {
fd = open(path, flags | O_CLOEXEC);
-
if (fd == -1)
return -1;
@@ -90,8 +109,14 @@
return -1;
}
- if (major(s.st_rdev) == DRM_MAJOR)
+ if (major(s.st_rdev) == DRM_MAJOR) {
launcher->drm_fd = fd;
+ if (drm_set_master(fd) == -1) {
+ weston_log("could not set master on drm fd\n");
+ close(fd);
+ return -1;
+ }
+ }
return fd;
}
@@ -198,26 +223,6 @@
return 1;
}
-#ifdef BUILD_DRM_COMPOSITOR
-static int
-drm_drop_master(int drm_fd)
-{
- if (drm_fd != -1)
- return drmDropMaster(drm_fd);
- return -EBADF;
-}
-static int
-drm_set_master(int drm_fd)
-{
- if (drm_fd != -1)
- return drmSetMaster(drm_fd);
- return -EBADF;
-}
-#else
-static int drm_drop_master(int drm_fd) {return 0;}
-static int drm_set_master(int drm_fd) {return 0;}
-#endif
-
static int
vt_handler(int signal_number, void *data)
{