diff --git a/cmd/stbak/cmd/archive.go b/cmd/stbak/cmd/archive.go index 638f2fc..0612038 100644 --- a/cmd/stbak/cmd/archive.go +++ b/cmd/stbak/cmd/archive.go @@ -7,14 +7,12 @@ import ( "io/fs" "os" "path/filepath" - "syscall" - "time" + "github.com/pojntfx/stfs/pkg/adapters" "github.com/pojntfx/stfs/pkg/controllers" "github.com/pojntfx/stfs/pkg/formatting" "github.com/spf13/cobra" "github.com/spf13/viper" - "golang.org/x/sys/unix" ) const ( @@ -102,22 +100,10 @@ var archiveCmd = &cobra.Command{ return err } - var unixStat syscall.Stat_t - if err := syscall.Stat(path, &unixStat); err != nil { + if err := adapters.EnhanceHeader(path, hdr); err != nil { return err } - mtimesec, mtimensec := unixStat.Mtim.Unix() - atimesec, atimensec := unixStat.Atim.Unix() - ctimesec, ctimensec := unixStat.Ctim.Unix() - - hdr.ModTime = time.Unix(mtimesec, mtimensec) - hdr.AccessTime = time.Unix(atimesec, atimensec) - hdr.ChangeTime = time.Unix(ctimesec, ctimensec) - - hdr.Devmajor = int64(unix.Major(unixStat.Dev)) - hdr.Devminor = int64(unix.Minor(unixStat.Dev)) - hdr.Name = path hdr.Format = tar.FormatPAX diff --git a/pkg/adapters/darwin.go b/pkg/adapters/darwin.go new file mode 100644 index 0000000..84afaae --- /dev/null +++ b/pkg/adapters/darwin.go @@ -0,0 +1,22 @@ +//go:build darwin + +package adapters + +import ( + "archive/tar" + "syscall" + + "golang.org/x/sys/unix" +) + +func EnhanceHeader(path string, hdr *tar.Header) error { + var unixStat syscall.Stat_t + if err := syscall.Stat(path, &unixStat); err != nil { + return err + } + + hdr.Devmajor = int64(unix.Major(uint64(unixStat.Dev))) + hdr.Devminor = int64(unix.Minor(uint64(unixStat.Dev))) + + return nil +} diff --git a/pkg/adapters/dragonfly.go b/pkg/adapters/dragonfly.go new file mode 100644 index 0000000..66e5895 --- /dev/null +++ b/pkg/adapters/dragonfly.go @@ -0,0 +1,31 @@ +//go:build dragonfly || openbsd || (linux && mips64) || (linux && mips) || (linux && mipsle) || (linux && mips64le) + +package adapters + +import ( + "archive/tar" + "syscall" + "time" + + "golang.org/x/sys/unix" +) + +func EnhanceHeader(path string, hdr *tar.Header) error { + var unixStat syscall.Stat_t + if err := syscall.Stat(path, &unixStat); err != nil { + return err + } + + mtimesec, mtimensec := unixStat.Mtim.Unix() + atimesec, atimensec := unixStat.Atim.Unix() + ctimesec, ctimensec := unixStat.Ctim.Unix() + + hdr.ModTime = time.Unix(mtimesec, mtimensec) + hdr.AccessTime = time.Unix(atimesec, atimensec) + hdr.ChangeTime = time.Unix(ctimesec, ctimensec) + + hdr.Devmajor = int64(unix.Major(uint64(unixStat.Dev))) + hdr.Devminor = int64(unix.Minor(uint64(unixStat.Dev))) + + return nil +} diff --git a/pkg/adapters/freebsd.go b/pkg/adapters/freebsd.go new file mode 100644 index 0000000..ec95819 --- /dev/null +++ b/pkg/adapters/freebsd.go @@ -0,0 +1,22 @@ +//go:build freebsd || netbsd + +package adapters + +import ( + "archive/tar" + "syscall" + + "golang.org/x/sys/unix" +) + +func EnhanceHeader(path string, hdr *tar.Header) error { + var unixStat syscall.Stat_t + if err := syscall.Stat(path, &unixStat); err != nil { + return err + } + + hdr.Devmajor = int64(unix.Major(unixStat.Dev)) + hdr.Devminor = int64(unix.Minor(unixStat.Dev)) + + return nil +} diff --git a/pkg/adapters/js.go b/pkg/adapters/js.go new file mode 100644 index 0000000..4b2182c --- /dev/null +++ b/pkg/adapters/js.go @@ -0,0 +1,11 @@ +//go:build js || windows + +package adapters + +import ( + "archive/tar" +) + +func EnhanceHeader(path string, hdr *tar.Header) error { + return nil +} diff --git a/pkg/adapters/linux.go b/pkg/adapters/linux.go new file mode 100644 index 0000000..802012f --- /dev/null +++ b/pkg/adapters/linux.go @@ -0,0 +1,31 @@ +//go:build !(freebsd || darwin || dragonfly || js || netbsd || openbsd || windows || (linux && mips64) || (linux && mips) || (linux && mipsle) || (linux && mips64le)) + +package adapters + +import ( + "archive/tar" + "syscall" + "time" + + "golang.org/x/sys/unix" +) + +func EnhanceHeader(path string, hdr *tar.Header) error { + var unixStat syscall.Stat_t + if err := syscall.Stat(path, &unixStat); err != nil { + return err + } + + mtimesec, mtimensec := unixStat.Mtim.Unix() + atimesec, atimensec := unixStat.Atim.Unix() + ctimesec, ctimensec := unixStat.Ctim.Unix() + + hdr.ModTime = time.Unix(mtimesec, mtimensec) + hdr.AccessTime = time.Unix(atimesec, atimensec) + hdr.ChangeTime = time.Unix(ctimesec, ctimensec) + + hdr.Devmajor = int64(unix.Major(unixStat.Dev)) + hdr.Devminor = int64(unix.Minor(unixStat.Dev)) + + return nil +}