diff --git a/trunk/novell4gentoo/app-arch/rpm5offset/ChangeLog b/trunk/novell4gentoo/app-arch/rpm5offset/ChangeLog index 5c80ae0..2c7e54b 100644 --- a/trunk/novell4gentoo/app-arch/rpm5offset/ChangeLog +++ b/trunk/novell4gentoo/app-arch/rpm5offset/ChangeLog @@ -1,7 +1,13 @@ # ChangeLog for app-arch/rpm5offset -# Copyright 1999-2009 Gentoo Foundation; Distributed under the GPL v2 +# Copyright 1999-2011 Gentoo Foundation; Distributed under the GPL v2 # $Header: $ +*rpm5offset-9.0-r2 (28 Oct 2011) + + 28 Oct 2011; Mario Fetka -rpm5offset-9.0.ebuild, + -rpm5offset-9.0-r1.ebuild, +rpm5offset-9.0-r2.ebuild, files/rpmoffset.c: + Bump + *rpm5offset-9.0-r1 (09 Sep 2009) 09 Sep 2009; Mario Fetka diff --git a/trunk/novell4gentoo/app-arch/rpm5offset/Manifest b/trunk/novell4gentoo/app-arch/rpm5offset/Manifest index a7d2553..7c59daa 100644 --- a/trunk/novell4gentoo/app-arch/rpm5offset/Manifest +++ b/trunk/novell4gentoo/app-arch/rpm5offset/Manifest @@ -1,5 +1,4 @@ -AUX rpmoffset.c 1964 RMD160 acea626f5080b7ea47863cf9e3bc2ab3b381c61e SHA1 5ec35b3d37773ca4a09443c6ea687c7d3a739f34 SHA256 e1e18d68009bd4541d6c65b43f45b58d720b9c87eba612d7616e244142f80dfe -EBUILD rpm5offset-9.0-r1.ebuild 653 RMD160 4da00e851208ae017289a981bf221125bed1300e SHA1 d7585e5c0953ae6106dcd1dd16eb4ac14c11b80a SHA256 84511d3c96d0269d0105cd2aede19170f7b421bea7bc921de47da221320e4139 -EBUILD rpm5offset-9.0.ebuild 628 RMD160 cf664dc26a5305e9d85b29ef89f9a1faf26bbae2 SHA1 c08ecbb217ffa829d134544c78fbbeb451510193 SHA256 5b9561a70c0dece76fb9e4f94690e8b8cf143dd98edf08d13938a922ce0eaef5 -MISC ChangeLog 359 RMD160 bf3896dfe95be868cff866614fe45990b1ade8e0 SHA1 de47c41139412e2e786222dd562b5ed8df0e36f5 SHA256 10185acde0bf53f6596e95e8fdc496e0a209dc7790b92a2e07f8370620b3a1cf +AUX rpmoffset.c 2755 RMD160 00f9a7e8dd8117eded73ead581e7bce9c40ed5af SHA1 cbe8b9f226c03d9b2b988d756adf507857bc47ce SHA256 b43c6bf2c3623d3fbc304ff3a804cf568caa7cd2d702ff5043ac8eda3c4fb42d +EBUILD rpm5offset-9.0-r2.ebuild 653 RMD160 2f85563f7df4e5548f241bb1ee870a311f9587bb SHA1 c242da35e6e69aa1fd8514c5a03977fd7c837f09 SHA256 74aed2a38c21a7be598b6f60ac9820807ff9ee2ab29023863faad265fb00107a +MISC ChangeLog 551 RMD160 097d5f93696e887e988fed531abda20ca9628152 SHA1 8f7cb8b55fb8f2ce542fb10cbd6e96723a472ac4 SHA256 0e1b6be4ddf6c2e697320ee1e1bdea987c5a8fa7f55b7f60147e89ff26d5ea83 MISC metadata.xml 170 RMD160 645927a396fdc21cdeb089fe42c5397332420ea6 SHA1 ac7f48a14fec325926f9ce1be8fbf1f311b4f2e4 SHA256 d797a2ec6f9dc516c9f9c1a758ee87ad3e8c43101b5dc76c2f872d5bd4639b42 diff --git a/trunk/novell4gentoo/app-arch/rpm5offset/files/rpmoffset.c b/trunk/novell4gentoo/app-arch/rpm5offset/files/rpmoffset.c index 61a4624..1701c40 100644 --- a/trunk/novell4gentoo/app-arch/rpm5offset/files/rpmoffset.c +++ b/trunk/novell4gentoo/app-arch/rpm5offset/files/rpmoffset.c @@ -4,69 +4,118 @@ /* Wouldn't it be a lot more sane if we could just untar these things? */ -#include +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + +#include #include +#include -/* These offsets keep getting bigger, so we're going to just bite a 2MB */ -/* chunk of RAM right away so that we have enough. Yeah, horrible */ -/* quick and dirty implementation, but hey -- it gets the job done. */ +#ifndef ARRAY_SIZE +# define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +#endif +#ifndef BUFSIZ +# define BUFSIZ 8192 +#endif -#define RPMBUFSIZ 3145728 +typedef struct { + const char *type; + const unsigned char *magic; + const size_t len; +} magic_t; -main() +/* LZMA is some fuzzy crap */ +int is_magic_lzma(const char *buf) { - char *buff = malloc(RPMBUFSIZ),*eb,*p; - for (p = buff, eb = buff + read(0,buff,RPMBUFSIZ); p < eb; p++) - { + return (buf[0] == 0x5d && buf[4] < 0x20) && + (!memcmp(buf + 10, "\x00\x00\x00", 3) || + !memcmp(buf + 5, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8)); +} +#define magic_lzma_len 13 - /* gzip format */ - if (*p == '\037' && p[1] == '\213' && p[2] == '\010') - { - printf("%ld\n",p - buff); - exit(0); +static const unsigned char magic_gzip[] = { '\037', '\213', '\010' }; +static const unsigned char magic_bzip2[] = { 'B', 'Z', 'h' }; +static const unsigned char magic_xz[] = { 0xFD, '7', 'z', 'X', 'Z', 0x00 }; +static const magic_t magics[] = { +#define DECLARE_MAGIC_T(t) { .type = #t, .magic = magic_##t, .len = sizeof(magic_##t), }, + DECLARE_MAGIC_T(gzip) + DECLARE_MAGIC_T(bzip2) + DECLARE_MAGIC_T(xz) +#undef DECLARE_MAGIC_T +}; +#define MAGIC_SIZE_MIN 3 +#define MAGIC_SIZE_MAX 13 + +static int show_magic; + +static int magic_finish(const char *magic, size_t offset) +{ + if (show_magic) + printf("%s ", magic); + printf("%zu\n", offset); + return 0; +} + +int main(int argc, char *argv[]) +{ + size_t i, read_cnt, offset, left, lzma_offset; + FILE *fp = stdin; + char p[BUFSIZ]; + + if (argc == 2 && !strcmp(argv[1], "-v")) { + show_magic = 1; + --argc; + } + + if (argc != 1) { + puts("Usage: rpmoffset < rpmfile"); + return 1; + } + /* fp = fopen(argv[1], "r"); */ + + lzma_offset = 0; + offset = left = 0; + while (1) { + read_cnt = fread(p + left, 1, sizeof(p) - left, fp); + if (read_cnt + left < MAGIC_SIZE_MIN) + break; + + for (i = 0; i < ARRAY_SIZE(magics); ++i) { + const char *needle; + + if (read_cnt + left < magics[i].len) + continue; + + needle = memmem(p, sizeof(p), magics[i].magic, magics[i].len); + if (needle) + return magic_finish(magics[i].type, offset + (needle - p)); } - /* bzip2 format */ - else if (*p == 'B' && p[1] == 'Z' && p[2] == 'h' ) - { - printf("%ld\n",p - buff); - exit(0); + /* Scan for LZMA magic, but don't return yet ... */ + if (!lzma_offset && read_cnt + left >= magic_lzma_len) { + for (i = 0; i <= read_cnt + left - magic_lzma_len; ++i) + if (is_magic_lzma(p + i)) { + lzma_offset = offset + i; + break; + } } - /* LZMA files; both LZMA_Alone and LZMA utils formats. The LZMA_Alone - * format is used by the LZMA_Alone tool from LZMA SDK. The LZMA utils - * format is the default format of LZMA utils 4.32.1 and later. */ + memmove(p, p + left + read_cnt - MAGIC_SIZE_MIN + 1, MAGIC_SIZE_MIN - 1); - /* LZMA utils format */ - else if (*p == '\377' && p[1] == 'L' && - p[2] == 'Z' && p[3] == 'M' && - p[4] == 'A' && p[5] == '\000') - { - printf("%ld\n",p - buff); - exit(0); - } - - /* The LZMA_Alone format has no magic bytes, thus we - * need to play a wizard. This can give false positives, - * thus the detection below should be removed when - * the newer LZMA utils format has got popular. */ -// else if (*p == 0x5D && p[1] == 0x00 && - else if (*p == '\135' && - p[5] == '\377' && p[6] == '\377' && - p[7] == '\377' && p[8] == '\377' && - p[9] == '\377' && p[10] == '\377' && - p[11] == '\377' && p[12] == '\377') - -/* ((p[10] == 0x00 && p[11] == 0x00 && - p[12] == 0x00) || - (p[5] == 0xFF && p[6] == 0xFF && - p[7] == 0xFF && p[8] == 0xFF && - p[9] == 0xFF && p[10] == 0xFF && - p[11] == 0xFF && p[12] == 0xFF))) -*/ { - printf("%ld\n",p - buff); - exit(0); + offset += read_cnt; + if (left == 0) { + offset -= MAGIC_SIZE_MIN - 1; + left = MAGIC_SIZE_MIN - 1; } } - exit(1); + + /* Delay till the end for LZMA archives since it is too fuzzy */ + if (lzma_offset) + return magic_finish("lzma", lzma_offset); + + if (ferror(stdin)) + perror(argv[0]); + + return 1; } diff --git a/trunk/novell4gentoo/app-arch/rpm5offset/rpm5offset-9.0-r1.ebuild b/trunk/novell4gentoo/app-arch/rpm5offset/rpm5offset-9.0-r2.ebuild similarity index 93% rename from trunk/novell4gentoo/app-arch/rpm5offset/rpm5offset-9.0-r1.ebuild rename to trunk/novell4gentoo/app-arch/rpm5offset/rpm5offset-9.0-r2.ebuild index 2251aae..ab179f0 100644 --- a/trunk/novell4gentoo/app-arch/rpm5offset/rpm5offset-9.0-r1.ebuild +++ b/trunk/novell4gentoo/app-arch/rpm5offset/rpm5offset-9.0-r2.ebuild @@ -1,4 +1,4 @@ -# Copyright 1999-2009 Gentoo Foundation +# Copyright 1999-2011 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ diff --git a/trunk/novell4gentoo/app-arch/rpm5offset/rpm5offset-9.0.ebuild b/trunk/novell4gentoo/app-arch/rpm5offset/rpm5offset-9.0.ebuild deleted file mode 100644 index 6090fc1..0000000 --- a/trunk/novell4gentoo/app-arch/rpm5offset/rpm5offset-9.0.ebuild +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 1999-2008 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: $ - -inherit toolchain-funcs - -DESCRIPTION="Find how deeply inside an .RPM the real data is" -HOMEPAGE="http://www.slackware.com/config/packages.php" -SRC_URI="" - -LICENSE="as-is" -SLOT="0" -KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~x86-fbsd" -IUSE="userland_GNU" - -RDEPEND="app-arch/cpio - app-arch/lzma-utils" -DEPEND="${DEPEND}" - -src_compile() { - "$(tc-getCC)" ${CFLAGS} ${LDFLAGS} ${FILESDIR}/rpmoffset.c -o rpm5offset || die -} - -src_install() { - dobin rpm5offset || die -}