diff options
Diffstat (limited to 'llgo/third_party/gofrontend/libgo/go/archive/tar/common.go')
| -rw-r--r-- | llgo/third_party/gofrontend/libgo/go/archive/tar/common.go | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/llgo/third_party/gofrontend/libgo/go/archive/tar/common.go b/llgo/third_party/gofrontend/libgo/go/archive/tar/common.go index e363aa793e0..c31df062f7e 100644 --- a/llgo/third_party/gofrontend/libgo/go/archive/tar/common.go +++ b/llgo/third_party/gofrontend/libgo/go/archive/tar/common.go @@ -139,8 +139,8 @@ func (fi headerFileInfo) Mode() (mode os.FileMode) { } switch fi.h.Typeflag { - case TypeLink, TypeSymlink: - // hard link, symbolic link + case TypeSymlink: + // symbolic link mode |= os.ModeSymlink case TypeChar: // character device node @@ -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) } |

