mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
50 lines
1.3 KiB
C
50 lines
1.3 KiB
C
module std::io::os;
|
|
import libc;
|
|
import std::io::path;
|
|
import std::os::win32;
|
|
import std::os::posix;
|
|
|
|
macro bool! native_rmdir(Path path)
|
|
{
|
|
$switch
|
|
$case POSIX_LIBC:
|
|
if (!posix::rmdir(path.as_zstr())) return true;
|
|
switch (libc::errno())
|
|
{
|
|
case errno::EBUSY: return IoError.BUSY?;
|
|
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::ENOTDIR:
|
|
case errno::ENOENT: return false;
|
|
case errno::ENOTEMPTY: return IoError.DIR_NOT_EMPTY?;
|
|
case errno::ELOOP: return IoError.SYMLINK_FAILED?;
|
|
default: return IoError.GENERAL_ERROR?;
|
|
}
|
|
$case WIN32_LIBC:
|
|
@pool()
|
|
{
|
|
if (win32::removeDirectoryW(path.as_str().to_temp_utf16()!!)) return true;
|
|
switch (win32::getLastError())
|
|
{
|
|
case win32::ERROR_ACCESS_DENIED:
|
|
return IoError.NO_PERMISSION?;
|
|
case win32::ERROR_CURRENT_DIRECTORY:
|
|
return IoError.BUSY?;
|
|
case win32::ERROR_DIR_NOT_EMPTY:
|
|
return IoError.DIR_NOT_EMPTY?;
|
|
case win32::ERROR_DIRECTORY:
|
|
case win32::ERROR_PATH_NOT_FOUND:
|
|
return false;
|
|
default:
|
|
return IoError.GENERAL_ERROR?;
|
|
}
|
|
};
|
|
$default:
|
|
unreachable("'rmdir' not available");
|
|
return false;
|
|
$endswitch
|
|
}
|