mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
50 lines
1.4 KiB
C
50 lines
1.4 KiB
C
module std::io::os;
|
|
import libc;
|
|
import std::io::path;
|
|
import std::os::win32;
|
|
import std::os::posix;
|
|
|
|
|
|
macro bool! native_mkdir(Path path, MkdirPermissions permissions)
|
|
{
|
|
$switch
|
|
$case env::POSIX:
|
|
if (!posix::mkdir(path.as_zstr(), permissions == NORMAL ? 0o777 : 0o700)) return true;
|
|
switch (libc::errno())
|
|
{
|
|
case errno::EACCES:
|
|
case errno::EPERM:
|
|
case errno::EROFS:
|
|
case errno::EFAULT: return IoError.NO_PERMISSION?;
|
|
case errno::ENAMETOOLONG: return IoError.NAME_TOO_LONG?;
|
|
case errno::EDQUOT:
|
|
case errno::ENOSPC: return IoError.OUT_OF_SPACE?;
|
|
case errno::EISDIR:
|
|
case errno::EEXIST: return false;
|
|
case errno::ELOOP: return IoError.SYMLINK_FAILED?;
|
|
case errno::ENOTDIR: return IoError.FILE_NOT_FOUND?;
|
|
default: return IoError.GENERAL_ERROR?;
|
|
}
|
|
$case env::WIN32:
|
|
@pool()
|
|
{
|
|
// TODO security attributes
|
|
if (win32::createDirectoryW(path.as_str().to_temp_utf16()!!, null)) return true;
|
|
switch (win32::getLastError())
|
|
{
|
|
case win32::ERROR_ACCESS_DENIED:
|
|
return IoError.NO_PERMISSION?;
|
|
case win32::ERROR_DISK_FULL:
|
|
return IoError.OUT_OF_SPACE?;
|
|
case win32::ERROR_ALREADY_EXISTS:
|
|
return false;
|
|
case win32::ERROR_PATH_NOT_FOUND:
|
|
return IoError.FILE_NOT_FOUND?;
|
|
default:
|
|
return IoError.GENERAL_ERROR?;
|
|
}
|
|
};
|
|
$default:
|
|
return IoError.UNSUPPORTED_OPERATION?;
|
|
$endswitch
|
|
} |