diff options
Diffstat (limited to 'rbutil/sansapatcher/sansapatcher.c')
-rw-r--r-- | rbutil/sansapatcher/sansapatcher.c | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/rbutil/sansapatcher/sansapatcher.c b/rbutil/sansapatcher/sansapatcher.c index bc03108930..ee15a16ca9 100644 --- a/rbutil/sansapatcher/sansapatcher.c +++ b/rbutil/sansapatcher/sansapatcher.c | |||
@@ -490,49 +490,63 @@ int sansa_scan(struct sansa_t* sansa) | |||
490 | int i; | 490 | int i; |
491 | int n = 0; | 491 | int n = 0; |
492 | char last_disk[4096]; | 492 | char last_disk[4096]; |
493 | int denied = 0; | ||
494 | int result; | ||
493 | 495 | ||
494 | printf("[INFO] Scanning disk devices...\n"); | 496 | printf("[INFO] Scanning disk devices...\n"); |
495 | 497 | ||
496 | for (i = 0; i <= 25 ; i++) { | 498 | for (i = 0; i <= 25 ; i++) { |
497 | #ifdef __WIN32__ | 499 | #ifdef __WIN32__ |
498 | sprintf(sansa->diskname,"\\\\.\\PhysicalDrive%d",i); | 500 | sprintf(sansa->diskname,"\\\\.\\PhysicalDrive%d",i); |
499 | #elif defined(linux) || defined (__linux) | 501 | #elif defined(linux) || defined (__linux) |
500 | sprintf(sansa->diskname,"/dev/sd%c",'a'+i); | 502 | sprintf(sansa->diskname,"/dev/sd%c",'a'+i); |
501 | #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) \ | 503 | #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) \ |
502 | || defined(__bsdi__) || defined(__DragonFly__) | 504 | || defined(__bsdi__) || defined(__DragonFly__) |
503 | sprintf(sansa->diskname,"/dev/da%d",i); | 505 | sprintf(sansa->diskname,"/dev/da%d",i); |
504 | #elif defined(__APPLE__) && defined(__MACH__) | 506 | #elif defined(__APPLE__) && defined(__MACH__) |
505 | sprintf(sansa->diskname,"/dev/disk%d",i); | 507 | sprintf(sansa->diskname,"/dev/disk%d",i); |
506 | #else | 508 | #else |
507 | #error No disk paths defined for this platform | 509 | #error No disk paths defined for this platform |
508 | #endif | 510 | #endif |
509 | if (sansa_open(sansa, 1) < 0) { | 511 | if ((result = sansa_open(sansa, 1)) < 0) { |
510 | continue; | 512 | if(result == -2) { |
511 | } | 513 | denied++; |
514 | } | ||
515 | continue; | ||
516 | } | ||
512 | 517 | ||
513 | if (sansa_read_partinfo(sansa,1) < 0) { | 518 | if (sansa_read_partinfo(sansa,1) < 0) { |
514 | continue; | 519 | continue; |
515 | } | 520 | } |
516 | 521 | ||
517 | if (is_sansa(sansa) < 0) { | 522 | if (is_sansa(sansa) < 0) { |
518 | continue; | 523 | continue; |
519 | } | 524 | } |
520 | 525 | ||
521 | #ifdef __WIN32__ | 526 | #ifdef __WIN32__ |
522 | printf("[INFO] %s found - disk device %d\n",sansa->targetname, i); | 527 | printf("[INFO] %s found - disk device %d\n",sansa->targetname, i); |
523 | #else | 528 | #else |
524 | printf("[INFO] %s found - %s\n",sansa->targetname, sansa->diskname); | 529 | printf("[INFO] %s found - %s\n",sansa->targetname, sansa->diskname); |
525 | #endif | 530 | #endif |
526 | n++; | 531 | n++; |
527 | strcpy(last_disk,sansa->diskname); | 532 | strcpy(last_disk,sansa->diskname); |
528 | sansa_close(sansa); | 533 | sansa_close(sansa); |
529 | } | 534 | } |
530 | 535 | ||
531 | if (n==1) { | 536 | if (n==1) { |
532 | /* Remember the disk name */ | 537 | /* Remember the disk name */ |
533 | strcpy(sansa->diskname,last_disk); | 538 | strcpy(sansa->diskname,last_disk); |
534 | } | 539 | } |
535 | return n; | 540 | else if (n == 0 && denied) { |
541 | printf("[ERR] FATAL: Permission denied on %d device(s) and no sansa detected.\n", denied); | ||
542 | #ifdef __WIN32__ | ||
543 | printf("[ERR] You need to run this program with administrator priviledges!\n"); | ||
544 | #else | ||
545 | printf("[ERR] You need permissions for raw disc access for this program to work!\n"); | ||
546 | #endif | ||
547 | } | ||
548 | |||
549 | return (n == 0 && denied) ? -1 : n; | ||
536 | } | 550 | } |
537 | 551 | ||
538 | /* Prepare original firmware for writing to the firmware partition by decrypting | 552 | /* Prepare original firmware for writing to the firmware partition by decrypting |