[*] UNIX: Use O_EXCL if available
[*] UNIX: Try to open readable dirs
This commit is contained in:
parent
151bb106fb
commit
9b74a623af
@ -139,6 +139,8 @@ namespace Aurora::IO
|
|||||||
this->bDirectIO = true;
|
this->bDirectIO = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int flags {};
|
||||||
|
|
||||||
switch (create.eMode)
|
switch (create.eMode)
|
||||||
{
|
{
|
||||||
case FS::EFileOpenMode::eRead:
|
case FS::EFileOpenMode::eRead:
|
||||||
@ -156,26 +158,57 @@ namespace Aurora::IO
|
|||||||
|
|
||||||
if (create.bFailIfNonEmptyFile)
|
if (create.bFailIfNonEmptyFile)
|
||||||
{
|
{
|
||||||
|
#if defined(O_EXCL)
|
||||||
|
flags = O_EXCL;
|
||||||
|
#else
|
||||||
if (AuFS::FileExists(pathex.c_str()))
|
if (AuFS::FileExists(pathex.c_str()))
|
||||||
{
|
{
|
||||||
SysPushErrorResourceExists("File {} already exists", create.path);
|
SysPushErrorResourceExists("File {} already exists", create.path);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
flags |= create.eMode == FS::EFileOpenMode::eRead ? O_RDONLY : (O_RDWR | O_CREAT);
|
||||||
|
flags |= O_CLOEXEC;
|
||||||
|
flags |= this->bDirectIO ? O_DIRECT : 0;
|
||||||
|
|
||||||
iFileDescriptor = ::open(pathex.c_str(),
|
iFileDescriptor = ::open(pathex.c_str(),
|
||||||
(create.eMode == FS::EFileOpenMode::eRead ? O_RDONLY : (O_RDWR | O_CREAT)) | O_CLOEXEC | (this->bDirectIO ? O_DIRECT : 0),
|
flags,
|
||||||
0664);
|
0664);
|
||||||
|
|
||||||
|
if (iFileDescriptor < 0)
|
||||||
|
{
|
||||||
|
if (errno == EEXIST)
|
||||||
|
{
|
||||||
|
SysPushErrorResourceExists("File {} already exists", create.path);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errno == EISDIR)
|
||||||
|
{
|
||||||
|
flags &= ~(O_WRONLY | O_RDWR);
|
||||||
|
iFileDescriptor = ::open(pathex.c_str(),
|
||||||
|
flags,
|
||||||
|
0664);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errno == ENFILE)
|
||||||
|
{
|
||||||
|
SysPushErrorIOResourceFailure("low resources");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (iFileDescriptor < 0)
|
if (iFileDescriptor < 0)
|
||||||
{
|
{
|
||||||
SysPushErrorIO("Couldn't open file: {} ({}) {}", path, pathex, errno);
|
SysPushErrorIO("Couldn't open file: {} ({}) {}", path, pathex, errno);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!FS::ApplyDumbAdvisoryLock(iFileDescriptor, create.eAdvisoryLevel))
|
if (!FS::ApplyDumbAdvisoryLock(iFileDescriptor, create.eAdvisoryLevel))
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user