aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk2
-rw-r--r--common.h1
-rw-r--r--extendedcommands.c79
-rw-r--r--recovery.c76
-rw-r--r--recovery_ui.h4
-rw-r--r--res/images/icon_cid.pngbin0 -> 36007 bytes
-rw-r--r--su/Android.mk17
-rw-r--r--su/install-su.sh26
-rw-r--r--ui.c1
-rwxr-xr-xutilities/Android.mk8
-rwxr-xr-xutilities/fix_permissions484
11 files changed, 137 insertions, 561 deletions
diff --git a/Android.mk b/Android.mk
index 2e0966f..8c79b7c 100644
--- a/Android.mk
+++ b/Android.mk
@@ -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
diff --git a/common.h b/common.h
index 7580f32..bf81b48 100644
--- a/common.h
+++ b/common.h
@@ -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");
}
}
diff --git a/recovery.c b/recovery.c
index 8cfaa73..60eb224 100644
--- a/recovery.c
+++ b/recovery.c
@@ -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
new file mode 100644
index 0000000..167ee38
--- /dev/null
+++ b/res/images/icon_cid.png
Binary files differ
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
diff --git a/ui.c b/ui.c
index 6546b79..20f5223 100644
--- a/ui.c
+++ b/ui.c
@@ -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