Skip to content

Commit f297303

Browse files
authored
Add support for extracting xattrs on unix (#74)
When extended file attributes are set on a file in the archive, try to preserve them on extraction but do not fail when the user does not have permission to set them or if they are not supported. This should prevent existing usages from breaking while also enabling users to preserve extended file attributes.
1 parent a1359ba commit f297303

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed

extractor/tgz_extractor.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,5 +105,9 @@ func extractTarArchiveFile(header *tar.Header, dest string, input io.Reader) err
105105
defer fileCopy.Close()
106106

107107
_, err = io.Copy(fileCopy, input)
108-
return err
108+
if err != nil {
109+
return err
110+
}
111+
112+
return setXattrsFromTar(filePath, header)
109113
}

extractor/xattr_unix.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//go:build unix
2+
3+
package extractor
4+
5+
import (
6+
"archive/tar"
7+
"errors"
8+
"strings"
9+
"syscall"
10+
11+
"golang.org/x/sys/unix"
12+
)
13+
14+
func setXattrsFromTar(path string, hdr *tar.Header) (err error) {
15+
const paxSchilyXattr = "SCHILY.xattr."
16+
17+
for key, value := range hdr.PAXRecords {
18+
if !strings.HasPrefix(key, paxSchilyXattr) {
19+
continue
20+
}
21+
22+
err = unix.Lsetxattr(path, key[len(paxSchilyXattr):], []byte(value), 0)
23+
if err != nil && !errors.Is(err, syscall.ENOTSUP) && !errors.Is(err, syscall.EPERM) {
24+
return err
25+
}
26+
}
27+
28+
return nil
29+
}

extractor/xattr_windows.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//go:build windows
2+
3+
package extractor
4+
5+
import "archive/tar"
6+
7+
func setXattrsFromTar(_ string, _ *tar.Header) error {
8+
return nil
9+
}

0 commit comments

Comments
 (0)