From 9d8bcbeb2abf0593ae9d804d038c3821693e7131 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Fri, 25 Sep 2020 22:48:00 +0200 Subject: sansapatcher: rework exit code handling. - #define all exit codes and use them for indicating further errors. - only enable interactive (i.e. wait for keypress before exiting) mode when built with bootloaders. Change-Id: I6dcbc51226aadc4ab640bf260b6331ddbd4773cc --- rbutil/sansapatcher/main.c | 49 +++++++++++++++++++++----------------- rbutil/sansapatcher/sansapatcher.h | 16 +++++++++++++ 2 files changed, 43 insertions(+), 22 deletions(-) (limited to 'rbutil') diff --git a/rbutil/sansapatcher/main.c b/rbutil/sansapatcher/main.c index acf2fb070a..d12e33c22b 100644 --- a/rbutil/sansapatcher/main.c +++ b/rbutil/sansapatcher/main.c @@ -152,17 +152,18 @@ int main(int argc, char* argv[]) if ((argc > 1) && ((strcmp(argv[1],"-h")==0) || (strcmp(argv[1],"--help")==0))) { print_usage(); - return 1; + return SANSA_OK; } if (sansa_alloc_buffer(&sansa, BUFFER_SIZE) < 0) { fprintf(stderr,"Failed to allocate memory buffer\n"); + return SANSA_INTERNAL_ERROR; } if ((argc > 1) && (strcmp(argv[1],"--scan")==0)) { if (sansa_scan(&sansa) == 0) fprintf(stderr,"[ERR] No E200s or C200s found.\n"); - return 0; + return SANSA_NOT_FOUND; } /* If the first parameter doesn't start with -, then we interpret it as a device */ @@ -194,11 +195,13 @@ int main(int argc, char* argv[]) } if (n != 1) { +#ifdef WITH_BOOTOBJS if (argc==1) { printf("\nPress ENTER to exit sansapatcher :"); fgets(yesno,4,stdin); } - return 0; +#endif + return n > 1 ? SANSA_MULTIPLE_DEVICES : SANSA_NOT_FOUND; } i = 1; @@ -223,28 +226,28 @@ int main(int argc, char* argv[]) (strcmp(argv[i],"--add-bootloader")==0)) { action = ADD_BOOTLOADER; i++; - if (i == argc) { print_usage(); return 1; } + if (i == argc) { print_usage(); return SANSA_WRONG_ARGUMENTS; } filename=argv[i]; i++; } else if ((strcmp(argv[i],"-of")==0) || (strcmp(argv[i],"--update-original-firmware")==0)) { action = UPDATE_OF; i++; - if (i == argc) { print_usage(); return 1; } + if (i == argc) { print_usage(); return SANSA_WRONG_ARGUMENTS; } filename=argv[i]; i++; } else if ((strcmp(argv[i],"-bl")==0) || (strcmp(argv[i],"--update-ppbl")==0)) { action = UPDATE_PPBL; i++; - if (i == argc) { print_usage(); return 1; } + if (i == argc) { print_usage(); return SANSA_WRONG_ARGUMENTS; } filename=argv[i]; i++; } else if ((strcmp(argv[i],"-rf")==0) || (strcmp(argv[i],"--read-firmware")==0)) { action = READ_FIRMWARE; i++; - if (i == argc) { print_usage(); return 1; } + if (i == argc) { print_usage(); return SANSA_WRONG_ARGUMENTS; } filename=argv[i]; i++; } @@ -252,18 +255,18 @@ int main(int argc, char* argv[]) if (sansa.diskname[0]==0) { print_usage(); - return 1; + return SANSA_WRONG_ARGUMENTS; } if (sansa_open(&sansa, 0) < 0) { - return 1; + return SANSA_ACCESS_DENIED; } fprintf(stderr,"[INFO] Reading partition table from %s\n",sansa.diskname); fprintf(stderr,"[INFO] Sector size is %d bytes\n",sansa.sector_size); if (sansa_read_partinfo(&sansa,0) < 0) { - return 2; + return SANSA_PARTITION_ERROR; } display_partinfo(&sansa); @@ -271,7 +274,7 @@ int main(int argc, char* argv[]) i = is_sansa(&sansa); if (i < 0) { fprintf(stderr,"[ERR] Disk is not an E200 or C200 (%d), aborting.\n",i); - return 3; + return SANSA_WRONG_TYPE; } if (sansa.hasoldbootloader) { @@ -281,7 +284,7 @@ int main(int argc, char* argv[]) printf("[ERR] *** sansapatcher for the first time.\n"); printf("[ERR] *** See http://www.rockbox.org/wiki/SansaE200Install\n"); printf("[ERR] ************************************************************************\n"); - res = 4; + res = SANSA_OLD_INSTALL; } else { if (action==LIST_IMAGES) { sansa_list_images(&sansa); @@ -293,7 +296,7 @@ int main(int argc, char* argv[]) if (fgets(yesno,4,stdin)) { if (yesno[0]=='i') { if (sansa_reopen_rw(&sansa) < 0) { - res = 5; + res = SANSA_CANNOT_REOPEN; } if (strcmp(sansa.targetname,"c200") == 0) { len = LEN_bootimg_c200; @@ -306,18 +309,18 @@ int main(int argc, char* argv[]) fprintf(stderr,"[INFO] Bootloader installed successfully.\n"); } else { fprintf(stderr,"[ERR] --install failed.\n"); - res = 6; + res = SANSA_INSTALL_FAILED; } } else if (yesno[0]=='u') { if (sansa_reopen_rw(&sansa) < 0) { - res = 5; + res = SANSA_CANNOT_REOPEN; } if (sansa_delete_bootloader(&sansa)==0) { fprintf(stderr,"[INFO] Bootloader removed.\n"); } else { fprintf(stderr,"[ERR] Bootloader removal failed.\n"); - res = 7; + res = SANSA_UNINSTALL_FAILED; } } } @@ -331,7 +334,7 @@ int main(int argc, char* argv[]) #ifdef WITH_BOOTOBJS } else if (action==INSTALL) { if (sansa_reopen_rw(&sansa) < 0) { - return 5; + return SANSA_CANNOT_REOPEN; } if (strcmp(sansa.targetname,"c200") == 0) { @@ -350,7 +353,7 @@ int main(int argc, char* argv[]) #endif } else if (action==ADD_BOOTLOADER) { if (sansa_reopen_rw(&sansa) < 0) { - return 5; + return SANSA_CANNOT_REOPEN; } len = sansa_read_bootloader(&sansa, filename, &buf); @@ -363,7 +366,7 @@ int main(int argc, char* argv[]) } } else if (action==DELETE_BOOTLOADER) { if (sansa_reopen_rw(&sansa) < 0) { - return 5; + return SANSA_CANNOT_REOPEN; } if (sansa_delete_bootloader(&sansa)==0) { @@ -373,7 +376,7 @@ int main(int argc, char* argv[]) } } else if (action==UPDATE_OF) { if (sansa_reopen_rw(&sansa) < 0) { - return 5; + return SANSA_CANNOT_REOPEN; } if (sansa_update_of(&sansa, filename)==0) { @@ -390,9 +393,9 @@ int main(int argc, char* argv[]) if (fgets(yesno,4,stdin)) { if (yesno[0]=='y') { if (sansa_reopen_rw(&sansa) < 0) { - return 5; + return SANSA_CANNOT_REOPEN; } - + if (sansa_update_ppbl(&sansa, filename)==0) { fprintf(stderr,"[INFO] PPBL updated successfully.\n"); } else { @@ -406,10 +409,12 @@ int main(int argc, char* argv[]) sansa_close(&sansa); sansa_dealloc_buffer(&sansa); +#ifdef WITH_BOOTOBJS if (action==INTERACTIVE) { printf("Press ENTER to exit sansapatcher :"); fgets(yesno,4,stdin); } +#endif return res; } diff --git a/rbutil/sansapatcher/sansapatcher.h b/rbutil/sansapatcher/sansapatcher.h index 1ae101e012..259143e38a 100644 --- a/rbutil/sansapatcher/sansapatcher.h +++ b/rbutil/sansapatcher/sansapatcher.h @@ -28,6 +28,22 @@ extern "C" { #include "sansaio.h" +/* exit codes */ +#define SANSA_OK 0 +#define SANSA_WRONG_ARGUMENTS 1 +#define SANSA_OPEN_INFILE_FAILED 2 +#define SANSA_PARTITION_ERROR 3 +#define SANSA_CANNOT_REOPEN 5 +#define SANSA_INSTALL_FAILED 6 +#define SANSA_UNINSTALL_FAILED 7 +#define SANSA_ACCESS_DENIED 10 +#define SANSA_NOT_FOUND 11 +#define SANSA_WRONG_DEVICE_COUNT 12 +#define SANSA_MULTIPLE_DEVICES 15 +#define SANSA_WRONG_TYPE 16 +#define SANSA_OLD_INSTALL 17 +#define SANSA_INTERNAL_ERROR 20 + extern int sansa_verbose; /* Size of buffer for disk I/O - 8MB is large enough for any version of the Apple firmware, but not the Nano's RSRC image. */ -- cgit v1.2.3