diff options
author | Eric Anholt <anholt@freebsd.org> | 2002-08-08 21:23:46 +0000 |
---|---|---|
committer | Eric Anholt <anholt@freebsd.org> | 2002-08-08 21:23:46 +0000 |
commit | d2f2b42f1d206fd248ada48ce2c498e31351ab33 (patch) | |
tree | 318d984dcd9a1530e15dcccbbb39753c5fc635ca /libdrm | |
parent | 977b420d5dc66db3d4335132861a1eff3747b49a (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.c | 12 |
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; |