summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbigbiff bigbiff <bigbiff@teamw.in>2019-01-09 02:06:57 +0100
committerDees Troy <dees_troy@teamw.in>2019-03-18 04:49:38 +0100
commit19874f14699edf411951a62f5ac880ca6a84d824 (patch)
tree30257d8752e5ecdc3883b7b582c93d866aa11a07
parentVibration: allow BoardConfig to disable vibration for a device. (diff)
downloadandroid_bootable_recovery-19874f14699edf411951a62f5ac880ca6a84d824.tar
android_bootable_recovery-19874f14699edf411951a62f5ac880ca6a84d824.tar.gz
android_bootable_recovery-19874f14699edf411951a62f5ac880ca6a84d824.tar.bz2
android_bootable_recovery-19874f14699edf411951a62f5ac880ca6a84d824.tar.lz
android_bootable_recovery-19874f14699edf411951a62f5ac880ca6a84d824.tar.xz
android_bootable_recovery-19874f14699edf411951a62f5ac880ca6a84d824.tar.zst
android_bootable_recovery-19874f14699edf411951a62f5ac880ca6a84d824.zip
-rwxr-xr-xdata.cpp37
-rwxr-xr-xgui/action.cpp3
-rwxr-xr-xgui/theme/common/landscape.xml19
-rwxr-xr-xgui/theme/common/languages/en.xml11
-rwxr-xr-xgui/theme/common/portrait.xml19
-rwxr-xr-xgui/theme/common/watch.xml19
-rwxr-xr-x[-rw-r--r--]openrecoveryscript.cpp21
-rwxr-xr-x[-rw-r--r--]partitionmanager.cpp31
-rwxr-xr-x[-rw-r--r--]twrp-functions.cpp105
-rwxr-xr-x[-rw-r--r--]twrp-functions.hpp5
-rwxr-xr-x[-rw-r--r--]twrp.cpp59
-rw-r--r--variables.h2
12 files changed, 218 insertions, 113 deletions
diff --git a/data.cpp b/data.cpp
index cf8349ba8..0ece4e793 100755
--- a/data.cpp
+++ b/data.cpp
@@ -1038,33 +1038,38 @@ void DataManager::Output_Version(void)
string Path;
char version[255];
- if (!PartitionManager.Mount_By_Path("/cache", false)) {
- LOGINFO("Unable to mount '%s' to write version number.\n", Path.c_str());
- return;
+ std::string cacheDir = TWFunc::get_cache_dir();
+ std::string recoveryCacheDir = cacheDir + "recovery/";
+
+ if (cacheDir == NON_AB_CACHE_DIR) {
+ if (!PartitionManager.Mount_By_Path(NON_AB_CACHE_DIR, false)) {
+ LOGINFO("Unable to mount '%s' to write version number.\n", Path.c_str());
+ return;
+ }
}
- if (!TWFunc::Path_Exists("/cache/recovery/.")) {
- LOGINFO("Recreating /cache/recovery folder.\n");
- if (mkdir("/cache/recovery", S_IRWXU | S_IRWXG | S_IWGRP | S_IXGRP) != 0) {
- LOGERR("DataManager::Output_Version -- Unable to make /cache/recovery\n");
+ if (!TWFunc::Path_Exists(recoveryCacheDir)) {
+ LOGINFO("Recreating %s folder.\n", recoveryCacheDir.c_str());
+ if (mkdir(recoveryCacheDir.c_str(), S_IRWXU | S_IRWXG | S_IWGRP | S_IXGRP) != 0) {
+ LOGERR("DataManager::Output_Version -- Unable to make %s: %s\n", recoveryCacheDir.c_str(), strerror(errno));
return;
}
}
- Path = "/cache/recovery/.version";
- if (TWFunc::Path_Exists(Path)) {
- unlink(Path.c_str());
+ std::string verPath = recoveryCacheDir + ".version";
+ if (TWFunc::Path_Exists(verPath)) {
+ unlink(verPath.c_str());
}
- FILE *fp = fopen(Path.c_str(), "w");
+ FILE *fp = fopen(verPath.c_str(), "w");
if (fp == NULL) {
- gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Path)(strerror(errno)));
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(verPath)(strerror(errno)));
return;
}
strcpy(version, TW_VERSION_STR);
fwrite(version, sizeof(version[0]), strlen(version) / sizeof(version[0]), fp);
fclose(fp);
- TWFunc::copy_file("/etc/recovery.fstab", "/cache/recovery/recovery.fstab", 0644);
+ TWFunc::copy_file("/etc/recovery.fstab", recoveryCacheDir + "recovery.fstab", 0644);
PartitionManager.Output_Storage_Fstab();
sync();
- LOGINFO("Version number saved to '%s'\n", Path.c_str());
+ LOGINFO("Version number saved to '%s'\n", verPath.c_str());
#endif
}
@@ -1077,10 +1082,6 @@ void DataManager::ReadSettingsFile(void)
GetValue(TW_IS_ENCRYPTED, is_enc);
GetValue(TW_HAS_DATA_MEDIA, has_data_media);
- if (is_enc == 1 && has_data_media == 1) {
- LOGINFO("Cannot load settings -- encrypted.\n");
- return;
- }
memset(mkdir_path, 0, sizeof(mkdir_path));
memset(settings_file, 0, sizeof(settings_file));
diff --git a/gui/action.cpp b/gui/action.cpp
index 11d9580fb..4b644a9b4 100755
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -490,6 +490,8 @@ void GUIAction::operation_start(const string operation_name)
DataManager::SetValue("tw_operation", operation_name);
DataManager::SetValue("tw_operation_state", 0);
DataManager::SetValue("tw_operation_status", 0);
+ bool tw_ab_device = TWFunc::get_cache_dir() != NON_AB_CACHE_DIR;
+ DataManager::SetValue("tw_ab_device", tw_ab_device);
}
void GUIAction::operation_end(const int operation_status)
@@ -1059,7 +1061,6 @@ int GUIAction::wipe(std::string arg)
{
operation_start("Format");
DataManager::SetValue("tw_partition", arg);
-
int ret_val = false;
if (simulate) {
diff --git a/gui/theme/common/landscape.xml b/gui/theme/common/landscape.xml
index f6f14bc51..d1bce168d 100755
--- a/gui/theme/common/landscape.xml
+++ b/gui/theme/common/landscape.xml
@@ -527,8 +527,9 @@
<template name="console"/>
<button style="main_button_half_width">
+ <condition var1="tw_ab_device" var2="0"/>
<placement x="%col2_x_left%" y="%row15a_y%"/>
- <text>{@wipe_cache_dalvik_btn=Wipe cache/dalvik}</text>
+ <text>{@wipe_cache_dalvik_btn=Wipe Cache/Dalvik}</text>
<actions>
<action function="set">tw_back=flash_done</action>
<action function="set">tw_action=wipe</action>
@@ -545,6 +546,22 @@
</button>
<button style="main_button_half_width">
+ <condition var1="tw_ab_device" var2="1"/>
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@wipe_dalvik_btn=Wipe Dalvik}</text>
+ <actions>
+ <action function="set">tw_back=flash_done</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=dalvik</action>
+ <action function="set">tw_text1={@wipe_dalvik_confirm=Wipe Dalvik?}</action>
+ <action function="set">tw_action_text1={@wiping_cache_dalvik=Wiping Dalvik...}</action>
+ <action function="set">tw_complete_text1={@wipe_dalvik_complete=Dalvik Wipe Complete}</action>
+ <action function="set">tw_slider_text={@swipe_wipe=Swipe to Wipe}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_width">
<placement x="%center_x%" y="%row15a_y%"/>
<text>{@reboot_system_btn=Reboot System}</text>
<actions>
diff --git a/gui/theme/common/languages/en.xml b/gui/theme/common/languages/en.xml
index 03d4e084c..f8de66221 100755
--- a/gui/theme/common/languages/en.xml
+++ b/gui/theme/common/languages/en.xml
@@ -98,7 +98,8 @@
<string name="successful">Successful</string>
<string name="install_failed">Installation Failed</string>
<string name="install_successful">Installation Successful</string>
- <string name="wipe_cache_dalvik_btn">Wipe cache/dalvik</string>
+ <string name="wipe_cache_dalvik_btn">Wipe Cache/Dalvik</string>
+ <string name="wipe_dalvik_btn">Wipe Dalvik</string>
<string name="reboot_system_btn">Reboot System</string>
<string name="install_sel_target">Select Target Partition</string>
<string name="flash_image_select">Select Partition to Flash Image:</string>
@@ -106,8 +107,11 @@
<string name="flashing_image">Flashing Image...</string>
<string name="image_flashed">Image Flashed</string>
<string name="wipe_cache_dalvik_confirm">Wipe Cache &amp; Dalvik?</string>
+ <string name="wipe_dalvik_confirm">Wipe Dalvik?</string>
<string name="wiping_cache_dalvik">Wiping Cache &amp; Dalvik...</string>
+ <string name="wiping_dalvik">Wiping Dalvik...</string>
<string name="wipe_cache_dalvik_complete">Cache &amp; Dalvik Wipe Complete</string>
+ <string name="wipe_dalvik_complete">Dalvik Wipe Complete</string>
<string name="swipe_wipe">Swipe to Wipe</string>
<string name="swipe_wipe_s"> Wipe</string>
<string name="no_os1">No OS Installed! Are you</string>
@@ -532,9 +536,10 @@
<string name="unable_find_part_path">Unable to find partition for path '{1}'</string>
<string name="update_part_details">Updating partition details...</string>
<string name="update_part_details_done">...done</string>
- <string name="wiping_dalvik">Wiping Dalvik Cache Directories...</string>
+ <string name="wiping_dalvik">Wiping Dalvik Directories...</string>
<string name="cleaned">Cleaned: {1}...</string>
- <string name="dalvik_done">-- Dalvik Cache Directories Wipe Complete!</string>
+ <string name="cache_dalvik_done">-- Dalvik Cache Directories Wipe Complete!</string>
+ <string name="dalvik_done">-- Dalvik Directory Wipe Complete!</string>
<string name="no_andsec">No android secure partitions found.</string>
<string name="unable_to_locate">Unable to locate {1}.</string>
<string name="wiping_datamedia">Wiping internal storage -- /data/media...</string>
diff --git a/gui/theme/common/portrait.xml b/gui/theme/common/portrait.xml
index 09b7c6b70..1cf4d8980 100755
--- a/gui/theme/common/portrait.xml
+++ b/gui/theme/common/portrait.xml
@@ -479,8 +479,9 @@
<template name="console"/>
<button style="main_button_half_height">
+ <condition var1="tw_ab_device" var2="0"/>
<placement x="%indent%" y="%row21a_y%"/>
- <text>{@wipe_cache_dalvik_btn=Wipe cache/dalvik}</text>
+ <text>{@wipe_cache_dalvik_btn=Wipe Cache/Dalvik}</text>
<actions>
<action function="set">tw_back=flash_done</action>
<action function="set">tw_action=wipe</action>
@@ -497,6 +498,22 @@
</button>
<button style="main_button_half_height">
+ <condition var1="tw_ab_device" var2="1"/>
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@wipe_dalvik_btn=Wipe Dalvik}</text>
+ <actions>
+ <action function="set">tw_back=flash_done</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=dalvik</action>
+ <action function="set">tw_text1={@wipe_dalvik_confirm=Wipe Dalvik?}</action>
+ <action function="set">tw_action_text1={@wiping_cache_dalvik=Wiping Dalvik...}</action>
+ <action function="set">tw_complete_text1={@wipe_dalvik_complete=Dalvik Wipe Complete}</action>
+ <action function="set">tw_slider_text={@swipe_wipe=Swipe to Wipe}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
<placement x="%center_x%" y="%row21a_y%"/>
<text>{@reboot_system_btn=Reboot System}</text>
<actions>
diff --git a/gui/theme/common/watch.xml b/gui/theme/common/watch.xml
index d36bb2d5a..56bdc5534 100755
--- a/gui/theme/common/watch.xml
+++ b/gui/theme/common/watch.xml
@@ -706,6 +706,7 @@
<template name="console"/>
<button style="main_button_half_height">
+ <condition var1="tw_ab_device" var2="0"/>
<placement x="%col1_x_left%" y="%row13_y%"/>
<text>{@wipe_cache_dalvik_btn=Wipe cache/dalvik}</text>
<actions>
@@ -718,7 +719,23 @@
<action function="set">tw_text1={@wipe_cache_dalvik_confirm=Wipe Cache &amp; Dalvik?}</action>
<action function="set">tw_action_text1={@wiping_cache_dalvik=Wiping Cache &amp; Dalvik...}</action>
<action function="set">tw_complete_text1={@wipe_cache_dalvik_complete=Cache &amp; Dalvik Wipe Complete}</action>
- <action function="set">tw_slider_text={@swipe_wipe_s= Wipe}</action>
+ <action function="set">tw_slider_text={@swipe_wipe=Swipe to Wipe}</action>
+ <action function="page">confirm_action</action>
+ </actions>
+ </button>
+
+ <button style="main_button_half_height">
+ <condition var1="tw_ab_device" var2="1"/>
+ <placement x="%indent%" y="%row21a_y%"/>
+ <text>{@wipe_dalvik_btn=Wipe Dalvik}</text>
+ <actions>
+ <action function="set">tw_back=flash_done</action>
+ <action function="set">tw_action=wipe</action>
+ <action function="set">tw_action_param=dalvik</action>
+ <action function="set">tw_text1={@wipe_dalvik_confirm=Wipe Dalvik?}</action>
+ <action function="set">tw_action_text1={@wiping_cache_dalvik=Wiping Dalvik...}</action>
+ <action function="set">tw_complete_text1={@wipe_dalvik_complete=Dalvik Wipe Complete}</action>
+ <action function="set">tw_slider_text={@swipe_wipe=Swipe to Wipe}</action>
<action function="page">confirm_action</action>
</actions>
</button>
diff --git a/openrecoveryscript.cpp b/openrecoveryscript.cpp
index 86c90a662..d4d4da514 100644..100755
--- a/openrecoveryscript.cpp
+++ b/openrecoveryscript.cpp
@@ -62,17 +62,18 @@ OpenRecoveryScript::VoidFunction OpenRecoveryScript::call_after_cli_command;
#define SCRIPT_COMMAND_SIZE 512
int OpenRecoveryScript::check_for_script_file(void) {
- if (!PartitionManager.Mount_By_Path(SCRIPT_FILE_CACHE, false)) {
- LOGINFO("Unable to mount /cache for OpenRecoveryScript support.\n");
- gui_msg(Msg(msg::kError, "unable_to_mount=Unable to mount {1}")(SCRIPT_FILE_CACHE));
+ std::string orsFile = TWFunc::get_cache_dir() + "/recovery/openrecoveryscript";
+ if (!PartitionManager.Mount_By_Path(orsFile, false)) {
+ LOGINFO("Unable to mount %s for OpenRecoveryScript support.\n", TWFunc::get_cache_dir().c_str());
+ gui_msg(Msg(msg::kError, "unable_to_mount=Unable to mount {1}")(TWFunc::get_cache_dir()));
return 0;
}
- if (TWFunc::Path_Exists(SCRIPT_FILE_CACHE)) {
- LOGINFO("Script file found: '%s'\n", SCRIPT_FILE_CACHE);
+ if (TWFunc::Path_Exists(orsFile)) {
+ LOGINFO("Script file found: '%s'\n", orsFile.c_str());
// Copy script file to /tmp
- TWFunc::copy_file(SCRIPT_FILE_CACHE, SCRIPT_FILE_TMP, 0755);
- // Delete the file from /cache
- unlink(SCRIPT_FILE_CACHE);
+ TWFunc::copy_file(orsFile, SCRIPT_FILE_TMP, 0755);
+ // Delete the file from cache
+ unlink(orsFile.c_str());
return 1;
}
return 0;
@@ -655,6 +656,10 @@ void OpenRecoveryScript::Run_CLI_Command(const char* command) {
gui_msg("decrypt_cmd=Attempting to decrypt data partition via command line.");
if (PartitionManager.Decrypt_Device(pass) == 0) {
// set_page_done = 1; // done by singleaction_page anyway
+ std::string orsFile = TWFunc::get_cache_dir() + "/openrecoveryscript";
+ if (TWFunc::Path_Exists(orsFile)) {
+ Run_OpenRecoveryScript_Action();
+ }
}
} else if (OpenRecoveryScript::Insert_ORS_Command(command)) {
OpenRecoveryScript::run_script_file();
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index 45460d1dc..b8a95ff26 100644..100755
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -1343,9 +1343,14 @@ int TWPartitionManager::Wipe_Dalvik_Cache(void) {
return false;
dir.push_back("/data/dalvik-cache");
- if (Mount_By_Path("/cache", false)) {
- dir.push_back("/cache/dalvik-cache");
- dir.push_back("/cache/dc");
+
+ std::string cacheDir = TWFunc::get_cache_dir();
+ if (cacheDir == NON_AB_CACHE_DIR) {
+ if (!PartitionManager.Mount_By_Path(NON_AB_CACHE_DIR, false)) {
+ LOGINFO("Unable to mount %s for wiping cache.\n", NON_AB_CACHE_DIR);
+ }
+ dir.push_back(cacheDir + "dalvik-cache");
+ dir.push_back(cacheDir + "/dc");
}
TWPartition* sdext = Find_Partition_By_Path("/sd-ext");
@@ -1357,14 +1362,24 @@ int TWPartitionManager::Wipe_Dalvik_Cache(void) {
}
}
- gui_msg("wiping_dalvik=Wiping Dalvik Cache Directories...");
+ if (cacheDir == NON_AB_CACHE_DIR) {
+ gui_msg("wiping_cache_dalvik=Wiping Dalvik Cache Directories...");
+ } else {
+ gui_msg("wiping_dalvik=Wiping Dalvik Directory...");
+ }
for (unsigned i = 0; i < dir.size(); ++i) {
if (stat(dir.at(i).c_str(), &st) == 0) {
TWFunc::removeDir(dir.at(i), false);
gui_msg(Msg("cleaned=Cleaned: {1}...")(dir.at(i)));
}
}
- gui_msg("dalvik_done=-- Dalvik Cache Directories Wipe Complete!");
+
+ if (cacheDir == NON_AB_CACHE_DIR) {
+ gui_msg("cache_dalvik_done=-- Dalvik Cache Directories Wipe Complete!");
+ } else {
+ gui_msg("dalvik_done=-- Dalvik Directory Wipe Complete!");
+ }
+
return true;
}
@@ -2194,10 +2209,12 @@ void TWPartitionManager::Output_Storage_Fstab(void) {
std::vector<TWPartition*>::iterator iter;
char storage_partition[255];
string Temp;
- FILE *fp = fopen("/cache/recovery/storage.fstab", "w");
+
+ std::string storageFstab = TWFunc::get_cache_dir() + "recovery/storage.fstab";
+ FILE *fp = fopen(storageFstab.c_str(), "w");
if (fp == NULL) {
- gui_msg(Msg(msg::kError, "unable_to_open=Unable to open '{1}'.")("/cache/recovery/storage.fstab"));
+ gui_msg(Msg(msg::kError, "unable_to_open=Unable to open '{1}'.")(storageFstab));
return;
}
diff --git a/twrp-functions.cpp b/twrp-functions.cpp
index 00a57a749..37dd0df48 100644..100755
--- a/twrp-functions.cpp
+++ b/twrp-functions.cpp
@@ -37,6 +37,7 @@
#include <sstream>
#include <cctype>
#include <algorithm>
+#include <selinux/label.h>
#include "twrp-functions.hpp"
#include "twcommon.h"
#include "gui/gui.hpp"
@@ -58,6 +59,8 @@ extern "C" {
#include "libcrecovery/common.h"
}
+struct selabel_handle *selinux_handle;
+
/* Execute a command */
int TWFunc::Exec_Cmd(const string& cmd, string &result) {
FILE* exec;
@@ -520,28 +523,29 @@ void TWFunc::Copy_Log(string Source, string Destination) {
}
void TWFunc::Update_Log_File(void) {
- // Copy logs to cache so the system can find out what happened.
- if (PartitionManager.Mount_By_Path("/cache", false)) {
- if (!TWFunc::Path_Exists("/cache/recovery/.")) {
- LOGINFO("Recreating /cache/recovery folder.\n");
- if (mkdir("/cache/recovery", S_IRWXU | S_IRWXG | S_IWGRP | S_IXGRP) != 0)
- LOGINFO("Unable to create /cache/recovery folder.\n");
+ std::string recoveryDir = get_cache_dir() + "recovery/";
+
+ if (get_cache_dir() == NON_AB_CACHE_DIR) {
+ if (!PartitionManager.Mount_By_Path(NON_AB_CACHE_DIR, false)) {
+ LOGINFO("Failed to mount %s for TWFunc::Update_Log_File\n", NON_AB_CACHE_DIR);
}
- Copy_Log(TMP_LOG_FILE, "/cache/recovery/log");
- copy_file("/cache/recovery/log", "/cache/recovery/last_log", 600);
- chown("/cache/recovery/log", 1000, 1000);
- chmod("/cache/recovery/log", 0600);
- chmod("/cache/recovery/last_log", 0640);
- } else if (PartitionManager.Mount_By_Path("/data", false) && TWFunc::Path_Exists("/data/cache/recovery/.")) {
- Copy_Log(TMP_LOG_FILE, "/data/cache/recovery/log");
- copy_file("/data/cache/recovery/log", "/data/cache/recovery/last_log", 600);
- chown("/data/cache/recovery/log", 1000, 1000);
- chmod("/data/cache/recovery/log", 0600);
- chmod("/data/cache/recovery/last_log", 0640);
- } else {
- LOGINFO("Failed to mount /cache or find /data/cache for TWFunc::Update_Log_File\n");
}
+ if (!TWFunc::Path_Exists(recoveryDir)) {
+ LOGINFO("Recreating %s folder.\n", recoveryDir.c_str());
+ if (mkdir(recoveryDir.c_str(), S_IRWXU | S_IRWXG | S_IWGRP | S_IXGRP) != 0) {
+ LOGINFO("Unable to create %s folder.\n", recoveryDir.c_str());
+ }
+ }
+
+ std::string logCopy = recoveryDir + "log";
+ std::string lastLogCopy = recoveryDir + "last_log";
+ copy_file(logCopy, lastLogCopy, 600);
+ Copy_Log(TMP_LOG_FILE, logCopy);
+ chown(logCopy.c_str(), 1000, 1000);
+ chmod(logCopy.c_str(), 0600);
+ chmod(lastLogCopy.c_str(), 0640);
+
// Reset bootloader message
TWPartition* Part = PartitionManager.Find_Partition_By_Path("/misc");
if (Part != NULL) {
@@ -555,12 +559,13 @@ void TWFunc::Update_Log_File(void) {
}
}
- if (PartitionManager.Mount_By_Path("/cache", false)) {
- if (unlink("/cache/recovery/command") && errno != ENOENT) {
- LOGINFO("Can't unlink %s\n", "/cache/recovery/command");
+ if (get_cache_dir() == NON_AB_CACHE_DIR) {
+ if (PartitionManager.Mount_By_Path("/cache", false)) {
+ if (unlink("/cache/recovery/command") && errno != ENOENT) {
+ LOGINFO("Can't unlink %s\n", "/cache/recovery/command");
+ }
}
}
-
sync();
}
@@ -1154,4 +1159,58 @@ int TWFunc::stream_adb_backup(string &Restore_Name) {
return -1;
return ret;
}
+
+std::string TWFunc::get_cache_dir() {
+ if (PartitionManager.Find_Partition_By_Path(NON_AB_CACHE_DIR) == NULL) {
+ return AB_CACHE_DIR;
+ }
+ else {
+ return NON_AB_CACHE_DIR;
+ }
+}
+
+void TWFunc::check_selinux_support() {
+ if (TWFunc::Path_Exists("/prebuilt_file_contexts")) {
+ if (TWFunc::Path_Exists("/file_contexts")) {
+ printf("Renaming regular /file_contexts -> /file_contexts.bak\n");
+ rename("/file_contexts", "/file_contexts.bak");
+ }
+ printf("Moving /prebuilt_file_contexts -> /file_contexts\n");
+ rename("/prebuilt_file_contexts", "/file_contexts");
+ }
+ struct selinux_opt selinux_options[] = {
+ { SELABEL_OPT_PATH, "/file_contexts" }
+ };
+ selinux_handle = selabel_open(SELABEL_CTX_FILE, selinux_options, 1);
+ if (!selinux_handle)
+ printf("No file contexts for SELinux\n");
+ else
+ printf("SELinux contexts loaded from /file_contexts\n");
+ { // Check to ensure SELinux can be supported by the kernel
+ char *contexts = NULL;
+ std::string cacheDir = TWFunc::get_cache_dir();
+ std::string se_context_check = cacheDir + "recovery/";
+ int ret = 0;
+
+ if (cacheDir == NON_AB_CACHE_DIR) {
+ PartitionManager.Mount_By_Path(NON_AB_CACHE_DIR, false);
+ }
+ if (TWFunc::Path_Exists(se_context_check)) {
+ ret = lgetfilecon(se_context_check.c_str(), &contexts);
+ if (ret > 0) {
+ lsetfilecon(se_context_check.c_str(), "test");
+ lgetfilecon(se_context_check.c_str(), &contexts);
+ } else {
+ LOGINFO("Could not check %s SELinux contexts, using /sbin/teamwin instead which may be inaccurate.\n", se_context_check.c_str());
+ lgetfilecon("/sbin/teamwin", &contexts);
+ }
+ }
+ if (ret < 0) {
+ gui_warn("no_kernel_selinux=Kernel does not have support for reading SELinux contexts.");
+ } else {
+ free(contexts);
+ gui_msg("full_selinux=Full SELinux support is present.");
+ }
+ }
+}
#endif // ndef BUILD_TWRPTAR_MAIN
diff --git a/twrp-functions.hpp b/twrp-functions.hpp
index 0efbdc947..7847aed4a 100644..100755
--- a/twrp-functions.hpp
+++ b/twrp-functions.hpp
@@ -26,6 +26,9 @@
using namespace std;
+#define NON_AB_CACHE_DIR "/cache/"
+#define AB_CACHE_DIR "/data/cache/"
+
typedef enum
{
rb_current = 0,
@@ -99,6 +102,8 @@ public:
static void copy_kernel_log(string curr_storage); // Copy Kernel Log to Current Storage (PSTORE/KMSG)
static bool isNumber(string strtocheck); // return true if number, false if not a number
static int stream_adb_backup(string &Restore_Name); // Tell ADB Backup to Stream to TWRP from GUI selection
+ static std::string get_cache_dir(); // return the cache partition existence
+ static void check_selinux_support(); // print whether selinux support is enabled to console
private:
static void Copy_Log(string Source, string Destination);
diff --git a/twrp.cpp b/twrp.cpp
index 2399c0bb3..6b9cd7552 100644..100755
--- a/twrp.cpp
+++ b/twrp.cpp
@@ -54,9 +54,6 @@ extern "C" {
}
#endif
-#include <selinux/label.h>
-struct selabel_handle *selinux_handle;
-
//extern int adb_server_main(int is_daemon, int server_port, int /* reply_fd */);
TWPartitionManager PartitionManager;
@@ -129,45 +126,6 @@ int main(int argc, char **argv) {
// Load up all the resources
gui_loadResources();
- if (TWFunc::Path_Exists("/prebuilt_file_contexts")) {
- if (TWFunc::Path_Exists("/file_contexts")) {
- printf("Renaming regular /file_contexts -> /file_contexts.bak\n");
- rename("/file_contexts", "/file_contexts.bak");
- }
- printf("Moving /prebuilt_file_contexts -> /file_contexts\n");
- rename("/prebuilt_file_contexts", "/file_contexts");
- }
- struct selinux_opt selinux_options[] = {
- { SELABEL_OPT_PATH, "/file_contexts" }
- };
- selinux_handle = selabel_open(SELABEL_CTX_FILE, selinux_options, 1);
- if (!selinux_handle)
- printf("No file contexts for SELinux\n");
- else
- printf("SELinux contexts loaded from /file_contexts\n");
- { // Check to ensure SELinux can be supported by the kernel
- char *contexts = NULL;
-
- if (PartitionManager.Mount_By_Path("/cache", false) && TWFunc::Path_Exists("/cache/recovery")) {
- lgetfilecon("/cache/recovery", &contexts);
- if (!contexts) {
- lsetfilecon("/cache/recovery", "test");
- lgetfilecon("/cache/recovery", &contexts);
- }
- } else {
- LOGINFO("Could not check /cache/recovery SELinux contexts, using /sbin/teamwin instead which may be inaccurate.\n");
- lgetfilecon("/sbin/teamwin", &contexts);
- }
- if (!contexts) {
- gui_warn("no_kernel_selinux=Kernel does not have support for reading SELinux contexts.");
- } else {
- free(contexts);
- gui_msg("full_selinux=Full SELinux support is present.");
- }
- }
-
- PartitionManager.Mount_By_Path("/cache", false);
-
bool Shutdown = false;
bool SkipDecryption = false;
string Send_Intent = "";
@@ -272,7 +230,6 @@ int main(int argc, char **argv) {
LOGINFO("Backup of TWRP ramdisk done.\n");
#endif
- TWFunc::Update_Log_File();
// Offer to decrypt if the device is encrypted
if (DataManager::GetIntValue(TW_IS_ENCRYPTED) != 0) {
if (SkipDecryption) {
@@ -283,10 +240,12 @@ int main(int argc, char **argv) {
LOGERR("Failed to start decrypt GUI page.\n");
} else {
// Check for and load custom theme if present
+ TWFunc::check_selinux_support();
gui_loadCustomResources();
}
}
} else if (datamedia) {
+ TWFunc::check_selinux_support();
if (tw_get_default_metadata(DataManager::GetSettingsStoragePath().c_str()) != 0) {
LOGINFO("Failed to get default contexts and file mode for storage files.\n");
} else {
@@ -294,17 +253,20 @@ int main(int argc, char **argv) {
}
}
+ // Fixup the RTC clock on devices which require it
+ if (crash_counter == 0)
+ TWFunc::Fixup_Time_On_Boot();
+
// Read the settings file
+ TWFunc::Update_Log_File();
DataManager::ReadSettingsFile();
PageManager::LoadLanguage(DataManager::GetStrValue("tw_language"));
GUIConsole::Translate_Now();
- // Fixup the RTC clock on devices which require it
- if (crash_counter == 0)
- TWFunc::Fixup_Time_On_Boot();
-
// Run any outstanding OpenRecoveryScript
- if ((DataManager::GetIntValue(TW_IS_ENCRYPTED) == 0 || SkipDecryption) && (TWFunc::Path_Exists(SCRIPT_FILE_TMP) || TWFunc::Path_Exists(SCRIPT_FILE_CACHE))) {
+ std::string cacheDir = TWFunc::get_cache_dir();
+ std::string orsFile = cacheDir + "/recovery/openrecoveryscript";
+ if ((DataManager::GetIntValue(TW_IS_ENCRYPTED) == 0 || SkipDecryption) && (TWFunc::Path_Exists(SCRIPT_FILE_TMP) || TWFunc::Path_Exists(orsFile))) {
OpenRecoveryScript::Run_OpenRecoveryScript();
}
@@ -388,3 +350,4 @@ int main(int argc, char **argv) {
return 0;
}
+
diff --git a/variables.h b/variables.h
index 53529f190..22eb5c94d 100644
--- a/variables.h
+++ b/variables.h
@@ -160,8 +160,6 @@
#define CUSTOM_LUN_FILE "/sys/class/android_usb/android0/f_mass_storage/lun%d/file"
#endif
-// For OpenRecoveryScript
-#define SCRIPT_FILE_CACHE "/cache/recovery/openrecoveryscript"
#define SCRIPT_FILE_TMP "/tmp/openrecoveryscript"
#define TMP_LOG_FILE "/tmp/recovery.log"