summaryrefslogtreecommitdiff
path: root/xf86drm.c
diff options
context:
space:
mode:
authorEmmanuel Vadot <manu@FreeBSD.org>2020-04-28 15:26:13 +0200
committerEmmanuel Vadot <manu@FreeBSD.org>2020-05-04 21:19:58 +0200
commitf52e2b20edda32e06f506bc455fcc44ed9266a36 (patch)
tree4ff2adacc5bcdc0aa6c37031614792f67a6ef8e2 /xf86drm.c
parent5ec177b398d6d305f273329c8228ea870e180d6d (diff)
downloaddrm-f52e2b20edda32e06f506bc455fcc44ed9266a36.tar.gz
libdrm: drmGetMinorNameFromFd: Fix FreeBSD variant
Fix the FreeBSD variant by getting the node type represented by fd to deduce the target minor name. We then return the full /dev/dri/<minorname><id> version. Fix: #41 Fixes: 6818a50b12 Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com> Signed-off-by: Emmanuel Vadot <manu@FreeBSD.org>
Diffstat (limited to 'xf86drm.c')
-rw-r--r--xf86drm.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/xf86drm.c b/xf86drm.c
index 08e5cafb..6fe0296f 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2947,7 +2947,7 @@ static char *drmGetMinorNameForFD(int fd, int type)
char dname[SPECNAMELEN];
const char *mname;
char name[SPECNAMELEN];
- int id, maj, min;
+ int id, maj, min, nodetype, i;
if (fstat(fd, &sbuf))
return NULL;
@@ -2965,14 +2965,25 @@ static char *drmGetMinorNameForFD(int fd, int type)
* FreeBSD on amd64/i386/powerpc external kernel modules create node in
* in /dev/drm/ and links in /dev/dri while a WIP in kernel driver creates
* only device nodes in /dev/dri/ */
+
+ /* Get the node type represented by fd so we can deduce the target name */
+ nodetype = drmGetMinorType(maj, min);
+ if (nodetype == -1)
+ return (NULL);
mname = drmGetMinorName(type);
- if (sscanf(dname, "drm/%d", &id) != 1) {
- snprintf(name, sizeof(name), "dri/%s", mname);
- if (strncmp(name, dname, strlen(name)) != 0)
- return NULL;
- snprintf(name, sizeof(name), "/dev/%s", dname);
- } else
- snprintf(name, sizeof(name), DRM_DIR_NAME "/%s%d", mname, id);
+
+ for (i = 0; i < SPECNAMELEN; i++) {
+ if (isalpha(dname[i]) == 0 && dname[i] != '/')
+ break;
+ }
+ if (dname[i] == '\0')
+ return (NULL);
+
+ id = (int)strtol(&dname[i], NULL, 10);
+ id -= drmGetMinorBase(nodetype);
+ snprintf(name, sizeof(name), DRM_DIR_NAME "/%s%d", mname,
+ id + drmGetMinorBase(type));
+
return strdup(name);
#else
struct stat sbuf;