Skip to content

Commit

Permalink
archive/tar: move round-trip reading into common os file
Browse files Browse the repository at this point in the history
Fixes golang#11426

Change-Id: I77368b0e852149ed4533e139cc43887508ac7f78
Reviewed-on: https://go-review.googlesource.com/11662
Reviewed-by: Austin Clements <[email protected]>
Reviewed-by: Russ Cox <[email protected]>
  • Loading branch information
alexbrainman committed Jun 30, 2015
1 parent 8b4278f commit 53eb478
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 39 deletions.
24 changes: 24 additions & 0 deletions src/archive/tar/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,30 @@ func FileInfoHeader(fi os.FileInfo, link string) (*Header, error) {
if fm&os.ModeSticky != 0 {
h.Mode |= c_ISVTX
}
// If possible, populate additional fields from OS-specific
// FileInfo fields.
if sys, ok := fi.Sys().(*Header); ok {
// This FileInfo came from a Header (not the OS). Use the
// original Header to populate all remaining fields.
h.Uid = sys.Uid
h.Gid = sys.Gid
h.Uname = sys.Uname
h.Gname = sys.Gname
h.AccessTime = sys.AccessTime
h.ChangeTime = sys.ChangeTime
if sys.Xattrs != nil {
h.Xattrs = make(map[string]string)
for k, v := range sys.Xattrs {
h.Xattrs[k] = v
}
}
if sys.Typeflag == TypeLink {
// hard link
h.Typeflag = TypeLink
h.Size = 0
h.Linkname = sys.Linkname
}
}
if sysStat != nil {
return h, sysStat(fi, h)
}
Expand Down
51 changes: 16 additions & 35 deletions src/archive/tar/stat_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,41 +16,22 @@ func init() {
}

func statUnix(fi os.FileInfo, h *Header) error {
switch sys := fi.Sys().(type) {
case *syscall.Stat_t:
h.Uid = int(sys.Uid)
h.Gid = int(sys.Gid)
// TODO(bradfitz): populate username & group. os/user
// doesn't cache LookupId lookups, and lacks group
// lookup functions.
h.AccessTime = statAtime(sys)
h.ChangeTime = statCtime(sys)
// TODO(bradfitz): major/minor device numbers?
if fi.Mode().IsRegular() && sys.Nlink > 1 {
h.Typeflag = TypeLink
h.Size = 0
// TODO(vbatts): Linkname?
}
case *Header:
// for the roundtrip logic
h.Uid = sys.Uid
h.Gid = sys.Gid
h.Uname = sys.Uname
h.Gname = sys.Gname
h.AccessTime = sys.AccessTime
h.ChangeTime = sys.ChangeTime
if sys.Xattrs != nil {
h.Xattrs = make(map[string]string)
for k, v := range sys.Xattrs {
h.Xattrs[k] = v
}
}
if sys.Typeflag == TypeLink {
// hard link
h.Typeflag = TypeLink
h.Size = 0
h.Linkname = sys.Linkname
}
sys, ok := fi.Sys().(*syscall.Stat_t)
if !ok {
return nil
}
h.Uid = int(sys.Uid)
h.Gid = int(sys.Gid)
// TODO(bradfitz): populate username & group. os/user
// doesn't cache LookupId lookups, and lacks group
// lookup functions.
h.AccessTime = statAtime(sys)
h.ChangeTime = statCtime(sys)
// TODO(bradfitz): major/minor device numbers?
if fi.Mode().IsRegular() && sys.Nlink > 1 {
h.Typeflag = TypeLink
h.Size = 0
// TODO(vbatts): Linkname?
}
return nil
}
4 changes: 0 additions & 4 deletions src/archive/tar/tar_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"os"
"path"
"reflect"
"runtime"
"strings"
"testing"
"time"
Expand Down Expand Up @@ -136,9 +135,6 @@ type headerRoundTripTest struct {
}

func TestHeaderRoundTrip(t *testing.T) {
if runtime.GOOS == "windows" || runtime.GOOS == "plan9" || runtime.GOOS == "nacl" {
t.Skipf("skipping on %s; issue 11426", runtime.GOOS)
}
golden := []headerRoundTripTest{
// regular file.
{
Expand Down

0 comments on commit 53eb478

Please sign in to comment.