diff options
Diffstat (limited to 'libgo/go')
-rw-r--r-- | libgo/go/syscall/errstr.go | 22 | ||||
-rw-r--r-- | libgo/go/syscall/errstr_glibc.go | 34 |
2 files changed, 9 insertions, 47 deletions
diff --git a/libgo/go/syscall/errstr.go b/libgo/go/syscall/errstr.go index 59f7a82..9f688e2 100644 --- a/libgo/go/syscall/errstr.go +++ b/libgo/go/syscall/errstr.go @@ -4,23 +4,19 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !hurd && !linux -// +build !hurd,!linux - package syscall -//sysnb strerror_r(errnum int, buf []byte) (err Errno) -//strerror_r(errnum _C_int, buf *byte, buflen Size_t) _C_int +import "internal/bytealg" + +//extern go_strerror +func go_strerror(_C_int, *byte, Size_t) _C_int func Errstr(errnum int) string { - for len := 128; ; len *= 2 { - b := make([]byte, len) - errno := strerror_r(errnum, b) + for size := 128; ; size *= 2 { + b := make([]byte, size) + errno := go_strerror(_C_int(errnum), &b[0], Size_t(len(b))) if errno == 0 { - i := 0 - for b[i] != 0 { - i++ - } + i := bytealg.IndexByte(b, 0) // Lowercase first letter: Bad -> bad, but // STREAM -> STREAM. if i > 1 && 'A' <= b[0] && b[0] <= 'Z' && 'a' <= b[1] && b[1] <= 'z' { @@ -29,7 +25,7 @@ func Errstr(errnum int) string { return string(b[:i]) } if errno != ERANGE { - return "errstr failure" + return "strerror_r failure" } } } diff --git a/libgo/go/syscall/errstr_glibc.go b/libgo/go/syscall/errstr_glibc.go deleted file mode 100644 index 03a327d..0000000 --- a/libgo/go/syscall/errstr_glibc.go +++ /dev/null @@ -1,34 +0,0 @@ -// errstr_glibc.go -- GNU/Linux and GNU/Hurd specific error strings. - -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// We use this rather than errstr.go because on GNU/Linux sterror_r -// returns a pointer to the error message, and may not use buf at all. - -//go:build hurd || linux -// +build hurd linux - -package syscall - -import "unsafe" - -//sysnb strerror_r(errnum int, b []byte) (errstr *byte) -//strerror_r(errnum _C_int, b *byte, len Size_t) *byte - -func Errstr(errnum int) string { - a := make([]byte, 128) - p := strerror_r(errnum, a) - b := (*[1000]byte)(unsafe.Pointer(p)) - i := 0 - for b[i] != 0 { - i++ - } - // Lowercase first letter: Bad -> bad, but STREAM -> STREAM. - if i > 1 && 'A' <= b[0] && b[0] <= 'Z' && 'a' <= b[1] && b[1] <= 'z' { - c := b[0] + 'a' - 'A' - return string(c) + string(b[1:i]) - } - return string(b[:i]) -} |