[PATCH libdrm] xf86drm: Add drmIsMaster()
Christopher James Halse Rogers
christopher.halse.rogers at canonical.com
Tue Nov 20 03:36:52 UTC 2018
We can't use drmSetMaster to query whether or not a drm fd is master
because it requires CAP_SYS_ADMIN, even if the fd *is* a master fd.
Pick DRM_IOCTL_MODE_ATTACHMODE as a long-deprecated ioctl that is
DRM_MASTER but not DRM_ROOT_ONLY as the probe by which we can detect
whether or not the fd is master.
Signed-off-by: Christopher James Halse Rogers <christopher.halse.rogers at canonical.com>
---
xf86drm.c | 20 ++++++++++++++++++++
xf86drm.h | 2 ++
2 files changed, 22 insertions(+)
diff --git a/xf86drm.c b/xf86drm.c
index 10df682b..bdb0439d 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2741,6 +2741,26 @@ drm_public int drmDropMaster(int fd)
return drmIoctl(fd, DRM_IOCTL_DROP_MASTER, NULL);
}
+drm_public bool drmIsMaster(int fd)
+{
+ struct drm_mode_mode_cmd cmd;
+
+ memclear(cmd);
+ /* Set an invalid connector_id to ensure that ATTACHMODE errors with
+ * EINVAL in the unlikely event someone feels like calling this on a
+ * kernel prior to 3.9. */
+ cmd.connector_id = -1;
+
+ if (drmIoctl(fd, DRM_IOCTL_MODE_ATTACHMODE, &cmd) != -1)
+ {
+ /* On 3.9 ATTACHMODE was changed to drm_noop, and so will succeed
+ * iff we've got a master fd */
+ return true;
+ }
+
+ return errno == EINVAL;
+}
+
drm_public char *drmGetDeviceNameFromFd(int fd)
{
char name[128];
diff --git a/xf86drm.h b/xf86drm.h
index 7773d71a..9e920db9 100644
--- a/xf86drm.h
+++ b/xf86drm.h
@@ -37,6 +37,7 @@
#include <stdarg.h>
#include <sys/types.h>
#include <stdint.h>
+#include <stdbool.h>
#include <drm.h>
#if defined(__cplusplus)
@@ -733,6 +734,7 @@ extern void drmMsg(const char *format, ...) DRM_PRINTFLIKE(1, 2);
extern int drmSetMaster(int fd);
extern int drmDropMaster(int fd);
+extern bool drmIsMaster(int fd);
#define DRM_EVENT_CONTEXT_VERSION 4
--
2.19.1
More information about the dri-devel
mailing list