diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c index 3465857fe..07c7f6daf 100644 --- a/src/backends/native/meta-kms-impl-device.c +++ b/src/backends/native/meta-kms-impl-device.c @@ -20,6 +20,7 @@ #include "backends/native/meta-kms-impl-device.h" #include +#include #include #include #include @@ -1193,6 +1194,52 @@ meta_kms_impl_device_get_fd (MetaKmsImplDevice *impl_device) return meta_device_file_get_fd (priv->device_file); } +/** + * meta_kms_impl_device_open_non_privileged_fd: + * @impl_device: a #MetaKmsImplDevice object + * + * Returns a non-master file descriptor for the given impl_device. The caller is + * responsable of closing the file descriptor. + * + * On error, returns a negative value. + */ +int +meta_kms_impl_device_open_non_privileged_fd (MetaKmsImplDevice *impl_device) +{ + int fd; + const char *path; + MetaKmsImplDevicePrivate *priv = + meta_kms_impl_device_get_instance_private (impl_device); + + if (!priv->device_file) + return -1; + + path = meta_device_file_get_path (priv->device_file); + + fd = open (path, O_RDWR | O_CLOEXEC); + if (fd < 0) + { + meta_topic (META_DEBUG_KMS, + "Error getting non-master fd for device at '%s': %s", + path, + g_strerror (errno)); + return -1; + } + + if (drmIsMaster (fd)) + { + if (drmDropMaster (fd) < 0) + { + meta_topic (META_DEBUG_KMS, + "Error dropping master for device at '%s'", + path); + return -1; + } + } + + return fd; +} + /** * meta_kms_impl_device_get_signaled_sync_file: * @impl_device: a #MetaKmsImplDevice object diff --git a/src/backends/native/meta-kms-impl-device.h b/src/backends/native/meta-kms-impl-device.h index dd6a224ed..0bbbefa75 100644 --- a/src/backends/native/meta-kms-impl-device.h +++ b/src/backends/native/meta-kms-impl-device.h @@ -165,6 +165,8 @@ void meta_kms_impl_device_hold_fd (MetaKmsImplDevice *impl_device); void meta_kms_impl_device_unhold_fd (MetaKmsImplDevice *impl_device); +int meta_kms_impl_device_open_non_privileged_fd (MetaKmsImplDevice *impl_device); + int meta_kms_impl_device_get_signaled_sync_file (MetaKmsImplDevice *impl_device); MetaKmsResourceChanges meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device,