From 0b5a245164641166e852730eaaed8e2a55eb4911 Mon Sep 17 00:00:00 2001 From: Kemal Akkoyun Date: Sun, 25 Feb 2024 15:42:34 +0100 Subject: [PATCH] Add support for glibc 2.39 Signed-off-by: Kemal Akkoyun --- .gitignore | 1 + cmd/debdownload/debdownload.go | 56 +++++++++++++------ cmd/debuginfofind/debuginfofind.go | 2 +- go.mod | 1 + go.sum | 2 + ...2.0 - 2.33.0.yaml => 2.32.0 - 2.35.0.yaml} | 0 ...6.0 - 2.38.0.yaml => 2.36.0 - 2.39.0.yaml} | 0 ...2.0 - 2.33.0.yaml => 2.32.0 - 2.34.0.yaml} | 0 scripts/download/glibc.sh | 3 + scripts/structlayout/glibc.sh | 2 +- 10 files changed, 48 insertions(+), 19 deletions(-) rename pkg/libc/glibc/layout/amd64/{2.32.0 - 2.33.0.yaml => 2.32.0 - 2.35.0.yaml} (100%) rename pkg/libc/glibc/layout/amd64/{2.36.0 - 2.38.0.yaml => 2.36.0 - 2.39.0.yaml} (100%) rename pkg/libc/glibc/layout/arm64/{2.32.0 - 2.33.0.yaml => 2.32.0 - 2.34.0.yaml} (100%) diff --git a/.gitignore b/.gitignore index e803938..4c892d5 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ tmp /debuginfofind /apkdownload /main +/keep diff --git a/cmd/debdownload/debdownload.go b/cmd/debdownload/debdownload.go index 20f7564..ee92d23 100644 --- a/cmd/debdownload/debdownload.go +++ b/cmd/debdownload/debdownload.go @@ -2,7 +2,6 @@ package main import ( "archive/tar" - "bytes" "context" "errors" "fmt" @@ -19,6 +18,8 @@ import ( "github.com/Masterminds/semver/v3" "github.com/blakesmith/ar" + "github.com/klauspost/compress/gzip" + "github.com/klauspost/compress/zstd" "github.com/peterbourgon/ff/v4" "github.com/peterbourgon/ff/v4/ffhelp" "github.com/ulikunitz/xz" @@ -228,10 +229,6 @@ func (c *cli) list(ctx context.Context, pkgUrl, pkgName string, architectures [] } } variant := strings.TrimPrefix(matches[2], "-") - if c.sv == ubuntu && variant == "" { - // No need to download the main package for Ubuntu. - continue - } if variant != "" { if _, ok := allowedVariants[variant]; !ok { continue @@ -356,9 +353,10 @@ func (c *cli) extract(_ context.Context, packages []*pkg, outputDir string) erro continue } - r := ar.NewReader(f) + var extracted bool + ar := ar.NewReader(f) for { - hdr, err := r.Next() + hdr, err := ar.Next() if err == io.EOF { break } @@ -366,23 +364,43 @@ func (c *cli) extract(_ context.Context, packages []*pkg, outputDir string) erro return fmt.Errorf("failed to read next entry: %w", err) } - if hdr.Name != "data.tar.xz" { + if !strings.HasPrefix(hdr.Name, "data.tar.") { continue } - c.logger.Info("extracting tar.xz", "file", hdr.Name) + c.logger.Info("extracting data.tar", "file", hdr.Name) - content, err := io.ReadAll(r) - if err != nil { - return fmt.Errorf("failed to read content: %w", err) - } + var r io.Reader + ext := filepath.Ext(hdr.Name) + switch ext { + case ".xz": + c.logger.Info("extracting tar.xz", "file", hdr.Name) - xzr, err := xz.NewReader(bytes.NewReader(content)) - if err != nil { - return fmt.Errorf("failed to create xz reader: %w", err) + r, err = xz.NewReader(ar) + if err != nil { + return fmt.Errorf("failed to create xz reader: %w", err) + } + case ".zst": + c.logger.Info("extracting tar.zst", "file", hdr.Name) + + r, err = zstd.NewReader(ar) + if err != nil { + return fmt.Errorf("failed to create zstd reader: %w", err) + } + + case ".gz": + c.logger.Info("extracting tar.gz", "file", hdr.Name) + + r, err = gzip.NewReader(ar) + if err != nil { + return fmt.Errorf("failed to create gzip reader: %w", err) + } + + default: + return fmt.Errorf("unsupported extension: %s", ext) } - tr := tar.NewReader(xzr) + tr := tar.NewReader(r) for { hdr, err := tr.Next() if err == io.EOF { @@ -412,8 +430,12 @@ func (c *cli) extract(_ context.Context, packages []*pkg, outputDir string) erro if _, err := io.Copy(f, tr); err != nil { return fmt.Errorf("failed to copy file: %w", err) } + extracted = true } } + if !extracted { + return fmt.Errorf("failed to extract any files") + } } return nil } diff --git a/cmd/debuginfofind/debuginfofind.go b/cmd/debuginfofind/debuginfofind.go index ff75420..34a5b6a 100644 --- a/cmd/debuginfofind/debuginfofind.go +++ b/cmd/debuginfofind/debuginfofind.go @@ -21,7 +21,7 @@ import ( func main() { logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ - Level: slog.LevelDebug, + Level: slog.LevelInfo, })) fSet := ff.NewFlagSet("debdownload") diff --git a/go.mod b/go.mod index b2d42c3..71373b4 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/Masterminds/semver/v3 v3.2.1 github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb github.com/google/go-cmp v0.5.8 + github.com/klauspost/compress v1.17.7 github.com/peterbourgon/ff/v4 v4.0.0-alpha.4 github.com/ulikunitz/xz v0.5.11 golang.org/x/exp v0.0.0-20240119083558-1b970713d09a diff --git a/go.sum b/go.sum index b6fa64e..e595f4a 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb h1:m935MPodAbYS46DG4 github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/peterbourgon/ff/v4 v4.0.0-alpha.4 h1:aiqS8aBlF9PsAKeMddMSfbwp3smONCn3UO8QfUg0Z7Y= diff --git a/pkg/libc/glibc/layout/amd64/2.32.0 - 2.33.0.yaml b/pkg/libc/glibc/layout/amd64/2.32.0 - 2.35.0.yaml similarity index 100% rename from pkg/libc/glibc/layout/amd64/2.32.0 - 2.33.0.yaml rename to pkg/libc/glibc/layout/amd64/2.32.0 - 2.35.0.yaml diff --git a/pkg/libc/glibc/layout/amd64/2.36.0 - 2.38.0.yaml b/pkg/libc/glibc/layout/amd64/2.36.0 - 2.39.0.yaml similarity index 100% rename from pkg/libc/glibc/layout/amd64/2.36.0 - 2.38.0.yaml rename to pkg/libc/glibc/layout/amd64/2.36.0 - 2.39.0.yaml diff --git a/pkg/libc/glibc/layout/arm64/2.32.0 - 2.33.0.yaml b/pkg/libc/glibc/layout/arm64/2.32.0 - 2.34.0.yaml similarity index 100% rename from pkg/libc/glibc/layout/arm64/2.32.0 - 2.33.0.yaml rename to pkg/libc/glibc/layout/arm64/2.32.0 - 2.34.0.yaml diff --git a/scripts/download/glibc.sh b/scripts/download/glibc.sh index def1913..5da69b9 100755 --- a/scripts/download/glibc.sh +++ b/scripts/download/glibc.sh @@ -70,6 +70,9 @@ for arch in $BIN_DIR/$PACKAGE_NAME/*; do if [ ! -f "$target" ]; then target="$variant"/lib/"$linuxArch"-linux-gnu/libc.so.6 fi + if [ ! -f "$target" ]; then + target="$variant"/usr/lib/"$linuxArch"-linux-gnu/libc.so.6 + fi dbginfo=$(./debuginfofind -d "$version"/dbg $target || true) if [ -n "$dbginfo" ]; then dbgTarget="$DEBUGINFO_DIR"/$PACKAGE_NAME/$a/$v/ diff --git a/scripts/structlayout/glibc.sh b/scripts/structlayout/glibc.sh index 2478dd3..a506dbe 100755 --- a/scripts/structlayout/glibc.sh +++ b/scripts/structlayout/glibc.sh @@ -27,7 +27,7 @@ for arch in "${SOURCE_DIR}"/*; do v=$(basename "${version}") a=$(basename "${arch}") echo "Running structlayout against glibc ${v} for ${a}..." - ./structlayout -r glibc -v "${v}" -o "${TARGET_DIR}/${a}" "${dbgfile}" + ./structlayout -r glibc -v "${v}" -o "${TARGET_DIR}/${a}" "${dbgfile}" done done done