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.
main
Eric Anholt 2002-08-08 21:23:46 +00:00
parent 977b420d5d
commit d2f2b42f1d
1 changed files with 11 additions and 1 deletions

View File

@ -229,7 +229,7 @@ static int drmOpenDevice(long dev, int minor)
sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor); sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
drmMsg("drmOpenDevice: node name is %s\n", buf); 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; if (!isroot) return DRM_ERR_NOT_ROOT;
remove(buf); remove(buf);
mknod(buf, S_IFCHR | devmode, dev); 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", drmMsg("drmOpenDevice: open result is %d, (%s)\n",
fd, fd < 0 ? strerror(errno) : "OK"); fd, fd < 0 ? strerror(errno) : "OK");
if (fd >= 0) return fd; 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"); drmMsg("drmOpenDevice: Open failed\n");
remove(buf); remove(buf);
return -errno; return -errno;