archive,hookfiles: convert paths to usr-merge when necessary (MR 39)
Co-authored-by: Caleb Connolly <caleb@postmarketos.org>
This commit is contained in:
@@ -237,7 +237,10 @@ func (archive *Archive) AddItemsExclude(flister filelist.FileLister, exclude fil
|
|||||||
|
|
||||||
// Adds the given file or directory at "source" to the archive at "dest"
|
// Adds the given file or directory at "source" to the archive at "dest"
|
||||||
func (archive *Archive) AddItem(source string, dest string) error {
|
func (archive *Archive) AddItem(source string, dest string) error {
|
||||||
|
if osutil.HasMergedUsr() {
|
||||||
|
source = osutil.MergeUsr(source)
|
||||||
|
dest = osutil.MergeUsr(dest)
|
||||||
|
}
|
||||||
sourceStat, err := os.Lstat(source)
|
sourceStat, err := os.Lstat(source)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e, ok := err.(*os.PathError)
|
e, ok := err.(*os.PathError)
|
||||||
|
@@ -11,6 +11,7 @@ import (
|
|||||||
|
|
||||||
"gitlab.com/postmarketOS/postmarketos-mkinitfs/internal/filelist"
|
"gitlab.com/postmarketOS/postmarketos-mkinitfs/internal/filelist"
|
||||||
"gitlab.com/postmarketOS/postmarketos-mkinitfs/internal/misc"
|
"gitlab.com/postmarketOS/postmarketos-mkinitfs/internal/misc"
|
||||||
|
"gitlab.com/postmarketOS/postmarketos-mkinitfs/internal/osutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
type HookFiles struct {
|
type HookFiles struct {
|
||||||
@@ -64,6 +65,9 @@ func slurpFiles(fd io.Reader) (*filelist.FileList, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
src, dest, has_dest := strings.Cut(line, ":")
|
src, dest, has_dest := strings.Cut(line, ":")
|
||||||
|
if osutil.HasMergedUsr() {
|
||||||
|
src = osutil.MergeUsr(src)
|
||||||
|
}
|
||||||
|
|
||||||
fFiles, err := misc.GetFiles([]string{src}, true)
|
fFiles, err := misc.GetFiles([]string{src}, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -27,6 +27,27 @@ func HasMergedUsr() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Converts given path to one supported by a merged /usr config.
|
||||||
|
// E.g., /bin/foo becomes /usr/bin/foo, /lib/bar becomes /usr/lib/bar
|
||||||
|
// See: https://www.freedesktop.org/wiki/Software/systemd/TheCaseForTheUsrMerge
|
||||||
|
func MergeUsr(file string) string {
|
||||||
|
|
||||||
|
// Prepend /usr to supported paths
|
||||||
|
for _, prefix := range []string{"/bin", "/sbin", "/lib", "/lib64"} {
|
||||||
|
if strings.HasPrefix(file, prefix) {
|
||||||
|
file = filepath.Join("/usr", file)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert /usr/sbin --> /usr/bin
|
||||||
|
if part, found := strings.CutPrefix(file, "/usr/sbin"); found {
|
||||||
|
file = filepath.Join("/usr/bin/", part)
|
||||||
|
}
|
||||||
|
|
||||||
|
return file
|
||||||
|
}
|
||||||
|
|
||||||
// Converts a relative symlink target path (e.g. ../../lib/foo.so), that is
|
// Converts a relative symlink target path (e.g. ../../lib/foo.so), that is
|
||||||
// absolute path
|
// absolute path
|
||||||
func RelativeSymlinkTargetToDir(symPath string, dir string) (string, error) {
|
func RelativeSymlinkTargetToDir(symPath string, dir string) (string, error) {
|
||||||
|
49
internal/osutil/osutil_test.go
Normal file
49
internal/osutil/osutil_test.go
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
// Copyright 2024 Clayton Craft <clayton@craftyguy.net>
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
package osutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMergeUsr(t *testing.T) {
|
||||||
|
subtests := []struct {
|
||||||
|
in string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
in: "/bin/foo",
|
||||||
|
expected: "/usr/bin/foo",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
in: "/sbin/foo",
|
||||||
|
expected: "/usr/bin/foo",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
in: "/usr/sbin/foo",
|
||||||
|
expected: "/usr/bin/foo",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
in: "/usr/bin/foo",
|
||||||
|
expected: "/usr/bin/foo",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
in: "/lib/foo.so",
|
||||||
|
expected: "/usr/lib/foo.so",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
in: "/lib64/foo.so",
|
||||||
|
expected: "/usr/lib64/foo.so",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, st := range subtests {
|
||||||
|
t.Run(st.in, func(t *testing.T) {
|
||||||
|
out := MergeUsr(st.in)
|
||||||
|
if out != st.expected {
|
||||||
|
t.Fatalf("expected: %q, got: %q\n", st.expected, out)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user