summaryrefslogtreecommitdiff
path: root/tools/iriver.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/iriver.c')
-rw-r--r--tools/iriver.c89
1 files changed, 44 insertions, 45 deletions
diff --git a/tools/iriver.c b/tools/iriver.c
index 53e8fbe7a7..dd5d607a89 100644
--- a/tools/iriver.c
+++ b/tools/iriver.c
@@ -99,6 +99,7 @@ static FILE * openoutfile( const char * filename )
99int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify, 99int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify,
100 enum striptype stripmode ) 100 enum striptype stripmode )
101{ 101{
102 int rv = 0;
102 FILE * infile = NULL; 103 FILE * infile = NULL;
103 FILE * outfile = NULL; 104 FILE * outfile = NULL;
104 int i = -1; 105 int i = -1;
@@ -110,7 +111,7 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify
110 unsigned char newmunge; 111 unsigned char newmunge;
111 signed long lenread; 112 signed long lenread;
112 int s = 0; 113 int s = 0;
113 unsigned char * pChecksums, * ppChecksums = 0; 114 unsigned char * pChecksums = NULL, * ppChecksums = NULL;
114 unsigned char ck; 115 unsigned char ck;
115 116
116 infile = openinfile(infile_name); 117 infile = openinfile(infile_name);
@@ -121,9 +122,8 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify
121 { 122 {
122 fprintf( stderr, "This doesn't look like a valid encrypted iHP " 123 fprintf( stderr, "This doesn't look like a valid encrypted iHP "
123 "firmware - reason: header length\n" ); 124 "firmware - reason: header length\n" );
124 fclose(infile); 125 rv = -1;
125 fclose(outfile); 126 goto bail;
126 return -1;
127 }; 127 };
128 128
129 i = testheader( headerdata ); 129 i = testheader( headerdata );
@@ -131,9 +131,8 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify
131 { 131 {
132 fprintf( stderr, "This firmware is for an unknown model, or is not" 132 fprintf( stderr, "This firmware is for an unknown model, or is not"
133 " a valid encrypted iHP firmware\n" ); 133 " a valid encrypted iHP firmware\n" );
134 fclose(infile); 134 rv = -2;
135 fclose(outfile); 135 goto bail;
136 return -2;
137 }; 136 };
138 fprintf( stderr, "Model %s\n", models[ i ] ); 137 fprintf( stderr, "Model %s\n", models[ i ] );
139 138
@@ -151,9 +150,8 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify
151 { 150 {
152 fprintf( stderr, "This doesn't look like a valid encrypted " 151 fprintf( stderr, "This doesn't look like a valid encrypted "
153 "iHP firmware - reason: file 'length' data\n" ); 152 "iHP firmware - reason: file 'length' data\n" );
154 fclose(infile); 153 rv = -3;
155 fclose(outfile); 154 goto bail;
156 return -3;
157 }; 155 };
158 156
159 minsize = firmware_minsize[i]; 157 minsize = firmware_minsize[i];
@@ -226,18 +224,16 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify
226 { 224 {
227 fprintf( stderr, "This doesn't look like a valid encrypted " 225 fprintf( stderr, "This doesn't look like a valid encrypted "
228 "iHP firmware - reason: ESTFBINR 'length' data\n" ); 226 "iHP firmware - reason: ESTFBINR 'length' data\n" );
229 fclose(infile); 227 rv = -4;
230 fclose(outfile); 228 goto bail;
231 return -4;
232 }; 229 };
233 230
234 if( fp != dwLength2 ) 231 if( fp != dwLength2 )
235 { 232 {
236 fprintf( stderr, "This doesn't look like a valid encrypted " 233 fprintf( stderr, "This doesn't look like a valid encrypted "
237 "iHP firmware - reason: 'length2' mismatch\n" ); 234 "iHP firmware - reason: 'length2' mismatch\n" );
238 fclose(infile); 235 rv = -5;
239 fclose(outfile); 236 goto bail;
240 return -5;
241 }; 237 };
242 238
243 fp = 0; 239 fp = 0;
@@ -252,9 +248,8 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify
252 { 248 {
253 fprintf( stderr, "This doesn't look like a valid encrypted " 249 fprintf( stderr, "This doesn't look like a valid encrypted "
254 "iHP firmware - reason: Checksum mismatch!" ); 250 "iHP firmware - reason: Checksum mismatch!" );
255 fclose(infile); 251 rv = -6;
256 fclose(outfile); 252 goto bail;
257 return -6;
258 }; 253 };
259 ppChecksums += lenread; 254 ppChecksums += lenread;
260 }; 255 };
@@ -263,9 +258,8 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify
263 { 258 {
264 fprintf( stderr, "This doesn't look like a valid encrypted " 259 fprintf( stderr, "This doesn't look like a valid encrypted "
265 "iHP firmware - reason: 'length3' mismatch\n" ); 260 "iHP firmware - reason: 'length3' mismatch\n" );
266 fclose(infile); 261 rv = -7;
267 fclose(outfile); 262 goto bail;
268 return -7;
269 }; 263 };
270 264
271 265
@@ -287,11 +281,18 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify
287 break; 281 break;
288 }; 282 };
289 283
290 return 0; 284bail:
285 if (infile != NULL)
286 fclose(infile);
287 if (outfile != NULL)
288 fclose(outfile);
289 free(pChecksums);
290 return rv;
291} 291}
292 292
293int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify ) 293int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify )
294{ 294{
295 int rv = 0;
295 FILE * infile = NULL; 296 FILE * infile = NULL;
296 FILE * outfile = NULL; 297 FILE * outfile = NULL;
297 int i = -1; 298 int i = -1;
@@ -303,7 +304,7 @@ int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify
303 unsigned char newmunge; 304 unsigned char newmunge;
304 signed long lenread; 305 signed long lenread;
305 int s = 0; 306 int s = 0;
306 unsigned char * pChecksums, * ppChecksums; 307 unsigned char * pChecksums = NULL, * ppChecksums = NULL;
307 unsigned char ck; 308 unsigned char ck;
308 309
309 infile = openinfile(infile_name); 310 infile = openinfile(infile_name);
@@ -314,9 +315,8 @@ int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify
314 { 315 {
315 fprintf( stderr, "This doesn't look like a valid decoded " 316 fprintf( stderr, "This doesn't look like a valid decoded "
316 "iHP firmware - reason: header length\n" ); 317 "iHP firmware - reason: header length\n" );
317 fclose(infile); 318 rv = -1;
318 fclose(outfile); 319 goto bail;
319 return -1;
320 }; 320 };
321 321
322 if( modify ) 322 if( modify )
@@ -329,9 +329,8 @@ int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify
329 { 329 {
330 fprintf( stderr, "This firmware is for an unknown model, or is not" 330 fprintf( stderr, "This firmware is for an unknown model, or is not"
331 " a valid decoded iHP firmware\n" ); 331 " a valid decoded iHP firmware\n" );
332 fclose(infile); 332 rv = -2;
333 fclose(outfile); 333 goto bail;
334 return -2;
335 }; 334 };
336 fprintf( stderr, "Model %s\n", models[ i ] ); 335 fprintf( stderr, "Model %s\n", models[ i ] );
337 336
@@ -348,9 +347,8 @@ int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify
348 { 347 {
349 fprintf( stderr, "This doesn't look like a valid decoded iHP" 348 fprintf( stderr, "This doesn't look like a valid decoded iHP"
350 " firmware - reason: file 'length' data\n" ); 349 " firmware - reason: file 'length' data\n" );
351 fclose(infile); 350 rv = -3;
352 fclose(outfile); 351 goto bail;
353 return -3;
354 }; 352 };
355 353
356 minsize = firmware_minsize[i]; 354 minsize = firmware_minsize[i];
@@ -401,18 +399,16 @@ int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify
401 { 399 {
402 fprintf( stderr, "This doesn't look like a valid decoded iHP" 400 fprintf( stderr, "This doesn't look like a valid decoded iHP"
403 " firmware - reason: ESTFBINR 'length' data\n" ); 401 " firmware - reason: ESTFBINR 'length' data\n" );
404 fclose(infile); 402 rv = -4;
405 fclose(outfile); 403 goto bail;
406 return -4;
407 }; 404 };
408 405
409 if( fp != dwLength2 ) 406 if( fp != dwLength2 )
410 { 407 {
411 fprintf( stderr, "This doesn't look like a valid decoded " 408 fprintf( stderr, "This doesn't look like a valid decoded "
412 "iHP firmware - reason: 'length1' mismatch\n" ); 409 "iHP firmware - reason: 'length1' mismatch\n" );
413 fclose(infile); 410 rv = -5;
414 fclose(outfile); 411 goto bail;
415 return -5;
416 }; 412 };
417 413
418 /* write out remainder w/out applying descrambler */ 414 /* write out remainder w/out applying descrambler */
@@ -431,14 +427,17 @@ int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify
431 { 427 {
432 fprintf( stderr, "This doesn't look like a valid decoded " 428 fprintf( stderr, "This doesn't look like a valid decoded "
433 "iHP firmware - reason: 'length2' mismatch\n" ); 429 "iHP firmware - reason: 'length2' mismatch\n" );
434 fclose(infile); 430 rv = -6;
435 fclose(outfile); 431 goto bail;
436 return -6;
437 }; 432 };
438 433
439 fprintf( stderr, "File encoded successfully and checksum table built!\n" ); 434 fprintf( stderr, "File encoded successfully and checksum table built!\n" );
440 435
441 fclose(infile); 436bail:
442 fclose(outfile); 437 if (infile != NULL)
443 return 0; 438 fclose(infile);
439 if (outfile != NULL)
440 fclose(outfile);
441 free(pChecksums);
442 return rv;
444} 443}