mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Simplify addTarFile
We can use tar.FileInfoHeader to do much of the work. Docker-DCO-1.1-Signed-off-by: Alexander Larsson <alexl@redhat.com> (github: alexlarsson)
This commit is contained in:
parent
5b77e51e0a
commit
bab8efbf05
1 changed files with 21 additions and 37 deletions
|
@ -15,7 +15,6 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Archive io.Reader
|
type Archive io.Reader
|
||||||
|
@ -125,48 +124,33 @@ func (compression *Compression) Extension() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func addTarFile(path, name string, tw *tar.Writer) error {
|
func addTarFile(path, name string, tw *tar.Writer) error {
|
||||||
var stat syscall.Stat_t
|
fi, err := os.Lstat(path)
|
||||||
if err := syscall.Lstat(path, &stat); err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
mtim := getLastModification(&stat)
|
link := ""
|
||||||
atim := getLastAccess(&stat)
|
if fi.Mode() & os.ModeSymlink != 0 {
|
||||||
hdr := &tar.Header{
|
if link, err = os.Readlink(path); err != nil {
|
||||||
Name: name,
|
return err
|
||||||
Mode: int64(stat.Mode & 07777),
|
}
|
||||||
Uid: int(stat.Uid),
|
|
||||||
Gid: int(stat.Gid),
|
|
||||||
ModTime: time.Unix(int64(mtim.Sec), int64(mtim.Nsec)),
|
|
||||||
AccessTime: time.Unix(int64(atim.Sec), int64(atim.Nsec)),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if stat.Mode&syscall.S_IFDIR == syscall.S_IFDIR {
|
hdr, err := tar.FileInfoHeader(fi, link)
|
||||||
hdr.Typeflag = tar.TypeDir
|
if err != nil {
|
||||||
} else if stat.Mode&syscall.S_IFLNK == syscall.S_IFLNK {
|
return err
|
||||||
hdr.Typeflag = tar.TypeSymlink
|
}
|
||||||
if link, err := os.Readlink(path); err != nil {
|
|
||||||
return err
|
hdr.Name = name
|
||||||
} else {
|
|
||||||
hdr.Linkname = link
|
stat, ok := fi.Sys().(*syscall.Stat_t)
|
||||||
|
if ok {
|
||||||
|
// Currently go does not fill in the major/minors
|
||||||
|
if stat.Mode&syscall.S_IFBLK == syscall.S_IFBLK ||
|
||||||
|
stat.Mode&syscall.S_IFCHR == syscall.S_IFCHR {
|
||||||
|
hdr.Devmajor = int64(major(uint64(stat.Rdev)))
|
||||||
|
hdr.Devminor = int64(minor(uint64(stat.Rdev)))
|
||||||
}
|
}
|
||||||
} else if stat.Mode&syscall.S_IFBLK == syscall.S_IFBLK ||
|
|
||||||
stat.Mode&syscall.S_IFCHR == syscall.S_IFCHR {
|
|
||||||
if stat.Mode&syscall.S_IFBLK == syscall.S_IFBLK {
|
|
||||||
hdr.Typeflag = tar.TypeBlock
|
|
||||||
} else {
|
|
||||||
hdr.Typeflag = tar.TypeChar
|
|
||||||
}
|
|
||||||
hdr.Devmajor = int64(major(uint64(stat.Rdev)))
|
|
||||||
hdr.Devminor = int64(minor(uint64(stat.Rdev)))
|
|
||||||
} else if stat.Mode&syscall.S_IFIFO == syscall.S_IFIFO ||
|
|
||||||
stat.Mode&syscall.S_IFSOCK == syscall.S_IFSOCK {
|
|
||||||
hdr.Typeflag = tar.TypeFifo
|
|
||||||
} else if stat.Mode&syscall.S_IFREG == syscall.S_IFREG {
|
|
||||||
hdr.Typeflag = tar.TypeReg
|
|
||||||
hdr.Size = stat.Size
|
|
||||||
} else {
|
|
||||||
return fmt.Errorf("Unknown file type: %s\n", path)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := tw.WriteHeader(hdr); err != nil {
|
if err := tw.WriteHeader(hdr); err != nil {
|
||||||
|
|
Loading…
Reference in a new issue