Skip to content

Commit

Permalink
Add symlink tree for compatibity with older firmware
Browse files Browse the repository at this point in the history
A lot of firmware binaries use non-standard paths like `/lib`. Add
standard tree of symlink for compatibility.

Closes #104
  • Loading branch information
anatol committed Sep 20, 2021
1 parent 90dd03a commit 2dbf058
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 39 deletions.
8 changes: 4 additions & 4 deletions generator/console.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func (img *Image) enableVirtualConsole(vConsolePath, localePath string) (*Virtua
if err != nil {
return nil, err
}
if err := img.AppendContent(blob, 0644, conf.KeymapFile); err != nil {
if err := img.AppendContent(conf.KeymapFile, 0644, blob); err != nil {
return nil, err
}
} else {
Expand All @@ -56,7 +56,7 @@ func (img *Image) enableVirtualConsole(vConsolePath, localePath string) (*Virtua
return nil, err
}
conf.FontFile = "/console/font"
if err := img.AppendContent(blob, 0644, conf.FontFile); err != nil {
if err := img.AppendContent(conf.FontFile, 0644, blob); err != nil {
return nil, err
}

Expand All @@ -66,7 +66,7 @@ func (img *Image) enableVirtualConsole(vConsolePath, localePath string) (*Virtua
return nil, err
}
conf.FontFile = "/console/font.map"
if err := img.AppendContent(blob, 0644, conf.FontFile); err != nil {
if err := img.AppendContent(conf.FontFile, 0644, blob); err != nil {
return nil, err
}
}
Expand All @@ -77,7 +77,7 @@ func (img *Image) enableVirtualConsole(vConsolePath, localePath string) (*Virtua
return nil, err
}
conf.FontFile = "/console/font.unimap"
if err := img.AppendContent(blob, 0644, conf.FontFile); err != nil {
if err := img.AppendContent(conf.FontFile, 0644, blob); err != nil {
return nil, err
}
}
Expand Down
39 changes: 34 additions & 5 deletions generator/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"strings"
"time"

"github.com/cavaliercoder/go-cpio"
"gopkg.in/yaml.v3"
)

Expand Down Expand Up @@ -125,7 +126,7 @@ func generateInitRamfs(conf *generatorConfig) error {
if err != nil {
return err
}
if err := img.AppendContent(content, 0644, "/etc/mdadm.conf"); err != nil {
if err := img.AppendContent("/etc/mdadm.conf", 0644, content); err != nil {
return err
}
}
Expand Down Expand Up @@ -156,19 +157,47 @@ func generateInitRamfs(conf *generatorConfig) error {
}

// appending initrd-release file per recommendation from https://systemd.io/INITRD_INTERFACE/
if err := img.AppendContent([]byte{}, 0644, "/etc/initrd-release"); err != nil {
if err := img.AppendContent("/etc/initrd-release", 0644, []byte{}); err != nil {
return err
}

if err := appendCompatibilitySymlinks(img); err != nil {
return err
}

return img.Close()
}

// appendCompatibilitySymlinks appends symlinks for compatibility with older firmware that loads extra files from non-standard locations
func appendCompatibilitySymlinks(img *Image) error {
symlinks := []struct{ src, target string }{
{"/lib", "/usr/lib"},
{"/usr/local/lib", "/usr/lib"},
{"/usr/sbin", "/usr/bin"},
{"/bin", "/usr/bin"},
{"/sbin", "/usr/bin"},
{"/usr/local/bin", "/usr/bin"},
{"/usr/local/sbin", "/usr/bin"},
{"/var/run", "/run"},
{"/usr/lib64", "/usr/lib"},
{"/lib64", "/usr/lib"},
}

for _, l := range symlinks {
mode := cpio.FileMode(0777) | cpio.ModeSymlink
if err := img.AppendEntry(l.src, mode, []byte(l.target)); err != nil {
return err
}
}
return nil
}

func (img *Image) appendInitBinary(initBinary string) error {
content, err := os.ReadFile(initBinary)
if err != nil {
return fmt.Errorf("%s: %v", initBinary, err)
}
return img.AppendContent(content, 0755, "/init")
return img.AppendContent("/init", 0755, content)
}

func (img *Image) appendExtraFiles(binaries []string) error {
Expand Down Expand Up @@ -231,7 +260,7 @@ func (img *Image) appendInitConfig(conf *generatorConfig, kmod *Kmod, vconsole *
return err
}

return img.AppendContent(content, 0644, initConfigPath)
return img.AppendContent(initConfigPath, 0644, content)
}

func (img *Image) appendModules(conf *generatorConfig) (*Kmod, error) {
Expand Down Expand Up @@ -289,5 +318,5 @@ func (img *Image) appendAliasesFile(aliases []alias) error {
buff.WriteString(a.module)
buff.WriteString("\n")
}
return img.AppendContent(buff.Bytes(), 0644, imageModulesDir+"booster.alias")
return img.AppendContent(imageModulesDir+"booster.alias", 0644, buff.Bytes())
}
61 changes: 32 additions & 29 deletions generator/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ func stripElf(name string, in []byte, stripAll bool) ([]byte, error) {
return os.ReadFile(t.Name())
}

func (img *Image) AppendContent(content []byte, mode os.FileMode, dest string) error {
func (img *Image) AppendContent(dest string, osMode os.FileMode, content []byte) error {
img.m.Lock()
if img.contains[dest] {
img.m.Unlock()
Expand Down Expand Up @@ -197,19 +197,8 @@ func (img *Image) AppendContent(content []byte, mode os.FileMode, dest string) e
}
}

hdr := &cpio.Header{
Name: strings.TrimPrefix(dest, "/"),
Mode: cpio.FileMode(mode) | cpio.ModeRegular,
Size: int64(len(content)),
}
img.m.Lock()
if err := img.out.WriteHeader(hdr); err != nil {
img.m.Unlock()
return err
}
_, err := img.out.Write(content)
img.m.Unlock()
return err
mode := cpio.FileMode(osMode) | cpio.ModeRegular
return img.AppendEntry(dest, mode, content)
}

// AppendFile appends the file + its dependencies to the ramfs file
Expand Down Expand Up @@ -248,22 +237,10 @@ func (img *Image) AppendFile(fn string) error {
return err
}

hdr := &cpio.Header{
Name: strings.TrimPrefix(fn, "/"),
Mode: cpio.FileMode(fi.Mode().Perm()) | cpio.ModeSymlink,
Size: int64(len(linkTarget)),
}

img.m.Lock()
if err := img.out.WriteHeader(hdr); err != nil {
img.m.Unlock()
return err
}
if _, err := img.out.Write([]byte(linkTarget)); err != nil {
img.m.Unlock()
mode := cpio.FileMode(fi.Mode().Perm()) | cpio.ModeSymlink
if err := img.AppendEntry(fn, mode, []byte(linkTarget)); err != nil {
return err
}
img.m.Unlock()

// now add the link target as well
if !filepath.IsAbs(linkTarget) {
Expand Down Expand Up @@ -293,14 +270,40 @@ func (img *Image) AppendFile(fn string) error {
return err
}

if err := img.AppendContent(content, fi.Mode().Perm(), fn); err != nil {
if err := img.AppendContent(fn, fi.Mode().Perm(), content); err != nil {
return err
}
}

return nil
}

// AppendEntry appends an entry to the archive
func (img *Image) AppendEntry(dest string, fileMode cpio.FileMode, content []byte) error {
if err := img.AppendDirEntry(path.Dir(dest)); err != nil {
return err
}

hdr := &cpio.Header{
Name: strings.TrimPrefix(dest, "/"),
Mode: fileMode,
Size: int64(len(content)),
}

img.m.Lock()
if err := img.out.WriteHeader(hdr); err != nil {
img.m.Unlock()
return err
}
if _, err := img.out.Write(content); err != nil {
img.m.Unlock()
return err
}
img.m.Unlock()

return nil
}

func elfSectionContent(s *elf.Section) (string, error) {
b, err := s.Data()
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion generator/kmod.go
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ func (k *Kmod) addModulesToImage(img *Image) error {
return
}

if err := img.AppendContent(content, 0644, imageModulesDir+modName+".ko"); err != nil {
if err := img.AppendContent(imageModulesDir+modName+".ko", 0644, content); err != nil {
errCh <- err
return
}
Expand Down

0 comments on commit 2dbf058

Please sign in to comment.