--- 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 Dri-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/dri-devel