aboutsummaryrefslogtreecommitdiff
path: root/backend/drm
diff options
context:
space:
mode:
authorSimon Zeni <simon@bl4ckb0ne.ca>2021-05-25 19:23:10 -0400
committerSimon Ser <contact@emersion.fr>2021-09-08 11:09:07 +0200
commit94ed8f9496b11cb084a1d4f83e13fc910f52033f (patch)
treebceca0df1a97f1c1e761c60bd21e7ddc487f46c0 /backend/drm
parente5a949a9550ad2d6c5aca3c8d0997dbfdca086d5 (diff)
backend/drm: introduce wlr_drm_backend_get_non_master_fd
Diffstat (limited to 'backend/drm')
-rw-r--r--backend/drm/drm.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index e9842bb3..0e981d59 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -3,6 +3,7 @@
#include <drm_fourcc.h>
#include <drm_mode.h>
#include <errno.h>
+#include <fcntl.h>
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
@@ -1479,6 +1480,31 @@ void destroy_drm_connector(struct wlr_drm_connector *conn) {
free(conn);
}
+int wlr_drm_backend_get_non_master_fd(struct wlr_backend *backend) {
+ assert(backend);
+
+ struct wlr_drm_backend *drm = get_drm_backend_from_backend(backend);
+ char *path = drmGetDeviceNameFromFd2(drm->fd);
+ if (!path) {
+ wlr_log(WLR_ERROR, "Failed to get device name from DRM fd");
+ return -1;
+ }
+
+ int fd = open(path, O_RDWR | O_CLOEXEC);
+ if (fd < 0) {
+ wlr_log_errno(WLR_ERROR, "Unable to clone DRM fd for client fd");
+ free(path);
+ return -1;
+ }
+
+ if (drmIsMaster(fd) && drmDropMaster(fd) < 0) {
+ wlr_log_errno(WLR_ERROR, "Failed to drop master");
+ return -1;
+ }
+
+ return fd;
+}
+
/* TODO: make the function return a `wlr_drm_lease` to provide a destroy event
* that can be fired when the kernel notifies us through uevent that the lease
* has been destroyed