Attached improved patch.

On Sat, Jul 4, 2009 at 11:14 AM, Pekka Paalanen<[email protected]> wrote:
> On Sat,  4 Jul 2009 02:18:53 +0300
> Pauli Nieminen <[email protected]> wrote:
>
>> ---
>>  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;
>> +}
>> +
>
> Is there a reason for not using strerror() here?
>
No good one. Only reason was that I have never used it before.
>
>>  /**
>>   * 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
>
>
> --
> Pekka Paalanen
> http://www.iki.fi/pq/
>
From cdf9faaab782f2a84ee16c27a4e7b1f70d2e6ad5 Mon Sep 17 00:00:00 2001
From: Pauli Nieminen <[email protected]>
Date: Sun, 5 Jul 2009 18:31:18 +0300
Subject: [PATCH 5/6] libdrm: Make chown check for return value.
 If call was interrupted by signal we have to make call again.

---
 libdrm/xf86drm.c |   19 ++++++++++++++++---
 1 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index 7b05386..3da0380 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -269,6 +269,19 @@ 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 = strerror(errno);
+	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 +320,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 +333,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 +376,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

Reply via email to