summaryrefslogtreecommitdiffstats
path: root/rbutil/sansapatcher
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2008-05-11 16:58:02 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2008-05-11 16:58:02 +0000
commit850c4f98baecf3d3c28e916927d15d3bbd0cd502 (patch)
tree2578116282c63b614b8ae7574724456ad857b980 /rbutil/sansapatcher
parentb9ae6664b396a4167ea8cf9ba092241ebba439b1 (diff)
downloadrockbox-850c4f98baecf3d3c28e916927d15d3bbd0cd502.tar.gz
rockbox-850c4f98baecf3d3c28e916927d15d3bbd0cd502.tar.bz2
rockbox-850c4f98baecf3d3c28e916927d15d3bbd0cd502.zip
Make sansapatcher check and report permission denied errors.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17461 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'rbutil/sansapatcher')
-rw-r--r--rbutil/sansapatcher/sansaio-posix.c4
-rw-r--r--rbutil/sansapatcher/sansaio-win32.c5
-rw-r--r--rbutil/sansapatcher/sansapatcher.c56
3 files changed, 42 insertions, 23 deletions
diff --git a/rbutil/sansapatcher/sansaio-posix.c b/rbutil/sansapatcher/sansaio-posix.c
index 22abc883d2..95677b6b35 100644
--- a/rbutil/sansapatcher/sansaio-posix.c
+++ b/rbutil/sansapatcher/sansaio-posix.c
@@ -25,6 +25,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
+#include <errno.h>
#if defined(linux) || defined (__linux)
#include <sys/mount.h>
@@ -74,7 +75,8 @@ int sansa_open(struct sansa_t* sansa, int silent)
sansa->dh=open(sansa->diskname,O_RDONLY);
if (sansa->dh < 0) {
if (!silent) perror(sansa->diskname);
- return -1;
+ if(errno == EACCES) return -2;
+ else return -1;
}
if(ioctl(sansa->dh,SANSA_SECTORSIZE_IOCTL,&sansa->sector_size) < 0) {
diff --git a/rbutil/sansapatcher/sansaio-win32.c b/rbutil/sansapatcher/sansaio-win32.c
index 8c2c696c1a..15bf82be3c 100644
--- a/rbutil/sansapatcher/sansaio-win32.c
+++ b/rbutil/sansapatcher/sansaio-win32.c
@@ -79,7 +79,10 @@ int sansa_open(struct sansa_t* sansa, int silent)
if (sansa->dh == INVALID_HANDLE_VALUE) {
if (!silent) print_error(" Error opening disk: ");
- return -1;
+ if(GetLastError() == ERROR_ACCESS_DENIED)
+ return -2;
+ else
+ return -1;
}
if (!lock_volume(sansa->dh)) {
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)
int i;
int n = 0;
char last_disk[4096];
+ int denied = 0;
+ int result;
printf("[INFO] Scanning disk devices...\n");
for (i = 0; i <= 25 ; i++) {
#ifdef __WIN32__
- sprintf(sansa->diskname,"\\\\.\\PhysicalDrive%d",i);
+ sprintf(sansa->diskname,"\\\\.\\PhysicalDrive%d",i);
#elif defined(linux) || defined (__linux)
- sprintf(sansa->diskname,"/dev/sd%c",'a'+i);
+ sprintf(sansa->diskname,"/dev/sd%c",'a'+i);
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) \
- || defined(__bsdi__) || defined(__DragonFly__)
- sprintf(sansa->diskname,"/dev/da%d",i);
+ || defined(__bsdi__) || defined(__DragonFly__)
+ sprintf(sansa->diskname,"/dev/da%d",i);
#elif defined(__APPLE__) && defined(__MACH__)
- sprintf(sansa->diskname,"/dev/disk%d",i);
+ sprintf(sansa->diskname,"/dev/disk%d",i);
#else
- #error No disk paths defined for this platform
+#error No disk paths defined for this platform
#endif
- if (sansa_open(sansa, 1) < 0) {
- continue;
- }
+ if ((result = sansa_open(sansa, 1)) < 0) {
+ if(result == -2) {
+ denied++;
+ }
+ continue;
+ }
- if (sansa_read_partinfo(sansa,1) < 0) {
- continue;
- }
+ if (sansa_read_partinfo(sansa,1) < 0) {
+ continue;
+ }
- if (is_sansa(sansa) < 0) {
- continue;
- }
+ if (is_sansa(sansa) < 0) {
+ continue;
+ }
#ifdef __WIN32__
- printf("[INFO] %s found - disk device %d\n",sansa->targetname, i);
+ printf("[INFO] %s found - disk device %d\n",sansa->targetname, i);
#else
- printf("[INFO] %s found - %s\n",sansa->targetname, sansa->diskname);
+ printf("[INFO] %s found - %s\n",sansa->targetname, sansa->diskname);
#endif
- n++;
- strcpy(last_disk,sansa->diskname);
- sansa_close(sansa);
+ n++;
+ strcpy(last_disk,sansa->diskname);
+ sansa_close(sansa);
}
if (n==1) {
/* Remember the disk name */
strcpy(sansa->diskname,last_disk);
}
- return n;
+ else if (n == 0 && denied) {
+ printf("[ERR] FATAL: Permission denied on %d device(s) and no sansa detected.\n", denied);
+#ifdef __WIN32__
+ printf("[ERR] You need to run this program with administrator priviledges!\n");
+#else
+ printf("[ERR] You need permissions for raw disc access for this program to work!\n");
+#endif
+ }
+
+ return (n == 0 && denied) ? -1 : n;
}
/* Prepare original firmware for writing to the firmware partition by decrypting