libdrm: Make chown check for return value

If call was interrupted by signal we have to make call again.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
main
Pauli Nieminen 2009-07-06 23:37:20 +03:00 committed by Ian Romanick
parent a953b3270c
commit c5a5bbbe89
1 changed files with 33 additions and 3 deletions

View File

@ -269,6 +269,36 @@ static int drmMatchBusID(const char *id1, const char *id2)
return 0; return 0;
} }
/**
* Handles error checking for chown call.
*
* \param path to file.
* \param id of the new owner.
* \param id of the new group.
*
* \return zero if success or -1 if failure.
*
* \internal
* Checks for failure. If failure was caused by signal call chown again.
* If any other failure happened then it will output error mesage using
* drmMsg() call.
*/
static int chown_check_return(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;
drmMsg("Failed to change owner or group for file %s! %d: %s\n",
path, errno, strerror(errno));
return -1;
}
/** /**
* Open the DRM device, creating it if necessary. * Open the DRM device, creating it if necessary.
* *
@ -307,7 +337,7 @@ static int drmOpenDevice(long dev, int minor, int type)
if (!isroot) if (!isroot)
return DRM_ERR_NOT_ROOT; return DRM_ERR_NOT_ROOT;
mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE); mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE);
chown(DRM_DIR_NAME, 0, 0); /* root:root */ chown_check_return(DRM_DIR_NAME, 0, 0); /* root:root */
chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE); chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE);
} }
@ -320,7 +350,7 @@ static int drmOpenDevice(long dev, int minor, int type)
} }
if (drm_server_info) { if (drm_server_info) {
chown(buf, user, group); chown_check_return(buf, user, group);
chmod(buf, devmode); chmod(buf, devmode);
} }
#else #else
@ -363,7 +393,7 @@ wait_for_udev:
remove(buf); remove(buf);
mknod(buf, S_IFCHR | devmode, dev); mknod(buf, S_IFCHR | devmode, dev);
if (drm_server_info) { if (drm_server_info) {
chown(buf, user, group); chown_check_return(buf, user, group);
chmod(buf, devmode); chmod(buf, devmode);
} }
} }