diff options
-rw-r--r-- | Android.mk | 2 | ||||
-rw-r--r-- | common.h | 1 | ||||
-rw-r--r-- | extendedcommands.c | 79 | ||||
-rw-r--r-- | recovery.c | 76 | ||||
-rw-r--r-- | recovery_ui.h | 4 | ||||
-rw-r--r-- | res/images/icon_cid.png | bin | 0 -> 36007 bytes | |||
-rw-r--r-- | su/Android.mk | 17 | ||||
-rw-r--r-- | su/install-su.sh | 26 | ||||
-rw-r--r-- | ui.c | 1 | ||||
-rwxr-xr-x | utilities/Android.mk | 8 | ||||
-rwxr-xr-x | utilities/fix_permissions | 484 |
11 files changed, 137 insertions, 561 deletions
@@ -38,7 +38,7 @@ RECOVERY_NAME := CWM-based Recovery endif endif -RECOVERY_VERSION := $(RECOVERY_NAME) v6.0.3.3 +RECOVERY_VERSION := $(RECOVERY_NAME) v6.0.3.5 LOCAL_CFLAGS += -DRECOVERY_VERSION="$(RECOVERY_VERSION)" RECOVERY_API_VERSION := 2 @@ -65,6 +65,7 @@ enum { BACKGROUND_ICON_INSTALLING, BACKGROUND_ICON_ERROR, BACKGROUND_ICON_CLOCKWORK, + BACKGROUND_ICON_CID, BACKGROUND_ICON_FIRMWARE_INSTALLING, BACKGROUND_ICON_FIRMWARE_ERROR, NUM_BACKGROUND_ICONS diff --git a/extendedcommands.c b/extendedcommands.c index 2aa5174..7ceed7c 100644 --- a/extendedcommands.c +++ b/extendedcommands.c @@ -1328,25 +1328,32 @@ void show_advanced_menu() }; static char* list[] = { "reboot recovery", + "reboot to bootloader", + "power off", "wipe dalvik cache", "report error", "key test", "show log", - "fix permissions", "partition sdcard", "partition external sdcard", "partition internal sdcard", NULL }; + char bootloader_mode[PROPERTY_VALUE_MAX]; + property_get("ro.bootloader.mode", bootloader_mode, ""); + if (!strcmp(bootloader_mode, "download")) { + list[1] = "reboot to download mode"; + } + if (!can_partition("/sdcard")) { - list[6] = NULL; + list[7] = NULL; } if (!can_partition("/external_sd")) { - list[7] = NULL; + list[8] = NULL; } if (!can_partition("/emmc")) { - list[8] = NULL; + list[9] = NULL; } for (;;) @@ -1357,9 +1364,29 @@ void show_advanced_menu() switch (chosen_item) { case 0: - android_reboot(ANDROID_RB_RESTART2, 0, "recovery"); + { + ui_print("Rebooting recovery...\n"); + reboot_main_system(ANDROID_RB_RESTART2, 0, "recovery"); break; + } case 1: + { + if (!strcmp(bootloader_mode, "download")) { + ui_print("Rebooting to download mode...\n"); + reboot_main_system(ANDROID_RB_RESTART2, 0, "download"); + } else { + ui_print("Rebooting to bootloader...\n"); + reboot_main_system(ANDROID_RB_RESTART2, 0, "bootloader"); + } + break; + } + case 2: + { + ui_print("Shutting down...\n"); + reboot_main_system(ANDROID_RB_POWEROFF, 0, 0); + break; + } + case 3: if (0 != ensure_path_mounted("/data")) break; ensure_path_mounted("/sd-ext"); @@ -1372,10 +1399,10 @@ void show_advanced_menu() } ensure_path_unmounted("/data"); break; - case 2: + case 4: handle_failure(1); break; - case 3: + case 5: { ui_print("Outputting key codes.\n"); ui_print("Go back to end debugging.\n"); @@ -1390,23 +1417,16 @@ void show_advanced_menu() while (action != GO_BACK); break; } - case 4: + case 6: ui_printlogtail(12); break; - case 5: - ensure_path_mounted("/system"); - ensure_path_mounted("/data"); - ui_print("Fixing permissions...\n"); - __system("fix_permissions"); - ui_print("Done!\n"); - break; - case 6: + case 7: partition_sdcard("/sdcard"); break; - case 7: + case 8: partition_sdcard("/external_sd"); break; - case 8: + case 9: partition_sdcard("/emmc"); break; } @@ -1578,16 +1598,23 @@ int verify_root_and_recovery() { int ret = 0; struct stat st; - if (0 == lstat("/system/etc/install-recovery.sh", &st)) { - if (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) { - ui_show_text(1); - ret = 1; - if (confirm_selection("ROM may flash stock recovery on boot. Fix?", "Yes - Disable recovery flash")) { - __system("chmod -x /system/etc/install-recovery.sh"); + // check to see if install-recovery.sh is going to clobber recovery + // install-recovery.sh is also used to run the su daemon on stock rom for 4.3+ + // so verify that doesn't exist... + if (0 != lstat("/system/etc/.installed_su_daemon", &st)) { + // check install-recovery.sh exists and is executable + if (0 == lstat("/system/etc/install-recovery.sh", &st)) { + if (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) { + ui_show_text(1); + ret = 1; + if (confirm_selection("ROM may flash stock recovery on boot. Fix?", "Yes - Disable recovery flash")) { + __system("chmod -x /system/etc/install-recovery.sh"); + } } } } + int exists = 0; if (0 == lstat("/system/bin/su", &st)) { exists = 1; @@ -1619,9 +1646,7 @@ int verify_root_and_recovery() { ui_show_text(1); ret = 1; if (confirm_selection("Root access is missing. Root device?", "Yes - Root device (/system/xbin/su)")) { - __system("cp /sbin/su.recovery /system/xbin/su"); - __system("chmod 6755 /system/xbin/su"); - __system("ln -sf /system/xbin/su /system/bin/su"); + __system("/sbin/install-su.sh"); } } @@ -53,6 +53,7 @@ struct selabel_handle *sehandle = NULL; static const struct option OPTIONS[] = { { "send_intent", required_argument, NULL, 's' }, { "update_package", required_argument, NULL, 'u' }, + { "headless", no_argument, NULL, 'h' }, { "wipe_data", no_argument, NULL, 'w' }, { "wipe_cache", no_argument, NULL, 'c' }, { "show_text", no_argument, NULL, 't' }, @@ -637,35 +638,8 @@ update_directory(const char* path, const char* unmount_when_done) { static void wipe_data(int confirm) { - if (confirm) { - static char** title_headers = NULL; - - if (title_headers == NULL) { - char* headers[] = { "Confirm wipe of all user data?", - " THIS CAN NOT BE UNDONE.", - "", - NULL }; - title_headers = prepend_title((const char**)headers); - } - - char* items[] = { " No", - " No", - " No", - " No", - " No", - " No", - " No", - " Yes -- delete all user data", // [7] - " No", - " No", - " No", - NULL }; - - int chosen_item = get_menu_selection(title_headers, items, 1, 0); - if (chosen_item != 7) { - return; - } - } + if (confirm && !confirm_selection( "Confirm wipe of all user data?", "Yes - Wipe all user data")) + return; ui_print("\n-- Wiping data...\n"); device_wipe_data(); @@ -679,6 +653,15 @@ wipe_data(int confirm) { ui_print("Data wipe complete.\n"); } +static void headless_wait() { + ui_show_text(0); + char** headers = prepend_title((const char**)MENU_HEADERS); + for (;;) { + finish_recovery(NULL); + get_menu_selection(headers, MENU_ITEMS, 0, 0); + } +} + int ui_menu_level = 1; int ui_root_menu = 0; static void @@ -706,7 +689,7 @@ prompt_and_wait() { int status; switch (chosen_item) { case ITEM_REBOOT: - poweroff=0; + poweroff = 0; return; case ITEM_WIPE_DATA: @@ -739,10 +722,6 @@ prompt_and_wait() { case ITEM_ADVANCED: show_advanced_menu(); break; - - case ITEM_POWEROFF: - poweroff = 1; - return; } } } @@ -785,6 +764,13 @@ setup_adbd() { property_set("service.adb.root", "1"); } +// call a clean reboot +void reboot_main_system(int cmd, int flags, char *arg) { + verify_root_and_recovery(); + finish_recovery(NULL); // sync() in here + android_reboot(cmd, flags, arg); +} + int main(int argc, char **argv) { @@ -864,6 +850,7 @@ main(int argc, char **argv) { const char *update_package = NULL; int wipe_data = 0, wipe_cache = 0; int sideload = 0; + int headless = 0; LOGI("Checking arguments.\n"); int arg; @@ -877,6 +864,11 @@ main(int argc, char **argv) { wipe_data = wipe_cache = 1; #endif break; + case 'h': + ui_set_background(BACKGROUND_ICON_CID); + ui_show_text(0); + headless = 1; + break; case 'c': wipe_cache = 1; break; case 't': ui_show_text(1); break; case 'l': sideload = 1; break; @@ -894,7 +886,7 @@ main(int argc, char **argv) { if (!sehandle) { fprintf(stderr, "Warning: No file_contexts\n"); - // ui_print("Warning: No file_contexts\n"); + ui_print("Warning: No file_contexts\n"); } LOGI("device_recovery_start()\n"); @@ -941,7 +933,8 @@ main(int argc, char **argv) { if (status != INSTALL_SUCCESS) ui_print("Cache wipe failed.\n"); } else if (sideload) { signature_check_enabled = 0; - ui_set_show_text(1); + if (!headless) + ui_set_show_text(1); if (0 == apply_from_adb()) { status = INSTALL_SUCCESS; ui_set_show_text(0); @@ -954,8 +947,10 @@ main(int argc, char **argv) { signature_check_enabled = 0; script_assert_enabled = 0; is_user_initiated_recovery = 1; - ui_set_show_text(1); - ui_set_background(BACKGROUND_ICON_CLOCKWORK); + if (!headless) { + ui_set_show_text(1); + ui_set_background(BACKGROUND_ICON_CLOCKWORK); + } if (extendedcommand_file_exists()) { LOGI("Running extendedcommand...\n"); @@ -974,11 +969,14 @@ main(int argc, char **argv) { setup_adbd(); + if (headless) { + headless_wait(); + } if (status != INSTALL_SUCCESS && !is_user_initiated_recovery) { ui_set_show_text(1); ui_set_background(BACKGROUND_ICON_ERROR); } - if (status != INSTALL_SUCCESS || ui_text_visible()) { + else if (status != INSTALL_SUCCESS || ui_text_visible()) { prompt_and_wait(); } diff --git a/recovery_ui.h b/recovery_ui.h index ec88d95..0555122 100644 --- a/recovery_ui.h +++ b/recovery_ui.h @@ -83,7 +83,6 @@ int device_wipe_data(); #define ITEM_NANDROID 4 #define ITEM_PARTITION 5 #define ITEM_ADVANCED 6 -#define ITEM_POWEROFF 7 // Header text to display above the main menu. extern char* MENU_HEADERS[]; @@ -102,4 +101,7 @@ set_sdcard_update_bootloader_message(); extern int ui_handle_key(int key, int visible); +// call a clean reboot +void reboot_main_system(int cmd, int flags, char *arg); + #endif diff --git a/res/images/icon_cid.png b/res/images/icon_cid.png Binary files differnew file mode 100644 index 0000000..167ee38 --- /dev/null +++ b/res/images/icon_cid.png diff --git a/su/Android.mk b/su/Android.mk index 6458e8e..484d21d 100644 --- a/su/Android.mk +++ b/su/Android.mk @@ -8,7 +8,7 @@ LOCAL_MODULE_TAGS := eng debug LOCAL_FORCE_STATIC_EXECUTABLE := true LOCAL_STATIC_LIBRARIES := libc LOCAL_C_INCLUDES := external/sqlite/dist -LOCAL_SRC_FILES := ../../../external/koush/Superuser/Superuser/jni/su/su.c ../../../external/koush/Superuser/Superuser/jni/su/activity.c ../../../external/koush/Superuser/Superuser/jni/su/utils.c dbstub.c +LOCAL_SRC_FILES := ../../../external/koush/Superuser/Superuser/jni/su/su.c ../../../external/koush/Superuser/Superuser/jni/su/daemon.c ../../../external/koush/Superuser/Superuser/jni/su/activity.c ../../../external/koush/Superuser/Superuser/jni/su/utils.c dbstub.c LOCAL_CFLAGS := -DSQLITE_OMIT_LOAD_EXTENSION -DREQUESTOR=\"$(SUPERUSER_PACKAGE)\" ifdef SUPERUSER_PACKAGE_PREFIX LOCAL_CFLAGS += -DREQUESTOR_PREFIX=\"$(SUPERUSER_PACKAGE_PREFIX)\" @@ -17,3 +17,18 @@ LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin include $(BUILD_EXECUTABLE) +include $(CLEAR_VARS) +LOCAL_MODULE := install-su.sh +LOCAL_MODULE_TAGS := optional +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 := run-su-daemon.sh +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES +LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin +LOCAL_SRC_FILES := ../../../external/koush/Superuser/Superuser/assets/install-recovery.sh +include $(BUILD_PREBUILT) diff --git a/su/install-su.sh b/su/install-su.sh new file mode 100644 index 0000000..136b09e --- /dev/null +++ b/su/install-su.sh @@ -0,0 +1,26 @@ +#!/sbin/sh +cp /sbin/su.recovery /system/xbin/su +chmod 6755 /system/xbin/su +ln -sf /system/xbin/su /system/bin/su + +# if the system is at least 4.3, and there is no su daemon built in, +# let's try to install it using install-recovery.sh +BUILD_RELEASE_VERSION=$(cat /system/build.prop | grep ro\\.build\\.version\\.release) +IS_43=$(echo $BUILD_RELEASE_VERSION | grep 4\\.3) +if [ ! -z "$IS_43" ] +then + if [ -o "$IS_43" \> "4.3" -o "$IS_43" == "4.3" ] + then + # check for rom su daemon before clobbering install-recovery.sh + if [ ! -f "/system/etc/.has_su_daemon" ] + then + chattr -i /system/etc/install-recovery.sh + cp /sbin/run-su-daemon.sh /system/etc/install-recovery.sh + chmod 755 /system/etc/install-recovery.sh + # note that an post install su daemon was installed + # so recovery doesn't freak out and recommend you disable + # the install-recovery.sh execute bit. + touch /system/etc/.installed_su_daemon + fi + fi +fi @@ -81,6 +81,7 @@ static const struct { gr_surface* surface; const char *name; } BITMAPS[] = { { &gBackgroundIcon[BACKGROUND_ICON_INSTALLING], "icon_installing" }, { &gBackgroundIcon[BACKGROUND_ICON_ERROR], "icon_error" }, { &gBackgroundIcon[BACKGROUND_ICON_CLOCKWORK], "icon_clockwork" }, + { &gBackgroundIcon[BACKGROUND_ICON_CID], "icon_cid" }, { &gBackgroundIcon[BACKGROUND_ICON_FIRMWARE_INSTALLING], "icon_firmware_install" }, { &gBackgroundIcon[BACKGROUND_ICON_FIRMWARE_ERROR], "icon_firmware_error" }, { &gProgressBarEmpty, "progress_empty" }, diff --git a/utilities/Android.mk b/utilities/Android.mk index 0aa001c..49174fe 100755 --- a/utilities/Android.mk +++ b/utilities/Android.mk @@ -1,14 +1,6 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) -LOCAL_MODULE := fix_permissions -LOCAL_MODULE_TAGS := optional -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 := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES diff --git a/utilities/fix_permissions b/utilities/fix_permissions deleted file mode 100755 index a6db514..0000000 --- a/utilities/fix_permissions +++ /dev/null @@ -1,484 +0,0 @@ -#! /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] -# v2.04 - replaced /system/sd with $SD_EXT_DIRECTORY [Firerat] -VERSION="2.04" - -# 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 ) -if $TEST "$SD_EXT_DIRECTORY" = ""; then - #check for mount point, /system/sd included in tests for backward compatibility - for MP in /sd-ext /system/sd;do - if $TEST -d $MP; then - SD_EXT_DIRECTORY=$MP - break - fi - done -fi -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 " $SD_EXT_DIRECTORY " "/proc/mounts" ) -eq 0; then - $MOUNT $SD_EXT_DIRECTORY > /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 $SD_EXT_DIRECTORY > /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 |