diff options
-rw-r--r-- | src/cmd/dist/metadata.go | 9 | ||||
-rw-r--r-- | src/cmd/internal/osinfo/doc.go | 6 | ||||
-rw-r--r-- | src/cmd/internal/osinfo/os_js.go | 18 | ||||
-rw-r--r-- | src/cmd/internal/osinfo/os_plan9.go | 21 | ||||
-rw-r--r-- | src/cmd/internal/osinfo/os_unix.go | 36 | ||||
-rw-r--r-- | src/cmd/internal/osinfo/os_windows.go | 19 |
6 files changed, 109 insertions, 0 deletions
diff --git a/src/cmd/dist/metadata.go b/src/cmd/dist/metadata.go index f0a125fb8a..76f108ea06 100644 --- a/src/cmd/dist/metadata.go +++ b/src/cmd/dist/metadata.go @@ -12,6 +12,7 @@ package main import ( + "cmd/internal/osinfo" "fmt" "internal/sysinfo" "runtime" @@ -20,5 +21,13 @@ import ( func logMetadata() error { fmt.Printf("# GOARCH: %s\n", runtime.GOARCH) fmt.Printf("# CPU: %s\n", sysinfo.CPU.Name()) + + fmt.Printf("# GOOS: %s\n", runtime.GOOS) + ver, err := osinfo.Version() + if err != nil { + return fmt.Errorf("error determining OS version: %v", err) + } + fmt.Printf("# OS Version: %s\n", ver) + return nil } diff --git a/src/cmd/internal/osinfo/doc.go b/src/cmd/internal/osinfo/doc.go new file mode 100644 index 0000000000..c2f74bea27 --- /dev/null +++ b/src/cmd/internal/osinfo/doc.go @@ -0,0 +1,6 @@ +// Copyright 2021 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. + +// Package osinfo provides OS metadata information. +package osinfo diff --git a/src/cmd/internal/osinfo/os_js.go b/src/cmd/internal/osinfo/os_js.go new file mode 100644 index 0000000000..8e86464cd8 --- /dev/null +++ b/src/cmd/internal/osinfo/os_js.go @@ -0,0 +1,18 @@ +// Copyright 2021 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 js + +package osinfo + +import ( + "fmt" +) + +// Version returns the OS version name/number. +func Version() (string, error) { + // TODO(prattmic): Does wasm have any version/runtime detection + // functionality? + return "", fmt.Errorf("unimplemented") +} diff --git a/src/cmd/internal/osinfo/os_plan9.go b/src/cmd/internal/osinfo/os_plan9.go new file mode 100644 index 0000000000..ad1d324e5e --- /dev/null +++ b/src/cmd/internal/osinfo/os_plan9.go @@ -0,0 +1,21 @@ +// Copyright 2021 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 plan9 + +package osinfo + +import ( + "os" +) + +// Version returns the OS version name/number. +func Version() (string, error) { + b, err := os.ReadFile("/dev/osversion") + if err != nil { + return "", err + } + + return string(b), nil +} diff --git a/src/cmd/internal/osinfo/os_unix.go b/src/cmd/internal/osinfo/os_unix.go new file mode 100644 index 0000000000..4587cb2501 --- /dev/null +++ b/src/cmd/internal/osinfo/os_unix.go @@ -0,0 +1,36 @@ +// Copyright 2021 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 || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris + +package osinfo + +import ( + "bytes" + + "golang.org/x/sys/unix" +) + +func utsString(b []byte) string { + i := bytes.IndexByte(b, 0) + if i == -1 { + return string(b) + } + return string(b[:i]) +} + +// 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 := utsString(uts.Sysname[:]) + release := utsString(uts.Release[:]) + version := utsString(uts.Version[:]) + machine := utsString(uts.Machine[:]) + + return sysname + " " + release + " " + version + " " + machine, nil +} diff --git a/src/cmd/internal/osinfo/os_windows.go b/src/cmd/internal/osinfo/os_windows.go new file mode 100644 index 0000000000..05fab9bb1e --- /dev/null +++ b/src/cmd/internal/osinfo/os_windows.go @@ -0,0 +1,19 @@ +// Copyright 2021 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 windows + +package osinfo + +import ( + "fmt" + + "golang.org/x/sys/windows" +) + +// Version returns the OS version name/number. +func Version() (string, error) { + major, minor, patch := windows.RtlGetNtVersionNumbers() + return fmt.Sprintf("%d.%d.%d", major, minor, patch), nil +} |