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
parent
a953b3270c
commit
c5a5bbbe89
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue