Gentoo Archives: gentoo-commits

From: Fabian Groffen <grobian@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage-utils:master commit in: /
Date: Wed, 01 Aug 2018 13:28:53
Message-Id: 1533129992.e04d4940401a13f6851c732b70bdba0a64902d10.grobian@gentoo
1 commit: e04d4940401a13f6851c732b70bdba0a64902d10
2 Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
3 AuthorDate: Wed Aug 1 13:26:32 2018 +0000
4 Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
5 CommitDate: Wed Aug 1 13:26:32 2018 +0000
6 URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=e04d4940
7
8 qmerge: implement laymans file identification, bug #660508
9
10 Portage can create binpkgs compressed differently than with bzip2, so
11 try to probe the file quickly before untarring, so we can use the
12 correct flag with tar.
13
14 Bug: https://bugs.gentoo.org/660508
15
16 qmerge.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
17 1 file changed, 46 insertions(+), 2 deletions(-)
18
19 diff --git a/qmerge.c b/qmerge.c
20 index 54d6a79..6d98c43 100644
21 --- a/qmerge.c
22 +++ b/qmerge.c
23 @@ -773,6 +773,7 @@ pkg_merge(int level, const depend_atom *atom, const struct pkg_t *pkg)
24 char **iargv;
25 char c;
26 int iargc;
27 + const char *compr;
28
29 if (!install || !pkg || !atom)
30 return;
31 @@ -914,11 +915,54 @@ pkg_merge(int level, const depend_atom *atom, const struct pkg_t *pkg)
32 if (run_applet_l("qxpak", "-d", "vdb", "-x", tbz2, NULL) != 0)
33 err("`qxpak -d vdb -x %s` failed", tbz2);
34
35 + /* figure out if the data is compressed differently from what the
36 + * name suggests, bug #660508, usage of BINPKG_COMPRESS,
37 + * due to the minimal nature of where we run, we cannot rely on file
38 + * or GNU tar, so have to do some laymans MAGIC hunting ourselves */
39 + compr = "j"; /* default: bzip2 */
40 + {
41 + /* bz2: 2-byte: 'B' 'Z' at byte 0
42 + * gz: 4-byte: 1f 8b at byte 0
43 + * xz: 4-byte: '7' 'z' 'X' 'Z' at byte 1
44 + * tar: 6-byte: 'u' 's' 't' 'a' 'r' \0 at byte 257 */
45 + unsigned char magic[257+6];
46 + FILE *mfd;
47 +
48 + sprintf(tbz2, "%s.tar.bz2", pkg->PF);
49 + mfd = fopen(tbz2, "r");
50 + if (mfd != NULL) {
51 + size_t mlen = fread(magic, 1, sizeof(magic), mfd);
52 + fclose(mfd);
53 +
54 + if (mlen >= 2 && magic[0] == 'B' && magic[1] == 'Z') {
55 + compr = "j";
56 + } else if (mlen >= 4 &&
57 + magic[0] == 037 && magic[1] == 0213 &&
58 + magic[2] == 010 && magic[3] == 00)
59 + {
60 + compr = "z";
61 + } else if (mlen >= 5 &&
62 + magic[1] == '7' && magic[2] == 'z' &&
63 + magic[3] == 'X' && magic[4] == 'Z')
64 + {
65 + compr = "J";
66 + } else if (mlen == 257+6 &&
67 + magic[257] == 'u' && magic[258] == 's' &&
68 + magic[259] == 't' && magic[260] == 'a' &&
69 + magic[261] == 'r' && magic[262] == '\0')
70 + {
71 + compr = "";
72 + }
73 + }
74 + }
75 +
76 free(tbz2);
77
78 - /* extrct the binary package data */
79 + /* extract the binary package data */
80 mkdir("image", 0755);
81 - snprintf(buf, sizeof(buf), BUSYBOX " tar -jx%sf %s.tar.bz2 -C image/", ((verbose > 1) ? "v" : ""), pkg->PF);
82 + snprintf(buf, sizeof(buf),
83 + BUSYBOX " tar -%sx%sf %s.tar.bz2 -C image/",
84 + compr, ((verbose > 1) ? "v" : ""), pkg->PF);
85 xsystem(buf);
86 fflush(stdout);