mirror of https://github.com/golang/go.git
cmd/internal/osinfo: stop importing golang.org/x/sys/unix
This is the only non-vendored file that imports x/sys/unix. Switch to fetching the information in this package. Change-Id: I4e54c2cd8b4953066e2bee42922f35c387fb43e9 Reviewed-on: https://go-review.googlesource.com/c/go/+/623435 Auto-Submit: Ian Lance Taylor <iant@google.com> Commit-Queue: Ian Lance Taylor <iant@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Reviewed-by: Michael Pratt <mpratt@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
parent
060bd25310
commit
555ef55460
|
|
@ -0,0 +1,36 @@
|
|||
// Copyright 2024 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.
|
||||
|
||||
// Supporting definitions for os_uname.go on Solaris.
|
||||
|
||||
package osinfo
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type utsname struct {
|
||||
Sysname [257]byte
|
||||
Nodename [257]byte
|
||||
Release [257]byte
|
||||
Version [257]byte
|
||||
Machine [257]byte
|
||||
}
|
||||
|
||||
//go:cgo_import_dynamic libc_uname uname "libc.so"
|
||||
//go:linkname procUname libc_uname
|
||||
|
||||
var procUname uintptr
|
||||
|
||||
//go:linkname rawsysvicall6 runtime.syscall_rawsysvicall6
|
||||
func rawsysvicall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err syscall.Errno)
|
||||
|
||||
func uname(buf *utsname) error {
|
||||
_, _, errno := rawsysvicall6(uintptr(unsafe.Pointer(&procUname)), 1, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0)
|
||||
if errno != 0 {
|
||||
return errno
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2024 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.
|
||||
|
||||
//go:build aix || linux
|
||||
|
||||
// Supporting definitions for os_uname.go on AIX and Linux.
|
||||
|
||||
package osinfo
|
||||
|
||||
import "syscall"
|
||||
|
||||
type utsname = syscall.Utsname
|
||||
|
||||
func uname(buf *utsname) error {
|
||||
return syscall.Uname(buf)
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
// Copyright 2022 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.
|
||||
|
||||
//go:build darwin || dragonfly || freebsd || netbsd || openbsd
|
||||
|
||||
package osinfo
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
// Version returns the OS version name/number.
|
||||
func Version() (string, error) {
|
||||
sysname, err := syscall.Sysctl("kern.ostype")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
release, err := syscall.Sysctl("kern.osrelease")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
version, err := syscall.Sysctl("kern.version")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// The version might have newlines or tabs; convert to spaces.
|
||||
version = strings.ReplaceAll(version, "\n", " ")
|
||||
version = strings.ReplaceAll(version, "\t", " ")
|
||||
version = strings.TrimSpace(version)
|
||||
|
||||
machine, err := syscall.Sysctl("hw.machine")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
ret := sysname + " " + release + " " + version + " " + machine
|
||||
return ret, nil
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
// Copyright 2022 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.
|
||||
|
||||
//go:build aix || linux || solaris
|
||||
|
||||
package osinfo
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"strings"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// Version returns the OS version name/number.
|
||||
func Version() (string, error) {
|
||||
var uts utsname
|
||||
if err := uname(&uts); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
var sb strings.Builder
|
||||
|
||||
writeCStr := func(b []byte) {
|
||||
if i := bytes.IndexByte(b, '\000'); i >= 0 {
|
||||
b = b[:i]
|
||||
}
|
||||
sb.Write(b)
|
||||
}
|
||||
|
||||
// We need some absurd conversions because syscall.Utsname
|
||||
// sometimes uses []uint8 and sometimes []int8.
|
||||
|
||||
s := uts.Sysname[:]
|
||||
writeCStr(*(*[]byte)(unsafe.Pointer(&s)))
|
||||
sb.WriteByte(' ')
|
||||
s = uts.Release[:]
|
||||
writeCStr(*(*[]byte)(unsafe.Pointer(&s)))
|
||||
sb.WriteByte(' ')
|
||||
s = uts.Version[:]
|
||||
writeCStr(*(*[]byte)(unsafe.Pointer(&s)))
|
||||
sb.WriteByte(' ')
|
||||
s = uts.Machine[:]
|
||||
writeCStr(*(*[]byte)(unsafe.Pointer(&s)))
|
||||
|
||||
return sb.String(), nil
|
||||
}
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
// Copyright 2022 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.
|
||||
|
||||
//go:build unix
|
||||
|
||||
package osinfo
|
||||
|
||||
import "golang.org/x/sys/unix"
|
||||
|
||||
// Version returns the OS version name/number.
|
||||
func Version() (string, error) {
|
||||
var uts unix.Utsname
|
||||
if err := unix.Uname(&uts); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
sysname := unix.ByteSliceToString(uts.Sysname[:])
|
||||
release := unix.ByteSliceToString(uts.Release[:])
|
||||
version := unix.ByteSliceToString(uts.Version[:])
|
||||
machine := unix.ByteSliceToString(uts.Machine[:])
|
||||
|
||||
return sysname + " " + release + " " + version + " " + machine, nil
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
// Copyright 2024 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.
|
||||
|
||||
//go:build unix
|
||||
|
||||
package osinfo
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestVersion(t *testing.T) {
|
||||
v, err := Version()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Logf("%q", v)
|
||||
|
||||
fields := strings.Fields(v)
|
||||
if len(fields) < 4 {
|
||||
t.Errorf("wanted at least 4 fields in %q, got %d", v, len(fields))
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue