diff options
author | Simon Zeni <simon@bl4ckb0ne.ca> | 2021-05-25 19:23:10 -0400 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-09-08 11:09:07 +0200 |
commit | 94ed8f9496b11cb084a1d4f83e13fc910f52033f (patch) | |
tree | bceca0df1a97f1c1e761c60bd21e7ddc487f46c0 /backend | |
parent | e5a949a9550ad2d6c5aca3c8d0997dbfdca086d5 (diff) |
backend/drm: introduce wlr_drm_backend_get_non_master_fd
Diffstat (limited to 'backend')
-rw-r--r-- | backend/drm/drm.c | 26 |
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 |