diff --git a/internal/fusefs/syscallerr.go b/internal/fusefs/syscallerr.go new file mode 100644 index 0000000..e055acb --- /dev/null +++ b/internal/fusefs/syscallerr.go @@ -0,0 +1,67 @@ +package fusefs +import ( + "go.arsenm.dev/infinitime/blefs" + "syscall" +) + +func syscallErr(err error) syscall.Errno { + if err == nil { + return 0 + } + + switch err { + case blefs.FSError{0x02}: // filesystem error + return syscall.EIO // TODO + case blefs.FSError{0x05}: // read-only filesystem + return syscall.EROFS + case blefs.FSError{0x03}: // no such file + return syscall.ENOENT + case blefs.FSError{0x04}: // protocol error + return syscall.EPROTO + case blefs.FSError{-5}: // input/output error + return syscall.EIO + case blefs.FSError{-84}: // filesystem is corrupted + return syscall.ENOTRECOVERABLE // TODO + case blefs.FSError{-2}: // no such directory entry + return syscall.ENOENT + case blefs.FSError{-17}: // entry already exists + return syscall.EEXIST + case blefs.FSError{-20}: // entry is not a directory + return syscall.ENOTDIR + case blefs.FSError{-39}: // directory is not empty + return syscall.ENOTEMPTY + case blefs.FSError{-9}: // bad file number + return syscall.EBADF + case blefs.FSError{-27}: // file is too large + return syscall.EFBIG + case blefs.FSError{-22}: // invalid parameter + return syscall.EINVAL + case blefs.FSError{-28}: // no space left on device + return syscall.ENOSPC + case blefs.FSError{-12}: // no more memory available + return syscall.ENOMEM + case blefs.FSError{-61}: // no attr available + return syscall.ENODATA // TODO + case blefs.FSError{-36}: // file name is too long + return syscall.ENAMETOOLONG + case blefs.ErrFileNotExists: // file does not exist + return syscall.ENOENT + case blefs.ErrFileReadOnly: // file is read only + return syscall.EACCES + case blefs.ErrFileWriteOnly: // file is write only + return syscall.EACCES + case blefs.ErrInvalidOffset: // invalid file offset + return syscall.EFAULT // TODO + case blefs.ErrOffsetChanged: // offset has already been changed + return syscall.ESPIPE + case blefs.ErrReadOpen: // only one file can be opened for reading at a time + return syscall.ENFILE + case blefs.ErrWriteOpen: // only one file can be opened for writing at a time + return syscall.ENFILE + case blefs.ErrNoRemoveRoot: // refusing to remove root directory + return syscall.EPERM + } + + return syscall.EIO // TODO + +}