---
 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

Reply via email to