]> Cypherpunks repositories - gostls13.git/commitdiff
archive/tar: populate Devmajor and Devminor in FileInfoHeader on *BSD
authorTobias Klauser <tklauser@distanz.ch>
Wed, 13 Sep 2017 07:11:49 +0000 (09:11 +0200)
committerJoe Tsai <thebrokentoaster@gmail.com>
Wed, 13 Sep 2017 21:02:11 +0000 (21:02 +0000)
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>
src/archive/tar/stat_unix.go

index ba7d83d24fe1684ea4722e57c9dc668d46065223..868105f338efdc109b77cda051c06247da28d56a 100644 (file)
@@ -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