---
libdrm/xf86drm.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 46 insertions(+), 3 deletions(-)
diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index 7b05386..bf80fd4 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -269,6 +269,49 @@ static int drmMatchBusID(const char *id1, const char *id2)
return 0;
}
+static int chownCheckReturn(const char *path, uid_t owner, gid_t group)
+{
+ int rv;
+ do {
+ rv = chown(path, owner, group);
+ } while( rv != 0 && errno == EINTR);
+ if (rv == 0)
+ return 0;
+ char *errMsg = "";
+ switch(errno)
+ {
+ case EACCES:
+ errMsg = "Read permission denied.";
+ break;
+ case ELOOP:
+ errMsg = "Recursive symbolic link.";
+ break;
+ case ENAMETOOLONG:
+ errMsg = "Too long path.";
+ break;
+ case ENOTDIR:
+ errMsg = "Path isn't in a directory.";
+ break;
+ case ENOENT:
+ errMsg = "No file found.";
+ break;
+ case EPERM:
+ errMsg = "No permission to change the permission.";
+ break;
+ case EROFS:
+ errMsg = "Read-only file system.";
+ break;
+ case EIO:
+ errMsg = "I/O error.";
+ break;
+ case EINVAL:
+ errMsg = "The owner or group id is invalid.";
+ break;
+ }
+ drmMsg("Failed to change ower or group for file %s! %d: %s\n",path,
errno, errMsg);
+ return -1;
+}
+
/**
* Open the DRM device, creating it if necessary.
*
@@ -307,7 +350,7 @@ static int drmOpenDevice(long dev, int minor, int type)
if (!isroot)
return DRM_ERR_NOT_ROOT;
mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE);
- chown(DRM_DIR_NAME, 0, 0); /* root:root */
+ chownCheckReturn(DRM_DIR_NAME, 0, 0); /* root:root */
chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE);
}
@@ -320,7 +363,7 @@ static int drmOpenDevice(long dev, int minor, int type)
}
if (drm_server_info) {
- chown(buf, user, group);
+ chownCheckReturn(buf, user, group);
chmod(buf, devmode);
}
#else
@@ -363,7 +406,7 @@ wait_for_udev:
remove(buf);
mknod(buf, S_IFCHR | devmode, dev);
if (drm_server_info) {
- chown(buf, user, group);
+ chownCheckReturn(buf, user, group);
chmod(buf, devmode);
}
}
--
1.6.3.1
------------------------------------------------------------------------------
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel