summaryrefslogtreecommitdiff
path: root/rbutil
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2020-09-25 22:48:00 +0200
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2020-09-27 09:28:15 +0200
commit9d8bcbeb2abf0593ae9d804d038c3821693e7131 (patch)
treeb1791263344ba6f04aeb13b2bb58b348b16da7d2 /rbutil
parentaf76fa3e7a321b303b0d219ed95578079bbc8a24 (diff)
downloadrockbox-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
Diffstat (limited to 'rbutil')
-rw-r--r--rbutil/sansapatcher/main.c49
-rw-r--r--rbutil/sansapatcher/sansapatcher.h16
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
31extern int sansa_verbose; 47extern 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. */