Skip to content

Commit

Permalink
pkg/archive: Use archive_unix.go on FreeBSD
Browse files Browse the repository at this point in the history
Almost all the code can be shared between Linux, FreeBSD and Darwin with
the only different in the handling of lchmod. On FreeBSD and Darwin (and
probably other BSDs) we can access lchmod functionality via
unix.Fchmodat.

Signed-off-by: Doug Rabson <dfr@rabson.org>
  • Loading branch information
dfr committed Sep 29, 2022
1 parent 42f81a2 commit 70871d3
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 150 deletions.
19 changes: 19 additions & 0 deletions pkg/archive/archive_bsd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//go:build freebsd || darwin
// +build freebsd darwin

package archive

import (
"archive/tar"
"os"

"golang.org/x/sys/unix"
)

func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo, forceMask *os.FileMode) error {
permissionsMask := hdrInfo.Mode()
if forceMask != nil {
permissionsMask = *forceMask
}
return unix.Fchmodat(unix.AT_FDCWD, path, uint32(permissionsMask), unix.AT_SYMLINK_NOFOLLOW)
}
129 changes: 0 additions & 129 deletions pkg/archive/archive_freebsd.go

This file was deleted.

19 changes: 19 additions & 0 deletions pkg/archive/archive_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,3 +189,22 @@ func GetFileOwner(path string) (uint32, uint32, uint32, error) {
}
return 0, 0, uint32(f.Mode()), nil
}

func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo, forceMask *os.FileMode) error {
permissionsMask := hdrInfo.Mode()
if forceMask != nil {
permissionsMask = *forceMask
}
if hdr.Typeflag == tar.TypeLink {
if fi, err := os.Lstat(hdr.Linkname); err == nil && (fi.Mode()&os.ModeSymlink == 0) {
if err := os.Chmod(path, permissionsMask); err != nil {
return err
}
}
} else if hdr.Typeflag != tar.TypeSymlink {
if err := os.Chmod(path, permissionsMask); err != nil {
return err
}
}
return nil
}
23 changes: 2 additions & 21 deletions pkg/archive/archive_unix.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//go:build !windows && !freebsd
// +build !windows,!freebsd
//go:build !windows
// +build !windows

package archive

Expand Down Expand Up @@ -101,25 +101,6 @@ func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error {
return system.Mknod(path, mode, system.Mkdev(hdr.Devmajor, hdr.Devminor))
}

func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo, forceMask *os.FileMode) error {
permissionsMask := hdrInfo.Mode()
if forceMask != nil {
permissionsMask = *forceMask
}
if hdr.Typeflag == tar.TypeLink {
if fi, err := os.Lstat(hdr.Linkname); err == nil && (fi.Mode()&os.ModeSymlink == 0) {
if err := os.Chmod(path, permissionsMask); err != nil {
return err
}
}
} else if hdr.Typeflag != tar.TypeSymlink {
if err := os.Chmod(path, permissionsMask); err != nil {
return err
}
}
return nil
}

// Hardlink without symlinks
func handleLLink(targetPath, path string) error {
// Note: on Linux, the link syscall will not follow symlinks.
Expand Down

0 comments on commit 70871d3

Please sign in to comment.