in src/common/commonutils/FileUtils.c [563:646]
static int CheckAccess(bool directory, const char* name, int desiredOwnerId, int desiredGroupId, unsigned int desiredAccess, bool rootCanOverwriteOwnership, char** reason, OsConfigLogHandle log)
{
struct stat statStruct = {0};
mode_t currentMode = 0;
mode_t desiredMode = 0;
int result = ENOENT;
if (NULL == name)
{
OsConfigLogError(log, "CheckAccess called with an invalid name argument");
return EINVAL;
}
if (directory ? DirectoryExists(name) : FileExists(name))
{
if (0 == (result = stat(name, &statStruct)))
{
if (((-1 != desiredOwnerId) && (((uid_t)desiredOwnerId != statStruct.st_uid) && (directory && rootCanOverwriteOwnership && ((0 != statStruct.st_uid))))) ||
((-1 != desiredGroupId) && (((gid_t)desiredGroupId != statStruct.st_gid) && (directory && rootCanOverwriteOwnership && ((0 != statStruct.st_gid))))))
{
OsConfigLogInfo(log, "CheckAccess: ownership of '%s' (%d, %d) does not match expected (%d, %d)",
name, statStruct.st_uid, statStruct.st_gid, desiredOwnerId, desiredGroupId);
OsConfigCaptureReason(reason, "Ownership of '%s' (%d, %d) does not match expected (%d, %d)",
name, statStruct.st_uid, statStruct.st_gid, desiredOwnerId, desiredGroupId);
result = ENOENT;
}
else
{
// Special case for the MPI Client
if (NULL != log)
{
OsConfigLogInfo(log, "CheckAccess: ownership of '%s' (%d, %d) matches expected (%d, %d)",
name, statStruct.st_uid, statStruct.st_gid, desiredOwnerId, desiredGroupId);
}
currentMode = statStruct.st_mode & 07777;
desiredMode = desiredAccess & 07777;
// S_ISVTX (01000): restricted deletion flag (for directories only)
if (!directory)
{
desiredMode &= ~S_ISVTX;
}
if (currentMode != desiredMode)
{
OsConfigLogInfo(log, "CheckAccess: access to '%s' (%03o) does not match expected (%03o)", name, currentMode, desiredMode);
OsConfigCaptureReason(reason, "Access to '%s' (%03o) does not match expected (%03o)", name, currentMode, desiredMode);
result = ENOENT;
}
else
{
// Special case for the MPI Client
if (NULL != log)
{
OsConfigLogInfo(log, "CheckAccess: access to '%s' (%03o) matches expected (%03o)", name, currentMode, desiredMode);
}
OsConfigCaptureSuccessReason(reason, "'%s' has required access (%03o) and ownership (uid: %d, gid: %u)", name, desiredMode, desiredOwnerId, desiredGroupId);
result = 0;
}
}
}
else
{
OsConfigLogInfo(log, "CheckAccess: stat('%s') failed with %d", name, errno);
}
}
else
{
OsConfigLogInfo(log, "CheckAccess: '%s' is not found, nothing to check", name);
if (OsConfigIsSuccessReason(reason))
{
OsConfigCaptureSuccessReason(reason, "'%s' is not found, nothing to check", name);
}
else
{
OsConfigCaptureReason(reason, "'%s' is not found", name);
}
result = 0;
}
return result;
}