aboutsummaryrefslogtreecommitdiff
path: root/src/archive
diff options
context:
space:
mode:
authorTobias Klauser <tklauser@distanz.ch>2017-09-13 09:11:49 +0200
committerJoe Tsai <thebrokentoaster@gmail.com>2017-09-13 21:02:11 +0000
commit3098cf01754a2cda60ff2953f5c09c010d7683bf (patch)
treed9f546033cda906255eb173c57d373922ad1bb93 /src/archive
parent577967799c22e5a443ec49f494039f80e08202fe (diff)
downloadgo-3098cf01754a2cda60ff2953f5c09c010d7683bf.tar.xz
archive/tar: populate Devmajor and Devminor in FileInfoHeader on *BSD
Extract device major/minor number on all the BSDs and set Devmajor and Devminor in FileInfoHeader. Code based on the corresponding Major/Minor implementations in golang.org/x/sys/unix. Change-Id: Ieffa7ce0cdbe6481950de666b2f5f88407a32382 Reviewed-on: https://go-review.googlesource.com/63470 Reviewed-by: Joe Tsai <joetsai@google.com>
Diffstat (limited to 'src/archive')
-rw-r--r--src/archive/tar/stat_unix.go24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/archive/tar/stat_unix.go b/src/archive/tar/stat_unix.go
index ba7d83d24f..868105f338 100644
--- a/src/archive/tar/stat_unix.go
+++ b/src/archive/tar/stat_unix.go
@@ -66,8 +66,30 @@ func statUnix(fi os.FileInfo, h *Header) error {
major := uint32((dev >> 24) & 0xff)
minor := uint32(dev & 0xffffff)
h.Devmajor, h.Devminor = int64(major), int64(minor)
+ case "dragonfly":
+ // Copied from golang.org/x/sys/unix/dev_dragonfly.go.
+ major := uint32((dev >> 8) & 0xff)
+ minor := uint32(dev & 0xffff00ff)
+ h.Devmajor, h.Devminor = int64(major), int64(minor)
+ case "freebsd":
+ // Copied from golang.org/x/sys/unix/dev_freebsd.go.
+ major := uint32((dev >> 8) & 0xff)
+ minor := uint32(dev & 0xffff00ff)
+ h.Devmajor, h.Devminor = int64(major), int64(minor)
+ case "netbsd":
+ // Copied from golang.org/x/sys/unix/dev_netbsd.go.
+ major := uint32((dev & 0x000fff00) >> 8)
+ minor := uint32((dev & 0x000000ff) >> 0)
+ minor |= uint32((dev & 0xfff00000) >> 12)
+ h.Devmajor, h.Devminor = int64(major), int64(minor)
+ case "openbsd":
+ // Copied from golang.org/x/sys/unix/dev_openbsd.go.
+ major := uint32((dev & 0x0000ff00) >> 8)
+ minor := uint32((dev & 0x000000ff) >> 0)
+ minor |= uint32((dev & 0xffff0000) >> 8)
+ h.Devmajor, h.Devminor = int64(major), int64(minor)
default:
- // TODO: Implement others (see https://golang.org/issue/8106)
+ // TODO: Implement solaris (see https://golang.org/issue/8106)
}
}
return nil