summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2008-06-18 22:30:59 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2008-06-18 22:30:59 +0000
commitc47988034fbd5d7de8fcda2a87224bdb0b5dcfe6 (patch)
treedeb96279c6952871b5c0f47ec25879bb73240afd
parentefbd2b8d7a9295f1a5544717c1b86527cc27ac7b (diff)
downloadrockbox-c47988034fbd5d7de8fcda2a87224bdb0b5dcfe6.tar.gz
rockbox-c47988034fbd5d7de8fcda2a87224bdb0b5dcfe6.tar.bz2
rockbox-c47988034fbd5d7de8fcda2a87224bdb0b5dcfe6.zip
Factor out scramble / mkboot functions to allow easier reuse (for rbutil).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17732 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--tools/descramble.c3
-rw-r--r--tools/iriver.c50
-rw-r--r--tools/iriver.h18
-rw-r--r--tools/mkboot.c43
-rw-r--r--tools/mkboot.h33
-rw-r--r--tools/scramble.c3
6 files changed, 116 insertions, 34 deletions
diff --git a/tools/descramble.c b/tools/descramble.c
index 3bf10a6b69..5d4975be26 100644
--- a/tools/descramble.c
+++ b/tools/descramble.c
@@ -87,8 +87,7 @@ int main (int argc, char** argv)
/* iRiver code dealt with in the iriver.c code */
iname = argv[2];
oname = argv[3];
- iriver_decode(iname, oname, FALSE, STRIP_NONE);
- return 0;
+ return iriver_decode(iname, oname, FALSE, STRIP_NONE) ? -1 : 0;
}
if(!strcmp(argv[1], "-gigabeat")) {
iname = argv[2];
diff --git a/tools/iriver.c b/tools/iriver.c
index 6730fbd8b2..4c949c6627 100644
--- a/tools/iriver.c
+++ b/tools/iriver.c
@@ -96,7 +96,7 @@ static FILE * openoutfile( const char * filename )
return F;
}
-int iriver_decode(char *infile_name, char *outfile_name, BOOL modify,
+int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify,
enum striptype stripmode )
{
FILE * infile = NULL;
@@ -120,7 +120,9 @@ int iriver_decode(char *infile_name, char *outfile_name, BOOL modify,
{
fprintf( stderr, "This doesn't look like a valid encrypted iHP "
"firmware - reason: header length\n" );
- exit( -1 );
+ fclose(infile);
+ fclose(outfile);
+ return -1;
};
i = testheader( headerdata );
@@ -128,7 +130,9 @@ int iriver_decode(char *infile_name, char *outfile_name, BOOL modify,
{
fprintf( stderr, "This firmware is for an unknown model, or is not"
" a valid encrypted iHP firmware\n" );
- exit( -1 );
+ fclose(infile);
+ fclose(outfile);
+ return -2;
};
fprintf( stderr, "Model %s\n", models[ i ] );
@@ -149,7 +153,9 @@ int iriver_decode(char *infile_name, char *outfile_name, BOOL modify,
{
fprintf( stderr, "This doesn't look like a valid encrypted "
"iHP firmware - reason: file 'length' data\n" );
- exit( -1 );
+ fclose(infile);
+ fclose(outfile);
+ return -3;
};
pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) );
@@ -209,7 +215,9 @@ int iriver_decode(char *infile_name, char *outfile_name, BOOL modify,
{
fprintf( stderr, "This doesn't look like a valid encrypted "
"iHP firmware - reason: 'length2' mismatch\n" );
- exit( -1 );
+ fclose(infile);
+ fclose(outfile);
+ return -4;
};
fp = 0;
@@ -224,7 +232,9 @@ int iriver_decode(char *infile_name, char *outfile_name, BOOL modify,
{
fprintf( stderr, "This doesn't look like a valid encrypted "
"iHP firmware - reason: Checksum mismatch!" );
- exit( -1 );
+ fclose(infile);
+ fclose(outfile);
+ return -5;
};
ppChecksums += lenread;
};
@@ -233,7 +243,9 @@ int iriver_decode(char *infile_name, char *outfile_name, BOOL modify,
{
fprintf( stderr, "This doesn't look like a valid encrypted "
"iHP firmware - reason: 'length3' mismatch\n" );
- exit( -1 );
+ fclose(infile);
+ fclose(outfile);
+ return -6;
};
@@ -258,7 +270,7 @@ int iriver_decode(char *infile_name, char *outfile_name, BOOL modify,
return 0;
}
-int iriver_encode(char *infile_name, char *outfile_name, BOOL modify )
+int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify )
{
FILE * infile = NULL;
FILE * outfile = NULL;
@@ -281,7 +293,9 @@ int iriver_encode(char *infile_name, char *outfile_name, BOOL modify )
{
fprintf( stderr, "This doesn't look like a valid decoded "
"iHP firmware - reason: header length\n" );
- exit( -1 );
+ fclose(infile);
+ fclose(outfile);
+ return -1;
};
if( modify )
@@ -294,7 +308,9 @@ int iriver_encode(char *infile_name, char *outfile_name, BOOL modify )
{
fprintf( stderr, "This firmware is for an unknown model, or is not"
" a valid decoded iHP firmware\n" );
- exit( -1 );
+ fclose(infile);
+ fclose(outfile);
+ return -2;
};
fprintf( stderr, "Model %s\n", models[ i ] );
@@ -314,7 +330,9 @@ int iriver_encode(char *infile_name, char *outfile_name, BOOL modify )
{
fprintf( stderr, "This doesn't look like a valid decoded iHP"
" firmware - reason: file 'length' data\n" );
- exit( -1 );
+ fclose(infile);
+ fclose(outfile);
+ return -3;
};
pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) );
@@ -351,7 +369,9 @@ int iriver_encode(char *infile_name, char *outfile_name, BOOL modify )
{
fprintf( stderr, "This doesn't look like a valid decoded "
"iHP firmware - reason: 'length1' mismatch\n" );
- exit( -1 );
+ fclose(infile);
+ fclose(outfile);
+ return -4;
};
/* write out remainder w/out applying descrambler */
@@ -370,10 +390,14 @@ int iriver_encode(char *infile_name, char *outfile_name, BOOL modify )
{
fprintf( stderr, "This doesn't look like a valid decoded "
"iHP firmware - reason: 'length2' mismatch\n" );
- exit( -1 );
+ fclose(infile);
+ fclose(outfile);
+ return -5;
};
fprintf( stderr, "File encoded successfully and checksum table built!\n" );
+ fclose(infile);
+ fclose(outfile);
return 0;
}
diff --git a/tools/iriver.h b/tools/iriver.h
index 96326c4e48..e9df809a12 100644
--- a/tools/iriver.h
+++ b/tools/iriver.h
@@ -16,14 +16,21 @@
* KIND, either express or implied.
*
****************************************************************************/
-
+#ifndef TRUE
#define TRUE 1
+#endif
+#ifndef FALSE
#define FALSE 0
+#endif
#define BOOL unsigned int
#define ESTF_SIZE 32
+#ifdef __cplusplus
+extern "C" {
+#endif
+
enum striptype
{
STRIP_NONE,
@@ -32,6 +39,11 @@ enum striptype
};
/* protos for iriver.c */
-int iriver_decode(char *infile, char *outfile, BOOL modify,
+int iriver_decode(const char *infile, const char *outfile, BOOL modify,
enum striptype stripmode );
-int iriver_encode(char *infile_name, char *outfile_name, BOOL modify );
+int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/tools/mkboot.c b/tools/mkboot.c
index ce743e9414..d86a4fc177 100644
--- a/tools/mkboot.c
+++ b/tools/mkboot.c
@@ -19,25 +19,25 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include "mkboot.h"
-void usage(void)
+#ifndef RBUTIL
+static void usage(void)
{
printf("usage: mkboot [-h300] <firmware file> <boot file> <output file>\n");
exit(1);
}
+#endif
-unsigned char image[0x400000 + 0x220 + 0x400000/0x200];
+static unsigned char image[0x400000 + 0x220 + 0x400000/0x200];
+#ifndef RBUTIL
int main(int argc, char *argv[])
{
char *infile, *bootfile, *outfile;
- FILE *f;
- int i;
- int len;
- int actual_length, total_length, binary_length, num_chksums;
int origin = 0x1f0000; /* H1x0 bootloader address */
-
+
if(argc < 3) {
usage();
}
@@ -55,6 +55,16 @@ int main(int argc, char *argv[])
bootfile = argv[2];
outfile = argv[3];
}
+ return mkboot(infile, bootfile, outfile, origin);
+}
+#endif
+
+int mkboot(const char* infile, const char* bootfile, const char* outfile, int origin)
+{
+ FILE *f;
+ int i;
+ int len;
+ int actual_length, total_length, binary_length, num_chksums;
memset(image, 0xff, sizeof(image));
@@ -62,13 +72,14 @@ int main(int argc, char *argv[])
f = fopen(infile, "rb");
if(!f) {
perror(infile);
- exit(1);
+ return -1;
}
i = fread(image, 1, 16, f);
if(i < 16) {
perror(infile);
- exit(1);
+ fclose(f);
+ return -2;
}
/* This is the length of the binary image without the scrambling
@@ -81,7 +92,8 @@ int main(int argc, char *argv[])
i = fread(image+16, 1, len, f);
if(i < len) {
perror(infile);
- exit(1);
+ fclose(f);
+ return -3;
}
fclose(f);
@@ -90,7 +102,8 @@ int main(int argc, char *argv[])
f = fopen(bootfile, "rb");
if(!f) {
perror(bootfile);
- exit(1);
+ fclose(f);
+ return -4;
}
fseek(f, 0, SEEK_END);
@@ -101,7 +114,8 @@ int main(int argc, char *argv[])
i = fread(image+0x220 + origin, 1, len, f);
if(i < len) {
perror(bootfile);
- exit(1);
+ fclose(f);
+ return -5;
}
fclose(f);
@@ -109,7 +123,7 @@ int main(int argc, char *argv[])
f = fopen(outfile, "wb");
if(!f) {
perror(outfile);
- exit(1);
+ return -6;
}
/* Patch the reset vector to start the boot loader */
@@ -161,7 +175,8 @@ int main(int argc, char *argv[])
i = fwrite(image, 1, total_length, f);
if(i < total_length) {
perror(outfile);
- exit(1);
+ fclose(f);
+ return -7;
}
printf("Wrote 0x%x bytes in %s\n", total_length, outfile);
diff --git a/tools/mkboot.h b/tools/mkboot.h
new file mode 100644
index 0000000000..ea9862157d
--- /dev/null
+++ b/tools/mkboot.h
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2008 by Dominik Riebeling
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#ifndef MKBOOT_H
+#define MKBOOT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int mkboot(const char* infile, const char* bootfile, const char* outfile, int origin);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/tools/scramble.c b/tools/scramble.c
index c02c78916b..5263809e41 100644
--- a/tools/scramble.c
+++ b/tools/scramble.c
@@ -287,8 +287,7 @@ int main (int argc, char** argv)
/* iRiver code dealt with in the iriver.c code */
iname = argv[2];
oname = argv[3];
- iriver_encode(iname, oname, FALSE);
- return 0;
+ return (iriver_encode(iname, oname, FALSE) != 0) ? -1 : 0;
}
else if(!strcmp(argv[1], "-gigabeat")) {
/* iRiver code dealt with in the iriver.c code */