diff --git a/internal/fusefs/syscallerr.go b/internal/fusefs/syscallerr.go index cddbadd..2a57c91 100644 --- a/internal/fusefs/syscallerr.go +++ b/internal/fusefs/syscallerr.go @@ -11,58 +11,64 @@ func syscallErr(err error) syscall.Errno { 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 + switch err := err.(type) { + case blefs.FSError: + switch err.Code { + case 0x02: // filesystem error + return syscall.EIO // TODO + case 0x05: // read-only filesystem + return syscall.EROFS + case 0x03: // no such file + return syscall.ENOENT + case 0x04: // protocol error + return syscall.EPROTO + case -5: // input/output error + return syscall.EIO + case -84: // filesystem is corrupted + return syscall.ENOTRECOVERABLE // TODO + case -2: // no such directory entry + return syscall.ENOENT + case -17: // entry already exists + return syscall.EEXIST + case -20: // entry is not a directory + return syscall.ENOTDIR + case -39: // directory is not empty + return syscall.ENOTEMPTY + case -9: // bad file number + return syscall.EBADF + case -27: // file is too large + return syscall.EFBIG + case -22: // invalid parameter + return syscall.EINVAL + case -28: // no space left on device + return syscall.ENOSPC + case -12: // no more memory available + return syscall.ENOMEM + case -61: // no attr available + return syscall.ENODATA // TODO + case -36: // file name is too long + return syscall.ENAMETOOLONG + } + default: + switch err { + 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 + return syscall.EIO }