diff options
Diffstat (limited to 'src/export/extract_version_4.c')
| -rw-r--r-- | src/export/extract_version_4.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/export/extract_version_4.c b/src/export/extract_version_4.c new file mode 100644 index 0000000..e0e858d --- /dev/null +++ b/src/export/extract_version_4.c | |||
| @@ -0,0 +1,70 @@ | |||
| 1 | #include <stdlib.h> | ||
| 2 | #include <stdio.h> | ||
| 3 | #include <unistd.h> | ||
| 4 | #include <fcntl.h> | ||
| 5 | #include <string.h> | ||
| 6 | #include <zlib.h> | ||
| 7 | #include "mystdlib.h" | ||
| 8 | |||
| 9 | #define XORLEN (29) | ||
| 10 | #define HUGEBLOCK (8*1024*1024) | ||
| 11 | |||
| 12 | int main(int argc, char **argv) { | ||
| 13 | unsigned const char xorkey [XORLEN] = "Just for Fun. Linus Torvalds."; | ||
| 14 | unsigned char input [XORLEN]; | ||
| 15 | unsigned char output [HUGEBLOCK]; | ||
| 16 | char respath[32]; /* file_XXXXX\0 */ | ||
| 17 | int zres = 0, filenum = 0, resfile; | ||
| 18 | size_t i, offs = 0, reported = 0; | ||
| 19 | MAP in; | ||
| 20 | |||
| 21 | if( argc != 2 ) exit(111); | ||
| 22 | in = map_file( argv[1], 1 ); | ||
| 23 | |||
| 24 | z_stream z; memset( &z, 0, sizeof(z)); | ||
| 25 | |||
| 26 | while( offs < in->size ) { | ||
| 27 | size_t inlen = offs + XORLEN < in->size ? XORLEN : in->size - offs; | ||
| 28 | for( i=0; i<inlen; ++i ) input[i] = in->addr[offs+i] ^ xorkey[i]; | ||
| 29 | z.next_in = input; z.avail_in = inlen; | ||
| 30 | z.next_out = output; z.avail_out = HUGEBLOCK; | ||
| 31 | inflateInit( &z ); zres = inflate( &z, Z_NO_FLUSH ); | ||
| 32 | if( (zres != Z_OK) && (zres != Z_STREAM_END) ) | ||
| 33 | goto error_continue; | ||
| 34 | |||
| 35 | z.next_in = in->addr + offs + inlen; | ||
| 36 | z.avail_in = (unsigned int)(in->size - offs - inlen); | ||
| 37 | while( zres == Z_OK ) zres = inflate( &z, Z_NO_FLUSH ); | ||
| 38 | |||
| 39 | if( zres != Z_STREAM_END ) { | ||
| 40 | error_continue: | ||
| 41 | inflateEnd(&z); memset( &z, 0, sizeof(z)); | ||
| 42 | offs++; | ||
| 43 | continue; | ||
| 44 | } | ||
| 45 | |||
| 46 | sprintf( respath, "file_%05X", filenum++ ); | ||
| 47 | |||
| 48 | resfile = open( respath, O_RDWR | O_CREAT, 0644 ); | ||
| 49 | if( resfile < 0 ) { | ||
| 50 | fprintf( stderr, "Could not open output file %s\n", respath ); | ||
| 51 | exit(1); | ||
| 52 | } | ||
| 53 | write( resfile, output, z.total_out ); | ||
| 54 | close( resfile ); | ||
| 55 | offs += z.total_in; | ||
| 56 | |||
| 57 | if( reported < ( offs * 10 ) / in->size ) { | ||
| 58 | reported++; | ||
| 59 | printf( "%zd%% ", 10 * reported ); | ||
| 60 | fflush( stdout ); | ||
| 61 | } | ||
| 62 | |||
| 63 | inflateEnd(&z); memset( &z, 0, sizeof(z)); | ||
| 64 | } | ||
| 65 | unmap_file(&in); | ||
| 66 | if( reported < 10 ) | ||
| 67 | printf( "100%% " ); | ||
| 68 | fflush( stdout ); | ||
| 69 | return 0; | ||
| 70 | } | ||
