summaryrefslogtreecommitdiffstats
path: root/rbutil/sansapatcher
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2021-12-15 21:04:28 +0100
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2021-12-24 18:05:53 +0100
commitc876d3bbefe0dc00c27ca0c12d29da5874946962 (patch)
tree69f468a185a369b01998314bc3ecc19b70f4fcaa /rbutil/sansapatcher
parent6c6f0757d7a902feb293be165d1490c42bc8e7ad (diff)
downloadrockbox-c876d3bbefe0dc00c27ca0c12d29da5874946962.tar.gz
rockbox-c876d3bbefe0dc00c27ca0c12d29da5874946962.zip
rbutil: Merge rbutil with utils folder.
rbutil uses several components from the utils folder, and can be considered part of utils too. Having it in a separate folder is an arbitrary split that doesn't help anymore these days, so merge them. This also allows other utils to easily use libtools.make without the need to navigate to a different folder. Change-Id: I3fc2f4de19e3e776553efb5dea5f779dfec0dc21
Diffstat (limited to 'rbutil/sansapatcher')
-rw-r--r--rbutil/sansapatcher/Makefile52
-rw-r--r--rbutil/sansapatcher/README36
-rw-r--r--rbutil/sansapatcher/main.c420
-rw-r--r--rbutil/sansapatcher/parttypes.h109
-rw-r--r--rbutil/sansapatcher/sansaio-posix.c157
-rw-r--r--rbutil/sansapatcher/sansaio-win32.c217
-rw-r--r--rbutil/sansapatcher/sansaio.h88
-rw-r--r--rbutil/sansapatcher/sansapatcher.c975
-rw-r--r--rbutil/sansapatcher/sansapatcher.h67
-rw-r--r--rbutil/sansapatcher/sansapatcher.manifest13
-rw-r--r--rbutil/sansapatcher/sansapatcher.pro38
-rw-r--r--rbutil/sansapatcher/sansapatcher.rc1
12 files changed, 0 insertions, 2173 deletions
diff --git a/rbutil/sansapatcher/Makefile b/rbutil/sansapatcher/Makefile
deleted file mode 100644
index 85c36c6d14..0000000000
--- a/rbutil/sansapatcher/Makefile
+++ /dev/null
@@ -1,52 +0,0 @@
-# __________ __ ___.
-# Open \______ \ ____ ____ | | _\_ |__ _______ ___
-# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
-# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
-# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
-# \/ \/ \/ \/ \/
-
-TARGET_DIR ?= $(shell pwd)/
-CFLAGS += -Wall -W -D_LARGEFILE64_SOURCE
-
-OUTPUT = sansapatcher
-
-# inputs
-LIBSOURCES := sansapatcher.c sansaio-posix.c sansaio-win32.c
-SOURCES := main.c
-# additional link dependencies for the standalone executable
-EXTRADEPS :=
-
-# Releases of sansapatcher are created with "make RELEASE=1". This
-# enables BOOTOBJS and uses the VERSION string defined in main.c
-ifdef RELEASE
-CFLAGS += -DRELEASE
-BOOTOBJS=1
-endif
-
-ifdef WITH_BOOTOBJS
-BOOTSRC = bootimg_c200.c bootimg_e200.c
-SOURCES += $(BOOTSRC)
-CFLAGS += -DWITH_BOOTOBJS
-endif
-
-include ../libtools.make
-
-# find out if we need to link the manifest resource.
-# Since libtools.make sets up BINARY we check it for the file extension .exe.
-ifeq ($(findstring exe,$(BINARY)),exe)
-$(BINARY): $(OBJDIR)sansapatcher-rc.o
-endif
-
-$(OBJDIR)main.o: $(BOOTSRC)
-$(OBJDIR)sansapatcher-rc.o: sansapatcher.rc sansapatcher.manifest
- @echo WINDRES $(notdir $<)
- $(SILENT)$(CROSS)$(WINDRES) -i sansapatcher.rc -o $@
-
-bootimg_c200.c: firmware.mi4 $(BIN2C)
- @echo BIN2C $<
- $(SILENT)$(BIN2C) $< $*
-
-bootimg_e200.c: PP5022.mi4 $(BIN2C)
- @echo BIN2C $< $*
- $(SILENT)$(BIN2C) $< $*
-
diff --git a/rbutil/sansapatcher/README b/rbutil/sansapatcher/README
deleted file mode 100644
index c62f676110..0000000000
--- a/rbutil/sansapatcher/README
+++ /dev/null
@@ -1,36 +0,0 @@
-sansapatcher
-------------
-
-To compile sansapatcher, you need both the C200 and E200 Rockbox
-bootloaders. The latest bootloaders can always be found here:
-
-http://download.rockbox.org/bootloader/sandisk-sansa/e200/PP5022.mi4
-http://download.rockbox.org/bootloader/sandisk-sansa/c200/firmware.mi4
-
-Place both these files in the sansapatcher source directory, and type "make".
-
-
-Building your own bootloaders
------------------------------
-
-If you would like to compile the bootloaders yourself, they are the output of
-running the "Bootloader" build for the E200 and C200 targets.
-
-NOTE: Unless you know what you are doing, it is recommended that you
- use the official pre-built binary bootloaders linked to above.
- Bootloaders compiled from current Rockbox SVN are untested and
- may contain bugs preventing you from starting the device (or
- worse...).
-
-In the Rockbox source directory, do:
-
-mkdir build-e200-bootloader
-cd build-e200-bootloader
-../tools/configure
-[Select E200, then B for bootloader]
-make
-
-This will create PP5022.mi4 which you should copy to the sansapatcher
-build directory.
-
-A similar process for the C200 will create firmware.mi4.
diff --git a/rbutil/sansapatcher/main.c b/rbutil/sansapatcher/main.c
deleted file mode 100644
index d12e33c22b..0000000000
--- a/rbutil/sansapatcher/main.c
+++ /dev/null
@@ -1,420 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- * $Id$
- *
- * Copyright (C) 2006-2007 Dave Chapman
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <inttypes.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "sansapatcher.h"
-#include "sansaio.h"
-#include "parttypes.h"
-#ifdef WITH_BOOTOBJS
-#include "bootimg_c200.h"
-#include "bootimg_e200.h"
-#endif
-
-#ifndef VERSION
-#define VERSION "0.8 with v6.0 bootloaders"
-#endif
-
-enum {
- NONE,
- INSTALL,
- INTERACTIVE,
- SHOW_INFO,
- LIST_IMAGES,
- DELETE_BOOTLOADER,
- ADD_BOOTLOADER,
- READ_FIRMWARE,
- WRITE_FIRMWARE,
- READ_PARTITION,
- WRITE_PARTITION,
- UPDATE_OF,
- UPDATE_PPBL
-};
-
-static void print_usage(void)
-{
- fprintf(stderr,"Usage: sansapatcher --scan\n");
-#ifdef __WIN32__
- fprintf(stderr," or sansapatcher [DISKNO] [action]\n");
-#else
- fprintf(stderr," or sansapatcher [device] [action]\n");
-#endif
- fprintf(stderr,"\n");
- fprintf(stderr,"Where [action] is one of the following options:\n");
- fprintf(stderr," --install\n");
- fprintf(stderr," -l, --list\n");
- fprintf(stderr," -rf, --read-firmware filename.mi4\n");
- fprintf(stderr," -a, --add-bootloader filename.mi4\n");
- fprintf(stderr," -d, --delete-bootloader\n");
- fprintf(stderr," -of --update-original-firmware filename.mi4\n");
- fprintf(stderr," -bl --update-ppbl filename.bin\n");
- fprintf(stderr,"\n");
-
-#ifdef __WIN32__
- fprintf(stderr,"DISKNO is the number (e.g. 2) Windows has assigned to your sansa's hard disk.\n");
- fprintf(stderr,"The first hard disk in your computer (i.e. C:\\) will be disk 0, the next disk\n");
- fprintf(stderr,"will be disk 1 etc. sansapatcher will refuse to access a disk unless it\n");
- fprintf(stderr,"can identify it as being an E200 or C200.\n");
- fprintf(stderr,"\n");
-#else
-#if defined(linux) || defined (__linux)
- fprintf(stderr,"\"device\" is the device node (e.g. /dev/sda) assigned to your sansa.\n");
-#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
- fprintf(stderr,"\"device\" is the device node (e.g. /dev/da1) assigned to your sansa.\n");
-#elif defined(__APPLE__) && defined(__MACH__)
- fprintf(stderr,"\"device\" is the device node (e.g. /dev/disk1) assigned to your sansa.\n");
-#endif
- fprintf(stderr,"sansapatcher will refuse to access a disk unless it can identify it as being\n");
- fprintf(stderr,"an E200 or C200.\n");
-#endif
-}
-
-static const char* get_parttype(int pt)
-{
- int i;
- static const char unknown[]="Unknown";
-
- if (pt == -1) {
- return "HFS/HFS+";
- }
-
- i=0;
- while (parttypes[i].name != NULL) {
- if (parttypes[i].type == pt) {
- return (parttypes[i].name);
- }
- i++;
- }
-
- return unknown;
-}
-
-static void display_partinfo(struct sansa_t* sansa)
-{
- int i;
- double sectors_per_MB = (1024.0*1024.0)/sansa->sector_size;
-
- printf("[INFO] Part Start Sector End Sector Size (MB) Type\n");
- for ( i = 0; i < 4; i++ ) {
- if (sansa->pinfo[i].start != 0) {
- printf("[INFO] %d %10ld %10ld %10.1f %s (0x%02x)\n",
- i,
- sansa->pinfo[i].start,
- sansa->pinfo[i].start+sansa->pinfo[i].size-1,
- sansa->pinfo[i].size/sectors_per_MB,
- get_parttype(sansa->pinfo[i].type),
- sansa->pinfo[i].type);
- }
- }
-}
-
-
-int main(int argc, char* argv[])
-{
- char yesno[4];
- int i;
- int n;
- char* filename;
- int action = SHOW_INFO;
- struct sansa_t sansa;
- int res = 0;
- unsigned char* buf = NULL;
- unsigned int len;
-
- fprintf(stderr,"sansapatcher v" VERSION " - (C) Dave Chapman 2006-2007\n");
- fprintf(stderr,"This is free software; see the source for copying conditions. There is NO\n");
- fprintf(stderr,"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
-
- if ((argc > 1) && ((strcmp(argv[1],"-h")==0) || (strcmp(argv[1],"--help")==0))) {
- print_usage();
- return SANSA_OK;
- }
-
- if (sansa_alloc_buffer(&sansa, BUFFER_SIZE) < 0) {
- fprintf(stderr,"Failed to allocate memory buffer\n");
- return SANSA_INTERNAL_ERROR;
- }
-
- if ((argc > 1) && (strcmp(argv[1],"--scan")==0)) {
- if (sansa_scan(&sansa) == 0)
- fprintf(stderr,"[ERR] No E200s or C200s found.\n");
- return SANSA_NOT_FOUND;
- }
-
- /* If the first parameter doesn't start with -, then we interpret it as a device */
- if ((argc > 1) && (argv[1][0] != '-')) {
- sansa.diskname[0]=0;
-#ifdef __WIN32__
- snprintf(sansa.diskname,sizeof(sansa.diskname),"\\\\.\\PhysicalDrive%s",argv[1]);
-#else
- strncpy(sansa.diskname,argv[1],sizeof(sansa.diskname));
-#endif
- i = 2;
- } else {
- /* Autoscan for C200/E200s */
- n = sansa_scan(&sansa);
- if (n==0) {
- fprintf(stderr,"[ERR] No E200s or C200s found, aborting\n");
- fprintf(stderr,"[ERR] Please connect your sansa and ensure it is in UMS mode\n");
-#if defined(__APPLE__) && defined(__MACH__)
- fprintf(stderr,"[ERR] Also ensure that your Sansa's main partition is not mounted.\n");
-#elif !defined(__WIN32__)
- if (geteuid()!=0) {
- fprintf(stderr,"[ERR] You may also need to run sansapatcher as root.\n");
- }
-#endif
- fprintf(stderr,"[ERR] Please refer to the Rockbox manual if you continue to have problems.\n");
- } else if (n > 1) {
- fprintf(stderr,"[ERR] %d Sansas found, aborting\n",n);
- fprintf(stderr,"[ERR] Please connect only one Sansa and re-run sansapatcher.\n");
- }
-
- if (n != 1) {
-#ifdef WITH_BOOTOBJS
- if (argc==1) {
- printf("\nPress ENTER to exit sansapatcher :");
- fgets(yesno,4,stdin);
- }
-#endif
- return n > 1 ? SANSA_MULTIPLE_DEVICES : SANSA_NOT_FOUND;
- }
-
- i = 1;
- }
-
-#ifdef WITH_BOOTOBJS
- action = INTERACTIVE;
-#endif
-
- while (i < argc) {
- if ((strcmp(argv[i],"-l")==0) || (strcmp(argv[i],"--list")==0)) {
- action = LIST_IMAGES;
- i++;
- } else if (strcmp(argv[i],"--install")==0) {
- action = INSTALL;
- i++;
- } else if ((strcmp(argv[i],"-d")==0) ||
- (strcmp(argv[i],"--delete-bootloader")==0)) {
- action = DELETE_BOOTLOADER;
- i++;
- } else if ((strcmp(argv[i],"-a")==0) ||
- (strcmp(argv[i],"--add-bootloader")==0)) {
- action = ADD_BOOTLOADER;
- i++;
- if (i == argc) { print_usage(); return SANSA_WRONG_ARGUMENTS; }
- filename=argv[i];
- i++;
- } else if ((strcmp(argv[i],"-of")==0) ||
- (strcmp(argv[i],"--update-original-firmware")==0)) {
- action = UPDATE_OF;
- i++;
- if (i == argc) { print_usage(); return SANSA_WRONG_ARGUMENTS; }
- filename=argv[i];
- i++;
- } else if ((strcmp(argv[i],"-bl")==0) ||
- (strcmp(argv[i],"--update-ppbl")==0)) {
- action = UPDATE_PPBL;
- i++;
- if (i == argc) { print_usage(); return SANSA_WRONG_ARGUMENTS; }
- filename=argv[i];
- i++;
- } else if ((strcmp(argv[i],"-rf")==0) ||
- (strcmp(argv[i],"--read-firmware")==0)) {
- action = READ_FIRMWARE;
- i++;
- if (i == argc) { print_usage(); return SANSA_WRONG_ARGUMENTS; }
- filename=argv[i];
- i++;
- }
- }
-
- if (sansa.diskname[0]==0) {
- print_usage();
- return SANSA_WRONG_ARGUMENTS;
- }
-
- if (sansa_open(&sansa, 0) < 0) {
- return SANSA_ACCESS_DENIED;
- }
-
- fprintf(stderr,"[INFO] Reading partition table from %s\n",sansa.diskname);
- fprintf(stderr,"[INFO] Sector size is %d bytes\n",sansa.sector_size);
-
- if (sansa_read_partinfo(&sansa,0) < 0) {
- return SANSA_PARTITION_ERROR;
- }
-
- display_partinfo(&sansa);
-
- i = is_sansa(&sansa);
- if (i < 0) {
- fprintf(stderr,"[ERR] Disk is not an E200 or C200 (%d), aborting.\n",i);
- return SANSA_WRONG_TYPE;
- }
-
- if (sansa.hasoldbootloader) {
- printf("[ERR] ************************************************************************\n");
- printf("[ERR] *** OLD ROCKBOX INSTALLATION DETECTED, ABORTING.\n");
- printf("[ERR] *** You must reinstall the original Sansa firmware before running\n");
- printf("[ERR] *** sansapatcher for the first time.\n");
- printf("[ERR] *** See http://www.rockbox.org/wiki/SansaE200Install\n");
- printf("[ERR] ************************************************************************\n");
- res = SANSA_OLD_INSTALL;
- } else {
- if (action==LIST_IMAGES) {
- sansa_list_images(&sansa);
-#ifdef WITH_BOOTOBJS
- } else if (action==INTERACTIVE) {
-
- printf("Enter i to install the Rockbox bootloader, u to uninstall\n or c to cancel and do nothing (i/u/c) :");
-
- if (fgets(yesno,4,stdin)) {
- if (yesno[0]=='i') {
- if (sansa_reopen_rw(&sansa) < 0) {
- res = SANSA_CANNOT_REOPEN;
- }
- if (strcmp(sansa.targetname,"c200") == 0) {
- len = LEN_bootimg_c200;
- buf = bootimg_c200;
- } else {
- len = LEN_bootimg_e200;
- buf = bootimg_e200;
- }
- if (sansa_add_bootloader(&sansa, buf, len)==0) {
- fprintf(stderr,"[INFO] Bootloader installed successfully.\n");
- } else {
- fprintf(stderr,"[ERR] --install failed.\n");
- res = SANSA_INSTALL_FAILED;
- }
- } else if (yesno[0]=='u') {
- if (sansa_reopen_rw(&sansa) < 0) {
- res = SANSA_CANNOT_REOPEN;
- }
-
- if (sansa_delete_bootloader(&sansa)==0) {
- fprintf(stderr,"[INFO] Bootloader removed.\n");
- } else {
- fprintf(stderr,"[ERR] Bootloader removal failed.\n");
- res = SANSA_UNINSTALL_FAILED;
- }
- }
- }
-#endif
- } else if (action==READ_FIRMWARE) {
- if (sansa_read_firmware(&sansa, filename)==0) {
- fprintf(stderr,"[INFO] Firmware read to file %s.\n",filename);
- } else {
- fprintf(stderr,"[ERR] --read-firmware failed.\n");
- }
-#ifdef WITH_BOOTOBJS
- } else if (action==INSTALL) {
- if (sansa_reopen_rw(&sansa) < 0) {
- return SANSA_CANNOT_REOPEN;
- }
-
- if (strcmp(sansa.targetname,"c200") == 0) {
- len = LEN_bootimg_c200;
- buf = bootimg_c200;
- } else {
- len = LEN_bootimg_e200;
- buf = bootimg_e200;
- }
-
- if (sansa_add_bootloader(&sansa, buf, len)==0) {
- fprintf(stderr,"[INFO] Bootloader installed successfully.\n");
- } else {
- fprintf(stderr,"[ERR] --install failed.\n");
- }
-#endif
- } else if (action==ADD_BOOTLOADER) {
- if (sansa_reopen_rw(&sansa) < 0) {
- return SANSA_CANNOT_REOPEN;
- }
-
- len = sansa_read_bootloader(&sansa, filename, &buf);
- if (len > 0) {
- if (sansa_add_bootloader(&sansa, buf, len)==0) {
- fprintf(stderr,"[INFO] Bootloader %s written to device.\n",filename);
- } else {
- fprintf(stderr,"[ERR] --add-bootloader failed.\n");
- }
- }
- } else if (action==DELETE_BOOTLOADER) {
- if (sansa_reopen_rw(&sansa) < 0) {
- return SANSA_CANNOT_REOPEN;
- }
-
- if (sansa_delete_bootloader(&sansa)==0) {
- fprintf(stderr,"[INFO] Bootloader removed successfully.\n");
- } else {
- fprintf(stderr,"[ERR] --delete-bootloader failed.\n");
- }
- } else if (action==UPDATE_OF) {
- if (sansa_reopen_rw(&sansa) < 0) {
- return SANSA_CANNOT_REOPEN;
- }
-
- if (sansa_update_of(&sansa, filename)==0) {
- fprintf(stderr,"[INFO] OF updated successfully.\n");
- } else {
- fprintf(stderr,"[ERR] --update-original-firmware failed.\n");
- }
- } else if (action==UPDATE_PPBL) {
- printf("[WARN] PPBL installation will overwrite your bootloader. This will lead to a\n");
- printf(" Sansa that won't boot if the bootloader file is invalid. Only continue if\n");
- printf(" you're sure you know what you're doing.\n");
- printf(" Continue (y/n)? ");
-
- if (fgets(yesno,4,stdin)) {
- if (yesno[0]=='y') {
- if (sansa_reopen_rw(&sansa) < 0) {
- return SANSA_CANNOT_REOPEN;
- }
-
- if (sansa_update_ppbl(&sansa, filename)==0) {
- fprintf(stderr,"[INFO] PPBL updated successfully.\n");
- } else {
- fprintf(stderr,"[ERR] --update-ppbl failed.\n");
- }
- }
- }
- }
- }
-
- sansa_close(&sansa);
- sansa_dealloc_buffer(&sansa);
-
-#ifdef WITH_BOOTOBJS
- if (action==INTERACTIVE) {
- printf("Press ENTER to exit sansapatcher :");
- fgets(yesno,4,stdin);
- }
-#endif
-
- return res;
-}
diff --git a/rbutil/sansapatcher/parttypes.h b/rbutil/sansapatcher/parttypes.h
deleted file mode 100644
index f8de303553..0000000000
--- a/rbutil/sansapatcher/parttypes.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/* DOS partition types - taken from fdisk */
-
-struct parttype {
- unsigned char type;
- char *name;
-};
-
-struct parttype parttypes[] = {
- {0x00, "Empty"},
- {0x01, "FAT12"},
- {0x02, "XENIX root"},
- {0x03, "XENIX usr"},
- {0x04, "FAT16 <32M"},
- {0x05, "Extended"}, /* DOS 3.3+ extended partition */
- {0x06, "FAT16"}, /* DOS 16-bit >=32M */
- {0x07, "HPFS/NTFS"}, /* OS/2 IFS, eg, HPFS or NTFS or QNX */
- {0x08, "AIX"}, /* AIX boot (AIX -- PS/2 port) or SplitDrive */
- {0x09, "AIX bootable"}, /* AIX data or Coherent */
- {0x0a, "OS/2 Boot Manager"},/* OS/2 Boot Manager */
- {0x0b, "W95 FAT32"},
- {0x0c, "W95 FAT32 (LBA)"},/* LBA really is `Extended Int 13h' */
- {0x0e, "W95 FAT16 (LBA)"},
- {0x0f, "W95 Ext'd (LBA)"},
- {0x10, "OPUS"},
- {0x11, "Hidden FAT12"},
- {0x12, "Compaq diagnostics"},
- {0x14, "Hidden FAT16 <32M"},
- {0x16, "Hidden FAT16"},
- {0x17, "Hidden HPFS/NTFS"},
- {0x18, "AST SmartSleep"},
- {0x1b, "Hidden W95 FAT32"},
- {0x1c, "Hidden W95 FAT32 (LBA)"},
- {0x1e, "Hidden W95 FAT16 (LBA)"},
- {0x24, "NEC DOS"},
- {0x39, "Plan 9"},
- {0x3c, "PartitionMagic recovery"},
- {0x40, "Venix 80286"},
- {0x41, "PPC PReP Boot"},
- {0x42, "SFS"},
- {0x4d, "QNX4.x"},
- {0x4e, "QNX4.x 2nd part"},
- {0x4f, "QNX4.x 3rd part"},
- {0x50, "OnTrack DM"},
- {0x51, "OnTrack DM6 Aux1"}, /* (or Novell) */
- {0x52, "CP/M"}, /* CP/M or Microport SysV/AT */
- {0x53, "OnTrack DM6 Aux3"},
- {0x54, "OnTrackDM6"},
- {0x55, "EZ-Drive"},
- {0x56, "Golden Bow"},
- {0x5c, "Priam Edisk"},
- {0x61, "SpeedStor"},
- {0x63, "GNU HURD or SysV"}, /* GNU HURD or Mach or Sys V/386 (such as ISC UNIX) */
- {0x64, "Novell Netware 286"},
- {0x65, "Novell Netware 386"},
- {0x70, "DiskSecure Multi-Boot"},
- {0x75, "PC/IX"},
- {0x80, "Old Minix"}, /* Minix 1.4a and earlier */
- {0x81, "Minix / old Linux"},/* Minix 1.4b and later */
- {0x82, "Linux swap / Solaris"},
- {0x83, "Linux"},
- {0x84, "OS/2 hidden C: drive"},
- {0x85, "Linux extended"},
- {0x86, "NTFS volume set"},
- {0x87, "NTFS volume set"},
- {0x88, "Linux plaintext"},
- {0x8e, "Linux LVM"},
- {0x93, "Amoeba"},
- {0x94, "Amoeba BBT"}, /* (bad block table) */
- {0x9f, "BSD/OS"}, /* BSDI */
- {0xa0, "IBM Thinkpad hibernation"},
- {0xa5, "FreeBSD"}, /* various BSD flavours */
- {0xa6, "OpenBSD"},
- {0xa7, "NeXTSTEP"},
- {0xa8, "Darwin UFS"},
- {0xa9, "NetBSD"},
- {0xab, "Darwin boot"},
- {0xb7, "BSDI fs"},
- {0xb8, "BSDI swap"},
- {0xbb, "Boot Wizard hidden"},
- {0xbe, "Solaris boot"},
- {0xbf, "Solaris"},
- {0xc1, "DRDOS/sec (FAT-12)"},
- {0xc4, "DRDOS/sec (FAT-16 < 32M)"},
- {0xc6, "DRDOS/sec (FAT-16)"},
- {0xc7, "Syrinx"},
- {0xda, "Non-FS data"},
- {0xdb, "CP/M / CTOS / ..."},/* CP/M or Concurrent CP/M or
- Concurrent DOS or CTOS */
- {0xde, "Dell Utility"}, /* Dell PowerEdge Server utilities */
- {0xdf, "BootIt"}, /* BootIt EMBRM */
- {0xe1, "DOS access"}, /* DOS access or SpeedStor 12-bit FAT
- extended partition */
- {0xe3, "DOS R/O"}, /* DOS R/O or SpeedStor */
- {0xe4, "SpeedStor"}, /* SpeedStor 16-bit FAT extended
- partition < 1024 cyl. */
- {0xeb, "BeOS fs"},
- {0xee, "EFI GPT"}, /* Intel EFI GUID Partition Table */
- {0xef, "EFI (FAT-12/16/32)"},/* Intel EFI System Partition */
- {0xf0, "Linux/PA-RISC boot"},/* Linux/PA-RISC boot loader */
- {0xf1, "SpeedStor"},
- {0xf4, "SpeedStor"}, /* SpeedStor large partition */
- {0xf2, "DOS secondary"}, /* DOS 3.3+ secondary */
- {0xfd, "Linux raid autodetect"},/* New (2.2.x) raid partition with
- autodetect using persistent
- superblock */
- {0xfe, "LANstep"}, /* SpeedStor >1024 cyl. or LANstep */
- {0xff, "BBT"}, /* Xenix Bad Block Table */
- { 0, 0 }
-};
diff --git a/rbutil/sansapatcher/sansaio-posix.c b/rbutil/sansapatcher/sansaio-posix.c
deleted file mode 100644
index 44c4dcc95c..0000000000
--- a/rbutil/sansapatcher/sansaio-posix.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- * $Id$
- *
- * Copyright (C) 2006-2007 Dave Chapman
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-
-#if !defined(_WIN32) /* all non-Windows platforms supported are POSIX. */
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <errno.h>
-
-#if defined(linux) || defined (__linux)
-#include <sys/mount.h>
-#define SANSA_SECTORSIZE_IOCTL BLKSSZGET
-#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) \
- || defined(__bsdi__) || defined(__DragonFly__)
-#include <sys/disk.h>
-#define SANSA_SECTORSIZE_IOCTL DIOCGSECTORSIZE
-#elif defined(__APPLE__) && defined(__MACH__)
-#include <sys/disk.h>
-#define SANSA_SECTORSIZE_IOCTL DKIOCGETBLOCKSIZE
-#else
- #error No sector-size detection implemented for this platform
-#endif
-
-#include "sansaio.h"
-
-#if defined(__APPLE__) && defined(__MACH__)
-static int sansa_unmount(struct sansa_t* sansa)
-{
- char cmd[4096];
- int res;
-
- sprintf(cmd, "/usr/sbin/diskutil unmount \"%ss1\"",sansa->diskname);
- fprintf(stderr,"[INFO] ");
- res = system(cmd);
-
- if (res==0) {
- return 0;
- } else {
- perror("Unmount failed");
- return -1;
- }
-}
-#endif
-
-
-void sansa_print_error(char* msg)
-{
- perror(msg);
-}
-
-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);
- if(errno == EACCES) return -2;
- else return -1;
- }
-
- if(ioctl(sansa->dh,SANSA_SECTORSIZE_IOCTL,&sansa->sector_size) < 0) {
- sansa->sector_size=512;
- if (!silent) {
- fprintf(stderr,"[ERR] ioctl() call to get sector size failed, defaulting to %d\n"
- ,sansa->sector_size);
- }
- }
- return 0;
-}
-
-
-int sansa_reopen_rw(struct sansa_t* sansa)
-{
-#if defined(__APPLE__) && defined(__MACH__)
- if (sansa_unmount(sansa) < 0)
- return -1;
-#endif
-
- close(sansa->dh);
- sansa->dh=open(sansa->diskname,O_RDWR);
- if (sansa->dh < 0) {
- perror(sansa->diskname);
- return -1;
- }
- return 0;
-}
-
-int sansa_close(struct sansa_t* sansa)
-{
- close(sansa->dh);
- return 0;
-}
-
-int sansa_alloc_buffer(struct sansa_t *sansa, int bufsize)
-{
- sansa->sectorbuf=malloc(bufsize);
- if (sansa->sectorbuf == NULL) {
- return -1;
- }
- return 0;
-}
-
-int sansa_dealloc_buffer(struct sansa_t* sansa)
-{
- if (sansa->sectorbuf == NULL) {
- return -1;
- }
- free(sansa->sectorbuf);
- sansa->sectorbuf = NULL;
- return 0;
-}
-
-int sansa_seek(struct sansa_t* sansa, loff_t pos)
-{
- off_t res;
-
- res = lseek64(sansa->dh, pos, SEEK_SET);
-
- if (res == -1) {
- return -1;
- }
- return 0;
-}
-
-int sansa_read(struct sansa_t* sansa, unsigned char* buf, int nbytes)
-{
- return read(sansa->dh, buf, nbytes);
-}
-
-int sansa_write(struct sansa_t* sansa, int nbytes)
-{
- return write(sansa->dh, sansa->sectorbuf, nbytes);
-}
-#endif
-
diff --git a/rbutil/sansapatcher/sansaio-win32.c b/rbutil/sansapatcher/sansaio-win32.c
deleted file mode 100644
index ee6a8cd93d..0000000000
--- a/rbutil/sansapatcher/sansaio-win32.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- * $Id$
- *
- * Copyright (C) 2006-2007 Dave Chapman
- *
- * error(), lock_volume() and unlock_volume() functions and inspiration taken
- * from:
- * RawDisk - Direct Disk Read/Write Access for NT/2000/XP
- * Copyright (c) 2003 Jan Kiszka
- * http://www.stud.uni-hannover.de/user/73174/RawDisk/
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-
-#if defined(_WIN32)
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#ifdef __WIN32__
-#include <windows.h>
-#include <winioctl.h>
-#endif
-
-#include "sansaio.h"
-
-static int lock_volume(HANDLE hDisk)
-{
- DWORD dummy;
-
- return DeviceIoControl(hDisk, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0,
- &dummy, NULL);
-}
-
-static int unlock_volume(HANDLE hDisk)
-{
- DWORD dummy;
-
- return DeviceIoControl(hDisk, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0,
- &dummy, NULL);
-}
-
-void sansa_print_error(char* msg)
-{
- LPSTR pMsgBuf = NULL;
-
- printf(msg);
- FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), pMsgBuf,
- 0, NULL);
- printf(pMsgBuf);
- LocalFree(pMsgBuf);
-}
-
-int sansa_open(struct sansa_t* sansa, int silent)
-{
- DISK_GEOMETRY_EX diskgeometry_ex;
- DISK_GEOMETRY diskgeometry;
- unsigned long n;
-
- sansa->dh = CreateFileA(sansa->diskname, GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
- FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, NULL);
-
- if (sansa->dh == INVALID_HANDLE_VALUE) {
- if (!silent) sansa_print_error(" Error opening disk: ");
- if(GetLastError() == ERROR_ACCESS_DENIED)
- return -2;
- else
- return -1;
- }
-
- if (!lock_volume(sansa->dh)) {
- if (!silent) sansa_print_error(" Error locking disk: ");
- return -1;
- }
-
- if (!DeviceIoControl(sansa->dh,
- IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
- NULL,
- 0,
- &diskgeometry_ex,
- sizeof(diskgeometry_ex),
- &n,
- NULL)) {
- if (!DeviceIoControl(sansa->dh,
- IOCTL_DISK_GET_DRIVE_GEOMETRY,
- NULL,
- 0,
- &diskgeometry,
- sizeof(diskgeometry),
- &n,
- NULL)) {
- if (!silent) sansa_print_error(" Error reading disk geometry: ");
- return -1;
- } else {
- sansa->sector_size=diskgeometry.BytesPerSector;
- }
- } else {
- sansa->sector_size=diskgeometry_ex.Geometry.BytesPerSector;
- }
-
- return 0;
-}
-
-int sansa_reopen_rw(struct sansa_t* sansa)
-{
- /* Close existing file and re-open for writing */
- unlock_volume(sansa->dh);
- CloseHandle(sansa->dh);
-
- sansa->dh = CreateFileA(sansa->diskname, GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
- FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, NULL);
-
- if (sansa->dh == INVALID_HANDLE_VALUE) {
- sansa_print_error(" Error opening disk: ");
- return -1;
- }
-
- if (!lock_volume(sansa->dh)) {
- sansa_print_error(" Error locking disk: ");
- return -1;
- }
-
- return 0;
-}
-
-int sansa_close(struct sansa_t* sansa)
-{
- unlock_volume(sansa->dh);
- CloseHandle(sansa->dh);
- return 0;
-}
-
-int sansa_alloc_buffer(struct sansa_t* sansa, int bufsize)
-{
- /* The ReadFile function requires a memory buffer aligned to a multiple of
- the disk sector size. */
- sansa->sectorbuf = (unsigned char*)VirtualAlloc(NULL, bufsize, MEM_COMMIT, PAGE_READWRITE);
- if (sansa->sectorbuf == NULL) {
- sansa_print_error(" Error allocating a buffer: ");
- return -1;
- }
- return 0;
-}
-
-int sansa_dealloc_buffer(struct sansa_t* sansa)
-{
- if (sansa->sectorbuf == NULL) {
- return -1;
- }
- if(!VirtualFree(sansa->sectorbuf, 0, MEM_RELEASE)) {
- sansa_print_error(" Error releasing buffer ");
- return -1;
- }
- sansa->sectorbuf = NULL;
- return 0;
-}
-
-int sansa_seek(struct sansa_t* sansa, loff_t pos)
-{
- LARGE_INTEGER li;
-
- li.QuadPart = pos;
-
- li.LowPart = SetFilePointer (sansa->dh, li.LowPart, &li.HighPart, FILE_BEGIN);
-
- if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR) {
- sansa_print_error(" Seek error ");
- return -1;
- }
- return 0;
-}
-
-int sansa_read(struct sansa_t* sansa, unsigned char* buf, int nbytes)
-{
- unsigned long count;
-
- if (!ReadFile(sansa->dh, buf, nbytes, &count, NULL)) {
- sansa_print_error(" Error reading from disk: ");
- return -1;
- }
-
- return count;
-}
-
-int sansa_write(struct sansa_t* sansa, int nbytes)
-{
- unsigned long count;
-
- if (!WriteFile(sansa->dh, sansa->sectorbuf, nbytes, &count, NULL)) {
- sansa_print_error(" Error writing to disk: ");
- return -1;
- }
-
- return count;
-}
-#endif
-
diff --git a/rbutil/sansapatcher/sansaio.h b/rbutil/sansapatcher/sansaio.h
deleted file mode 100644
index 61e2f1d1b2..0000000000
--- a/rbutil/sansapatcher/sansaio.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- * $Id$
- *
- * Copyright (C) 2006-2007 Dave Chapman
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-
-#ifndef __SANSAIO_H
-#define __SANSAIO_H
-
-#include <stdint.h>
-#if !defined(_MSC_VER)
-#include <unistd.h> /* not available on MSVC */
-#endif
-
-#if defined(__WIN32__) || defined(_WIN32)
-#include <windows.h>
-#define loff_t int64_t
-#else
-#define HANDLE int
-#define O_BINARY 0
-
-/* Only Linux seems to need lseek64 and loff_t */
-#if !defined(linux) && !defined (__linux)
-#define loff_t off_t
-#define lseek64 lseek
-#endif
-
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct sansa_partinfo_t {
- unsigned long start; /* first sector (LBA) */
- unsigned long size; /* number of sectors */
- int type;
-};
-
-struct mi4header_t {
- uint32_t version;
- uint32_t length;
- uint32_t crc32;
- uint32_t enctype;
- uint32_t mi4size;
- uint32_t plaintext;
-};
-
-struct sansa_t {
- HANDLE dh;
- unsigned char* sectorbuf;
- char diskname[4096];
- int sector_size;
- struct sansa_partinfo_t pinfo[4];
- int hasoldbootloader;
- char* targetname; /* "e200" or "c200" */
- loff_t start; /* Offset in bytes of firmware partition from start of disk */
-};
-
-void sansa_print_error(char* msg);
-int sansa_open(struct sansa_t* sansa, int silent);
-int sansa_reopen_rw(struct sansa_t* sansa);
-int sansa_close(struct sansa_t* sansa);
-int sansa_seek(struct sansa_t* sansa, loff_t pos);
-int sansa_read(struct sansa_t* sansa, unsigned char* buf, int nbytes);
-int sansa_write(struct sansa_t* sansa, int nbytes);
-int sansa_alloc_buffer(struct sansa_t* sansa, int bufsize);
-int sansa_dealloc_buffer(struct sansa_t* sansa);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/rbutil/sansapatcher/sansapatcher.c b/rbutil/sansapatcher/sansapatcher.c
deleted file mode 100644
index e3b105dcca..0000000000
--- a/rbutil/sansapatcher/sansapatcher.c
+++ /dev/null
@@ -1,975 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- * $Id$
- *
- * Copyright (C) 2006-2007 Dave Chapman
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <inttypes.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "sansaio.h"
-#include "sansapatcher.h"
-
-/* The offset of the MI4 image header in the firmware partition */
-#define PPMI_OFFSET 0x80000
-#define NVPARAMS_OFFSET 0x780000
-#define NVPARAMS_SIZE (0x80000-0x200)
-
-int sansa_verbose = 0;
-
-/* Windows requires the buffer for disk I/O to be aligned in memory on a
- multiple of the disk volume size - so we use a single global variable
- and initialise it with sansa_alloc_buf() in main().
-*/
-
-static off_t filesize(int fd) {
- struct stat buf;
-
- if (fstat(fd,&buf) < 0) {
- perror("[ERR] Checking filesize of input file");
- return -1;
- } else {
- return(buf.st_size);
- }
-}
-
-/* Partition table parsing code taken from Rockbox */
-
-#define MAX_SECTOR_SIZE 2048
-#define SECTOR_SIZE 512
-
-static inline int32_t le2int(const unsigned char* buf)
-{
- int32_t res = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
-
- return res;
-}
-
-static inline uint32_t le2uint(const unsigned char* buf)
-{
- uint32_t res = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
-
- return res;
-}
-
-static inline void int2le(unsigned int val, unsigned char* addr)
-{
- addr[0] = val & 0xFF;
- addr[1] = (val >> 8) & 0xff;
- addr[2] = (val >> 16) & 0xff;
- addr[3] = (val >> 24) & 0xff;
-}
-
-#define BYTES2INT32(array,pos)\
- ((long)array[pos] | ((long)array[pos+1] << 8 ) |\
- ((long)array[pos+2] << 16 ) | ((long)array[pos+3] << 24 ))
-
-int sansa_read_partinfo(struct sansa_t* sansa, int silent)
-{
- int i;
- unsigned long count;
-
- count = sansa_read(sansa,sansa->sectorbuf, sansa->sector_size);
-
- if (count <= 0) {
- sansa_print_error(" Error reading from disk: ");
- return -1;
- }
-
- if ((sansa->sectorbuf[510] == 0x55) && (sansa->sectorbuf[511] == 0xaa)) {
- /* parse partitions */
- for ( i = 0; i < 4; i++ ) {
- unsigned char* ptr = sansa->sectorbuf + 0x1be + 16*i;
- sansa->pinfo[i].type = ptr[4];
- sansa->pinfo[i].start = BYTES2INT32(ptr, 8);
- sansa->pinfo[i].size = BYTES2INT32(ptr, 12);
-
- /* extended? */
- if ( sansa->pinfo[i].type == 5 ) {
- /* not handled yet */
- }
- }
- } else if ((sansa->sectorbuf[0] == 'E') && (sansa->sectorbuf[1] == 'R')) {
- if (!silent) fprintf(stderr,"[ERR] Bad boot sector signature\n");
- return -1;
- }
-
- /* Calculate the starting position of the firmware partition */
- sansa->start = (loff_t)sansa->pinfo[1].start*(loff_t)sansa->sector_size;
- return 0;
-}
-
-/* NOTE: memmem implementation copied from glibc-2.2.4 - it's a GNU
- extension and is not universally. In addition, early versions of
- memmem had a serious bug - the meaning of needle and haystack were
- reversed. */
-
-/* Copyright (C) 1991,92,93,94,96,97,98,2000 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-/* Return the first occurrence of NEEDLE in HAYSTACK. */
-static void *
-sansa_memmem (haystack, haystack_len, needle, needle_len)
- const void *haystack;
- size_t haystack_len;
- const void *needle;
- size_t needle_len;
-{
- const char *begin;
- const char *const last_possible
- = (const char *) haystack + haystack_len - needle_len;
-
- if (needle_len == 0)
- /* The first occurrence of the empty string is deemed to occur at
- the beginning of the string. */
- return (void *) haystack;
-
- /* Sanity check, otherwise the loop might search through the whole
- memory. */
- if (__builtin_expect (haystack_len < needle_len, 0))
- return NULL;
-
- for (begin = (const char *) haystack; begin <= last_possible; ++begin)
- if (begin[0] == ((const char *) needle)[0] &&
- !memcmp ((const void *) &begin[1],
- (const void *) ((const char *) needle + 1),
- needle_len - 1))
- return (void *) begin;
-
- return NULL;
-}
-
-/*
- * CRC32 implementation taken from:
- *
- * efone - Distributed internet phone system.
- *
- * (c) 1999,2000 Krzysztof Dabrowski
- * (c) 1999,2000 ElysiuM deeZine
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
- */
-
-/* crc_tab[] -- this crcTable is being build by chksum_crc32GenTab().
- * so make sure, you call it before using the other
- * functions!
- */
-static unsigned int crc_tab[256];
-
-/* chksum_crc() -- to a given block, this one calculates the
- * crc32-checksum until the length is
- * reached. the crc32-checksum will be
- * the result.
- */
-static unsigned int chksum_crc32 (const unsigned char *block, unsigned int length)
-{
- register unsigned long crc;
- unsigned long i;
-
- crc = 0;
- for (i = 0; i < length; i++)
- {
- crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_tab[(crc ^ *block++) & 0xFF];
- }
- return (crc);
-}
-
-/* chksum_crc32gentab() -- to a global crc_tab[256], this one will
- * calculate the crcTable for crc32-checksums.
- * it is generated to the polynom [..]
- */
-
-static void chksum_crc32gentab (void)
-{
- unsigned long crc, poly;
- int i, j;
-
- poly = 0xEDB88320L;
- for (i = 0; i < 256; i++)
- {
- crc = i;
- for (j = 8; j > 0; j--)
- {
- if (crc & 1)
- {
- crc = (crc >> 1) ^ poly;
- }
- else
- {
- crc >>= 1;
- }
- }
- crc_tab[i] = crc;
- }
-}
-
-/* Known keys for Sansa E200 and C200 firmwares: */
-#define NUM_KEYS ((int)(sizeof(keys)/sizeof(keys[0])))
-static const uint32_t keys[][4] = {
- { 0xe494e96e, 0x3ee32966, 0x6f48512b, 0xa93fbb42 }, /* "sansa" */
- { 0xd7b10538, 0xc662945b, 0x1b3fce68, 0xf389c0e6 }, /* "sansa_gh" */
- { 0x1d29ddc0, 0x2579c2cd, 0xce339e1a, 0x75465dfe }, /* sansa 103 */
-
- { 0x2a7968de, 0x15127979, 0x142e60a7, 0xe49c1893 }, /* c200 1.00.03 */
- { 0xbf2d06fa, 0xf0e23d59, 0x29738132, 0xe2d04ca7 }, /* c200 1.00.04 and up*/
- { 0xa913d139, 0xf842f398, 0x3e03f1a6, 0x060ee012 }, /* c200 1.01.05 and up*/
- { 0x0fe92902, 0xe8cc0f89, 0x6ff568ba, 0x1eff5161 }, /* c200 1.01.07 */
-};
-
-/*
-
-tea_decrypt() from http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm
-
-"Following is an adaptation of the reference encryption and decryption
-routines in C, released into the public domain by David Wheeler and
-Roger Needham:"
-
-*/
-
-/* NOTE: The mi4 version of TEA uses a different initial value to sum compared
- to the reference implementation and the main loop is 8 iterations, not
- 32.
-*/
-
-static void tea_decrypt(uint32_t* v0, uint32_t* v1, const uint32_t* k) {
- uint32_t sum=0xF1BBCDC8, i; /* set up */
- uint32_t delta=0x9E3779B9; /* a key schedule constant */
- uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
- for(i=0; i<8; i++) { /* basic cycle start */
- *v1 -= ((*v0<<4) + k2) ^ (*v0 + sum) ^ ((*v0>>5) + k3);
- *v0 -= ((*v1<<4) + k0) ^ (*v1 + sum) ^ ((*v1>>5) + k1);
- sum -= delta; /* end cycle */
- }
-}
-
-/* mi4 files are encrypted in 64-bit blocks (two little-endian 32-bit
- integers) and the key is incremented after each block
- */
-
-static void tea_decrypt_buf(const unsigned char* src, unsigned char* dest,
- size_t n, const uint32_t * initial_key)
-{
- uint32_t v0, v1;
- unsigned int i;
- uint32_t key[4];
-
- memcpy(key, initial_key, sizeof(key));
- for (i = 0; i < (n / 8); i++) {
- v0 = le2int(src);
- v1 = le2int(src+4);
-
- tea_decrypt(&v0, &v1, key);
-
- int2le(v0, dest);
- int2le(v1, dest+4);
-
- src += 8;
- dest += 8;
-
- /* Now increment the key */
- key[0]++;
- if (key[0]==0) {
- key[1]++;
- if (key[1]==0) {
- key[2]++;
- if (key[2]==0) {
- key[3]++;
- }
- }
- }
- }
-}
-
-static int get_mi4header(const unsigned char* buf,struct mi4header_t* mi4header)
-{
- if (memcmp(buf,"PPOS",4)!=0)
- return -1;
-
- mi4header->version = le2int(buf+0x04);
- mi4header->length = le2int(buf+0x08);
- mi4header->crc32 = le2int(buf+0x0c);
- mi4header->enctype = le2int(buf+0x10);
- mi4header->mi4size = le2int(buf+0x14);
- mi4header->plaintext = le2int(buf+0x18);
-
- return 0;
-}
-
-static int set_mi4header(unsigned char* buf,const struct mi4header_t* mi4header)
-{
- if (memcmp(buf,"PPOS",4)!=0)
- return -1;
-
- int2le(mi4header->version ,buf+0x04);
- int2le(mi4header->length ,buf+0x08);
- int2le(mi4header->crc32 ,buf+0x0c);
- int2le(mi4header->enctype ,buf+0x10);
- int2le(mi4header->mi4size ,buf+0x14);
- int2le(mi4header->plaintext ,buf+0x18);
-
- /* Add a dummy DSA signature */
- memset(buf+0x1c,0,40);
- buf[0x2f] = 1;
-
- return 0;
-}
-
-static int sansa_seek_and_read(struct sansa_t* sansa, loff_t pos, unsigned char* buf, int nbytes)
-{
- int n;
-
- if (sansa_seek(sansa, pos) < 0) {
- return -1;
- }
-
- if ((n = sansa_read(sansa,buf,nbytes)) < 0) {
- return -1;
- }
-
- if (n < nbytes) {
- fprintf(stderr,"[ERR] Short read - requested %d bytes, received %d\n",
- nbytes,n);
- return -1;
- }
-
- return 0;
-}
-
-
-/* We identify an E200 based on the following criteria:
-
- 1) Exactly two partitions;
- 2) First partition is type "W95 FAT32" (0x0b or 0x0c);
- 3) Second partition is type "OS/2 hidden C: drive" (0x84);
- 4) The "PPBL" string appears at offset 0 in the 2nd partition;
- 5) The "PPMI" string appears at offset PPMI_OFFSET in the 2nd partition.
-*/
-
-int is_sansa(struct sansa_t* sansa)
-{
- struct mi4header_t mi4header;
- int ppmi_length;
- int ppbl_length;
-
- /* Check partition layout */
- if (((sansa->pinfo[0].type != 0x06) &&
- (sansa->pinfo[0].type != 0x0b) &&
- (sansa->pinfo[0].type != 0x0c) &&
- (sansa->pinfo[0].type != 0x0e)) ||
- (sansa->pinfo[1].type != 0x84) ||
- (sansa->pinfo[2].type != 0x00) ||
- (sansa->pinfo[3].type != 0x00)) {
- /* Bad partition layout, abort */
- return -1;
- }
-
- /* Check Bootloader header */
- if (sansa_seek_and_read(sansa, sansa->start, sansa->sectorbuf, 0x200) < 0) {
- return -2;
- }
- if (memcmp(sansa->sectorbuf,"PPBL",4)!=0) {
- /* No bootloader header, abort */
- return -4;
- }
- ppbl_length = (le2int(sansa->sectorbuf+4) + 0x1ff) & ~0x1ff;
-
- /* Sanity/safety check - the bootloader can't be larger than PPMI_OFFSET */
- if (ppbl_length > PPMI_OFFSET)
- {
- return -5;
- }
-
- /* Load Sansa bootloader and check for "Sansa C200" magic string */
- if (sansa_seek_and_read(sansa, sansa->start + 0x200, sansa->sectorbuf, ppbl_length) < 0) {
- fprintf(stderr,"[ERR] Seek and read to 0x%08"PRIx64" in is_sansa failed.\n",
- sansa->start+0x200);
- return -6;
- }
- if (sansa_memmem(sansa->sectorbuf, ppbl_length, "Sansa C200", 10) != NULL) {
- /* C200 */
- sansa->targetname="c200";
- } else {
- /* E200 */
- sansa->targetname="e200";
- }
-
- /* Check Main firmware header */
- if (sansa_seek_and_read(sansa, sansa->start+PPMI_OFFSET, sansa->sectorbuf, 0x200) < 0) {
- fprintf(stderr,"[ERR] Seek to 0x%"PRIx64" in is_sansa failed.\n",
- sansa->start+PPMI_OFFSET);
- return -5;
- }
- if (memcmp(sansa->sectorbuf,"PPMI",4)!=0) {
- /* No bootloader header, abort */
- return -7;
- }
- ppmi_length = le2int(sansa->sectorbuf+4);
-
- /* Check main mi4 file header */
- if (sansa_seek_and_read(sansa, sansa->start+PPMI_OFFSET+0x200, sansa->sectorbuf, 0x200) < 0) {
- fprintf(stderr,"[ERR] Seek to 0x%"PRIx64" in is_sansa failed.\n",
- sansa->start+PPMI_OFFSET+0x200);
- return -5;
- }
-
- if (get_mi4header(sansa->sectorbuf,&mi4header) < 0) {
- fprintf(stderr,"[ERR] Invalid mi4header\n");
- return -6;
- }
-
- /* Some sanity checks:
-
- 1) Main MI4 image without RBBL and < 100000 bytes -> old install
- 2) Main MI4 image with RBBL but no second image -> old install
- */
-
- sansa->hasoldbootloader = 0;
- if (memcmp(sansa->sectorbuf+0x1f8,"RBBL",4)==0) {
- /* Look for an original firmware after the first image */
- if (sansa_seek_and_read(sansa,
- sansa->start + PPMI_OFFSET + 0x200 + ppmi_length,
- sansa->sectorbuf, 512) < 0) {
- return -7;
- }
-
- if (get_mi4header(sansa->sectorbuf,&mi4header)!=0) {
- fprintf(stderr,"[ERR] No original firmware found\n");
- sansa->hasoldbootloader = 1;
- }
- } else if (mi4header.mi4size < 100000) {
- fprintf(stderr,"[ERR] Old bootloader found\n");
- sansa->hasoldbootloader = 1;
- }
-
- return 0;
-}
-
-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);
-#elif defined(linux) || defined (__linux)
- 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);
-#elif defined(__APPLE__) && defined(__MACH__)
- sprintf(sansa->diskname,"/dev/disk%d",i);
-#else
-#error No disk paths defined for this platform
-#endif
- if ((result = sansa_open(sansa, 1)) < 0) {
- if(result == -2) {
- denied++;
- }
- sansa_close(sansa);
- continue;
- }
-
- if (sansa_read_partinfo(sansa,1) < 0) {
- sansa_close(sansa);
- continue;
- }
-
- if (is_sansa(sansa) < 0) {
- sansa_close(sansa);
- continue;
- }
-
-#ifdef __WIN32__
- printf("[INFO] %s found - disk device %d\n",sansa->targetname, i);
-#else
- printf("[INFO] %s found - %s\n",sansa->targetname, sansa->diskname);
-#endif
- n++;
- strcpy(last_disk,sansa->diskname);
- sansa_close(sansa);
- }
-
- if (n==1) {
- /* Remember the disk name */
- strcpy(sansa->diskname,last_disk);
- }
- 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
- and updating the header */
-static int prepare_original_firmware(struct sansa_t* sansa, unsigned char* buf, struct mi4header_t* mi4header)
-{
- unsigned char* tmpbuf;
- int i;
- int key_found;
-
- get_mi4header(buf,mi4header);
-
-#if 0
- printf("mi4header->version =0x%08x\n",mi4header->version);
- printf("mi4header->length =0x%08x\n",mi4header->length);
- printf("mi4header->crc32 =0x%08x\n",mi4header->crc32);
- printf("mi4header->enctype =0x%08x\n",mi4header->enctype);
- printf("mi4header->mi4size =0x%08x\n",mi4header->mi4size);
- printf("mi4header->plaintext =0x%08x\n",mi4header->plaintext);
-#endif
-
- /* Decrypt anything that needs decrypting. */
- if (mi4header->plaintext < mi4header->mi4size - 0x200) {
- /* TODO: Check different keys */
- tmpbuf=malloc(mi4header->mi4size-(mi4header->plaintext+0x200));
- if (tmpbuf==NULL) {
- fprintf(stderr,"[ERR] Can not allocate memory\n");
- return -1;
- }
-
- key_found=0;
- for (i=0; i < NUM_KEYS && !key_found ; i++) {
- tea_decrypt_buf(buf+(mi4header->plaintext+0x200),
- tmpbuf,
- mi4header->mi4size-(mi4header->plaintext+0x200),
- keys[i]);
- key_found = (le2uint(tmpbuf+mi4header->length-mi4header->plaintext-4) == 0xaa55aa55);
- }
-
- if (key_found) {
- memcpy(buf+(mi4header->plaintext+0x200),tmpbuf,mi4header->mi4size-(mi4header->plaintext+0x200));
- free(tmpbuf);
- } else {
- fprintf(stderr,"[ERR] Failed to decrypt image, aborting\n");
- free(tmpbuf);
- return -1;
- }
- }
-
- /* Increase plaintext value to full file */
- mi4header->plaintext = mi4header->mi4size - 0x200;
-
- /* Update CRC checksum */
- chksum_crc32gentab ();
- mi4header->crc32 = chksum_crc32(buf+0x200,mi4header->mi4size-0x200);
-
- set_mi4header(buf,mi4header);
-
- /* Add Rockbox-specific header */
- memcpy(buf+0x1f8,"RBOF",4);
- memcpy(buf+0x1fc,sansa->targetname,4);
-
- return 0;
-}
-
-static int load_original_firmware(struct sansa_t* sansa, unsigned char* buf, struct mi4header_t* mi4header)
-{
- int ppmi_length;
- int n;
-
- /* Read 512 bytes from PPMI_OFFSET - the PPMI header plus the mi4 header */
- if (sansa_seek_and_read(sansa, sansa->start + PPMI_OFFSET, buf, 512) < 0) {
- return -1;
- }
-
- /* No need to check PPMI magic - it's done during init to confirm
- this is an E200 */
- ppmi_length = le2int(buf+4);
-
- /* Firstly look for an original firmware after the first image */
- if (sansa_seek_and_read(sansa, sansa->start + PPMI_OFFSET + 0x200 + ppmi_length, buf, 512) < 0) {
- return -1;
- }
-
- if (get_mi4header(buf,mi4header)==0) {
- /* We have a valid MI4 file after a bootloader, so we use this. */
- if ((n = sansa_seek_and_read(sansa,
- sansa->start + PPMI_OFFSET + 0x200 + ppmi_length,
- buf, mi4header->mi4size)) < 0) {
- return -1;
- }
- } else {
- /* No valid MI4 file, so read the first image. */
- if ((n = sansa_seek_and_read(sansa,
- sansa->start + PPMI_OFFSET + 0x200,
- buf, ppmi_length)) < 0) {
- return -1;
- }
- }
- return prepare_original_firmware(sansa, buf, mi4header);
-}
-
-int sansa_read_firmware(struct sansa_t* sansa, const char* filename)
-{
- int res;
- int outfile;
- struct mi4header_t mi4header;
-
- res = load_original_firmware(sansa,sansa->sectorbuf,&mi4header);
- if (res < 0)
- return res;
-
- outfile = open(filename,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666);
- if (outfile < 0) {
- fprintf(stderr,"[ERR] Couldn't open file %s\n",filename);
- return -1;
- }
-
- res = write(outfile,sansa->sectorbuf,mi4header.mi4size);
- if (res != (int)mi4header.mi4size) {
- fprintf(stderr,"[ERR] Write error - %d\n", res);
- return -1;
- }
- close(outfile);
-
- return 0;
-}
-
-unsigned int sansa_read_bootloader(struct sansa_t* sansa, const char* filename, unsigned char** bl_buffer)
-{
- /* Step 1 - read bootloader into RAM. */
- int infile;
- unsigned int n;
- unsigned int len;
- infile=open(filename,O_RDONLY|O_BINARY);
- if (infile < 0) {
- fprintf(stderr,"[ERR] Couldn't open input file %s\n",filename);
- return 0;
- }
-
- len = filesize(infile);
-
- unsigned char* b = malloc(len);
- if (b == NULL) {
- fprintf(stderr,"[ERR] Could not allocate memory for bootloader\n");
- close(infile);
- return 0;
- }
-
- n = read(infile,b,len);
- close(infile);
- if (n < len) {
- fprintf(stderr,"[ERR] Short read - requested %d bytes, received %d\n"
- ,len,n);
- return 0;
- }
-
- if (memcmp(b+0x1f8,"RBBL",4)!=0) {
- fprintf(stderr,"[ERR] %s is not a Rockbox bootloader, aborting.\n",
- filename);
- return 0;
- }
- if (memcmp(b+0x1fc,sansa->targetname,4)!=0) {
- fprintf(stderr,"[ERR] %s is not a Rockbox bootloader for %s, aborting.\n",
- filename, sansa->targetname);
- return 0;
- }
- *bl_buffer = b;
- return len;
-}
-
-int sansa_add_bootloader(struct sansa_t* sansa, const unsigned char* bootloader, const unsigned int bl_length)
-{
- int res;
- struct mi4header_t mi4header;
- int length;
- int n;
-
- /* Create PPMI header */
- memset(sansa->sectorbuf,0,0x200);
- memcpy(sansa->sectorbuf,"PPMI",4);
- int2le(bl_length, sansa->sectorbuf+4);
- int2le(0x00020000, sansa->sectorbuf+8);
-
- /* copy bootloader to sansa->sectorbuf+0x200 */
- memcpy(sansa->sectorbuf+0x200,bootloader,bl_length);
-
- /* Load original firmware from Sansa to the space after the bootloader */
- res = load_original_firmware(sansa,sansa->sectorbuf+0x200+bl_length,&mi4header);
- if (res < 0)
- return res;
-
- /* Now write the whole thing back to the Sansa */
-
- if (sansa_seek(sansa, sansa->start+PPMI_OFFSET) < 0) {
- fprintf(stderr,"[ERR] Seek to 0x%08"PRIx64" in add_bootloader failed.\n",
- sansa->start+PPMI_OFFSET);
- return -5;
- }
-
- length = 0x200 + bl_length + mi4header.mi4size;
-
- n=sansa_write(sansa, length);
- if (n < length) {
- fprintf(stderr,"[ERR] Short write in add_bootloader\n");
- return -6;
- }
-
- return 0;
-}
-
-int sansa_delete_bootloader(struct sansa_t* sansa)
-{
- int res;
- struct mi4header_t mi4header;
- int n;
- int length;
-
- /* Load original firmware from Sansa to sansa->sectorbuf+0x200 */
- res = load_original_firmware(sansa,sansa->sectorbuf+0x200,&mi4header);
- if (res < 0)
- return res;
-
- /* Create PPMI header */
- memset(sansa->sectorbuf,0,0x200);
- memcpy(sansa->sectorbuf,"PPMI",4);
- int2le(mi4header.mi4size, sansa->sectorbuf+4);
- int2le(0x00020000, sansa->sectorbuf+8);
-
- /* Now write the whole thing back to the Sansa */
-
- if (sansa_seek(sansa, sansa->start+PPMI_OFFSET) < 0) {
- fprintf(stderr,"[ERR] Seek to 0x%08"PRIx64" in add_bootloader failed.\n",
- sansa->start+PPMI_OFFSET);
- return -5;
- }
-
- length = 0x200 + mi4header.mi4size;
-
- n=sansa_write(sansa, length);
- if (n < length) {
- fprintf(stderr,"[ERR] Short write in delete_bootloader\n");
- return -6;
- }
-
- return 0;
-}
-
-/** List number of MI4 images on the player, return number.
- */
-int sansa_list_images(struct sansa_t* sansa)
-{
- struct mi4header_t mi4header;
- loff_t ppmi_length;
- int num = 0;
-
- /* Check Main firmware header */
- if (sansa_seek_and_read(sansa, sansa->start+PPMI_OFFSET, sansa->sectorbuf, 0x200) < 0) {
- return 0;
- }
-
- ppmi_length = le2int(sansa->sectorbuf+4);
-
- printf("[INFO] Image 1 - %"PRIu64" bytes\n",ppmi_length);
- num = 1;
-
- /* Look for an original firmware after the first image */
- if (sansa_seek_and_read(sansa, sansa->start + PPMI_OFFSET + 0x200 + ppmi_length, sansa->sectorbuf, 512) < 0) {
- return 0;
- }
-
- if (get_mi4header(sansa->sectorbuf,&mi4header)==0) {
- printf("[INFO] Image 2 - %d bytes\n",mi4header.mi4size);
- num = 2;
- }
- return num;
-}
-
-int sansa_update_of(struct sansa_t* sansa, const char* filename)
-{
- int n;
- int infile = -1; /* Prevent an erroneous "may be used uninitialised" gcc warning */
- int of_length = 0; /* Keep gcc happy when building for rbutil */
- int ppmi_length;
- struct mi4header_t mi4header;
- unsigned char buf[512];
-
- /* Step 1 - check we have an OF on the Sansa to upgrade. We expect the
- Rockbox bootloader to be installed and the OF to be after it on disk. */
-
- /* Read 512 bytes from PPMI_OFFSET - the PPMI header */
- if (sansa_seek_and_read(sansa, sansa->start + PPMI_OFFSET,
- buf, 512) < 0) {
- return -1;
- }
-
- /* No need to check PPMI magic - it's done during init to confirm
- this is an E200 */
- ppmi_length = le2int(buf+4);
-
- /* Look for an original firmware after the first image */
- if (sansa_seek_and_read(sansa, sansa->start+PPMI_OFFSET+0x200+ppmi_length,
- buf, 512) < 0) {
- return -1;
- }
-
- if (get_mi4header(buf,&mi4header)!=0) {
- /* We don't have a valid MI4 file after a bootloader, so do nothing. */
- fprintf(stderr,"[ERR] No original firmware found at 0x%08"PRIx64"\n",
- sansa->start+PPMI_OFFSET+0x200+ppmi_length);
- return -1;
- }
-
- /* Step 2 - read OF into RAM. */
- infile=open(filename,O_RDONLY|O_BINARY);
- if (infile < 0) {
- fprintf(stderr,"[ERR] Couldn't open input file %s\n",filename);
- return -1;
- }
-
- of_length = filesize(infile);
-
- /* Load original firmware from file */
- memset(sansa->sectorbuf,0,0x200);
- n = read(infile,sansa->sectorbuf,of_length);
- close(infile);
- if (n < of_length) {
- fprintf(stderr,"[ERR] Short read - requested %d bytes, received %d\n"
- , of_length, n);
- return -1;
- }
-
- /* Check we have a valid MI4 file. */
- if (get_mi4header(sansa->sectorbuf,&mi4header)!=0) {
- fprintf(stderr,"[ERR] %s is not a valid mi4 file\n",filename);
- return -1;
- }
-
- /* Decrypt and build the header */
- if(prepare_original_firmware(sansa, sansa->sectorbuf, &mi4header)!=0){
- fprintf(stderr,"[ERR] Unable to build decrypted mi4 from %s\n"
- ,filename);
- return -1;
- }
-
- /* Step 3 - write the OF to the Sansa */
- if (sansa_seek(sansa, sansa->start+PPMI_OFFSET+0x200+ppmi_length) < 0) {
- fprintf(stderr,"[ERR] Seek to 0x%08"PRIx64" in sansa_update_of failed.\n",
- sansa->start+PPMI_OFFSET+0x200+ppmi_length);
- return -1;
- }
-
- n=sansa_write(sansa, of_length);
- if (n < of_length) {
- fprintf(stderr,"[ERR] Short write in sansa_update_of\n");
- return -1;
- }
-
- /* Step 4 - zero out the nvparams section - we have to do this or we end up
- with multiple copies of the nvparams data and don't know which one to
- work with for the database rebuild disabling trick in our bootloader */
- if (strcmp(sansa->targetname,"e200") == 0) {
- printf("[INFO] Resetting Original Firmware settings\n");
- if (sansa_seek(sansa, sansa->start+NVPARAMS_OFFSET+0x200) < 0) {
- fprintf(stderr,"[ERR] Seek to 0x%08"PRIx64" in sansa_update_of failed.\n",
- sansa->start+NVPARAMS_OFFSET+0x200);
- return -1;
- }
-
- memset(sansa->sectorbuf,0,NVPARAMS_SIZE);
- n=sansa_write(sansa, NVPARAMS_SIZE);
- if (n < NVPARAMS_SIZE) {
- fprintf(stderr,"[ERR] Short write in sansa_update_of\n");
- return -1;
- }
- }
-
- return 0;
-}
-
-/* Update the PPBL (bootloader) image in the hidden firmware partition */
-int sansa_update_ppbl(struct sansa_t* sansa, const char* filename)
-{
- int n;
- int infile = -1; /* Prevent an erroneous "may be used uninitialised" gcc warning */
- int ppbl_length = 0; /* Keep gcc happy when building for rbutil */
-
- /* Step 1 - read bootloader into RAM. */
- infile=open(filename,O_RDONLY|O_BINARY);
- if (infile < 0) {
- fprintf(stderr,"[ERR] Couldn't open input file %s\n",filename);
- return -1;
- }
-
- ppbl_length = filesize(infile);
-
- n = read(infile,sansa->sectorbuf+0x200,ppbl_length);
- close(infile);
- if (n < ppbl_length) {
- fprintf(stderr,"[ERR] Short read - requested %d bytes, received %d\n", ppbl_length, n);
- return -1;
- }
-
- /* Step 2 - Build the header */
- memset(sansa->sectorbuf,0,0x200);
- memcpy(sansa->sectorbuf,"PPBL",4);
- int2le(ppbl_length, sansa->sectorbuf+4);
- int2le(0x00010000, sansa->sectorbuf+8);
-
- /* Step 3 - write the bootloader to the Sansa */
- if (sansa_seek(sansa, sansa->start) < 0) {
- fprintf(stderr,"[ERR] Seek to 0x%08"PRIx64" in sansa_update_ppbl failed.\n", sansa->start);
- return -1;
- }
-
- n=sansa_write(sansa, ppbl_length + 0x200);
- if (n < (ppbl_length+0x200)) {
- fprintf(stderr,"[ERR] Short write in sansa_update_ppbl\n");
- return -1;
- }
-
- return 0;
-}
-
diff --git a/rbutil/sansapatcher/sansapatcher.h b/rbutil/sansapatcher/sansapatcher.h
deleted file mode 100644
index 259143e38a..0000000000
--- a/rbutil/sansapatcher/sansapatcher.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- * $Id$
- *
- * Copyright (C) 2006-2007 Dave Chapman
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-
-#ifndef _SANSAPATCHER_H
-#define _SANSAPATCHER_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "sansaio.h"
-
-/* exit codes */
-#define SANSA_OK 0
-#define SANSA_WRONG_ARGUMENTS 1
-#define SANSA_OPEN_INFILE_FAILED 2
-#define SANSA_PARTITION_ERROR 3
-#define SANSA_CANNOT_REOPEN 5
-#define SANSA_INSTALL_FAILED 6
-#define SANSA_UNINSTALL_FAILED 7
-#define SANSA_ACCESS_DENIED 10
-#define SANSA_NOT_FOUND 11
-#define SANSA_WRONG_DEVICE_COUNT 12
-#define SANSA_MULTIPLE_DEVICES 15
-#define SANSA_WRONG_TYPE 16
-#define SANSA_OLD_INSTALL 17
-#define SANSA_INTERNAL_ERROR 20
-
-extern int sansa_verbose;
-/* Size of buffer for disk I/O - 8MB is large enough for any version
- of the Apple firmware, but not the Nano's RSRC image. */
-#define BUFFER_SIZE 8*1024*1024
-
-int sansa_read_partinfo(struct sansa_t* sansa, int silent);
-int is_sansa(struct sansa_t* sansa);
-int sansa_scan(struct sansa_t* sansa);
-int sansa_read_firmware(struct sansa_t* sansa, const char* filename);
-unsigned int sansa_read_bootloader(struct sansa_t* sansa, const char* filename, unsigned char** bl_buffer);
-int sansa_add_bootloader(struct sansa_t* sansa, const unsigned char* buf, unsigned int len);
-int sansa_delete_bootloader(struct sansa_t* sansa);
-int sansa_update_of(struct sansa_t* sansa,const char* filename);
-int sansa_update_ppbl(struct sansa_t* sansa,const char* filename);
-int sansa_list_images(struct sansa_t* sansa);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
-
diff --git a/rbutil/sansapatcher/sansapatcher.manifest b/rbutil/sansapatcher/sansapatcher.manifest
deleted file mode 100644
index 71bb153688..0000000000
--- a/rbutil/sansapatcher/sansapatcher.manifest
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
- <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="sansapatcher.exe" type="win32"/>
-
- <!-- Identify the application security requirements. -->
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
- <security>
- <requestedPrivileges>
- <requestedExecutionLevel level="requireAdministrator"/>
- </requestedPrivileges>
- </security>
- </trustInfo>
-</assembly>
diff --git a/rbutil/sansapatcher/sansapatcher.pro b/rbutil/sansapatcher/sansapatcher.pro
deleted file mode 100644
index f8308e6283..0000000000
--- a/rbutil/sansapatcher/sansapatcher.pro
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# __________ __ ___.
-# Open \______ \ ____ ____ | | _\_ |__ _______ ___
-# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
-# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
-# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
-# \/ \/ \/ \/ \/
-#
-# All files in this archive are subject to the GNU General Public License.
-# See the file COPYING in the source tree root for full license agreement.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-
-TEMPLATE = app
-TARGET = sansapatcher
-QT -= core
-
-SOURCES += \
- sansaio-posix.c \
- sansaio-win32.c \
- sansapatcher.c \
- main.c
-
-HEADERS += \
- parttypes.h \
- sansaio.h \
- sansapatcher.h \
-
-RC_FILE = sansapatcher.rc
-
-DEFINES += _LARGEFILE64_SOURCE
-
-unix {
- target.path = /usr/local/bin
- INSTALLS += target
-}
diff --git a/rbutil/sansapatcher/sansapatcher.rc b/rbutil/sansapatcher/sansapatcher.rc
deleted file mode 100644
index 26bb8fe730..0000000000
--- a/rbutil/sansapatcher/sansapatcher.rc
+++ /dev/null
@@ -1 +0,0 @@
-1 24 MOVEABLE PURE "sansapatcher.manifest"