summaryrefslogtreecommitdiff
path: root/libdrm
diff options
context:
space:
mode:
authorEric Anholt <anholt@freebsd.org>2002-08-08 21:23:46 +0000
committerEric Anholt <anholt@freebsd.org>2002-08-08 21:23:46 +0000
commitd2f2b42f1d206fd248ada48ce2c498e31351ab33 (patch)
tree318d984dcd9a1530e15dcccbbb39753c5fc635ca /libdrm
parent977b420d5dc66db3d4335132861a1eff3747b49a (diff)
Try to open the /dev/dri/cardX device once, then only if it fails check the
device number and recreate it if necessary. Fixes xf86drm.c to allow linux binaries to be used for emulation on FreeBSD.
Diffstat (limited to 'libdrm')
-rw-r--r--libdrm/xf86drm.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index b5375ee5..d2ce5e1e 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -229,7 +229,7 @@ static int drmOpenDevice(long dev, int minor)
sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
drmMsg("drmOpenDevice: node name is %s\n", buf);
- if (stat(buf, &st) || st.st_rdev != dev) {
+ if (stat(buf, &st)) {
if (!isroot) return DRM_ERR_NOT_ROOT;
remove(buf);
mknod(buf, S_IFCHR | devmode, dev);
@@ -243,6 +243,16 @@ static int drmOpenDevice(long dev, int minor)
drmMsg("drmOpenDevice: open result is %d, (%s)\n",
fd, fd < 0 ? strerror(errno) : "OK");
if (fd >= 0) return fd;
+
+ if (st.st_rdev != dev) {
+ if (!isroot) return DRM_ERR_NOT_ROOT;
+ remove(buf);
+ mknod(buf, S_IFCHR | devmode, dev);
+ }
+ fd = open(buf, O_RDWR, 0);
+ drmMsg("drmOpenDevice: open result is %d, (%s)\n",
+ fd, fd < 0 ? strerror(errno) : "OK");
+
drmMsg("drmOpenDevice: Open failed\n");
remove(buf);
return -errno;