@@ -940,21 +940,25 @@ static void
940
940
941
941
#define BRTYPE_B_SYS 0
942
942
#define BRTYPE_B_DATA 1
943
- #define BRTYPE_HL1 2
944
- #define BRTYPE_RESTORE 3
945
- #define BRTYPE_REST_FORMAT 4
943
+ #define BRTYPE_B_EFS 2
944
+ #define BRTYPE_HL1 3
945
+ #define BRTYPE_RESTORE 4
946
+ #define BRTYPE_REST_FORMAT 5
946
947
947
948
char st [255 ];
948
- static char * backup_parts [] = { "/system" , "/data" };
949
- static char * backup_file [] = { "Sys" , "Data" };
949
+ static char * backup_parts [] = { "/system" , "/data" , "/efs" };
950
+ static char * backup_file [] = { "Sys" , "Data" , "Efs" };
950
951
951
952
static char * items [] = { "TAR backup system" ,
952
953
"TAR backup data" ,
954
+ "TAR backup efs" ,
953
955
" -------" ,
954
956
"TAR restore" ,
955
957
"TAR restore (+ format)" ,
956
958
NULL };
957
959
960
+ if (ensure_root_path_mounted ("SDCARD:" )) { ui_print ("\nError mount sdcard\n" ); return ; }
961
+
958
962
959
963
for (;;) {
960
964
@@ -982,6 +986,28 @@ static void
982
986
ui_print ("/data" );
983
987
if (!format_root_device ("DATA:" )) ui_print ("ok" );
984
988
}
989
+ }
990
+ if (strstr (st , "_Efs." )) {
991
+ if (!ensure_root_path_unmounted ("EFS:" )) {
992
+ ui_print ("/efs" );
993
+ //We won't format EFS without an image backup
994
+ int ret ;
995
+ struct statfs s ;
996
+ if (0 != (ret = statfs ("/sdcard" , & s )))
997
+ return print_and_error ("Unable to stat /sdcard\n" );
998
+ uint64_t bavail = s .f_bavail ;
999
+ uint64_t bsize = s .f_bsize ;
1000
+ uint64_t sdcard_free = bavail * bsize ;
1001
+ uint64_t sdcard_free_mb = sdcard_free / (uint64_t )(1024 * 1024 );
1002
+ if (sdcard_free_mb < 20 ) return print_and_error ("You should have at least 20MB free on your SD card\n" );
1003
+ if (chdir ("/sdcard/samdroid/image" )) {
1004
+ __system ("mkdir -p /sdcard/samdroid/image" );
1005
+ }
1006
+ unlink ("/sdcard/samdroid/image/before_tar_restore.img" );
1007
+ if (!__system ("dd if=/dev/stl10 of=/sdcard/samdroid/image/efs_before_tar_restore.img" )) {
1008
+ if (format_root_device ("EFS:" )) return print_and_error ("Can't format EFS\n" );
1009
+ }
1010
+ }
985
1011
}
986
1012
case BRTYPE_RESTORE :
987
1013
strcpy (sfpath , "/sdcard/samdroid/" );
@@ -996,6 +1022,10 @@ static void
996
1022
ui_print ("/data" );
997
1023
if (ensure_root_path_mounted ("DATA:" )) { ui_print ("\nError mount /data\n" ); return ; }
998
1024
}
1025
+ if (strstr (st , "_Efs." )) {
1026
+ ui_print ("/efs" );
1027
+ if (ensure_root_path_mounted ("EFS:" )) { ui_print ("\nError mount /efs\n" ); return ; }
1028
+ }
999
1029
1000
1030
ui_print ("\nRestoring.." );
1001
1031
@@ -1004,7 +1034,7 @@ static void
1004
1034
chdir ("/" );
1005
1035
char * args [] = {"/xbin/tar" , "-x" ,"-f" , sfpath , NULL };
1006
1036
execv ("/xbin/tar" , args );
1007
- fprintf (stderr , "E:Can't backup \n(%s)\n" , strerror (errno ));
1037
+ fprintf (stderr , "E:Can't restore \n(%s)\n" , strerror (errno ));
1008
1038
_exit (-1 );
1009
1039
}
1010
1040
@@ -1021,6 +1051,8 @@ static void
1021
1051
} else {
1022
1052
ui_print ("\nRestore complete.\n" );
1023
1053
}
1054
+ case BRTYPE_B_EFS :
1055
+ ensure_root_path_unmounted ("EFS:" );
1024
1056
break ;
1025
1057
}
1026
1058
continue ;
@@ -1043,12 +1075,26 @@ static void
1043
1075
case BRTYPE_B_DATA :
1044
1076
if (ensure_root_path_mounted ("DATA:" )) { ui_print ("\nError mount /data\n" ); return ; }
1045
1077
break ;
1078
+ case BRTYPE_B_EFS :
1079
+ if (ensure_root_path_mounted ("EFS:" )) { ui_print ("\nError mount /efs\n" ); return ; }
1080
+ break ;
1046
1081
}
1082
+ int ret ;
1083
+ struct statfs s ;
1084
+ if (0 != (ret = statfs ("/sdcard" , & s )))
1085
+ return print_and_error ("Unable to stat /sdcard\n" );
1086
+ uint64_t bavail = s .f_bavail ;
1087
+ uint64_t bsize = s .f_bsize ;
1088
+ uint64_t sdcard_free = bavail * bsize ;
1089
+ uint64_t sdcard_free_mb = sdcard_free / (uint64_t )(1024 * 1024 );
1090
+
1047
1091
switch (chosen_item ) {
1048
1092
case BRTYPE_B_SYS :
1049
1093
case BRTYPE_B_DATA :
1050
- if (ensure_root_path_mounted ("SDCARD:" )) { ui_print ("\nError mount sdcard\n" ); return ; }
1051
- ui_print ("\nBackuping: " );
1094
+ if (sdcard_free_mb < 220 ) return print_and_error ("You should have at least 220MB free on your SD card\n" );
1095
+ case BRTYPE_B_EFS :
1096
+ if (sdcard_free_mb < 20 ) return print_and_error ("You should have at least 20MB free on your SD card\n" );
1097
+ ui_print ("\nBacking up: " );
1052
1098
ui_print (backup_parts [chosen_item ]);
1053
1099
ui_print ("\n" );
1054
1100
@@ -1080,16 +1126,18 @@ static void
1080
1126
}
1081
1127
ui_print ("\n" );
1082
1128
1083
- if (!WIFEXITED (status ) || (WEXITSTATUS (status ) == 2 )) {
1129
+ if (!WIFEXITED (status ) || (WEXITSTATUS (status ) != 0 )) {
1084
1130
LOGE ("Can't create tar file %s\n" , st );
1085
1131
} else {
1086
1132
ui_print ("Backup complete.\n" );
1087
1133
}
1134
+ if ( chosen_item == BRTYPE_B_EFS )
1135
+ ensure_root_path_unmounted ("EFS:" );
1088
1136
break ;
1089
1137
}
1090
1138
1091
1139
} else {
1092
- ui_print ("\nData backup aborted.\n" );
1140
+ ui_print ("\nBackup aborted.\n" );
1093
1141
}
1094
1142
if (!ui_text_visible ()) break ;
1095
1143
}
@@ -1541,6 +1589,7 @@ void image_backup() {
1541
1589
static char * list [] = { "DATA:" ,
1542
1590
"SYSTEM:" ,
1543
1591
"SDEXT:" ,
1592
+ "EFS:" ,
1544
1593
NULL
1545
1594
};
1546
1595
@@ -1598,7 +1647,7 @@ void image_backup() {
1598
1647
sprintf (st ,"%s%s%s" ,st ,part ,".img" );
1599
1648
char cmd [PATH_MAX ];
1600
1649
sprintf (cmd ,"/xbin/dd if=\"%s\" of=\"%s\"" ,info -> device ,st );
1601
- ui_print ("Backuping .." );
1650
+ ui_print ("Backing up .." );
1602
1651
if (ensure_root_path_mounted ("SDCARD:" ) != 0 ) //Just to be sure
1603
1652
return print_and_error ("Can't mount sdcard\n" );
1604
1653
pid_t pid = fork ();
@@ -1615,7 +1664,7 @@ void image_backup() {
1615
1664
ui_print ("." );
1616
1665
sleep (1 );
1617
1666
}
1618
- if ( WEXITSTATUS (status ) == 2 ) return print_and_error ("\nBackuping failed!\n" );
1667
+ if ( WEXITSTATUS (status ) == 2 ) return print_and_error ("\nBacking up failed!\n" );
1619
1668
else {
1620
1669
ui_print ("\nBackup Finished!\n" );
1621
1670
return ;
@@ -1806,7 +1855,7 @@ void show_fs_select(RootInfo* info)
1806
1855
}
1807
1856
char cmd [PATH_MAX ];
1808
1857
if ( strcmp (info -> name ,"CACHE:" ) ) {
1809
- ui_print ("\nBackuping " );
1858
+ ui_print ("\nBacking up " );
1810
1859
sprintf (cmd ,"/xbin/tar -c --exclude=*RFS_LOG.LO* -f %s %s" ,backup ,info -> mount_point );
1811
1860
pid_t pid = fork ();
1812
1861
if (pid == 0 ) {
@@ -1818,8 +1867,8 @@ void show_fs_select(RootInfo* info)
1818
1867
ui_print ("." );
1819
1868
sleep (1 );
1820
1869
}
1821
- if ( WEXITSTATUS (status ) == 2 ) err = 1 ;
1822
- if ( err ) return print_and_error ("\nBackuping failed!\n" );
1870
+ if ( WEXITSTATUS (status ) != 0 ) err = 1 ;
1871
+ if ( err ) return print_and_error ("\nBacking up failed!\n" );
1823
1872
1824
1873
}
1825
1874
if (ensure_root_path_unmounted (info -> name )) {
@@ -1859,7 +1908,7 @@ void show_fs_select(RootInfo* info)
1859
1908
ui_print ("." );
1860
1909
sleep (1 );
1861
1910
}
1862
- if ( WEXITSTATUS (status ) == 2 ) err = 1 ;
1911
+ if ( WEXITSTATUS (status ) != 0 ) err = 1 ;
1863
1912
if ( err ) return print_and_error ("Restoring failed!\n" );
1864
1913
}
1865
1914
if (!err ) ui_print ("\nConversion was successful!\n" );
0 commit comments