summaryrefslogtreecommitdiff
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
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.
-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;