[Skiboot] [PATCH 08/17] external/pflash: Stop using exit() in the main
Cyril Bur
cyril.bur at au1.ibm.com
Fri Jul 21 16:35:59 AEST 2017
Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
---
external/pflash/pflash.c | 72 ++++++++++++++++++++++++++++++++----------------
1 file changed, 49 insertions(+), 23 deletions(-)
diff --git a/external/pflash/pflash.c b/external/pflash/pflash.c
index c1a8b9e2..c0a63fca 100644
--- a/external/pflash/pflash.c
+++ b/external/pflash/pflash.c
@@ -669,6 +669,7 @@ int main(int argc, char *argv[])
}
break;
case 'P':
+ free(part_name);
part_name = strdup(optarg);
break;
case '4':
@@ -679,6 +680,7 @@ int main(int argc, char *argv[])
break;
case 'r':
do_read = true;
+ free(read_file);
read_file = strdup(optarg);
break;
case 'E':
@@ -692,6 +694,7 @@ int main(int argc, char *argv[])
break;
case 'p':
program = true;
+ free(write_file);
write_file = strdup(optarg);
break;
case 'f':
@@ -787,25 +790,28 @@ int main(int argc, char *argv[])
print_help(pname);
if (no_action)
- return rc;
+ goto out;
/* --enable-4B and --disable-4B are mutually exclusive */
if (enable_4B && disable_4B) {
fprintf(stderr, "--enable-4B and --disable-4B are mutually"
" exclusive !\n");
- exit(1);
+ rc = 1;
+ goto out;
}
/* 4B not supported on BMC flash */
if (enable_4B && bmc_flash) {
fprintf(stderr, "--enable-4B not supported on BMC flash !\n");
- exit(1);
+ rc = 1;
+ goto out;;
}
/* partitions not supported on BMC flash */
if (part_name && bmc_flash) {
fprintf(stderr, "--partition not supported on BMC flash !\n");
- exit(1);
+ rc = 1;
+ goto out;
}
if (print_detail && ((detail_id == UINT_MAX && !part_name)
@@ -818,51 +824,60 @@ int main(int argc, char *argv[])
if (part_name && erase_all) {
fprintf(stderr, "--partition and --erase-all are mutually"
" exclusive !\n");
- exit(1);
+ rc = 1;
+ goto out;
}
/* Read command should always come with a file */
if (do_read && !read_file) {
fprintf(stderr, "Read with no file specified !\n");
- exit(1);
+ rc = 1;
+ goto out;
}
/* Program command should always come with a file */
if (program && !write_file) {
fprintf(stderr, "Program with no file specified !\n");
- exit(1);
+ rc = 1;
+ goto out;
}
/* If both partition and address specified, error out */
if (address && part_name) {
fprintf(stderr, "Specify partition or address, not both !\n");
- exit(1);
+ rc = 1;
+ goto out;
}
if (do_clear && !part_name) {
fprintf(stderr, "--clear only supported on a partition name\n");
- exit(1);
+ rc = 1;
+ goto out;
}
/* Explicitly only support two sides */
if (flash_side != 0 && flash_side != 1) {
fprintf(stderr, "Unexpected value for --side '%d'\n", flash_side);
- exit(1);
+ rc = 1;
+ goto out;
}
if (ffs_toc_seen && flash_side) {
fprintf(stderr, "--toc and --side are exclusive");
- exit(1);
+ rc = 1;
+ goto out;
}
if (flashfilename && bmc_flash) {
fprintf(stderr, "Filename or bmc flash but not both\n");
- exit(1);
+ rc = 1;
+ goto out;
}
if (flashfilename && direct) {
fprintf(stderr, "Filename or direct access but not both\n");
- exit(1);
+ rc = 1;
+ goto out;
}
/* If file specified but not size, get size from file
@@ -872,7 +887,8 @@ int main(int argc, char *argv[])
if (stat(write_file, &stbuf)) {
perror("Failed to get file size");
- exit(1);
+ rc = 1;
+ goto out;
}
write_size = stbuf.st_size;
}
@@ -881,19 +897,22 @@ int main(int argc, char *argv[])
if (arch_flash_access(NULL, bmc_flash ? BMC_DIRECT : PNOR_DIRECT) == ACCESS_INVAL) {
fprintf(stderr, "Can't access %s flash directly on this architecture\n",
bmc_flash ? "BMC" : "PNOR");
- exit(1);
+ rc = 1;
+ goto out;
}
} else if (!flashfilename) {
if (arch_flash_access(NULL, bmc_flash ? BMC_MTD : PNOR_MTD) == ACCESS_INVAL) {
fprintf(stderr, "Can't access %s flash through MTD on this system\n",
bmc_flash ? "BMC" : "PNOR");
- exit(1);
+ rc = 1;
+ goto out;
}
}
if (arch_flash_init(&bl, flashfilename, true)) {
fprintf(stderr, "Couldn't initialise architecture flash structures\n");
- exit(1);
+ rc = 1;
+ goto out;
}
atexit(exiting);
@@ -902,7 +921,8 @@ int main(int argc, char *argv[])
&fl_total_size, &fl_erase_granule);
if (rc) {
fprintf(stderr, "Error %d getting flash info\n", rc);
- exit(1);
+ rc = 1;
+ goto out;
}
/* If -t is passed, then print a nice message */
@@ -927,7 +947,7 @@ int main(int argc, char *argv[])
&pstart, &pmaxsz, &pactsize, &ecc);
if (rc) {
fprintf(stderr,"Failed to get partition info\n");
- exit(1);
+ goto out;
}
if (!ecc && do_clear) {
@@ -956,14 +976,14 @@ int main(int argc, char *argv[])
printf("ERROR: Size (%d bytes) larger than partition"
" (%d bytes). Use --force to force\n",
write_size, pmaxsz);
- exit(1);
+ goto out;
}
/* If erasing, check partition alignment */
if (erase && ((pstart | pmaxsz) & 0xfff)) {
fprintf(stderr,"Partition not aligned properly\n");
- exit(1);
+ goto out;
}
/* Set address */
@@ -1011,7 +1031,7 @@ int main(int argc, char *argv[])
if (need_relock == -1) {
fprintf(stderr, "Architecture doesn't support write protection on flash\n");
need_relock = 0;
- exit (1);
+ goto out;
}
}
if (do_read)
@@ -1024,5 +1044,11 @@ int main(int argc, char *argv[])
program_file(write_file, address, write_size);
if (do_clear)
set_ecc(address, write_size);
- return 0;
+ rc = 0;
+out:
+ free(part_name);
+ free(read_file);
+ free(write_file);
+
+ return rc;
}
--
2.13.3
More information about the Skiboot
mailing list