54deb01f00
Before this change Open("name", os.O_RDONLY|os.O_TRUNC) would have truncated the file. This is what Linux does, but is counterintuitive. POSIX states this is undefined, so return an error in this case instead. This preserves the invariant O_RDONLY => file is not changed.
49 lines
902 B
Go
49 lines
902 B
Go
// Cross platform errors
|
|
|
|
package vfs
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
// Error describes low level errors in a cross platform way.
|
|
type Error byte
|
|
|
|
// NB if changing errors translateError in cmd/mount/fs.go, cmd/cmount/fs.go
|
|
|
|
// Low level errors
|
|
const (
|
|
OK Error = iota
|
|
ENOTEMPTY
|
|
ESPIPE
|
|
EBADF
|
|
EROFS
|
|
ENOSYS
|
|
)
|
|
|
|
// Errors which have exact counterparts in os
|
|
var (
|
|
ENOENT = os.ErrNotExist
|
|
EEXIST = os.ErrExist
|
|
EPERM = os.ErrPermission
|
|
EINVAL = os.ErrInvalid
|
|
// ECLOSED see errors_{old,new}.go
|
|
)
|
|
|
|
var errorNames = []string{
|
|
OK: "Success",
|
|
ENOTEMPTY: "Directory not empty",
|
|
ESPIPE: "Illegal seek",
|
|
EBADF: "Bad file descriptor",
|
|
EROFS: "Read only file system",
|
|
ENOSYS: "Function not implemented",
|
|
}
|
|
|
|
// Error renders the error as a string
|
|
func (e Error) Error() string {
|
|
if int(e) >= len(errorNames) {
|
|
return fmt.Sprintf("Low level error %d", e)
|
|
}
|
|
return errorNames[e]
|
|
}
|