diff --git a/rbutil/ipodpatcher/ipodpatcher.c b/rbutil/ipodpatcher/ipodpatcher.c index 9f446d4ea4..542e078605 100644 --- a/rbutil/ipodpatcher/ipodpatcher.c +++ b/rbutil/ipodpatcher/ipodpatcher.c @@ -796,6 +796,26 @@ int add_new_image(struct ipod_t* ipod, char* imagename, char* filename, int type } +int ipod_has_bootloader(struct ipod_t* ipod) +{ + /* The 2nd gen Nano is installed differently */ + if (ipod->modelnum == 62) { + int i; + int has_osbk = 0; + /* Check if we have an OSBK image */ + for (i = 0; i < ipod->nimages; i++) { + if (ipod->ipod_directory[i].ftype==FTYPE_OSBK) { + has_osbk = 1; + } + } + return has_osbk; + } + else { + return (ipod->ipod_directory[0].entryOffset != 0); + } +} + + /* Bootloader installation on the Nano2G consists of renaming the OSOS image to OSBK and then writing the Rockbox bootloader as a @@ -810,17 +830,8 @@ int add_new_image(struct ipod_t* ipod, char* imagename, char* filename, int type static int add_bootloader_nano2g(struct ipod_t* ipod, char* filename, int type) { - int i; - int has_osbk = 0; - /* Check if we already have an OSBK image */ - for (i = 0; i < ipod->nimages; i++) { - if (ipod->ipod_directory[i].ftype==FTYPE_OSBK) { - has_osbk = 1; - } - } - - if (has_osbk == 0) { + if (ipod_has_bootloader(ipod) == 0) { /* First-time install - rename OSOS to OSBK and create new OSOS for bootloader */ fprintf(stderr,"[INFO] Creating OSBK backup image of original firmware\n"); @@ -841,17 +852,8 @@ static int add_bootloader_nano2g(struct ipod_t* ipod, char* filename, int type) static int delete_bootloader_nano2g(struct ipod_t* ipod) { - int i; - int has_osbk = 0; - /* Check if we have an OSBK image */ - for (i = 0; i < ipod->nimages; i++) { - if (ipod->ipod_directory[i].ftype==FTYPE_OSBK) { - has_osbk = 1; - } - } - - if (has_osbk == 0) { + if (ipod_has_bootloader(ipod) == 0) { fprintf(stderr,"[ERR] No OSBK image found - nothing to uninstall\n"); return -1; } else { @@ -1118,7 +1120,7 @@ int delete_bootloader(struct ipod_t* ipod) /* Firstly check we have a bootloader... */ - if (ipod->ipod_directory[0].entryOffset == 0) { + if (ipod_has_bootloader(ipod) == 0) { fprintf(stderr,"[ERR] No bootloader found.\n"); return -1; } diff --git a/rbutil/ipodpatcher/ipodpatcher.h b/rbutil/ipodpatcher/ipodpatcher.h index 30a1b1e9fd..dc3f100520 100644 --- a/rbutil/ipodpatcher/ipodpatcher.h +++ b/rbutil/ipodpatcher/ipodpatcher.h @@ -69,6 +69,7 @@ void ipod_get_ramsize(struct ipod_t* ipod); int read_aupd(struct ipod_t* ipod, char* filename); int write_aupd(struct ipod_t* ipod, char* filename); off_t filesize(int fd); +int ipod_has_bootloader(struct ipod_t* ipod); #ifdef __cplusplus } diff --git a/rbutil/rbutilqt/base/bootloaderinstallipod.cpp b/rbutil/rbutilqt/base/bootloaderinstallipod.cpp index cb69faa35b..249da13735 100644 --- a/rbutil/rbutilqt/base/bootloaderinstallipod.cpp +++ b/rbutil/rbutilqt/base/bootloaderinstallipod.cpp @@ -166,7 +166,7 @@ bool BootloaderInstallIpod::uninstall(void) return false; } - if (ipod.ipod_directory[0].entryOffset == 0) { + if (ipod_has_bootloader(&ipod) == 0) { emit logItem(tr("No bootloader detected."), LOGERROR); emit done(true); return false; @@ -199,8 +199,8 @@ BootloaderInstallBase::BootloaderType BootloaderInstallIpod::installed(void) } else { read_directory(&ipod); - if(ipod.ipod_directory[0].entryOffset == 0 || ipod.macpod) { - qDebug() << "[BootloaderInstallIpod] installed: BootloaderOther"; + getmodel(&ipod,(ipod.ipod_directory[ipod.ososimage].vers>>8)); + if(!ipod_has_bootloader(&ipod)) { result = BootloaderOther; } else {