From d2f2b42f1d206fd248ada48ce2c498e31351ab33 Mon Sep 17 00:00:00 2001
From: Eric Anholt <anholt@freebsd.org>
Date: Thu, 8 Aug 2002 21:23:46 +0000
Subject: 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.

---
 libdrm/xf86drm.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

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;
-- 
cgit v1.2.3