add fix permissions and partition sd card to the recovery. TODO: Restrict to devicess that support large recovery images.
This commit is contained in:
		| @@ -44,7 +44,7 @@ LOCAL_MODULE := recovery | ||||
|  | ||||
| LOCAL_FORCE_STATIC_EXECUTABLE := true | ||||
|  | ||||
| RECOVERY_VERSION := ClockworkMod Recovery v2.5.0.7 | ||||
| RECOVERY_VERSION := ClockworkMod Recovery v2.5.0.8 | ||||
| LOCAL_CFLAGS += -DRECOVERY_VERSION="$(RECOVERY_VERSION)" | ||||
| RECOVERY_API_VERSION := 2 | ||||
| LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION) | ||||
| @@ -194,6 +194,7 @@ include $(commands_recovery_local_path)/mtdutils/Android.mk | ||||
| include $(commands_recovery_local_path)/tools/Android.mk | ||||
| include $(commands_recovery_local_path)/edify/Android.mk | ||||
| include $(commands_recovery_local_path)/updater/Android.mk | ||||
| include $(commands_recovery_local_path)/utilities/Android.mk | ||||
| commands_recovery_local_path := | ||||
|  | ||||
| endif   # TARGET_ARCH == arm | ||||
|   | ||||
| @@ -418,6 +418,10 @@ void show_mount_usb_storage_menu() | ||||
|  | ||||
| int confirm_selection(const char* title, const char* confirm) | ||||
| { | ||||
|     struct stat info; | ||||
|     if (0 == stat("/sdcard/clockworkmod/.no_confirm", &info)) | ||||
|         return 1; | ||||
|  | ||||
|     char* confirm_headers[]  = {  title, "  THIS CAN NOT BE UNDONE.", "", NULL }; | ||||
|     char* items[] = { "No", | ||||
|                       "No", | ||||
| @@ -474,7 +478,7 @@ int format_non_mtd_device(const char* root) | ||||
|  | ||||
| void show_partition_menu() | ||||
| { | ||||
|     static char* headers[] = {  "Mount and unmount partitions", | ||||
|     static char* headers[] = {  "Mounts and Storage Menu", | ||||
|                                 "", | ||||
|                                 NULL  | ||||
|     }; | ||||
| @@ -796,8 +800,8 @@ void show_advanced_menu() | ||||
|                             "Wipe Battery Stats", | ||||
|                             "Report Error", | ||||
|                             "Key Test", | ||||
|                             "Restart adbd", | ||||
|                             "Process dump", | ||||
|                             "Partition SD Card", | ||||
|                             "Fix Permissions", | ||||
|                             NULL | ||||
|     }; | ||||
|  | ||||
| @@ -851,12 +855,51 @@ void show_advanced_menu() | ||||
|             } | ||||
|             case 5: | ||||
|             { | ||||
|                 __system("kill $(ps | grep adbd)"); | ||||
|                 __system("/sbin/adbd &"); | ||||
|                 static char* ext_sizes[] = { "128M", | ||||
|                                              "256M", | ||||
|                                              "512M", | ||||
|                                              "1024M", | ||||
|                                              NULL }; | ||||
|  | ||||
|                 static char* swap_sizes[] = { "0M", | ||||
|                                               "32M", | ||||
|                                               "64M", | ||||
|                                               "128M", | ||||
|                                               "256M", | ||||
|                                               NULL }; | ||||
|  | ||||
|                 static char* ext_headers[] = { "Ext Size", "", NULL }; | ||||
|                 static char* swap_headers[] = { "Swap Size", "", NULL }; | ||||
|  | ||||
|                 int ext_size = get_menu_selection(ext_headers, ext_sizes, 0); | ||||
|                 if (ext_size == GO_BACK) | ||||
|                     continue; | ||||
|                   | ||||
|                 int swap_size = get_menu_selection(swap_headers, swap_sizes, 0); | ||||
|                 if (swap_size == GO_BACK) | ||||
|                     continue; | ||||
|  | ||||
|                 char sddevice[256]; | ||||
|                 const RootInfo *ri = get_root_info_for_path("SDCARD:"); | ||||
|                 strcpy(sddevice, ri->device); | ||||
|                 // we only want the mmcblk, not the partition | ||||
|                 sddevice[strlen("/dev/block/mmcblkX")] = NULL; | ||||
|                 char cmd[PATH_MAX]; | ||||
|                 setenv("SDPATH", sddevice, 1); | ||||
|                 sprintf(cmd, "sdparted -es %s -ss %s -efs ext3 -s", ext_sizes[ext_size], swap_sizes[swap_size]); | ||||
|                 ui_print("Partitioning SD Card... please wait...\n"); | ||||
|                 if (0 == __system(cmd)) | ||||
|                     ui_print("Done!\n"); | ||||
|                 else | ||||
|                     ui_print("An error occured while partitioning your SD Card. Please see /tmp/recovery.log for more details.\n"); | ||||
|             } | ||||
|             case 6: | ||||
|             { | ||||
|                 __system("ps"); | ||||
|                 ensure_root_path_mounted("SYSTEM:"); | ||||
|                 ensure_root_path_mounted("DATA:"); | ||||
|                 ui_print("Fixing permissions...\n"); | ||||
|                 __system("fix_permissions"); | ||||
|                 ui_print("Done!\n"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
							
								
								
									
										4
									
								
								roots.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								roots.h
									
									
									
									
									
								
							| @@ -21,11 +21,11 @@ | ||||
| #include "mtdutils/mtdutils.h" | ||||
|  | ||||
| #ifndef SDCARD_DEVICE_PRIMARY | ||||
| #define SDCARD_DEVICE_PRIMARY "/dev/block/mmcblk0" | ||||
| #define SDCARD_DEVICE_PRIMARY "/dev/block/mmcblk0p1" | ||||
| #endif | ||||
|  | ||||
| #ifndef SDCARD_DEVICE_SECONDARY | ||||
| #define SDCARD_DEVICE_SECONDARY "/dev/block/mmcblk0p1" | ||||
| #define SDCARD_DEVICE_SECONDARY "/dev/block/mmcblk0" | ||||
| #endif | ||||
|  | ||||
| #ifndef SDEXT_DEVICE | ||||
|   | ||||
							
								
								
									
										41
									
								
								utilities/Android.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								utilities/Android.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| LOCAL_PATH := $(call my-dir) | ||||
|  | ||||
| include $(CLEAR_VARS) | ||||
| LOCAL_MODULE := e2fsck | ||||
| LOCAL_MODULE_TAGS := eng | ||||
| LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES | ||||
| LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin | ||||
| LOCAL_SRC_FILES := $(LOCAL_MODULE) | ||||
| include $(BUILD_PREBUILT) | ||||
|  | ||||
| include $(CLEAR_VARS) | ||||
| LOCAL_MODULE := fix_permissions | ||||
| LOCAL_MODULE_TAGS := eng | ||||
| LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES | ||||
| LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin | ||||
| LOCAL_SRC_FILES := $(LOCAL_MODULE) | ||||
| include $(BUILD_PREBUILT) | ||||
|  | ||||
| include $(CLEAR_VARS) | ||||
| LOCAL_MODULE := parted | ||||
| LOCAL_MODULE_TAGS := eng | ||||
| LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES | ||||
| LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin | ||||
| LOCAL_SRC_FILES := $(LOCAL_MODULE) | ||||
| include $(BUILD_PREBUILT) | ||||
|  | ||||
| include $(CLEAR_VARS) | ||||
| LOCAL_MODULE := sdparted | ||||
| LOCAL_MODULE_TAGS := eng | ||||
| LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES | ||||
| LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin | ||||
| LOCAL_SRC_FILES := $(LOCAL_MODULE) | ||||
| include $(BUILD_PREBUILT) | ||||
|  | ||||
| include $(CLEAR_VARS) | ||||
| LOCAL_MODULE := tune2fs | ||||
| LOCAL_MODULE_TAGS := eng | ||||
| LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES | ||||
| LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin | ||||
| LOCAL_SRC_FILES := $(LOCAL_MODULE) | ||||
| include $(BUILD_PREBUILT) | ||||
							
								
								
									
										
											BIN
										
									
								
								utilities/e2fsck
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								utilities/e2fsck
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										476
									
								
								utilities/fix_permissions
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										476
									
								
								utilities/fix_permissions
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,476 @@ | ||||
| #! /system/bin/sh | ||||
| # | ||||
| # Warning: if you want to run this script in cm-recovery change the above to #!/sbin/sh | ||||
| # | ||||
| # fix_permissions - fixes permissions on Android data directories after upgrade | ||||
| # shade@chemlab.org | ||||
| # | ||||
| # original concept: http://blog.elsdoerfer.name/2009/05/25/android-fix-package-uid-mismatches/ | ||||
| # implementation by: Cyanogen | ||||
| # improved by: ankn, smeat, thenefield, farmatito, rikupw, Kastro | ||||
| # | ||||
| # v1.1-v1.31r3 - many improvements and concepts from XDA developers. | ||||
| # v1.34 through v2.00 -  A lot of frustration [by Kastro] | ||||
| # v2.01	- Completely rewrote the script for SPEED, thanks for the input farmatito | ||||
| #         /data/data depth recursion is tweaked; | ||||
| #         fixed single mode; | ||||
| #         functions created for modularity; | ||||
| #         logging can be disabled via CLI for more speed; | ||||
| #         runtime computation added to end (Runtime: mins secs); | ||||
| #         progress (current # of total) added to screen; | ||||
| #         fixed CLI argument parsing, now you can have more than one option!; | ||||
| #         debug cli option; | ||||
| #         verbosity can be disabled via CLI option for less noise;; | ||||
| #         [by Kastro, (XDA: k4str0), twitter;mattcarver] | ||||
| # v2.02 - ignore com.htc.resources.apk if it exists and minor code cleanups, | ||||
| #         fix help text, implement simulated run (-s) [farmatito] | ||||
| # v2.03 - fixed chown group ownership output [Kastro] | ||||
|  | ||||
| VERSION="2.03" | ||||
|  | ||||
| # Defaults | ||||
| DEBUG=0 # Debug off by default | ||||
| LOGGING=1 # Logging on by default | ||||
| VERBOSE=1 # Verbose on by default | ||||
|  | ||||
| # Messages | ||||
| UID_MSG="Changing user ownership for:" | ||||
| GID_MSG="Changing group ownership for:" | ||||
| PERM_MSG="Changing permissions for:" | ||||
|  | ||||
| # Programs needed | ||||
| ECHO="busybox echo" | ||||
| GREP="busybox grep" | ||||
| EGREP="busybox egrep" | ||||
| CAT="busybox cat" | ||||
| CHOWN="busybox chown" | ||||
| CHMOD="busybox chmod" | ||||
| MOUNT="busybox mount" | ||||
| UMOUNT="busybox umount" | ||||
| CUT="busybox cut" | ||||
| FIND="busybox find" | ||||
| LS="busybox ls" | ||||
| TR="busybox tr" | ||||
| TEE="busybox tee" | ||||
| TEST="busybox test" | ||||
| SED="busybox sed" | ||||
| RM="busybox rm" | ||||
| WC="busybox wc" | ||||
| EXPR="busybox expr" | ||||
| DATE="busybox date" | ||||
|  | ||||
| # Initialise vars | ||||
| CODEPATH="" | ||||
| UID="" | ||||
| GID="" | ||||
| PACKAGE="" | ||||
| REMOVE=0 | ||||
| NOSYSTEM=0 | ||||
| ONLY_ONE="" | ||||
| SIMULATE=0 | ||||
| SYSREMOUNT=0 | ||||
| SYSMOUNT=0 | ||||
| DATAMOUNT=0 | ||||
| SYSSDMOUNT=0 | ||||
| FP_STARTTIME=$( $DATE +"%m-%d-%Y %H:%M:%S" ) | ||||
| FP_STARTEPOCH=$( $DATE +%s ) | ||||
|  | ||||
| fp_usage() | ||||
| { | ||||
|    $ECHO "Usage $0 [OPTIONS] [APK_PATH]" | ||||
|    $ECHO "      -d         turn on debug" | ||||
|    $ECHO "      -f         fix only package APK_PATH" | ||||
|    $ECHO "      -l         disable logging for this run (faster)" | ||||
|    $ECHO "      -r         remove stale data directories" | ||||
|    $ECHO "                 of uninstalled packages while fixing permissions" | ||||
|    $ECHO "      -s         simulate only" | ||||
|    $ECHO "      -u         check only non-system directories" | ||||
|    $ECHO "      -v         disable verbosity for this run (less output)" | ||||
|    $ECHO "      -V         print version" | ||||
|    $ECHO "      -h         this help" | ||||
| } | ||||
|  | ||||
| fp_parseargs() | ||||
| { | ||||
|    # Parse options | ||||
|    while $TEST $# -ne 0; do | ||||
|       case "$1" in | ||||
|          -d) | ||||
|             DEBUG=1 | ||||
|          ;; | ||||
|          -f) | ||||
|             if $TEST $# -lt 2; then | ||||
|                $ECHO "$0: missing argument for option $1" | ||||
|                exit 1 | ||||
|             else | ||||
|                if $TEST $( $ECHO $2 | $CUT -c1 ) != "-"; then | ||||
|                   ONLY_ONE=$2 | ||||
|                   shift; | ||||
|                else | ||||
|                   $ECHO "$0: missing argument for option $1" | ||||
|                   exit 1 | ||||
|                fi | ||||
|             fi | ||||
|          ;; | ||||
|          -r) | ||||
|             REMOVE=1 | ||||
|          ;; | ||||
|          -s) | ||||
|             SIMULATE=1 | ||||
|          ;; | ||||
|          -l) | ||||
|             if $TEST $LOGGING -eq 0; then | ||||
|                LOGGING=1 | ||||
|             else | ||||
|                LOGGING=0 | ||||
|             fi | ||||
|          ;; | ||||
|          -v) | ||||
|             if $TEST $VERBOSE -eq 0; then | ||||
|                VERBOSE=1 | ||||
|             else | ||||
|                VERBOSE=0 | ||||
|             fi | ||||
|          ;; | ||||
|          -u) | ||||
|             NOSYSTEM=1 | ||||
|          ;; | ||||
|          -V) | ||||
|             $ECHO "$0 $VERSION" | ||||
|             exit 0 | ||||
|          ;; | ||||
|          -h) | ||||
|             fp_usage | ||||
|             exit 0 | ||||
|          ;; | ||||
|          -*) | ||||
|             $ECHO "$0: unknown option $1" | ||||
|             $ECHO | ||||
|             fp_usage | ||||
|             exit 1 | ||||
|          ;; | ||||
|       esac | ||||
|       shift; | ||||
|    done | ||||
| } | ||||
|  | ||||
| fp_print() | ||||
| { | ||||
|    MSG=$@ | ||||
|    if $TEST $LOGGING -eq 1; then | ||||
|       $ECHO $MSG | $TEE -a $LOG_FILE | ||||
|    else | ||||
|       $ECHO $MSG | ||||
|    fi | ||||
| } | ||||
|  | ||||
| fp_start() | ||||
| { | ||||
|    if $TEST $SIMULATE -eq 0 ; then | ||||
|       if $TEST $( $GREP -c " /system " "/proc/mounts" ) -ne 0; then | ||||
|          DEVICE=$( $GREP " /system " "/proc/mounts" | $CUT -d ' ' -f1 ) | ||||
|          if $TEST $DEBUG -eq 1; then | ||||
|             fp_print "/system mounted on $DEVICE" | ||||
|          fi | ||||
|          if $TEST $( $GREP " /system " "/proc/mounts" | $GREP -c " ro " ) -ne 0; then | ||||
|             $MOUNT -o remount,rw $DEVICE /system | ||||
|             SYSREMOUNT=1 | ||||
|          fi | ||||
|       else | ||||
|          $MOUNT /system > /dev/null 2>&1 | ||||
|          SYSMOUNT=1 | ||||
|       fi | ||||
|        | ||||
|       if $TEST $( $GREP -c " /data " "/proc/mounts" ) -eq 0; then | ||||
|          $MOUNT /data > /dev/null 2>&1 | ||||
|          DATAMOUNT=1 | ||||
|       fi | ||||
|        | ||||
|       if $TEST -e /dev/block/mmcblk0p2 && $TEST $( $GREP -c " /system/sd " "/proc/mounts" ) -eq 0; then | ||||
|          $MOUNT /system/sd > /dev/null 2>&1 | ||||
|          SYSSDMOUNT=1 | ||||
|       fi | ||||
|    fi | ||||
|    if $TEST $( $MOUNT | $GREP -c /sdcard ) -eq 0; then | ||||
|       LOG_FILE="/data/fix_permissions.log" | ||||
|    else | ||||
|       LOG_FILE="/sdcard/fix_permissions.log" | ||||
|    fi | ||||
|    if $TEST ! -e "$LOG_FILE"; then | ||||
|       > $LOG_FILE | ||||
|    fi | ||||
|     | ||||
|    fp_print "$0 $VERSION started at $FP_STARTTIME" | ||||
| } | ||||
|  | ||||
| fp_chown_uid() | ||||
| { | ||||
|    FP_OLDUID=$1 | ||||
|    FP_UID=$2 | ||||
|    FP_FILE=$3 | ||||
|     | ||||
|    #if user ownership doesn't equal then change them | ||||
|    if $TEST "$FP_OLDUID" != "$FP_UID"; then | ||||
|       if $TEST $VERBOSE -ne 0; then | ||||
|          fp_print "$UID_MSG $FP_FILE from '$FP_OLDUID' to '$FP_UID'" | ||||
|       fi | ||||
|       if $TEST $SIMULATE -eq 0; then | ||||
|          $CHOWN $FP_UID "$FP_FILE" | ||||
|       fi | ||||
|    fi | ||||
| } | ||||
|  | ||||
| fp_chown_gid() | ||||
| { | ||||
|    FP_OLDGID=$1 | ||||
|    FP_GID=$2 | ||||
|    FP_FILE=$3 | ||||
|     | ||||
|    #if group ownership doesn't equal then change them | ||||
|    if $TEST "$FP_OLDGID" != "$FP_GID"; then | ||||
|       if $TEST $VERBOSE -ne 0; then | ||||
|          fp_print "$GID_MSG $FP_FILE from '$FP_OLDGID' to '$FP_GID'" | ||||
|       fi | ||||
|       if $TEST $SIMULATE -eq 0; then | ||||
|          $CHOWN :$FP_GID "$FP_FILE" | ||||
|       fi | ||||
|    fi | ||||
| } | ||||
|  | ||||
| fp_chmod() | ||||
| { | ||||
|    FP_OLDPER=$1 | ||||
|    FP_OLDPER=$( $ECHO $FP_OLDPER | cut -c2-10 ) | ||||
|    FP_PERSTR=$2 | ||||
|    FP_PERNUM=$3 | ||||
|    FP_FILE=$4 | ||||
|     | ||||
|    #if the permissions are not equal | ||||
|    if $TEST "$FP_OLDPER" != "$FP_PERSTR"; then | ||||
|       if $TEST $VERBOSE -ne 0; then | ||||
|          fp_print "$PERM_MSG $FP_FILE from '$FP_OLDPER' to '$FP_PERSTR' ($FP_PERNUM)" | ||||
|       fi | ||||
|       #change the permissions | ||||
|       if $TEST $SIMULATE -eq 0; then | ||||
|          $CHMOD $FP_PERNUM "$FP_FILE" | ||||
|       fi | ||||
|    fi | ||||
| } | ||||
|  | ||||
| fp_all() | ||||
| { | ||||
|    FP_NUMS=$( $CAT /data/system/packages.xml | $EGREP "^<package.*serId" | $GREP -v framework-res.apk | $GREP -v com.htc.resources.apk | $WC -l ) | ||||
|    I=0 | ||||
|    $CAT /data/system/packages.xml | $EGREP "^<package.*serId" | $GREP -v framework-res.apk | $GREP -v com.htc.resources.apk | while read all_line; do | ||||
|       I=$( $EXPR $I + 1 ) | ||||
|       fp_package "$all_line" $I $FP_NUMS | ||||
|    done | ||||
| } | ||||
|  | ||||
| fp_single() | ||||
| { | ||||
|    FP_SFOUND=$( $CAT /data/system/packages.xml | $EGREP "^<package.*serId" | $GREP -v framework-res.apk | $GREP -v com.htc.resources.apk | $GREP -i $ONLY_ONE | wc -l ) | ||||
|    if $TEST $FP_SFOUND -gt 1; then | ||||
|       fp_print "Cannot perform single operation on $FP_SFOUND matched package(s)." | ||||
|       elif $TEST $FP_SFOUND = "" -o $FP_SFOUND -eq 0; then | ||||
|       fp_print "Could not find the package you specified in the packages.xml file." | ||||
|    else | ||||
|       FP_SPKG=$( $CAT /data/system/packages.xml | $EGREP "^<package.*serId" | $GREP -v framework-res.apk | $GREP -v com.htc.resources.apk | $GREP -i $ONLY_ONE ) | ||||
|       fp_package "${FP_SPKG}" 1 1 | ||||
|    fi | ||||
| } | ||||
|  | ||||
| fp_package() | ||||
| { | ||||
|    pkgline=$1 | ||||
|    curnum=$2 | ||||
|    endnum=$3 | ||||
|    CODEPATH=$( $ECHO $pkgline | $SED 's%.* codePath="\(.*\)".*%\1%' |  $CUT -d '"' -f1 ) | ||||
|    PACKAGE=$( $ECHO $pkgline | $SED 's%.* name="\(.*\)".*%\1%' | $CUT -d '"' -f1 ) | ||||
|    UID=$( $ECHO $pkgline | $SED 's%.*serId="\(.*\)".*%\1%' |  $CUT -d '"' -f1 ) | ||||
|    GID=$UID | ||||
|    APPDIR=$( $ECHO $CODEPATH | $SED 's%^\(.*\)/.*%\1%' ) | ||||
|    APK=$( $ECHO $CODEPATH | $SED 's%^.*/\(.*\..*\)$%\1%' ) | ||||
|     | ||||
|    #debug | ||||
|    if $TEST $DEBUG -eq 1; then | ||||
|       fp_print "CODEPATH: $CODEPATH APPDIR: $APPDIR APK:$APK UID/GID:$UID:$GID" | ||||
|    fi | ||||
|     | ||||
|    #check for existence of apk | ||||
|    if $TEST -e $CODEPATH;  then | ||||
|       fp_print "Processing ($curnum of $endnum): $PACKAGE..." | ||||
|        | ||||
|       #lets get existing permissions of CODEPATH | ||||
|       OLD_UGD=$( $LS -ln "$CODEPATH" ) | ||||
|       OLD_PER=$( $ECHO $OLD_UGD | $CUT -d ' ' -f1 ) | ||||
|       OLD_UID=$( $ECHO $OLD_UGD | $CUT -d ' ' -f3 ) | ||||
|       OLD_GID=$( $ECHO $OLD_UGD | $CUT -d ' ' -f4 ) | ||||
|        | ||||
|       #apk source dirs | ||||
|       if $TEST "$APPDIR" = "/system/app"; then | ||||
|          #skip system apps if set | ||||
|          if $TEST "$NOSYSTEM" = "1"; then | ||||
|             fp_print "***SKIPPING SYSTEM APP ($PACKAGE)!" | ||||
|             return | ||||
|          fi | ||||
|          fp_chown_uid $OLD_UID 0 "$CODEPATH" | ||||
|          fp_chown_gid $OLD_GID 0 "$CODEPATH" | ||||
|          fp_chmod $OLD_PER "rw-r--r--" 644 "$CODEPATH" | ||||
|          elif $TEST "$APPDIR" = "/data/app" || $TEST "$APPDIR" = "/sd-ext/app"; then | ||||
|          fp_chown_uid $OLD_UID 1000 "$CODEPATH" | ||||
|          fp_chown_gid $OLD_GID 1000 "$CODEPATH" | ||||
|          fp_chmod $OLD_PER "rw-r--r--" 644 "$CODEPATH" | ||||
|          elif $TEST "$APPDIR" = "/data/app-private" || $TEST "$APPDIR" = "/sd-ext/app-private"; then | ||||
|          fp_chown_uid $OLD_UID 1000 "$CODEPATH" | ||||
|          fp_chown_gid $OLD_GID $GID "$CODEPATH" | ||||
|          fp_chmod $OLD_PER "rw-r-----" 640 "$CODEPATH" | ||||
|       fi | ||||
|    else | ||||
|       fp_print "$CODEPATH does not exist ($curnum of $endnum). Reinstall..." | ||||
|       if $TEST $REMOVE -eq 1; then | ||||
|          if $TEST -d /data/data/$PACKAGE ; then | ||||
|             fp_print "Removing stale dir /data/data/$PACKAGE" | ||||
|             if $TEST $SIMULATE -eq 0 ; then | ||||
|                $RM -R /data/data/$PACKAGE | ||||
|             fi | ||||
|          fi | ||||
|       fi | ||||
|    fi | ||||
|     | ||||
|    #the data/data for the package | ||||
|    if $TEST -d "/data/data/$PACKAGE"; then | ||||
|       #find all directories in /data/data/$PACKAGE | ||||
|       $FIND /data/data/$PACKAGE -type d -exec $LS -ldn {} \; | while read dataline; do | ||||
|          #get existing permissions of that directory | ||||
|          OLD_PER=$( $ECHO $dataline | $CUT -d ' ' -f1 ) | ||||
|          OLD_UID=$( $ECHO $dataline | $CUT -d ' ' -f3 ) | ||||
|          OLD_GID=$( $ECHO $dataline | $CUT -d ' ' -f4 ) | ||||
|          FILEDIR=$( $ECHO $dataline | $CUT -d ' ' -f9 ) | ||||
|          FOURDIR=$( $ECHO $FILEDIR | $CUT -d '/' -f5 ) | ||||
|           | ||||
|          #set defaults for iteration | ||||
|          ISLIB=0 | ||||
|          REVPERM=755 | ||||
|          REVPSTR="rwxr-xr-x" | ||||
|          REVUID=$UID | ||||
|          REVGID=$GID | ||||
|           | ||||
|          if $TEST "$FOURDIR" = ""; then | ||||
|             #package directory, perms:755 owner:$UID:$GID | ||||
|             fp_chmod $OLD_PER "rwxr-xr-x" 755 "$FILEDIR" | ||||
|             elif $TEST "$FOURDIR" = "lib"; then | ||||
|             #lib directory, perms:755 owner:1000:1000 | ||||
|             #lib files, perms:755 owner:1000:1000 | ||||
|             ISLIB=1 | ||||
|             REVPERM=755 | ||||
|             REVPSTR="rwxr-xr-x" | ||||
|             REVUID=1000 | ||||
|             REVGID=1000 | ||||
|             fp_chmod $OLD_PER "rwxr-xr-x" 755 "$FILEDIR" | ||||
|             elif $TEST "$FOURDIR" = "shared_prefs"; then | ||||
|             #shared_prefs directories, perms:771 owner:$UID:$GID | ||||
|             #shared_prefs files, perms:660 owner:$UID:$GID | ||||
|             REVPERM=660 | ||||
|             REVPSTR="rw-rw----" | ||||
|             fp_chmod $OLD_PER "rwxrwx--x" 771 "$FILEDIR" | ||||
|             elif $TEST "$FOURDIR" = "databases"; then | ||||
|             #databases directories, perms:771 owner:$UID:$GID | ||||
|             #databases files, perms:660 owner:$UID:$GID | ||||
|             REVPERM=660 | ||||
|             REVPSTR="rw-rw----" | ||||
|             fp_chmod $OLD_PER "rwxrwx--x" 771 "$FILEDIR" | ||||
|             elif $TEST "$FOURDIR" = "cache"; then | ||||
|             #cache directories, perms:771 owner:$UID:$GID | ||||
|             #cache files, perms:600 owner:$UID:GID | ||||
|             REVPERM=600 | ||||
|             REVPSTR="rw-------" | ||||
|             fp_chmod $OLD_PER "rwxrwx--x" 771 "$FILEDIR" | ||||
|          else | ||||
|             #other directories, perms:771 owner:$UID:$GID | ||||
|             REVPERM=771 | ||||
|             REVPSTR="rwxrwx--x" | ||||
|             fp_chmod $OLD_PER "rwxrwx--x" 771 "$FILEDIR" | ||||
|          fi | ||||
|           | ||||
|          #change ownership of directories matched | ||||
|          if $TEST "$ISLIB" = "1"; then | ||||
|             fp_chown_uid $OLD_UID 1000 "$FILEDIR" | ||||
|             fp_chown_gid $OLD_GID 1000 "$FILEDIR" | ||||
|          else | ||||
|             fp_chown_uid $OLD_UID $UID "$FILEDIR" | ||||
|             fp_chown_gid $OLD_GID $GID "$FILEDIR" | ||||
|          fi | ||||
|           | ||||
|          #if any files exist in directory with improper permissions reset them | ||||
|          $FIND $FILEDIR -type f -maxdepth 1 ! -perm $REVPERM -exec $LS -ln {} \; | while read subline; do | ||||
|             OLD_PER=$( $ECHO $subline | $CUT -d ' ' -f1 ) | ||||
|             SUBFILE=$( $ECHO $subline | $CUT -d ' ' -f9 ) | ||||
|             fp_chmod $OLD_PER $REVPSTR $REVPERM "$SUBFILE" | ||||
|          done | ||||
|           | ||||
|          #if any files exist in directory with improper user reset them | ||||
|          $FIND $FILEDIR -type f -maxdepth 1 ! -user $REVUID -exec $LS -ln {} \; | while read subline; do | ||||
|             OLD_UID=$( $ECHO $subline | $CUT -d ' ' -f3 ) | ||||
|             SUBFILE=$( $ECHO $subline | $CUT -d ' ' -f9 ) | ||||
|             fp_chown_uid $OLD_UID $REVUID "$SUBFILE" | ||||
|          done | ||||
|           | ||||
|          #if any files exist in directory with improper group reset them | ||||
|          $FIND $FILEDIR -type f -maxdepth 1 ! -group $REVGID -exec $LS -ln {} \; | while read subline; do | ||||
|             OLD_GID=$( $ECHO $subline | $CUT -d ' ' -f4 ) | ||||
|             SUBFILE=$( $ECHO $subline | $CUT -d ' ' -f9 ) | ||||
|             fp_chown_gid $OLD_GID $REVGID "$SUBFILE" | ||||
|          done | ||||
|       done | ||||
|    fi | ||||
| } | ||||
|  | ||||
| date_diff() | ||||
| { | ||||
|    if $TEST $# -ne 2; then | ||||
|       FP_DDM="E" | ||||
|       FP_DDS="E" | ||||
|       return | ||||
|    fi | ||||
|    FP_DDD=$( $EXPR $2 - $1 ) | ||||
|    FP_DDM=$( $EXPR $FP_DDD / 60 ) | ||||
|    FP_DDS=$( $EXPR $FP_DDD % 60 ) | ||||
| } | ||||
|  | ||||
| fp_end() | ||||
| { | ||||
|    if $TEST $SYSREMOUNT -eq 1; then | ||||
|       $MOUNT -o remount,ro $DEVICE /system > /dev/null 2>&1 | ||||
|    fi | ||||
|     | ||||
|    if $TEST $SYSSDMOUNT -eq 1; then | ||||
|       $UMOUNT /system/sd > /dev/null 2>&1 | ||||
|    fi | ||||
|     | ||||
|    if $TEST $SYSMOUNT -eq 1; then | ||||
|       $UMOUNT /system > /dev/null 2>&1 | ||||
|    fi | ||||
|     | ||||
|    if $TEST $DATAMOUNT -eq 1; then | ||||
|       $UMOUNT /data > /dev/null 2>&1 | ||||
|    fi | ||||
|     | ||||
|    FP_ENDTIME=$( $DATE +"%m-%d-%Y %H:%M:%S" ) | ||||
|    FP_ENDEPOCH=$( $DATE +%s ) | ||||
|     | ||||
|    date_diff $FP_STARTEPOCH $FP_ENDEPOCH | ||||
|     | ||||
|    fp_print "$0 $VERSION ended at $FP_ENDTIME (Runtime:${FP_DDM}m${FP_DDS}s)" | ||||
| } | ||||
|  | ||||
| #MAIN SCRIPT | ||||
|  | ||||
| fp_parseargs $@ | ||||
| fp_start | ||||
| if $TEST "$ONLY_ONE" != "" -a "$ONLY_ONE" != "0" ; then | ||||
|    fp_single "$ONLY_ONE" | ||||
| else | ||||
|    fp_all | ||||
| fi | ||||
| fp_end | ||||
							
								
								
									
										
											BIN
										
									
								
								utilities/parted
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								utilities/parted
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										637
									
								
								utilities/sdparted
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										637
									
								
								utilities/sdparted
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,637 @@ | ||||
| #!/sbin/sh | ||||
|  | ||||
| # do logging, if not excluded with -x | ||||
| LOGFILE="/data/sdparted.log" | ||||
| [ "$1" != "-x" ] && echo "$0" "$@" >> "$LOGFILE" && "$0" -x "$@" 2>&1 | tee -a "$LOGFILE" && exit | ||||
| shift | ||||
|  | ||||
| ShowError() { echo ; echo " err: $1" ; echo ; exit 1 ; } | ||||
|  | ||||
| ShowMessage() { echo ; echo " msg: $1" ; } | ||||
|  | ||||
| ShowHelp() { | ||||
|  | ||||
| cat <<DONEHELP | ||||
|  | ||||
| $SCRIPTNAME v$SCRIPTREV created by $MYNAME | ||||
|  | ||||
| if you use this script in your work, please give some credit. thanks. | ||||
|  | ||||
| requirements: cm-recovery-v1.4 | ||||
|  | ||||
| usage: $SCRIPTNAME [options] | ||||
|  | ||||
|  | ||||
| options: | ||||
|  | ||||
|  --fatsize|-fs SIZE[MG]     set the size of the fat32 partition to <SIZE>. | ||||
|                             default=total sdcard size - (ext + swap) | ||||
| 						 | ||||
|  --extsize|-es SIZE[MG]     set the size of the ext partition to <SIZE>. | ||||
|                             default=$EXTSIZE | ||||
| 						 | ||||
|  --swapsize|-ss SIZE[MG]    set the size of the swap partition to <SIZE>. | ||||
|                             if set to 0, no swap partition will be created. | ||||
|                             default=$SWAPSIZE | ||||
| 						 | ||||
|  --extfs|-efs TYPE          set the filesystem of ext partition to <TYPE>. | ||||
|                             valid types=ext2, ext3, ext4 | ||||
|                             default=$EXTFS | ||||
|  | ||||
|  | ||||
|  --upgradefs|-ufs TYPE      upgrades existing ext partition to <TYPE>. | ||||
|                             this operation will NOT wipe your sdcard and | ||||
|                             cannot be used with any partition creation options. | ||||
|                             valid types=ext3, ext4 | ||||
|  | ||||
|  --downgradefs|-dfs TYPE    downgrades existing ext partition to <TYPE>. | ||||
|                             this operation will NOT wipe your sdcard and | ||||
|                             cannot be used with any partition creation options. | ||||
|                             valid types=ext2 | ||||
|  | ||||
| 							 | ||||
|  --interactive|-i           interactive mode | ||||
|  | ||||
|  --help|-h                  display this help | ||||
|  | ||||
|  --printonly|-po            display sdcard information | ||||
|  | ||||
|  --silent|-s                do not prompt user, not even initial warning. | ||||
|  | ||||
|  | ||||
| examples: | ||||
|  $SCRIPTNAME                     creates swap=$SWAPSIZE ext2=$EXTSIZE fat32=remaining free space | ||||
|  $SCRIPTNAME -efs ext4           creates swap=$SWAPSIZE ext4=$EXTSIZE fat32=remaining free space | ||||
|  $SCRIPTNAME -fs 1.5G -efs ext3  creates swap=$SWAPSIZE ext3=$EXTSIZE fat32=1536 | ||||
|  $SCRIPTNAME -es 256M -ss 0      creates no swap ext2=256 fat32=remaining free space | ||||
|  $SCRIPTNAME -ufs ext4           upgrades ext partition to ext4 | ||||
|  | ||||
| DONEHELP | ||||
|  | ||||
| } | ||||
|  | ||||
| UserAbort() { | ||||
| 	 | ||||
| 	WHILEEXIT= | ||||
|  | ||||
| 	while [ -z "$WHILEEXIT" ] | ||||
| 	do | ||||
| 		echo -n "do you want to continue? (Y/n) " | ||||
| 		read response | ||||
| 		echo | ||||
| 		[ "$response" = "Y" ] || [ "$response" = "n" ] || [ "$response" = "N" ] && WHILEEXIT="$response" | ||||
| 	done | ||||
| 	 | ||||
| 	echo "$response" > /dev/null 2>&1 >>"$LOGFILE" | ||||
| 	 | ||||
| 	[ "$response" != "Y" ] | ||||
| 	 | ||||
| } | ||||
|  | ||||
| UnmountAll () { | ||||
|  | ||||
| 	# unmount all partitions so we can work with $SDPATH | ||||
| 	# i'm assuming no more than 3 partitions | ||||
| 	# maybe make a little more elegant later | ||||
| 	echo -n "unmounting all partitions..." | ||||
| 	umount "$FATPATH" > /dev/null 2>&1 >>"$LOGFILE" | ||||
| 	umount "$EXTPATH" > /dev/null 2>&1 >>"$LOGFILE" | ||||
| 	umount "$SWAPPATH" > /dev/null 2>&1 >>"$LOGFILE" | ||||
| 	echo "done" | ||||
| 	echo | ||||
| 	 | ||||
| } | ||||
|  | ||||
|  | ||||
| CheckReqs() { | ||||
|  | ||||
| 	echo -n "checking script requirements..." | ||||
| 	# check for valid sdcard | ||||
| 	[ -e $SDPATH ] || ShowError "$SDPATH does not exist!" | ||||
| 	 | ||||
| 	# look for necessary programs | ||||
| 	[ -e $CMPARTED ] || ShowError "$CMPARTED does not exist!" | ||||
| 	[ -e $CMTUNE2FS ] || ShowError "$CMTUNE2FS does not exist!" | ||||
| 	[ -e $CME2FSCK ] || ShowError "$CME2FSCK does not exist!" | ||||
| 	 | ||||
| 	# verify cm-v1.4 | ||||
| 	PARTEDREV=`"$CMPARTED" "$SDPATH" version | grep Parted | cut -d" " -f3` | ||||
| 	[ "$PARTEDREV" == "1.8.8.1.179-aef3" ] || ShowError "you are not using parted v1.8.8.1.179-aef3!" | ||||
| 	echo "done" | ||||
| 	echo | ||||
| 	 | ||||
| } | ||||
|  | ||||
| CheckTableType() { | ||||
|  | ||||
| 	TABLETYPE=`"$CMPARTED" "$SDPATH" print | grep Table: | cut -d" " -f3` | ||||
| 	 | ||||
| 	[ "$TABLETYPE" == "loop" -o "$TABLETYPE" == "msdos" ] && TTISOK=1 || TTISOK=0 | ||||
| 	[ "$TABLETYPE" == "loop" ] && TTISLOOP=1 || TTISLOOP=0 | ||||
| 	[ "$TABLETYPE" == "msdos" ] && TTISMSDOS=1 || TTISMOSDOS=0 | ||||
| 	 | ||||
| } | ||||
|  | ||||
| ValidateExtArg() { | ||||
|  | ||||
| 	FUNC_RET="nonzero" | ||||
| 		 | ||||
| 	# validating argument | ||||
| 	[ "$1" != "ext2" ] && [ "$1" != "ext3" ] && [ "$1" != "ext4" ] && FUNC_RET= | ||||
| 		 | ||||
| 	[ -z "$FUNC_RET" ] && [ -z "$IMODE" ] && ShowError "$1 is not a valid filesystem." | ||||
| 	[ -z "$FUNC_RET" ] && [ -n "$IMODE" ] && ShowMessage "$1 is not a valid filesystem." | ||||
| 	 | ||||
| 	# return valid argument | ||||
| 	[ -n "$FUNC_RET" ] && FUNC_RET="$1" | ||||
| 	 | ||||
| } | ||||
|  | ||||
| ValidateSizeArg() { | ||||
|  | ||||
| 	# check for zero-length arg to protect expr length | ||||
| 	[ -z "$1" ] && ShowError "zero-length argument passed to size-validator" | ||||
| 		 | ||||
| 	SIZEMB= | ||||
| 	ARGLEN=`expr length $1` | ||||
| 	SIZELEN=$(($ARGLEN-1)) | ||||
| 	SIZEARG=`expr substr $1 1 $SIZELEN` | ||||
| 	SIZEUNIT=`expr substr $1 $ARGLEN 1` | ||||
| 	 | ||||
| 	# check if SIZEARG is an integer | ||||
| 	if [ $SIZEARG -eq $SIZEARG 2> /dev/null ] ; then | ||||
| 		# look for G | ||||
| 		[ "$SIZEUNIT" == "G" ] && SIZEMB=$(($SIZEARG * 1024)) | ||||
| 		# look for M | ||||
| 		[ "$SIZEUNIT" == "M" ] && SIZEMB=$SIZEARG | ||||
| 		# no units on arg AND prevents using bogus size units | ||||
| 		[ -z "$SIZEMB" ] && [ $SIZEUNIT -eq $SIZEUNIT 2> /dev/null ] && SIZEMB=$1 | ||||
| 	# check if SIZEARG is a floating point number, GB only | ||||
| 	elif [ `expr index "$SIZEARG" .` != 0 ] && [ "$SIZEUNIT" == "G" ]  ; then | ||||
| 		INT=`echo "$SIZEARG" | cut -d"." -f1` | ||||
| 		FRAC=`echo "$SIZEARG" | cut -d"." -f2` | ||||
| 		SIGDIGITS=`expr length $FRAC` | ||||
| 		 | ||||
| 		[ -z "$INT" ] && INT=0 | ||||
| 		INTMB=$(($INT * 1024)) | ||||
| 		FRACMB=$((($FRAC * 1024) / (10**$SIGDIGITS))) | ||||
| 		SIZEMB=$(($INTMB + $FRACMB)) | ||||
| 	# it's not a valid size | ||||
| 	else | ||||
| 		[ -z "$IMODE" ] && ShowError "$1 is not a valid size" | ||||
| 	fi | ||||
| 	 | ||||
| 	[ -z "$SIZEMB" ] && [ -n "$IMODE" ] && ShowMessage "$1 is not a valid size" | ||||
| 	 | ||||
| 	# return valid argument in MB | ||||
| 	FUNC_RET=$SIZEMB | ||||
| 	 | ||||
| } | ||||
|  | ||||
| CalculatePartitions() { | ||||
|  | ||||
| 	# get size of sdcard in MB & do some math | ||||
| 	SDSIZEMB=`"$CMPARTED" "$SDPATH" unit MB print | grep $SDPATH | cut -d" " -f3` | ||||
| 	SDSIZE=${SDSIZEMB%MB} | ||||
| 	[ -n "$FATSIZE" ] || FATSIZE=$(($SDSIZE - $EXTSIZE - $SWAPSIZE)) | ||||
| 	EXTEND=$(($FATSIZE + $EXTSIZE)) | ||||
| 	SWAPEND=$(($EXTEND + $SWAPSIZE)) | ||||
| 	 | ||||
| 	# check for fatsize of 0 | ||||
| 	[ $FATSIZE -le 0 ] && ShowError "must have a fat32 partition greater than 0MB" | ||||
| 	 | ||||
| 	# check for zero-length sdsize... | ||||
| 	# indicative of parted not reporting length  | ||||
| 	# correctly b/c of error on sdcard | ||||
| 	[ -z "$SDSIZE" ] && ShowError "zero-length argument passed to partition-calculator" | ||||
| 	 | ||||
| 	# make sure we're not being asked to do the impossible | ||||
| 	[ $(($FATSIZE + $EXTSIZE + $SWAPSIZE)) -gt $SDSIZE ] && [ -z "$IMODE" ] && ShowError "sum of requested partitions is greater than sdcard size" | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| UpgradeDowngradeOnly() { | ||||
|  | ||||
| 	if [ -n "$UEXTFSONLY" ] ; then | ||||
| 		echo | ||||
| 		[ -n "$CREATEPART" ] && ShowError "cannot use upgrade option when creating partitions, use -efs instead" | ||||
| 		[ -n "$DEXTFSONLY" ] && ShowError "cannot upgrade AND downgrade, it just doesn't make sense" | ||||
| 		echo "you have chosen to upgrade $EXTPATH to $UEXTFSONLY." | ||||
| 		echo "this action will NOT delete any data from sdcard." | ||||
| 		echo | ||||
| 		[ -z "$SILENTRUN" ] &&	UserAbort && ShowError "script canceled by user" | ||||
| 		echo | ||||
| 		UpgradeExt "$UEXTFSONLY" | ||||
| 		ShowCardInfo | ||||
| 	elif [ -n "$DEXTFSONLY" ] ; then | ||||
| 		echo | ||||
| 		[ -n "$CREATEPART" ] && ShowError "cannot use downgrade option when creating partitions." | ||||
| 		[ -n "$UEXTFSONLY" ] && ShowError "cannot downgrade AND upgrade, it just doesn't make sense." | ||||
| 		echo "you have chosen to downgrade $EXTPATH to $DEXTFSONLY." | ||||
| 		echo "this action will NOT delete any data from sdcard." | ||||
| 		echo | ||||
| 		[ -z "$SILENTRUN" ] &&	UserAbort && ShowError "script canceled by user" | ||||
| 		echo | ||||
| 		DowngradeExt "$DEXTFSONLY" | ||||
| 		ShowCardInfo | ||||
| 	fi | ||||
| 	 | ||||
| } | ||||
|  | ||||
| PrepareSdCard() { | ||||
|  | ||||
| 	echo | ||||
| 	if [ $TTISOK -eq 0 ] ; then | ||||
| 		echo "partition 1 may not be aligned to cylinder boundaries." | ||||
| 		echo "to continue, this must be corrected." | ||||
| 	elif [ $TTISLOOP -gt 0 ] ; then | ||||
| 		echo "your sdcard's partition table type is $TABLETYPE." | ||||
| 		echo "to continue, partition table must be set to 'msdos'." | ||||
| 	elif [ $TTISMSDOS -gt 0 ] ; then | ||||
| 		# just a reminder..in a later version,  | ||||
| 		# i may implement resizing of partitions,  | ||||
| 		# so this will be unnecessary. but until then... | ||||
| 		echo "to continue, all existing partitions must be removed." | ||||
| 	else | ||||
| 		# this is not good, and should never happen | ||||
| 		# if it does, there is a serious problem | ||||
| 		ShowError "sdcard failed table type check." | ||||
| 	fi | ||||
| 	 | ||||
| 	echo | ||||
| 	echo "this action will remove all data from your sdcard." | ||||
| 	echo | ||||
| 	[ -z "$SILENTRUN" ] &&	UserAbort && ShowError "script canceled by user" | ||||
| 	 | ||||
| 	[ $TTISOK -eq 0 ] && echo -n "correcting cylinder boundaries..." | ||||
| 	[ $TTISLOOP -gt 0 ] && echo -n "setting partition table to msdos..." | ||||
| 	[ $TTISMSDOS -gt 0 ] && echo -n "removing all partitions..." | ||||
| 	 | ||||
| 	"$CMPARTED" -s "$SDPATH" mklabel msdos 2>&1 >>"$LOGFILE" | ||||
| 	echo "done" | ||||
| 	echo | ||||
| 	 | ||||
| } | ||||
|  | ||||
| ShowActions() { | ||||
|  | ||||
| 	echo | ||||
| 	echo "total size of sdcard=$SDSIZEMB" | ||||
| 	echo | ||||
| 	echo "the following actions will be performed:" | ||||
| 	echo " -create $FATSIZE""MB fat32 partition" | ||||
| 	[ $EXTSIZE -gt 0 ] && echo " -create $EXTSIZE""MB ext2 partition" | ||||
| 	[ $SWAPSIZE -gt 0 ] && echo " -create $SWAPSIZE""MB swap partition" | ||||
| 	[ "$EXTFS" != "ext2" ] && echo " -ext2 partition will be upgraded to $EXTFS" | ||||
| 	echo | ||||
| 	[ -z "$SILENTRUN" ] &&	UserAbort && ShowError "script canceled by user" | ||||
| 	echo | ||||
| 	 | ||||
| } | ||||
|  | ||||
| ShowCardInfo() { | ||||
|  | ||||
| 	CheckTableType | ||||
| 	 | ||||
| 	echo | ||||
| 	echo "retrieving current sdcard information..." | ||||
| 	 | ||||
| 	if [ $TTISOK -gt 0 ] ; then | ||||
| 		echo | ||||
| 		parted "$SDPATH" print | ||||
| 		echo | ||||
| 		echo "script log is located @ /data/sdparted.log" | ||||
| 		exit 0 | ||||
| 	else | ||||
| 		echo | ||||
| 		echo "partition 1 may not be aligned to cylinder boundaries." | ||||
| 		ShowError "cannot complete print operation." | ||||
| 	fi | ||||
| 	echo | ||||
| 	 | ||||
| } | ||||
|  | ||||
|  | ||||
| PartitionSdCard() { | ||||
|  | ||||
| 	echo "performing selected actions..." | ||||
| 	echo | ||||
| 	 | ||||
| 	if [ $FATSIZE -gt 0 ] ; then | ||||
| 		echo -n "creating fat32 partition..." | ||||
| 		"$CMPARTED" -s "$SDPATH" mkpartfs primary fat32 0 "$FATSIZE"MB 2>&1 >>"$LOGFILE" | ||||
| 		echo "done" | ||||
| 	fi | ||||
| 	 | ||||
| 	if [ $EXTSIZE -gt 0 ] ; then | ||||
| 		echo -n "creating ext2 partition..." | ||||
| 		"$CMPARTED" -s "$SDPATH" mkpartfs primary ext2 "$FATSIZE"MB "$EXTEND"MB 2>&1 >>"$LOGFILE" | ||||
| 		echo "done" | ||||
| 	fi | ||||
| 	 | ||||
| 	if [ $SWAPSIZE -gt 0 ] ; then | ||||
| 		echo -n "creating swap partition..." | ||||
| 		"$CMPARTED" -s "$SDPATH" mkpartfs primary linux-swap "$EXTEND"MB "$SWAPEND"MB 2>&1 >>"$LOGFILE" | ||||
| 		echo "done" | ||||
| 	fi | ||||
| 	echo | ||||
| 	 | ||||
| } | ||||
|  | ||||
| UpgradeExt() { | ||||
|  | ||||
| 	# check for no upgrade | ||||
| 	[ "$1" == "ext2" ] && return | ||||
| 	# check for ext partition | ||||
| 	[ ! -e "$EXTPATH" ] && ShowError "$EXTPATH does not exist" | ||||
|  | ||||
| 	# have to use -m switch for this check b/c parted incorrectly | ||||
| 	# reports all ext partitions as ext2 when running print <number> | ||||
| 	CHECKEXTFS=`"$CMPARTED" -m "$SDPATH" print | grep ext | cut -d":" -f5` | ||||
| 	[ "$CHECKEXTFS" == "$1" ] && ShowError "$EXTPATH is already $1" | ||||
|  | ||||
| 	# grabbed the code bits for ext3 from upgrade_fs(credit:cyanogen) | ||||
| 	# check for ext2...must upgrade to ext3 first b4 ext4 | ||||
| 	if [ "$1" == "ext3" -o "$1" == "ext4" ] ; then | ||||
| 		echo -n "adding journaling to $EXTPATH..." | ||||
| 		umount /system/sd > /dev/null 2>&1 >>"$LOGFILE" | ||||
| 		"$CME2FSCK" -p "$EXTPATH" 2>&1 >>"$LOGFILE" | ||||
| 		"$CMTUNE2FS" -c0 -i0 -j "$EXTPATH" 2>&1 >>"$LOGFILE" | ||||
| 		echo "done" | ||||
| 	fi | ||||
|  | ||||
| 	# and got convert to ext4 from xda-forum(credit:Denkai) | ||||
| 	if [ "$1" == "ext4" ] ; then | ||||
| 		echo -n "converting $EXTPATH to ext4 filesystem..." | ||||
| 		umount /system/sd > /dev/null 2>&1 >>"$LOGFILE" | ||||
| 		"$CMTUNE2FS" -O extents,uninit_bg,dir_index "$EXTPATH" 2>&1 >>"$LOGFILE" | ||||
| 		"$CME2FSCK" -fpDC0 "$EXTPATH" 2>&1 >>"$LOGFILE" | ||||
| 		echo "done" | ||||
| 	fi | ||||
| 	echo | ||||
| 	 | ||||
| } | ||||
|  | ||||
| DowngradeExt() { | ||||
|  | ||||
| 	# check for ext partition | ||||
| 	[ ! -e "$EXTPATH" ] && ShowError "$EXTPATH does not exist" | ||||
|  | ||||
| 	# have to use print for this check b/c parted incorrectly | ||||
| 	# reports all ext partitions as ext2 when running print <number> | ||||
| 	CHECKEXTFS=`"$CMPARTED" -m "$SDPATH" print | grep ext | cut -d":" -f5` | ||||
| 	[ "$CHECKEXTFS" == "$1" ] && ShowError "$EXTPATH is already $1" | ||||
| 	 | ||||
| 	if [ "$CHECKEXTFS" == "ext4" -o "$1" == "ext3" ] ; then | ||||
| 		# interweb says downgrading from ext4 is not possible | ||||
| 		# without a backup/restore procedure. | ||||
| 		# if i figure it out, i'll implement it. | ||||
| 		ShowError "downgrading from ext4 is not currently supported" | ||||
| 	fi | ||||
| 	 | ||||
| 	if [ "$1" == "ext2" ] ; then | ||||
| 		echo -n "removing journaling from $EXTPATH..." | ||||
| 		umount /system/sd > /dev/null 2>&1 >>"$LOGFILE" | ||||
| 		"$CMTUNE2FS" -O ^has_journal "$EXTPATH" 2>&1 >>"$LOGFILE" | ||||
| 		"$CME2FSCK" -fp "$EXTPATH" 2>&1 >>"$LOGFILE" | ||||
| 		echo "done" | ||||
| 	fi | ||||
| 	echo | ||||
| 	 | ||||
| } | ||||
|  | ||||
|  | ||||
| Interactive() { | ||||
|  | ||||
| cat <<DONEINSTRUCT | ||||
|  | ||||
| sdparted interactive mode | ||||
|  | ||||
| rules: | ||||
| 1. no answer means you accept default value | ||||
| 2. enter '0' for no partition | ||||
|  | ||||
| DONEINSTRUCT | ||||
|  | ||||
| 	UserAbort && ShowError "script canceled by user" | ||||
| 	 | ||||
| 	CalculatePartitions | ||||
| 	 | ||||
| 	GetSwapSize | ||||
| 	 | ||||
| 	FATSIZE= | ||||
| 	 | ||||
| 	CalculatePartitions | ||||
| 	 | ||||
| 	GetExtSize | ||||
| 	 | ||||
| 	GetExtType | ||||
| 	 | ||||
| 	FATSIZE= | ||||
| 	 | ||||
| 	CalculatePartitions | ||||
| 	 | ||||
| 	GetFatSize | ||||
| 	 | ||||
| } | ||||
|  | ||||
| GetSwapSize() { | ||||
|  | ||||
| 	SWAPTEST= | ||||
| 	 | ||||
| 	while [ -z "$SWAPTEST" ] | ||||
| 	do | ||||
| 		echo | ||||
| 		echo -n "swap partition size [default=$SWAPSIZE]: " | ||||
| 		read SWAPRESP | ||||
| 		 | ||||
| 		[ -z "$SWAPRESP" ] && SWAPRESP="$SWAPSIZE" | ||||
| 		echo "$SWAPRESP" > /dev/null 2>&1 >>"$LOGFILE" | ||||
| 		 | ||||
| 		ValidateSizeArg "$SWAPRESP" | ||||
| 		SWAPTEST="$FUNC_RET" | ||||
| 		[ -n "$SWAPTEST" ] && [ $SWAPTEST -gt $SDSIZE ] && ShowMessage "$SWAPRESP > available space($(($SDSIZE))M)." && SWAPTEST= | ||||
| 	done | ||||
| 	 | ||||
| 	SWAPSIZE=$SWAPTEST | ||||
| 	 | ||||
| } | ||||
|  | ||||
| GetExtSize() { | ||||
|  | ||||
| 	EXTTEST= | ||||
| 	 | ||||
| 	while [ -z "$EXTTEST" ] | ||||
| 	do | ||||
| 		echo | ||||
| 		echo -n "ext partition size [default=$EXTSIZE]: " | ||||
| 		read EXTRESP | ||||
| 		 | ||||
| 		[ -z "$EXTRESP" ] && EXTRESP="$EXTSIZE" | ||||
| 		echo "$EXTRESP" > /dev/null 2>&1 >>"$LOGFILE" | ||||
| 		 | ||||
| 		ValidateSizeArg "$EXTRESP" | ||||
| 		EXTTEST="$FUNC_RET" | ||||
| 		 | ||||
| 		[ -n "$EXTTEST" ] && [ $EXTTEST -gt $(($SDSIZE - $SWAPSIZE)) ] && ShowMessage "$EXTRESP > available space($(($SDSIZE - $SWAPSIZE))M)." && EXTTEST= | ||||
| 	done | ||||
| 	 | ||||
| 	EXTSIZE=$EXTTEST | ||||
| 	 | ||||
| } | ||||
|  | ||||
| GetExtType() { | ||||
|  | ||||
| 	FSTEST= | ||||
| 	 | ||||
| 	while [ -z "$FSTEST" ] | ||||
| 	do | ||||
| 		echo | ||||
| 		echo -n "ext partition type [default=$EXTFS]: " | ||||
| 		read FSRESP | ||||
| 		 | ||||
| 		[ -z "$FSRESP" ] && FSRESP="$EXTFS" | ||||
| 		echo "$FSRESP" > /dev/null 2>&1 >>"$LOGFILE" | ||||
| 		 | ||||
| 		ValidateExtArg "$FSRESP" | ||||
| 		FSTEST="$FUNC_RET" | ||||
| 	done | ||||
| 	 | ||||
| 	EXTFS="$FSTEST" | ||||
| 	 | ||||
| } | ||||
|  | ||||
| GetFatSize() { | ||||
|  | ||||
| 	FATTEST= | ||||
| 	 | ||||
| 	while [ -z "$FATTEST" ] | ||||
| 	do | ||||
| 		echo | ||||
| 		echo -n "fat partition size [default=$FATSIZE]: " | ||||
| 		read FATRESP | ||||
| 		 | ||||
| 		[ -z "$FATRESP" ] && FATRESP="$FATSIZE" | ||||
| 		echo "$FATRESP" > /dev/null 2>&1 >>"$LOGFILE" | ||||
| 		 | ||||
| 		ValidateSizeArg "$FATRESP" | ||||
| 		FATTEST="$FUNC_RET" | ||||
| 		 | ||||
| 		[ -n "$FATTEST" ] && [ $FATTEST -gt $FATSIZE ] && ShowMessage "$FATRESP > available space($(($SDSIZE - $SWAPSIZE - $EXTSIZE))M)." && FATTEST= | ||||
| 		[ -n "$FATTEST" ] && [ $FATTEST -le 0 ] && ShowMessage "must have a fat32 partition greater than 0MB" && FATTEST= | ||||
| 	done | ||||
| 	 | ||||
| 	FATSIZE=$FATTEST | ||||
| 	 | ||||
| } | ||||
|  | ||||
|  | ||||
| SCRIPTNAME="sdparted" | ||||
| SCRIPTREV="0.6" | ||||
| MYNAME="51dusty" | ||||
|  | ||||
| IMODE= | ||||
| SILENTRUN= | ||||
| CREATEPART= | ||||
| FUNC_RET= | ||||
|  | ||||
| UEXTFSONLY= | ||||
| DEXTFSONLY= | ||||
|  | ||||
| TTISOK= | ||||
| TTISLOOP= | ||||
| TTISMSDOS= | ||||
|  | ||||
| SDSIZE= | ||||
| SDSIZEMB= | ||||
| if [ -z "$SDPATH" ] | ||||
| then | ||||
|     SDPATH="/dev/block/mmcblk0" | ||||
| else | ||||
|     echo Found SDPATH=$SDPATH | ||||
| fi | ||||
|  | ||||
| FATSIZE= | ||||
| FATTYPE="fat32" | ||||
| FATPATH=$SDPATH"p1" | ||||
|  | ||||
| EXTSIZE=512 | ||||
| EXTFS="ext2" | ||||
| EXTPATH=$SDPATH"p2" | ||||
| EXTEND= | ||||
|  | ||||
| SWAPSIZE=32 | ||||
| SWAPTYPE="linux-swap" | ||||
| SWAPPATH=$SDPATH"p3" | ||||
| SWAPEND= | ||||
|  | ||||
| CMPARTED="/sbin/parted" | ||||
| CMTUNE2FS="/sbin/tune2fs" | ||||
| CME2FSCK="/sbin/e2fsck" | ||||
|  | ||||
| # give the output some breathing room | ||||
| echo "$SCRIPTREV" >> "$LOGFILE"  | ||||
| echo | ||||
|  | ||||
| # check for arguments | ||||
| while [ $# -gt 0 ] ; do | ||||
|   case "$1" in | ||||
|  | ||||
|     -h|--help) ShowHelp ; exit 0 ;; | ||||
|      | ||||
|     -fs|--fatsize) shift ; ValidateSizeArg "$1" ; FATSIZE="$FUNC_RET" ; CREATEPART="$1" ;; | ||||
|     -es|--extsize) shift ; ValidateSizeArg "$1" ; EXTSIZE="$FUNC_RET" ; CREATEPART="$1" ;; | ||||
| 	-ss|--swapsize) shift ; ValidateSizeArg "$1" ; SWAPSIZE="$FUNC_RET" ; CREATEPART="$1" ;; | ||||
| 	-efs|--extfs) shift ; ValidateExtArg "$1" ; EXTFS="$FUNC_RET" ; CREATEPART="$1" ;; | ||||
| 	 | ||||
| 	-ufs|--upgradefs) shift ; ValidateExtArg "$1" ; UEXTFSONLY="$FUNC_RET" ;; | ||||
| 	-dfs|--downgradefs) shift ; ValidateExtArg "$1" ; DEXTFSONLY="$FUNC_RET" ;; | ||||
| 	 | ||||
| 	-i|--interactive) IMODE="$1" ;; | ||||
| 	 | ||||
| 	-s|--silent) SILENTRUN="$1" ;; | ||||
| 	 | ||||
| 	-po|--printonly) ShowCardInfo ;; | ||||
| 	 | ||||
| 	*) ShowHelp ; ShowError "unknown argument '$1'" ;; | ||||
|  | ||||
|   esac | ||||
|   shift | ||||
| done | ||||
|  | ||||
| # can't do silent when in interactive mode | ||||
| [ -n "$IMODE" ] && SILENTRUN= | ||||
|  | ||||
| # make sure sdcard exists and all needed files are here | ||||
| CheckReqs | ||||
|  | ||||
| # unmount all | ||||
| UnmountAll | ||||
|  | ||||
| # upgrade only? downgrade only? | ||||
| UpgradeDowngradeOnly | ||||
|  | ||||
| # check table | ||||
| CheckTableType | ||||
|  | ||||
| # prep card | ||||
| PrepareSdCard | ||||
|  | ||||
| # check for interactive mode | ||||
| [ -n "$IMODE" ] && Interactive | ||||
|  | ||||
| # do some math | ||||
| CalculatePartitions | ||||
|  | ||||
| # last chance to cancel | ||||
| ShowActions | ||||
|  | ||||
| # partition card | ||||
| PartitionSdCard | ||||
|  | ||||
| # upgrade fs if necessary | ||||
| UpgradeExt "$EXTFS" | ||||
|  | ||||
| # say goodbye and show print output | ||||
| ShowCardInfo | ||||
							
								
								
									
										
											BIN
										
									
								
								utilities/tune2fs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								utilities/tune2fs
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user