Skip to content
This repository was archived by the owner on Mar 27, 2024. It is now read-only.

Commit bc5c88f

Browse files
author
priyawadhwa
authored
Merge pull request #199 from priyawadhwa/extract-hardlinks
Extract hard links from tar
2 parents 6a52189 + e51287a commit bc5c88f

File tree

3 files changed

+3381
-1
lines changed

3 files changed

+3381
-1
lines changed

pkg/util/tar_utils.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,18 @@ package util
1818

1919
import (
2020
"archive/tar"
21+
"fmt"
22+
"github.com/pkg/errors"
2123
"github.com/sirupsen/logrus"
2224
"io"
2325
"os"
2426
"path/filepath"
2527
"strings"
2628
)
2729

30+
// Map of target:linkname
31+
var hardlinks = make(map[string]string)
32+
2833
func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
2934
for {
3035
header, err := tr.Next()
@@ -119,11 +124,38 @@ func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
119124
if err = os.Symlink(header.Linkname, target); err != nil {
120125
logrus.Errorf("Failed to create symlink between %s and %s: %s", header.Linkname, target, err)
121126
}
127+
case tar.TypeLink:
128+
linkname := filepath.Join(path, header.Linkname)
129+
// Check if the linkname already exists
130+
if _, err := os.Stat(linkname); !os.IsNotExist(err) {
131+
// If it exists, create the hard link
132+
resolveHardlink(linkname, target)
133+
} else {
134+
hardlinks[target] = linkname
135+
}
136+
}
137+
}
138+
139+
for target, linkname := range hardlinks {
140+
logrus.Info("Resolving hard links.")
141+
if _, err := os.Stat(linkname); !os.IsNotExist(err) {
142+
// If it exists, create the hard link
143+
if err := resolveHardlink(linkname, target); err != nil {
144+
return errors.Wrap(err, fmt.Sprintf("Unable to create hard link from %s to %s", linkname, target))
145+
}
122146
}
123147
}
124148
return nil
125149
}
126150

151+
func resolveHardlink(linkname, target string) error {
152+
if err := os.Link(linkname, target); err != nil {
153+
return err
154+
}
155+
logrus.Debugf("Created hard link from %s to %s", linkname, target)
156+
return nil
157+
}
158+
127159
func checkWhitelist(target string, whitelist []string) bool {
128160
for _, w := range whitelist {
129161
if HasFilepathPrefix(target, w) {

0 commit comments

Comments
 (0)