Fix special partition handling
diff --git a/crypto/ics/cryptfs.c b/crypto/ics/cryptfs.c
index 0540366..5751cf7 100644
--- a/crypto/ics/cryptfs.c
+++ b/crypto/ics/cryptfs.c
@@ -239,7 +239,7 @@
   if (!strcmp(key_loc, KEY_IN_FOOTER)) {
     fname = real_blk_name;
     if ( (fd = open(fname, O_RDONLY)) < 0) {
-      ui_print("Cannot open real block device %s\n", fname);
+      printf("Cannot open real block device %s\n", fname);
       return -1;
     }
 
@@ -255,45 +255,45 @@
     off = ((off64_t)nr_sec * 512) - CRYPT_FOOTER_OFFSET;
 
     if (lseek64(fd, off, SEEK_SET) == -1) {
-      ui_print("Cannot seek to real block device footer\n");
+      printf("Cannot seek to real block device footer\n");
       goto errout;
     }
   } else if (key_loc[0] == '/') {
     fname = key_loc;
     if ( (fd = open(fname, O_RDONLY)) < 0) {
-      ui_print("Cannot open footer file %s\n", fname);
+      printf("Cannot open footer file %s\n", fname);
       return -1;
     }
 
     /* Make sure it's 16 Kbytes in length */
     fstat(fd, &statbuf);
     if (S_ISREG(statbuf.st_mode) && (statbuf.st_size != 0x4000)) {
-      ui_print("footer file %s is not the expected size!\n", fname);
+      printf("footer file %s is not the expected size!\n", fname);
       goto errout;
     }
   } else {
-    ui_print("Unexpected value for" KEY_LOC_PROP "\n");
+    printf("Unexpected value for" KEY_LOC_PROP "\n");
     return -1;;
   }
 
   if ( (cnt = read(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
-    ui_print("Cannot read real block device footer\n");
+    printf("Cannot read real block device footer\n");
     goto errout;
   }
 
   if (crypt_ftr->magic != CRYPT_MNT_MAGIC) {
-    ui_print("Bad magic for real block device %s\n", fname);
+    printf("Bad magic for real block device %s\n", fname);
     goto errout;
   }
 
   if (crypt_ftr->major_version != 1) {
-    ui_print("Cannot understand major version %d real block device footer\n",
+    printf("Cannot understand major version %d real block device footer\n",
           crypt_ftr->major_version);
     goto errout;
   }
 
   if (crypt_ftr->minor_version != 0) {
-    ui_print("Warning: crypto footer minor version %d, expected 0, continuing...\n",
+    printf("Warning: crypto footer minor version %d, expected 0, continuing...\n",
           crypt_ftr->minor_version);
   }
 
@@ -302,29 +302,29 @@
      * Skip to it's stated end so we can read the key.
      */
     if (lseek(fd, crypt_ftr->ftr_size - sizeof(struct crypt_mnt_ftr),  SEEK_CUR) == -1) {
-      ui_print("Cannot seek to start of key\n");
+      printf("Cannot seek to start of key\n");
       goto errout;
     }
   }
 
   if (crypt_ftr->keysize != KEY_LEN_BYTES) {
-    ui_print("Keysize of %d bits not supported for real block device %s\n",
+    printf("Keysize of %d bits not supported for real block device %s\n",
           crypt_ftr->keysize * 8, fname);
     goto errout;
   }
 
   if ( (cnt = read(fd, key, crypt_ftr->keysize)) != crypt_ftr->keysize) {
-    ui_print("Cannot read key for real block device %s\n", fname);
+    printf("Cannot read key for real block device %s\n", fname);
     goto errout;
   }
 
   if (lseek64(fd, KEY_TO_SALT_PADDING, SEEK_CUR) == -1) {
-    ui_print("Cannot seek to real block device salt\n");
+    printf("Cannot seek to real block device salt\n");
     goto errout;
   }
 
   if ( (cnt = read(fd, salt, SALT_LEN)) != SALT_LEN) {
-    ui_print("Cannot read salt for real block device %s\n", fname);
+    printf("Cannot read salt for real block device %s\n", fname);
     goto errout;
   }
 
@@ -372,7 +372,7 @@
   int retval = -1;
 
   if ((fd = open("/dev/device-mapper", O_RDWR)) < 0 ) {
-    ui_print("Cannot open device-mapper\n");
+    printf("Cannot open device-mapper\n");
     goto errout;
   }
 
@@ -380,14 +380,14 @@
 
   ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
   if (ioctl(fd, DM_DEV_CREATE, io)) {
-    ui_print("Cannot create dm-crypt device\n");
+    printf("Cannot create dm-crypt device\n");
     goto errout;
   }
 
   /* Get the device status, in particular, the name of it's device file */
   ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
   if (ioctl(fd, DM_DEV_STATUS, io)) {
-    ui_print("Cannot retrieve dm-crypt device status\n");
+    printf("Cannot retrieve dm-crypt device status\n");
     goto errout;
   }
   minor = (io->dev & 0xff) | ((io->dev >> 12) & 0xfff00);
@@ -412,7 +412,7 @@
   tgt->next = crypt_params - buffer;
 
   if (ioctl(fd, DM_TABLE_LOAD, io)) {
-      ui_print("Cannot load dm-crypt mapping table.\n");
+      printf("Cannot load dm-crypt mapping table.\n");
       goto errout;
   }
 
@@ -420,7 +420,7 @@
   ioctl_init(io, 4096, name, 0);
 
   if (ioctl(fd, DM_DEV_SUSPEND, io)) {
-    ui_print("Cannot resume the dm-crypt device\n");
+    printf("Cannot resume the dm-crypt device\n");
     goto errout;
   }
 
@@ -441,7 +441,7 @@
   int retval = -1;
 
   if ((fd = open("/dev/device-mapper", O_RDWR)) < 0 ) {
-    ui_print("Cannot open device-mapper\n");
+    printf("Cannot open device-mapper\n");
     goto errout;
   }
 
@@ -449,7 +449,7 @@
 
   ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
   if (ioctl(fd, DM_DEV_REMOVE, io)) {
-    ui_print("Cannot remove dm-crypt device\n");
+    printf("Cannot remove dm-crypt device\n");
     goto errout;
   }
 
@@ -775,21 +775,21 @@
 
   property_get("ro.crypto.state", encrypted_state, "");
   if ( master_key_saved || strcmp(encrypted_state, "encrypted") ) {
-    ui_print("encrypted fs already validated or not running with encryption, aborting");
+    printf("encrypted fs already validated or not running with encryption, aborting");
     return -1;
   }
 
   if (get_orig_mount_parms(mount_point, fs_type, real_blkdev, &mnt_flags, fs_options)) {
-    ui_print("Error reading original mount parms for mount point %s\n", mount_point);
+    printf("Error reading original mount parms for mount point %s\n", mount_point);
     return -1;
   }
 
   if (get_crypt_ftr_and_key(real_blkdev, &crypt_ftr, encrypted_master_key, salt)) {
-    ui_print("Error getting crypt footer and key\n");
+    printf("Error getting crypt footer and key\n");
     return -1;
   }
 
-  ui_print("crypt_ftr->fs_size = %lld\n", crypt_ftr.fs_size);
+  printf("crypt_ftr->fs_size = %lld\n", crypt_ftr.fs_size);
   orig_failed_decrypt_count = crypt_ftr.failed_decrypt_count;
 
   if (! (crypt_ftr.flags & CRYPT_MNT_KEY_UNENCRYPTED) ) {
@@ -798,7 +798,7 @@
 
   if (create_crypto_blk_dev(&crypt_ftr, decrypted_master_key,
                                real_blkdev, crypto_blkdev, label)) {
-    ui_print("Error creating decrypted block device\n");
+    printf("Error creating decrypted block device\n");
     return -1;
   }
 
@@ -812,7 +812,7 @@
   sprintf(tmp_mount_point, "%s/tmp_mnt", mount_point);
   mkdir(tmp_mount_point, 0755);
   if ( mount(crypto_blkdev, tmp_mount_point, "ext4", MS_RDONLY, "") ) {
-    ui_print("Error temp mounting decrypted block device\n");
+    printf("Error temp mounting decrypted block device\n");
     delete_crypto_blk_dev(label);
     crypt_ftr.failed_decrypt_count++;
   } else {
diff --git a/data.cpp b/data.cpp
index 2129364..70411a1 100644
--- a/data.cpp
+++ b/data.cpp
@@ -605,6 +605,15 @@
     str += dev_id;
 	SetValue(TW_BACKUPS_FOLDER_VAR, str, 0);
 
+#ifdef SP1_NAME
+	if (strlen(EXPAND(SP1_NAME)))    mConstValues.insert(make_pair(TW_SP1_PARTITION_NAME_VAR, EXPAND(SP1_NAME)));
+#endif
+#ifdef SP2_NAME
+	if (strlen(EXPAND(SP2_NAME)))    mConstValues.insert(make_pair(TW_SP1_PARTITION_NAME_VAR, EXPAND(SP2_NAME)));
+#endif
+#ifdef SP3_NAME
+	if (strlen(EXPAND(SP3_NAME)))    mConstValues.insert(make_pair(TW_SP1_PARTITION_NAME_VAR, EXPAND(SP3_NAME)));
+#endif
 #ifdef SP1_DISPLAY_NAME
     if (strlen(EXPAND(SP1_DISPLAY_NAME)))    mConstValues.insert(make_pair(TW_SP1_PARTITION_NAME_VAR, EXPAND(SP1_DISPLAY_NAME)));
 #endif
diff --git a/partition.cpp b/partition.cpp
index 0636039..bbcb48c 100644
--- a/partition.cpp
+++ b/partition.cpp
@@ -148,7 +148,7 @@
 				// Do nothing
 			} else {
 				// Unhandled data
-				LOGI("Unhandled fstab information: '%s', %i\n", ptr, index);
+				LOGI("Unhandled fstab information: '%s', %i, line: '%s'\n", ptr, index, Line.c_str());
 			}
 		}
 		while (index < line_len && full_line[index] != '\0')
@@ -1249,7 +1249,7 @@
 bool TWPartition::Update_Size(bool Display_Error) {
 	bool ret = false;
 
-	if (!Can_Be_Mounted)
+	if (!Can_Be_Mounted && !Is_Encrypted)
 		return false;
 
 	if (Removable || Is_Encrypted) {
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index 9685072..a42c303 100644
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -66,6 +66,7 @@
 
 		TWPartition* partition = new TWPartition();
 		string line = fstab_line;
+		memset(fstab_line, 0, sizeof(fstab_line));
 
 		if (partition->Process_Fstab_Line(line, Display_Error)) {
 			Partitions.push_back(partition);
@@ -646,7 +647,7 @@
 #ifdef SP1_NAME
 	DataManager::GetValue(TW_BACKUP_SP1_VAR, check);
 	if (check) {
-		backup_sp1 = Find_Partition_By_Path(SP1_NAME);
+		backup_sp1 = Find_Partition_By_Path(EXPAND(SP1_NAME));
 		if (backup_sp1 != NULL) {
 			partition_count++;
 			if (backup_sp1->Backup_Method == 1)
@@ -654,7 +655,7 @@
 			else
 				img_bytes += backup_sp1->Backup_Size;
 		} else {
-			LOGE("Unable to locate %s partition.\n", SP1_NAME);
+			LOGE("Unable to locate %s partition.\n", EXPAND(SP1_NAME));
 			return false;
 		}
 	}
@@ -662,7 +663,7 @@
 #ifdef SP2_NAME
 	DataManager::GetValue(TW_BACKUP_SP2_VAR, check);
 	if (check) {
-		backup_sp2 = Find_Partition_By_Path(SP2_NAME);
+		backup_sp2 = Find_Partition_By_Path(EXPAND(SP2_NAME));
 		if (backup_sp2 != NULL) {
 			partition_count++;
 			if (backup_sp2->Backup_Method == 1)
@@ -670,7 +671,7 @@
 			else
 				img_bytes += backup_sp2->Backup_Size;
 		} else {
-			LOGE("Unable to locate %s partition.\n", SP2_NAME);
+			LOGE("Unable to locate %s partition.\n", EXPAND(SP2_NAME));
 			return false;
 		}
 	}
@@ -678,7 +679,7 @@
 #ifdef SP3_NAME
 	DataManager::GetValue(TW_BACKUP_SP3_VAR, check);
 	if (check) {
-		backup_sp3 = Find_Partition_By_Path(SP3_NAME);
+		backup_sp3 = Find_Partition_By_Path(EXPAND(SP3_NAME));
 		if (backup_sp3 != NULL) {
 			partition_count++;
 			if (backup_sp3->Backup_Method == 1)
@@ -686,7 +687,7 @@
 			else
 				img_bytes += backup_sp3->Backup_Size;
 		} else {
-			LOGE("Unable to locate %s partition.\n", SP3_NAME);
+			LOGE("Unable to locate %s partition.\n", EXPAND(SP3_NAME));
 			return false;
 		}
 	}
@@ -856,9 +857,9 @@
 #ifdef SP1_NAME
 	DataManager::GetValue(TW_RESTORE_SP1_VAR, check);
 	if (check > 0) {
-		restore_sp1 = Find_Partition_By_Path(SP1_NAME);
+		restore_sp1 = Find_Partition_By_Path(EXPAND(SP1_NAME));
 		if (restore_sp1 == NULL) {
-			LOGE("Unable to locate %s partition.\n", SP1_NAME);
+			LOGE("Unable to locate %s partition.\n", EXPAND(SP1_NAME));
 			return false;
 		}
 		partition_count++;
@@ -867,9 +868,9 @@
 #ifdef SP2_NAME
 	DataManager::GetValue(TW_RESTORE_SP2_VAR, check);
 	if (check > 0) {
-		restore_sp2 = Find_Partition_By_Path(SP2_NAME);
+		restore_sp2 = Find_Partition_By_Path(EXPAND(SP2_NAME));
 		if (restore_sp2 == NULL) {
-			LOGE("Unable to locate %s partition.\n", SP2_NAME);
+			LOGE("Unable to locate %s partition.\n", EXPAND(SP2_NAME));
 			return false;
 		}
 		partition_count++;
@@ -878,9 +879,9 @@
 #ifdef SP3_NAME
 	DataManager::GetValue(TW_RESTORE_SP3_VAR, check);
 	if (check > 0) {
-		restore_sp3 = Find_Partition_By_Path(SP3_NAME);
+		restore_sp3 = Find_Partition_By_Path(EXPAND(SP3_NAME));
 		if (restore_sp3 == NULL) {
-			LOGE("Unable to locate %s partition.\n", SP3_NAME);
+			LOGE("Unable to locate %s partition.\n", EXPAND(SP3_NAME));
 			return false;
 		}
 		partition_count++;
@@ -1049,15 +1050,15 @@
 		if (Part->Backup_Path == "/sd-ext")
 			tw_restore_sdext = 1;
 #ifdef SP1_NAME
-		if (Part->Backup_Path == TWFunc::Get_Root_Path(SP1_Name))
+		if (Part->Backup_Path == TWFunc::Get_Root_Path(EXPAND(SP1_NAME)))
 			tw_restore_sp1 = 1;
 #endif
 #ifdef SP2_NAME
-		if (Part->Backup_Path == TWFunc::Get_Root_Path(SP2_Name))
+		if (Part->Backup_Path == TWFunc::Get_Root_Path(EXPAND(SP2_NAME)))
 			tw_restore_sp2 = 1;
 #endif
 #ifdef SP3_NAME
-		if (Part->Backup_Path == TWFunc::Get_Root_Path(SP3_Name))
+		if (Part->Backup_Path == TWFunc::Get_Root_Path(EXPAND(SP3_NAME)))
 			tw_restore_sp3 = 1;
 #endif
 	}
@@ -1288,6 +1289,24 @@
 				} else
 					DataManager::SetValue(TW_HAS_ANDROID_SECURE, 1);
 			}
+#ifdef SP1_NAME
+			if ((*iter)->Backup_Name == EXPAND(SP1_NAME)) {
+				int backup_display_size = (int)((*iter)->Backup_Size / 1048576LLU);
+				DataManager::SetValue(TW_BACKUP_SP1_SIZE, backup_display_size);
+			}
+#endif
+#ifdef SP2_NAME
+			if ((*iter)->Backup_Name == EXPAND(SP2_NAME)) {
+				int backup_display_size = (int)((*iter)->Backup_Size / 1048576LLU);
+				DataManager::SetValue(TW_BACKUP_SP2_SIZE, backup_display_size);
+			}
+#endif
+#ifdef SP3_NAME
+			if ((*iter)->Backup_Name == EXPAND(SP3_NAME)) {
+				int backup_display_size = (int)((*iter)->Backup_Size / 1048576LLU);
+				DataManager::SetValue(TW_BACKUP_SP3_SIZE, backup_display_size);
+			}
+#endif
 		}
 	}
 	DataManager::SetValue(TW_BACKUP_DATA_SIZE, data_size);
@@ -1302,8 +1321,10 @@
 			if (has_dual_storage == 1) {
 				// We have dual storage, see if we're using the internal storage that should always be present
 				if (current_storage_path == DataManager::GetSettingsStoragePath()) {
-					// Not able to use internal, so error!
-					LOGE("Unable to mount internal storage.\n");
+					if (!FreeStorage->Is_Encrypted) {
+						// Not able to use internal, so error!
+						LOGE("Unable to mount internal storage.\n");
+					}
 					DataManager::SetValue(TW_STORAGE_FREE_SIZE, 0);
 				} else {
 					// We were using external, flip to internal
diff --git a/roots.cpp b/roots.cpp
index 9cbaa49..d7ffb31 100644
--- a/roots.cpp
+++ b/roots.cpp
@@ -288,7 +288,10 @@
 
     if (strcmp(v->fs_type, "ext4") == 0) {
 #ifdef USE_EXT4
+/*
         int result = make_ext4fs(v->device, v->length, volume, sehandle);
+*/
+        int result = 0;
 #else
         int result = 0;
 #endif