summaryrefslogtreecommitdiff
path: root/src/export/extract_version_2.c
diff options
context:
space:
mode:
authorDirk Engling <erdgeist@erdgeist.org>2014-02-25 00:30:31 +0100
committerDirk Engling <erdgeist@erdgeist.org>2014-02-25 00:30:31 +0100
commit6922e6678d247af8c9d63df7a3db2fe83c328f7e (patch)
treeacdc9e46b7a79d01b81c4a1cd5383ac2f227e490 /src/export/extract_version_2.c
parentffbf9e8402aad3dff81546937798fe9f9a26289a (diff)
Get rid of warnings uncovered with clangs -Weverything
Diffstat (limited to 'src/export/extract_version_2.c')
-rw-r--r--src/export/extract_version_2.c65
1 files changed, 32 insertions, 33 deletions
diff --git a/src/export/extract_version_2.c b/src/export/extract_version_2.c
index 6686dca..c4914a7 100644
--- a/src/export/extract_version_2.c
+++ b/src/export/extract_version_2.c
@@ -28,10 +28,9 @@ static uint8_t mantra_in[] = { 0x68, 0x35, 0x2d, 0x6c };
28 28
29int main( int args, char **argv ) 29int main( int args, char **argv )
30{ 30{
31 int filenum = 0, run = 1; 31 int filenum = 0, run = 1, first_run = 1;
32 size_t offset = 0, reported = 0, enc_len = 32; 32 size_t offset = 0, old_offset = 0, reported = 0, enc_len = 32;
33 ssize_t oldoffset = -1; 33 uint8_t mantra[4], id0, id5, *mapped_file;
34 uint8_t mantra[4], id0, id5, *mappedfile;
35 MAP map; 34 MAP map;
36 35
37 /* For streets we do have a enc_len of 34 */ 36 /* For streets we do have a enc_len of 34 */
@@ -39,11 +38,11 @@ int main( int args, char **argv )
39 switch( getopt( args, argv, ":e:" ) ) { 38 switch( getopt( args, argv, ":e:" ) ) {
40 case -1 : run = 0; break; 39 case -1 : run = 0; break;
41 case 'e': 40 case 'e':
42 enc_len = atol( optarg ); 41 enc_len = strtoul( optarg, 0, 0 );
43 break; 42 break;
44 default: 43 default:
45 fputs( "Syntax: %s [-e encrypted_length (default: 32, for streets 34 or 0)] path-to-teiln.dat", stderr ); exit( 1 ); 44 fputs( "Syntax: %s [-e encrypted_length (default: 32, for streets 34 or 0)] path-to-teiln.dat", stderr );
46 break; 45 exit( 1 );
47 } 46 }
48 } 47 }
49 run = 1; 48 run = 1;
@@ -52,25 +51,25 @@ int main( int args, char **argv )
52 { fputs( "Missing filename.", stderr ); exit( 1 ); } 51 { fputs( "Missing filename.", stderr ); exit( 1 ); }
53 52
54 map = map_file( argv[optind], 1 ); 53 map = map_file( argv[optind], 1 );
55 mappedfile = map->addr; 54 mapped_file = map->addr;
56 55
57 mantra[0] = mantra_in[0] ^ mappedfile[4]; 56 mantra[0] = mantra_in[0] ^ mapped_file[4];
58 mantra[1] = mantra_in[1] ^ mappedfile[5]; 57 mantra[1] = mantra_in[1] ^ mapped_file[5];
59 mantra[2] = mantra_in[2] ^ mappedfile[2]; 58 mantra[2] = mantra_in[2] ^ mapped_file[2];
60 mantra[3] = mantra_in[3] ^ mappedfile[3]; 59 mantra[3] = mantra_in[3] ^ mapped_file[3];
61 60
62 id0 = mappedfile[0]; 61 id0 = mapped_file[0];
63 id5 = mappedfile[5]; 62 id5 = mapped_file[5];
64 63
65 while( run ) 64 while( run )
66 { 65 {
67 while( ( offset < map->size ) && ( 66 while( ( offset < map->size ) && (
68 ( mappedfile[ offset + 0 ] != id0 ) || 67 ( mapped_file[ offset + 0 ] != id0 ) ||
69 ( mappedfile[ offset + 2 ] != ( '-' ^ mantra[2] )) || 68 ( mapped_file[ offset + 2 ] != ( '-' ^ mantra[2] )) ||
70 ( mappedfile[ offset + 3 ] != ( 'l' ^ mantra[3] )) || 69 ( mapped_file[ offset + 3 ] != ( 'l' ^ mantra[3] )) ||
71 ( mappedfile[ offset + 4 ] != ( 'h' ^ mantra[0] )) || 70 ( mapped_file[ offset + 4 ] != ( 'h' ^ mantra[0] )) ||
72 ( mappedfile[ offset + 5 ] != id5 ) || 71 ( mapped_file[ offset + 5 ] != id5 ) ||
73 ( mappedfile[ offset + 6 ] != ( '-' ^ mantra[2] )) 72 ( mapped_file[ offset + 6 ] != ( '-' ^ mantra[2] ))
74 ) ) offset++; 73 ) ) offset++;
75 74
76 // printf( "Found an appropriate offset at: %zd\n", offset ); 75 // printf( "Found an appropriate offset at: %zd\n", offset );
@@ -85,11 +84,12 @@ int main( int args, char **argv )
85 if( offset == map->size ) 84 if( offset == map->size )
86 run = 0; 85 run = 0;
87 86
88 if( oldoffset != -1 ) 87 if( !first_run )
89 { 88 {
90 uint8_t *mf = mappedfile + oldoffset, df[128]; 89 uint8_t *mf = mapped_file + old_offset, df[128];
91 size_t filename_len, header_len, i; 90 size_t filename_len, header_len, i;
92 char filename_template[32], filename[32]; 91 int fh;
92 char filename[32];
93 93
94 /* De-"crypt" obfuscation to our header copy */ 94 /* De-"crypt" obfuscation to our header copy */
95 for( i=0; i<enc_len; ++i) 95 for( i=0; i<enc_len; ++i)
@@ -104,26 +104,25 @@ int main( int args, char **argv )
104 df[i] = mf[i]; 104 df[i] = mf[i];
105 105
106 /* Make up new sequental file name */ 106 /* Make up new sequental file name */
107 snprintf( filename_template, sizeof(filename_template), "%%0%dd.lha", (int)filename_len ); 107 snprintf( filename, sizeof(filename), "%0*d.lha", (int)filename_len, filenum++ );
108 snprintf( filename, sizeof( filename ), filename_template, filenum++ );
109 memcpy( ((uint8_t*)df) + 22, filename, filename_len); 108 memcpy( ((uint8_t*)df) + 22, filename, filename_len);
110 109
111 /* Recalculate checksum with new file name */ 110 /* Recalculate checksum with new file name */
112 df[1] = 0; for( i=2; i<header_len; ++i) df[1] += df[i]; 111 df[1] = 0; for( i=2; i<header_len; ++i) df[1] += df[i];
113 112
114 /* Open file and dump our de-"crypted" header and then rest of file */ 113 /* Open file and dump our de-"crypted" header and then rest of file */
115 i = open( filename, O_CREAT | O_TRUNC | O_WRONLY, 0644 ); 114 fh = open( filename, O_CREAT | O_TRUNC | O_WRONLY, 0644 );
116 if( enc_len > header_len ) { 115 if( enc_len > header_len ) {
117 write( i, df, enc_len ); 116 write( fh, df, enc_len );
118 write( i, mf + enc_len, offset - oldoffset - enc_len ); 117 write( fh, mf + enc_len, offset - old_offset - enc_len );
119 } else { 118 } else {
120 write( i, df, header_len ); 119 write( fh, df, header_len );
121 write( i, mf + header_len, offset - oldoffset - header_len ); 120 write( fh, mf + header_len, offset - old_offset - header_len );
122 } 121 }
123 close( i ); 122 close( fh );
124 } 123 }
125 oldoffset = offset; 124 first_run = 0;
126 offset++; 125 old_offset = offset++;
127 } 126 }
128 127
129 unmap_file( &map ); 128 unmap_file( &map );