Fix ext storage and zip paths

Fix a bug with handling external storage during boot.
Check zip root path when switching storage and ensure that the
path is in the new storage path to prevent user confusion.
diff --git a/data.cpp b/data.cpp
index 505a3a1..2129364 100644
--- a/data.cpp
+++ b/data.cpp
@@ -840,11 +840,15 @@
 	GetValue(TW_HAS_EXTERNAL, has_ext);
 	if (has_dual != 0 && use_ext == 1) {
 		// Attempt to sdcard using external storage
-		if (PartitionManager.Mount_Current_Storage(false)) {
+		if (!PartitionManager.Mount_Current_Storage(false)) {
 			LOGE("Failed to mount external storage, using internal storage.\n");
 			// Remount failed, default back to internal storage
 			SetValue(TW_USE_EXTERNAL_STORAGE, 0);
 			PartitionManager.Mount_Current_Storage(true);
+			string int_zip_path;
+			GetValue(TW_ZIP_INTERNAL_VAR, int_zip_path);
+			SetValue(TW_USE_EXTERNAL_STORAGE, 0);
+			SetValue(TW_ZIP_LOCATION_VAR, int_zip_path);
 		}
 	} else {
 		PartitionManager.Mount_Current_Storage(true);
diff --git a/gui/Android.mk b/gui/Android.mk
index a19a63e..86d7453 100644
--- a/gui/Android.mk
+++ b/gui/Android.mk
@@ -43,6 +43,9 @@
 ifneq ($(RECOVERY_SDCARD_ON_DATA),)
 	LOCAL_CFLAGS += -DRECOVERY_SDCARD_ON_DATA
 endif
+ifneq ($(TW_EXTERNAL_STORAGE_PATH),)
+	LOCAL_CFLAGS += -DTW_EXTERNAL_STORAGE_PATH=$(TW_EXTERNAL_STORAGE_PATH)
+endif
 
 LOCAL_C_INCLUDES += bionic external/stlport/stlport $(commands_recovery_local_path)/gui/devices/$(DEVICE_RESOLUTION)
 
diff --git a/gui/action.cpp b/gui/action.cpp
index 15180ca..bbcca23 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -540,11 +540,37 @@
 		}
 		if (PartitionManager.Mount_Current_Storage(true)) {
 			if (arg == "internal") {
+				string zip_path, zip_root;
+				DataManager::GetValue(TW_ZIP_INTERNAL_VAR, zip_path);
+				zip_root = TWFunc::Get_Root_Path(zip_path);
+#ifdef RECOVERY_SDCARD_ON_DATA
+	#ifndef TW_EXTERNAL_STORAGE_PATH
+				if (zip_root != "/sdcard")
+					DataManager::SetValue(TW_ZIP_INTERNAL_VAR, "/sdcard");
+	#else
+				if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
+					if (zip_root != "/emmc")
+						DataManager::SetValue(TW_ZIP_INTERNAL_VAR, "/emmc");
+				} else {
+					if (zip_root != "/sdcard")
+						DataManager::SetValue(TW_ZIP_INTERNAL_VAR, "/sdcard");
+				}
+	#endif
+#else
+				if (zip_root != DataManager::GetCurrentStoragePath())
+					DataManager::SetValue(TW_ZIP_LOCATION_VAR, DataManager::GetCurrentStoragePath());
+#endif
 				// Save the current zip location to the external variable
 				DataManager::SetValue(TW_ZIP_EXTERNAL_VAR, DataManager::GetStrValue(TW_ZIP_LOCATION_VAR));
 				// Change the current zip location to the internal variable
 				DataManager::SetValue(TW_ZIP_LOCATION_VAR, DataManager::GetStrValue(TW_ZIP_INTERNAL_VAR));
 			} else if (arg == "external") {
+				string zip_path, zip_root;
+				DataManager::GetValue(TW_ZIP_EXTERNAL_VAR, zip_path);
+				zip_root = TWFunc::Get_Root_Path(zip_path);
+				if (zip_root != DataManager::GetCurrentStoragePath()) {
+					DataManager::SetValue(TW_ZIP_EXTERNAL_VAR, DataManager::GetCurrentStoragePath());
+				}
 				// Save the current zip location to the internal variable
 				DataManager::SetValue(TW_ZIP_INTERNAL_VAR, DataManager::GetStrValue(TW_ZIP_LOCATION_VAR));
 				// Change the current zip location to the external variable