Index: xz/extra/scanlzma/scanlzma.c |
=================================================================== |
--- xz/extra/scanlzma/scanlzma.c (revision 0) |
+++ xz/extra/scanlzma/scanlzma.c (revision 0) |
@@ -0,0 +1,84 @@ |
+/* |
+ scanlzma, scan for lzma compressed data in stdin and echo it to stdout. |
+ Copyright (C) 2006 Timo Lindfors |
+ |
+ This program is free software; you can redistribute it and/or modify |
+ it under the terms of the GNU General Public License as published by |
+ the Free Software Foundation; either version 2 of the License, or |
+ (at your option) any later version. |
+ |
+ This program is distributed in the hope that it will be useful, |
+ but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ GNU General Public License for more details. |
+*/ |
+ |
+/* Usage example: |
+ |
+ $ wget http://www.wifi-shop.cz/Files/produkty/wa2204/wa2204av1.4.1.zip |
+ $ unzip wa2204av1.4.1.zip |
+ $ gcc scanlzma.c -o scanlzma -Wall |
+ $ ./scanlzma 0 < WA2204-FW1.4.1/linux-1.4.bin | lzma -c -d | strings | grep -i "copyright" |
+ UpdateDD version 2.5, Copyright (C) 2005 Philipp Benner. |
+ Copyright (C) 2005 Philipp Benner. |
+ Copyright (C) 2005 Philipp Benner. |
+ mawk 1.3%s%s %s, Copyright (C) Michael D. Brennan |
+ # Copyright (C) 1998, 1999, 2001 Henry Spencer. |
+ ... |
+ |
+*/ |
+ |
+ |
+/* LZMA compressed file format */ |
+/* --------------------------- */ |
+/* Offset Size Description */ |
+/* 0 1 Special LZMA properties for compressed data */ |
+/* 1 4 Dictionary size (little endian) */ |
+/* 5 8 Uncompressed size (little endian). -1 means unknown size */ |
+/* 13 Compressed data */ |
+ |
+#define BUFSIZE 4096 |
+ |
+int find_lzma_header(unsigned char *buf) { |
+ return (buf[0] < 0xE1 |
+ && buf[0] == 0x5d |
+ && buf[4] < 0x20 |
+ && (memcmp (buf + 10 , "\x00\x00\x00", 3) == 0 |
+ || (memcmp (buf + 5, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8) == 0))); |
+} |
+ |
+int main(int argc, char *argv[]) { |
+ char buf[BUFSIZE]; |
+ int ret, i, numlzma, blocks=0; |
+ |
+ if (argc != 2) { |
+ printf("usage: %s numlzma < infile | lzma -c -d > outfile\n" |
+ "where numlzma is index of lzma file to extract, starting from zero.\n", |
+ argv[0]); |
+ exit(1); |
+ } |
+ numlzma = atoi(argv[1]); |
+ |
+ for (;;) { |
+ /* Read data. */ |
+ ret = fread(buf, BUFSIZE, 1, stdin); |
+ if (ret != 1) |
+ break; |
+ |
+ /* Scan for signature. */ |
+ for (i = 0; i<BUFSIZE-23; i++) { |
+ if (find_lzma_header(buf+i) && numlzma-- <= 0) { |
+ fwrite(buf+i, (BUFSIZE-i), 1, stdout); |
+ for (;;) { |
+ int ch; |
+ ch = getchar(); |
+ if (ch == EOF) |
+ exit(0); |
+ putchar(ch); |
+ } |
+ } |
+ } |
+ blocks++; |
+ } |
+ return 1; |
+} |
Property changes on: xz/extra/scanlzma/scanlzma.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |