diff options
author | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2020-09-25 22:48:00 +0200 |
---|---|---|
committer | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2020-09-27 09:28:15 +0200 |
commit | 9d8bcbeb2abf0593ae9d804d038c3821693e7131 (patch) | |
tree | b1791263344ba6f04aeb13b2bb58b348b16da7d2 | |
parent | af76fa3e7a321b303b0d219ed95578079bbc8a24 (diff) | |
download | rockbox-9d8bcbeb2abf0593ae9d804d038c3821693e7131.tar.gz rockbox-9d8bcbeb2abf0593ae9d804d038c3821693e7131.zip |
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
-rw-r--r-- | rbutil/sansapatcher/main.c | 49 | ||||
-rw-r--r-- | rbutil/sansapatcher/sansapatcher.h | 16 |
2 files changed, 43 insertions, 22 deletions
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[]) | |||
152 | 152 | ||
153 | if ((argc > 1) && ((strcmp(argv[1],"-h")==0) || (strcmp(argv[1],"--help")==0))) { | 153 | if ((argc > 1) && ((strcmp(argv[1],"-h")==0) || (strcmp(argv[1],"--help")==0))) { |
154 | print_usage(); | 154 | print_usage(); |
155 | return 1; | 155 | return SANSA_OK; |
156 | } | 156 | } |
157 | 157 | ||
158 | if (sansa_alloc_buffer(&sansa, BUFFER_SIZE) < 0) { | 158 | if (sansa_alloc_buffer(&sansa, BUFFER_SIZE) < 0) { |
159 | fprintf(stderr,"Failed to allocate memory buffer\n"); | 159 | fprintf(stderr,"Failed to allocate memory buffer\n"); |
160 | return SANSA_INTERNAL_ERROR; | ||
160 | } | 161 | } |
161 | 162 | ||
162 | if ((argc > 1) && (strcmp(argv[1],"--scan")==0)) { | 163 | if ((argc > 1) && (strcmp(argv[1],"--scan")==0)) { |
163 | if (sansa_scan(&sansa) == 0) | 164 | if (sansa_scan(&sansa) == 0) |
164 | fprintf(stderr,"[ERR] No E200s or C200s found.\n"); | 165 | fprintf(stderr,"[ERR] No E200s or C200s found.\n"); |
165 | return 0; | 166 | return SANSA_NOT_FOUND; |
166 | } | 167 | } |
167 | 168 | ||
168 | /* If the first parameter doesn't start with -, then we interpret it as a device */ | 169 | /* 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[]) | |||
194 | } | 195 | } |
195 | 196 | ||
196 | if (n != 1) { | 197 | if (n != 1) { |
198 | #ifdef WITH_BOOTOBJS | ||
197 | if (argc==1) { | 199 | if (argc==1) { |
198 | printf("\nPress ENTER to exit sansapatcher :"); | 200 | printf("\nPress ENTER to exit sansapatcher :"); |
199 | fgets(yesno,4,stdin); | 201 | fgets(yesno,4,stdin); |
200 | } | 202 | } |
201 | return 0; | 203 | #endif |
204 | return n > 1 ? SANSA_MULTIPLE_DEVICES : SANSA_NOT_FOUND; | ||
202 | } | 205 | } |
203 | 206 | ||
204 | i = 1; | 207 | i = 1; |
@@ -223,28 +226,28 @@ int main(int argc, char* argv[]) | |||
223 | (strcmp(argv[i],"--add-bootloader")==0)) { | 226 | (strcmp(argv[i],"--add-bootloader")==0)) { |
224 | action = ADD_BOOTLOADER; | 227 | action = ADD_BOOTLOADER; |
225 | i++; | 228 | i++; |
226 | if (i == argc) { print_usage(); return 1; } | 229 | if (i == argc) { print_usage(); return SANSA_WRONG_ARGUMENTS; } |
227 | filename=argv[i]; | 230 | filename=argv[i]; |
228 | i++; | 231 | i++; |
229 | } else if ((strcmp(argv[i],"-of")==0) || | 232 | } else if ((strcmp(argv[i],"-of")==0) || |
230 | (strcmp(argv[i],"--update-original-firmware")==0)) { | 233 | (strcmp(argv[i],"--update-original-firmware")==0)) { |
231 | action = UPDATE_OF; | 234 | action = UPDATE_OF; |
232 | i++; | 235 | i++; |
233 | if (i == argc) { print_usage(); return 1; } | 236 | if (i == argc) { print_usage(); return SANSA_WRONG_ARGUMENTS; } |
234 | filename=argv[i]; | 237 | filename=argv[i]; |
235 | i++; | 238 | i++; |
236 | } else if ((strcmp(argv[i],"-bl")==0) || | 239 | } else if ((strcmp(argv[i],"-bl")==0) || |
237 | (strcmp(argv[i],"--update-ppbl")==0)) { | 240 | (strcmp(argv[i],"--update-ppbl")==0)) { |
238 | action = UPDATE_PPBL; | 241 | action = UPDATE_PPBL; |
239 | i++; | 242 | i++; |
240 | if (i == argc) { print_usage(); return 1; } | 243 | if (i == argc) { print_usage(); return SANSA_WRONG_ARGUMENTS; } |
241 | filename=argv[i]; | 244 | filename=argv[i]; |
242 | i++; | 245 | i++; |
243 | } else if ((strcmp(argv[i],"-rf")==0) || | 246 | } else if ((strcmp(argv[i],"-rf")==0) || |
244 | (strcmp(argv[i],"--read-firmware")==0)) { | 247 | (strcmp(argv[i],"--read-firmware")==0)) { |
245 | action = READ_FIRMWARE; | 248 | action = READ_FIRMWARE; |
246 | i++; | 249 | i++; |
247 | if (i == argc) { print_usage(); return 1; } | 250 | if (i == argc) { print_usage(); return SANSA_WRONG_ARGUMENTS; } |
248 | filename=argv[i]; | 251 | filename=argv[i]; |
249 | i++; | 252 | i++; |
250 | } | 253 | } |
@@ -252,18 +255,18 @@ int main(int argc, char* argv[]) | |||
252 | 255 | ||
253 | if (sansa.diskname[0]==0) { | 256 | if (sansa.diskname[0]==0) { |
254 | print_usage(); | 257 | print_usage(); |
255 | return 1; | 258 | return SANSA_WRONG_ARGUMENTS; |
256 | } | 259 | } |
257 | 260 | ||
258 | if (sansa_open(&sansa, 0) < 0) { | 261 | if (sansa_open(&sansa, 0) < 0) { |
259 | return 1; | 262 | return SANSA_ACCESS_DENIED; |
260 | } | 263 | } |
261 | 264 | ||
262 | fprintf(stderr,"[INFO] Reading partition table from %s\n",sansa.diskname); | 265 | fprintf(stderr,"[INFO] Reading partition table from %s\n",sansa.diskname); |
263 | fprintf(stderr,"[INFO] Sector size is %d bytes\n",sansa.sector_size); | 266 | fprintf(stderr,"[INFO] Sector size is %d bytes\n",sansa.sector_size); |
264 | 267 | ||
265 | if (sansa_read_partinfo(&sansa,0) < 0) { | 268 | if (sansa_read_partinfo(&sansa,0) < 0) { |
266 | return 2; | 269 | return SANSA_PARTITION_ERROR; |
267 | } | 270 | } |
268 | 271 | ||
269 | display_partinfo(&sansa); | 272 | display_partinfo(&sansa); |
@@ -271,7 +274,7 @@ int main(int argc, char* argv[]) | |||
271 | i = is_sansa(&sansa); | 274 | i = is_sansa(&sansa); |
272 | if (i < 0) { | 275 | if (i < 0) { |
273 | fprintf(stderr,"[ERR] Disk is not an E200 or C200 (%d), aborting.\n",i); | 276 | fprintf(stderr,"[ERR] Disk is not an E200 or C200 (%d), aborting.\n",i); |
274 | return 3; | 277 | return SANSA_WRONG_TYPE; |
275 | } | 278 | } |
276 | 279 | ||
277 | if (sansa.hasoldbootloader) { | 280 | if (sansa.hasoldbootloader) { |
@@ -281,7 +284,7 @@ int main(int argc, char* argv[]) | |||
281 | printf("[ERR] *** sansapatcher for the first time.\n"); | 284 | printf("[ERR] *** sansapatcher for the first time.\n"); |
282 | printf("[ERR] *** See http://www.rockbox.org/wiki/SansaE200Install\n"); | 285 | printf("[ERR] *** See http://www.rockbox.org/wiki/SansaE200Install\n"); |
283 | printf("[ERR] ************************************************************************\n"); | 286 | printf("[ERR] ************************************************************************\n"); |
284 | res = 4; | 287 | res = SANSA_OLD_INSTALL; |
285 | } else { | 288 | } else { |
286 | if (action==LIST_IMAGES) { | 289 | if (action==LIST_IMAGES) { |
287 | sansa_list_images(&sansa); | 290 | sansa_list_images(&sansa); |
@@ -293,7 +296,7 @@ int main(int argc, char* argv[]) | |||
293 | if (fgets(yesno,4,stdin)) { | 296 | if (fgets(yesno,4,stdin)) { |
294 | if (yesno[0]=='i') { | 297 | if (yesno[0]=='i') { |
295 | if (sansa_reopen_rw(&sansa) < 0) { | 298 | if (sansa_reopen_rw(&sansa) < 0) { |
296 | res = 5; | 299 | res = SANSA_CANNOT_REOPEN; |
297 | } | 300 | } |
298 | if (strcmp(sansa.targetname,"c200") == 0) { | 301 | if (strcmp(sansa.targetname,"c200") == 0) { |
299 | len = LEN_bootimg_c200; | 302 | len = LEN_bootimg_c200; |
@@ -306,18 +309,18 @@ int main(int argc, char* argv[]) | |||
306 | fprintf(stderr,"[INFO] Bootloader installed successfully.\n"); | 309 | fprintf(stderr,"[INFO] Bootloader installed successfully.\n"); |
307 | } else { | 310 | } else { |
308 | fprintf(stderr,"[ERR] --install failed.\n"); | 311 | fprintf(stderr,"[ERR] --install failed.\n"); |
309 | res = 6; | 312 | res = SANSA_INSTALL_FAILED; |
310 | } | 313 | } |
311 | } else if (yesno[0]=='u') { | 314 | } else if (yesno[0]=='u') { |
312 | if (sansa_reopen_rw(&sansa) < 0) { | 315 | if (sansa_reopen_rw(&sansa) < 0) { |
313 | res = 5; | 316 | res = SANSA_CANNOT_REOPEN; |
314 | } | 317 | } |
315 | 318 | ||
316 | if (sansa_delete_bootloader(&sansa)==0) { | 319 | if (sansa_delete_bootloader(&sansa)==0) { |
317 | fprintf(stderr,"[INFO] Bootloader removed.\n"); | 320 | fprintf(stderr,"[INFO] Bootloader removed.\n"); |
318 | } else { | 321 | } else { |
319 | fprintf(stderr,"[ERR] Bootloader removal failed.\n"); | 322 | fprintf(stderr,"[ERR] Bootloader removal failed.\n"); |
320 | res = 7; | 323 | res = SANSA_UNINSTALL_FAILED; |
321 | } | 324 | } |
322 | } | 325 | } |
323 | } | 326 | } |
@@ -331,7 +334,7 @@ int main(int argc, char* argv[]) | |||
331 | #ifdef WITH_BOOTOBJS | 334 | #ifdef WITH_BOOTOBJS |
332 | } else if (action==INSTALL) { | 335 | } else if (action==INSTALL) { |
333 | if (sansa_reopen_rw(&sansa) < 0) { | 336 | if (sansa_reopen_rw(&sansa) < 0) { |
334 | return 5; | 337 | return SANSA_CANNOT_REOPEN; |
335 | } | 338 | } |
336 | 339 | ||
337 | if (strcmp(sansa.targetname,"c200") == 0) { | 340 | if (strcmp(sansa.targetname,"c200") == 0) { |
@@ -350,7 +353,7 @@ int main(int argc, char* argv[]) | |||
350 | #endif | 353 | #endif |
351 | } else if (action==ADD_BOOTLOADER) { | 354 | } else if (action==ADD_BOOTLOADER) { |
352 | if (sansa_reopen_rw(&sansa) < 0) { | 355 | if (sansa_reopen_rw(&sansa) < 0) { |
353 | return 5; | 356 | return SANSA_CANNOT_REOPEN; |
354 | } | 357 | } |
355 | 358 | ||
356 | len = sansa_read_bootloader(&sansa, filename, &buf); | 359 | len = sansa_read_bootloader(&sansa, filename, &buf); |
@@ -363,7 +366,7 @@ int main(int argc, char* argv[]) | |||
363 | } | 366 | } |
364 | } else if (action==DELETE_BOOTLOADER) { | 367 | } else if (action==DELETE_BOOTLOADER) { |
365 | if (sansa_reopen_rw(&sansa) < 0) { | 368 | if (sansa_reopen_rw(&sansa) < 0) { |
366 | return 5; | 369 | return SANSA_CANNOT_REOPEN; |
367 | } | 370 | } |
368 | 371 | ||
369 | if (sansa_delete_bootloader(&sansa)==0) { | 372 | if (sansa_delete_bootloader(&sansa)==0) { |
@@ -373,7 +376,7 @@ int main(int argc, char* argv[]) | |||
373 | } | 376 | } |
374 | } else if (action==UPDATE_OF) { | 377 | } else if (action==UPDATE_OF) { |
375 | if (sansa_reopen_rw(&sansa) < 0) { | 378 | if (sansa_reopen_rw(&sansa) < 0) { |
376 | return 5; | 379 | return SANSA_CANNOT_REOPEN; |
377 | } | 380 | } |
378 | 381 | ||
379 | if (sansa_update_of(&sansa, filename)==0) { | 382 | if (sansa_update_of(&sansa, filename)==0) { |
@@ -390,9 +393,9 @@ int main(int argc, char* argv[]) | |||
390 | if (fgets(yesno,4,stdin)) { | 393 | if (fgets(yesno,4,stdin)) { |
391 | if (yesno[0]=='y') { | 394 | if (yesno[0]=='y') { |
392 | if (sansa_reopen_rw(&sansa) < 0) { | 395 | if (sansa_reopen_rw(&sansa) < 0) { |
393 | return 5; | 396 | return SANSA_CANNOT_REOPEN; |
394 | } | 397 | } |
395 | 398 | ||
396 | if (sansa_update_ppbl(&sansa, filename)==0) { | 399 | if (sansa_update_ppbl(&sansa, filename)==0) { |
397 | fprintf(stderr,"[INFO] PPBL updated successfully.\n"); | 400 | fprintf(stderr,"[INFO] PPBL updated successfully.\n"); |
398 | } else { | 401 | } else { |
@@ -406,10 +409,12 @@ int main(int argc, char* argv[]) | |||
406 | sansa_close(&sansa); | 409 | sansa_close(&sansa); |
407 | sansa_dealloc_buffer(&sansa); | 410 | sansa_dealloc_buffer(&sansa); |
408 | 411 | ||
412 | #ifdef WITH_BOOTOBJS | ||
409 | if (action==INTERACTIVE) { | 413 | if (action==INTERACTIVE) { |
410 | printf("Press ENTER to exit sansapatcher :"); | 414 | printf("Press ENTER to exit sansapatcher :"); |
411 | fgets(yesno,4,stdin); | 415 | fgets(yesno,4,stdin); |
412 | } | 416 | } |
417 | #endif | ||
413 | 418 | ||
414 | return res; | 419 | return res; |
415 | } | 420 | } |
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" { | |||
28 | 28 | ||
29 | #include "sansaio.h" | 29 | #include "sansaio.h" |
30 | 30 | ||
31 | /* exit codes */ | ||
32 | #define SANSA_OK 0 | ||
33 | #define SANSA_WRONG_ARGUMENTS 1 | ||
34 | #define SANSA_OPEN_INFILE_FAILED 2 | ||
35 | #define SANSA_PARTITION_ERROR 3 | ||
36 | #define SANSA_CANNOT_REOPEN 5 | ||
37 | #define SANSA_INSTALL_FAILED 6 | ||
38 | #define SANSA_UNINSTALL_FAILED 7 | ||
39 | #define SANSA_ACCESS_DENIED 10 | ||
40 | #define SANSA_NOT_FOUND 11 | ||
41 | #define SANSA_WRONG_DEVICE_COUNT 12 | ||
42 | #define SANSA_MULTIPLE_DEVICES 15 | ||
43 | #define SANSA_WRONG_TYPE 16 | ||
44 | #define SANSA_OLD_INSTALL 17 | ||
45 | #define SANSA_INTERNAL_ERROR 20 | ||
46 | |||
31 | extern int sansa_verbose; | 47 | extern int sansa_verbose; |
32 | /* Size of buffer for disk I/O - 8MB is large enough for any version | 48 | /* Size of buffer for disk I/O - 8MB is large enough for any version |
33 | of the Apple firmware, but not the Nano's RSRC image. */ | 49 | of the Apple firmware, but not the Nano's RSRC image. */ |