Skip to content

Commit 7b2c453

Browse files
committed
errdefs: detect certain sycall errors as internal
Signed-off-by: Tonis Tiigi <[email protected]>
1 parent bfd46b6 commit 7b2c453

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

errdefs/errdefs.go renamed to errdefs/internal.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package errdefs
22

3-
import "errors"
3+
import (
4+
"errors"
5+
"syscall"
6+
)
47

58
type internalErr struct {
69
error
@@ -27,5 +30,20 @@ func Internal(err error) error {
2730

2831
func IsInternal(err error) bool {
2932
var s system
30-
return errors.As(err, &s)
33+
if errors.As(err, &s) {
34+
return true
35+
}
36+
37+
var errno syscall.Errno
38+
if errors.As(err, &errno) {
39+
if isInternalSyscall(errno) {
40+
return true
41+
}
42+
}
43+
return false
44+
}
45+
46+
func isInternalSyscall(err syscall.Errno) bool {
47+
_, ok := syscallErrors()[err]
48+
return ok
3149
}

errdefs/internal_linux.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//go:build linux
2+
// +build linux
3+
4+
package errdefs
5+
6+
import (
7+
"syscall"
8+
9+
"golang.org/x/sys/unix"
10+
)
11+
12+
func syscallErrors() map[syscall.Errno]struct{} {
13+
return map[syscall.Errno]struct{}{
14+
unix.EIO: {}, // I/O error
15+
unix.ENOMEM: {}, // Out of memory
16+
unix.EFAULT: {}, // Bad address
17+
unix.ENOSPC: {}, // No space left on device
18+
unix.ENOTRECOVERABLE: {}, // State not recoverable
19+
unix.EHWPOISON: {}, // Memory page has hardware error
20+
}
21+
}

errdefs/internal_nolinux.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//go:build !linux
2+
// +build !linux
3+
4+
package errdefs
5+
6+
import "syscall"
7+
8+
func syscallErrors() map[syscall.Errno]struct{} {
9+
return nil
10+
}

0 commit comments

Comments
 (0)