Refactor mknkboot in preparation for beastpatcher integration.

- separate patching from main function.
- improve cleaning up open files / allocated memory on errors.
- correct check for number of arguments.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22723 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Dominik Riebeling 2009-09-17 21:03:40 +00:00
parent be3c62f9ab
commit d270452402

View file

@ -140,40 +140,36 @@ static off_t filesize(int fd) {
} }
int main(int argc, char *argv[]) int mknkboot(const char* infile, const char* bootfile, const char* outfile)
{ {
char *infile, *bootfile, *outfile; int fdin, fdboot = -1, fdout = -1;
int fdin, fdboot,fdout;
int i,n; int i,n;
int inlength,bootlength,newlength; int inlength,bootlength,newlength;
unsigned char* buf; unsigned char* buf = NULL;
unsigned char* boot; unsigned char* boot;
unsigned char* boot2; unsigned char* boot2;
unsigned char* disable; unsigned char* disable;
uint32_t sum; uint32_t sum;
int result = 0;
if(argc < 3) {
usage();
}
infile = argv[1];
bootfile = argv[2];
outfile = argv[3];
fdin = open(infile, O_RDONLY|O_BINARY); fdin = open(infile, O_RDONLY|O_BINARY);
if (fdin < 0) if (fdin < 0)
{ {
perror(infile); perror(infile);
result = 1;
goto quit;
} }
fdboot = open(bootfile, O_RDONLY|O_BINARY); fdboot = open(bootfile, O_RDONLY|O_BINARY);
if (fdboot < 0) if (fdboot < 0)
{ {
perror(bootfile); perror(bootfile);
close(fdin);
result = 2;
goto quit;
} }
inlength = filesize(fdin); inlength = filesize(fdin);
bootlength = filesize(fdboot); bootlength = filesize(fdboot);
/* Create buffer for original nk.bin, plus our bootloader (with 12 /* Create buffer for original nk.bin, plus our bootloader (with 12
@ -185,7 +181,8 @@ int main(int argc, char *argv[])
if (buf==NULL) if (buf==NULL)
{ {
printf("[ERR] Could not allocate memory, aborting\n"); printf("[ERR] Could not allocate memory, aborting\n");
return 1; result = 3;
goto quit;
} }
/****** STEP 1 - Read original nk.bin into buffer */ /****** STEP 1 - Read original nk.bin into buffer */
@ -194,7 +191,8 @@ int main(int argc, char *argv[])
if (n != inlength) if (n != inlength)
{ {
printf("[ERR] Could not read from %s\n",infile); printf("[ERR] Could not read from %s\n",infile);
return 2; result = 4;
goto quit;
} }
/****** STEP 2 - Move EOF record to the new EOF */ /****** STEP 2 - Move EOF record to the new EOF */
@ -218,7 +216,8 @@ int main(int argc, char *argv[])
if (n != bootlength) if (n != bootlength)
{ {
printf("[ERR] Could not read from %s\n",bootfile); printf("[ERR] Could not read from %s\n",bootfile);
return 3; result = 5;
goto quit;
} }
/****** STEP 5 - Create header for bootloader record */ /****** STEP 5 - Create header for bootloader record */
@ -257,18 +256,41 @@ int main(int argc, char *argv[])
if (fdout < 0) if (fdout < 0)
{ {
perror(outfile); perror(outfile);
result = 6;
goto quit;
} }
n = write(fdout, buf, newlength); n = write(fdout, buf, newlength);
if (n != newlength) if (n != newlength)
{ {
printf("[ERR] Could not write output file %s\n",outfile); printf("[ERR] Could not write output file %s\n",outfile);
return 3; result = 7;
goto quit;
} }
quit:
if(buf != NULL)
free(buf);
close(fdin); close(fdin);
close(fdboot); close(fdboot);
close(fdout); close(fdout);
return 0; return result;
} }
int main(int argc, char* argv[])
{
char *infile, *bootfile, *outfile;
if(argc < 4) {
usage();
}
infile = argv[1];
bootfile = argv[2];
outfile = argv[3];
return mknkboot(infile, bootfile, outfile);
}