fix(错误处理): 修复错误映射关系
/ build (push) Successful in 12s

This commit is contained in:
2026-03-03 10:27:33 +08:00
parent 93817f7114
commit 2439762607
+38 -2
View File
@@ -15,6 +15,7 @@
package fs package fs
import ( import (
"errors"
"os" "os"
"strings" "strings"
"syscall" "syscall"
@@ -33,6 +34,38 @@ type FileNotifyInformation struct {
FileName [1]uint16 FileName [1]uint16
} }
// winErrToFuse Windows 错误码到 FUSE POSIX errno 的映射表
var winErrToFuse = map[syscall.Errno]int{
windows.ERROR_FILE_NOT_FOUND: int(fuse.ENOENT),
windows.ERROR_PATH_NOT_FOUND: int(fuse.ENOENT),
windows.ERROR_ACCESS_DENIED: int(fuse.EACCES),
windows.ERROR_INVALID_HANDLE: int(fuse.EBADF),
windows.ERROR_NOT_ENOUGH_MEMORY: int(fuse.ENOMEM),
windows.ERROR_OUTOFMEMORY: int(fuse.ENOMEM),
windows.ERROR_INVALID_DRIVE: int(fuse.ENOENT),
windows.ERROR_NO_MORE_FILES: int(fuse.ENOENT),
windows.ERROR_WRITE_PROTECT: int(fuse.EROFS),
windows.ERROR_NOT_READY: int(fuse.EIO),
windows.ERROR_SHARING_VIOLATION: int(fuse.EBUSY),
windows.ERROR_LOCK_VIOLATION: int(fuse.EBUSY),
windows.ERROR_HANDLE_EOF: int(fuse.EIO),
windows.ERROR_HANDLE_DISK_FULL: int(fuse.ENOSPC),
windows.ERROR_NOT_SUPPORTED: int(fuse.ENOSYS),
windows.ERROR_INVALID_PARAMETER: int(fuse.EINVAL),
windows.ERROR_INSUFFICIENT_BUFFER: int(fuse.EINVAL),
windows.ERROR_INVALID_NAME: int(fuse.ENOENT),
windows.ERROR_DIR_NOT_EMPTY: int(fuse.ENOTEMPTY),
windows.ERROR_ALREADY_EXISTS: int(fuse.EEXIST),
windows.ERROR_FILE_EXISTS: int(fuse.EEXIST),
windows.ERROR_BROKEN_PIPE: int(fuse.EPIPE),
windows.ERROR_DISK_FULL: int(fuse.ENOSPC),
windows.ERROR_CALL_NOT_IMPLEMENTED: int(fuse.ENOSYS),
windows.ERROR_NEGATIVE_SEEK: int(fuse.EINVAL),
windows.ERROR_SEEK_ON_DEVICE: int(fuse.ESPIPE),
windows.ERROR_DIRECTORY: int(fuse.ENOTDIR),
windows.ERROR_NOT_EMPTY: int(fuse.ENOTEMPTY),
}
// errno 转换错误码 // errno 转换错误码
// 入参: err 错误对象 // 入参: err 错误对象
// 返回: int 错误码 // 返回: int 错误码
@@ -40,8 +73,11 @@ func errno(err error) int {
if err == nil { if err == nil {
return 0 return 0
} }
if sysErr, ok := err.(syscall.Errno); ok { var sysErr syscall.Errno
return -int(sysErr) if errors.As(err, &sysErr) {
if fuseErr, ok := winErrToFuse[sysErr]; ok {
return -fuseErr
}
} }
return -int(fuse.EIO) return -int(fuse.EIO)
} }