On Sat,  4 Jul 2009 02:18:53 +0300
Pauli Nieminen <suok...@gmail.com> 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?


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

------------------------------------------------------------------------------
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to