summaryrefslogtreecommitdiff
path: root/xf86drm.c
diff options
context:
space:
mode:
authorJonathan Gray <jsg@jsg.id.au>2016-12-17 16:09:51 +1100
committerEmil Velikov <emil.l.velikov@gmail.com>2016-12-24 17:06:49 +0000
commitd5cf3f98314c1b9d87216e00c30c9fef06ff24c3 (patch)
tree16479426affd410a56731ac1b99a61e4eb1809a6 /xf86drm.c
parente3af5368b2c372cfda27bc010b9c98a923d83cd9 (diff)
downloaddrm-d5cf3f98314c1b9d87216e00c30c9fef06ff24c3.tar.gz
xf86drm: adjust device node path for minor base
When constructing a path to a device node the minor number retrieved from fstat needs to have the offset of the node type subtracted from it. Control and render node types have the same major as the primary node but each has their own block of minor types at fixed offsets. v2: remove min < base test as requested by Emil Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com> Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
Diffstat (limited to 'xf86drm.c')
-rw-r--r--xf86drm.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/xf86drm.c b/xf86drm.c
index b5eeeb09..f6850aa2 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2838,7 +2838,7 @@ out_close_dir:
char buf[PATH_MAX + 1];
const char *dev_name;
unsigned int maj, min;
- int n;
+ int n, base;
if (fstat(fd, &sbuf))
return NULL;
@@ -2863,7 +2863,11 @@ out_close_dir:
return NULL;
};
- n = snprintf(buf, sizeof(buf), dev_name, DRM_DIR_NAME, min);
+ base = drmGetMinorBase(type);
+ if (base < 0)
+ return NULL;
+
+ n = snprintf(buf, sizeof(buf), dev_name, DRM_DIR_NAME, min - base);
if (n == -1 || n >= sizeof(buf))
return NULL;
@@ -3262,7 +3266,7 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
char node[PATH_MAX + 1];
const char *dev_name;
int node_type, subsystem_type;
- int maj, min, n, ret;
+ int maj, min, n, ret, base;
if (fd == -1 || device == NULL)
return -EINVAL;
@@ -3294,7 +3298,11 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
return -EINVAL;
};
- n = snprintf(node, PATH_MAX, dev_name, DRM_DIR_NAME, min);
+ base = drmGetMinorBase(node_type);
+ if (base < 0)
+ return -EINVAL;
+
+ n = snprintf(node, PATH_MAX, dev_name, DRM_DIR_NAME, min - base);
if (n == -1 || n >= PATH_MAX)
return -errno;
if (stat(node, &sbuf))