#!/system/xbin/bb/sh msg() { echo "--------------------------------------" ; echo "+$1" >&2 ; } warn() { echo "==WARNING: $1" >&2 ; } error() { echo >&2 ; echo "===ERROR: $1" >&2 ; exit ; } used() { du -s "$1" | (read k x; echo $k) ; } free() { df "$1" |tail -1 | (read x1 x2 x3 k x5; echo $k) ; } backup_sd_err() { echo "==ERROR: Could not backup $MPF to $1." echo echo "Check that you have enough space in $1 to fit all of the contents of $MPF. If not, either delete some files from $MPF or choose a new location for your backup." echo k=`used "$MPF"` echo " Used space on $MPF: ${k}K" k=`free "$1"` echo " Free space on $1 partition: ${k}K" exit } backup_sd() { msg "Backing up $MPF to $BDIR" [ ! -d "$BDIR" ] && mkdir -p "$BDIR" cp -a "$MPF" "$1" && return rm -r "$BDIR$MPF" backup_sd_err "$1" >&2 } umount_err() { echo "==ERROR: Could not unmount $MPF!" echo echo "Perhaps an application is holding a file open? Stop running applications and try again!" echo exit } fdiska() { # line ... (while [ $# -gt 0 ] ; do echo "$1" ; shift ; done) | { fdisk "$DEV" || return 1 ; } return 0 } partition() { msg "Partitioning sdcard" x=`df|grep "^$MPF":` [ ! -z "$x" ] && { umount "$MPF" || umount_err >&2 ; } # My 1 GB Card: # /dev/block/mmcblk0p1 1 31000 991992 6 FAT16 msg " Backup partition table/wipe/create FAT$FAT $FSIZE/create EXT2 $ESIZE" fbackup "$BAKP" fdiska p q > "$BAKP" # Separating these steps causes problems. It appears that as soon # as the partition table is written, the /sdcard gets mounted. This # then prevents any more partitions from being created. [ ! -z "$ESIZE" ] && ESIZE="+$ESIZE" fdiska o n p 1 '' "+$FSIZE" t "$FT" p n p 2 '' "$ESIZE" t 2 83 p w || error "Unable to create new partitions" sleep 3 # Seems like the phone mounts this automatically in read only mode # if fs is sane? This can prevent a mkdosfs umount "$MPF" } mkfses() { msg "Creating FAT$FAT Filesystem" mkdosfs -F "$FAT" "$DEV1" msg "Creating EXT2 Filesystem" "$MKFS" "$DEV2" } yN() { read r ; [ "$r" = "y" -o "$r" = "Y" -o "$r" = "yes" -o "$r" = "YES" ] ; } lcp() { while read f ; do cp -dr "$BDIR$MPF/$f" "$MPF" || err=1 done echo "Permission setting errors are normal on a FAT system" >&2 [ -z "$err" ] || return 1 } restore() { msg "Restoring $BDIR$MPF to $MPF" mount "$DEV1" "$MPF" || error "Cannot mount $MPF" insmod "$KOD/ext2.ko" mount "$DEV2" "$MPE" ls -a "$BDIR$MPF" | grep -v '^.$'|grep -v '^..$'| lcp || error "restore failed!" msg "You should now have a FAT partition on $MPF and an EXT2 partition on $MPE" echo >&2 df | grep -e "$MPF" -e "$MPE" >&2 echo >&2 echo "Would you like to remove the backup under $BDIR$MPF? y/N" >&2 yN && rm -rf "$BDIR$MPF" } configs_error() { mount -o ro,remount -t yaffs2 /dev/block/mtdblock3 /system error "$1" } fbackup() { # -c file [ "$1" = "-c" ] && { cfg=configs_ ; shift ; } [ ! -f "$1" ] && return if [ -f "$1".orig ] ; then echo "WARNING: $1 backup $1.orig already exists!" >&2 echo >&2 echo "Do you want to overwrite it? y/N" >&2 yN || return rm "$1".orig fi cp "$1" "$1".orig || "$cfg"error "Unable to backup $1" } configs() { msg "Backing up and Updating $CFGI" mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system fbackup -c "$CFGI" cat > "$CFGI" < "$CFGM" <&2 <&2 < GPL2 or above EOF } MPF=/sdcard MPE=/system/sd DEV=/dev/block/mmcblk0 DEV1=/dev/block/mmcblk0p1 DEV2=/dev/block/mmcblk0p2 FT=b FAT=32 FSIZE="500M" ESIZE="" MKFS=mke2fs CFGI=/system/init.rc CFGM=/system/etc/mountd.conf UNAME=`uname -r` KOD="/system/modules/$UNAME/kernel/fs/ext2" BAKP=/data/local/tmp/partitions.orig BDIR=/data while [ $# -gt 0 ] ; do case "$1" in -h) Usage ; exit ;; --help) Help ; exit ;; -b|--backup) clearactions ; SW_NB='' ;; -c|--configs) clearactions ; SW_NC='' ;; -p|--partition) clearactions ; SW_NP='' ;; -m|--mkfs) clearactions ; SW_NM='' ;; -r|--restore) clearactions ; SW_NR='' ;; -nd|--nodata) SW_NB="$1" ; SW_NR="$1" ;; -nb|--nobackup) SW_NB="$1" ;; -nc|--noconfigs) SW_NC="$1" ;; -np|--nopartition) SW_NP="$1" ;; -nm|--nomkfs) SW_NM="$1" ;; -nr|--norestore) SW_NR="$1" ;; -f|--force) SW_FORCE="$1" ;; -pm|--pmke2fs) shift ; MKFS="$1" ;; -pe|--pext2) shift ; MPE="$1" ;; -pb|--pbackup) shift ; BDIR="$1" echo "$BDIR" | grep "^$MPF/" > /dev/null && error "backup dir ($BDIR) cannot be a subdirectory of $MPF!" [ "$BDIR" = "$MPF" ] && error "cannot backup $MPF to itself!" [ -d "$BDIR$MPF" ] && error "backup dir ($BDIR$MPF) already exists!" ;; -f32|--fat32) FAT=32 ; FT=b ;; -f16|--fat16) FAT=16 ; FT=6 ;; -fs|--fatsize) shift ; FSIZE="$1" ;; -es|--ext2size) shift ; ESIZE="$1" ;; *) Usage ; error "invalid argument $1" ;; esac shift done if [ -z "$SW_NM" ] ; then "$MKFS" -h 2> /dev/null [ $? -eq 127 -a -z "$SW_FORCE" ] && error "Cannot find $MKFS executable" fi [ -z "$SW_NB" ] && backup_sd "$BDIR" [ -z "$SW_NC" ] && configs [ -z "$SW_NP" ] && partition [ -z "$SW_NM" ] && mkfses [ -z "$SW_NR" ] && restore