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@xxxxxxxxxxxxx> --- 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 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel