archive/tar: support stat and device numbers on AIX

Reviewed-on: https://go-review.googlesource.com/87198

From-SVN: r256810
This commit is contained in:
Ian Lance Taylor 2018-01-17 18:33:50 +00:00
parent 4436a3ce49
commit c1fa27707a
3 changed files with 13 additions and 3 deletions

View File

@ -1,4 +1,4 @@
ca805b704fc141d7ad61f8fcd3badbaa04b7e363
3ea7fc3b918210e7248dbc51d90af20639dc4167
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build linux dragonfly openbsd solaris
// +build aix linux dragonfly openbsd solaris
package tar

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build linux darwin dragonfly freebsd openbsd netbsd solaris
// +build aix linux darwin dragonfly freebsd openbsd netbsd solaris
package tar
@ -54,6 +54,16 @@ func statUnix(fi os.FileInfo, h *Header) error {
if h.Typeflag == TypeChar || h.Typeflag == TypeBlock {
dev := uint64(sys.Rdev) // May be int32 or uint32
switch runtime.GOOS {
case "aix":
var major, minor uint32
if runtime.GOARCH == "ppc64" {
major = uint32((dev & 0x3fffffff00000000) >> 32)
minor = uint32((dev & 0x00000000ffffffff) >> 0)
} else {
major = uint32((dev >> 16) & 0xffff)
minor = uint32(dev & 0xffff)
}
h.Devmajor, h.Devminor = int64(major), int64(minor)
case "linux":
// Copied from golang.org/x/sys/unix/dev_linux.go.
major := uint32((dev & 0x00000000000fff00) >> 8)