Merge "Erase PST partition if its marked to be erased." into lmp-dev

This commit is contained in:
Andres Morales
2014-08-06 17:07:35 +00:00
committed by Android (Google) Code Review
3 changed files with 44 additions and 0 deletions

View File

@@ -659,6 +659,7 @@ wipe_data(int confirm, Device* device) {
device->WipeData();
erase_volume("/data");
erase_volume("/cache");
erase_persistent_partition();
ui->Print("Data wipe complete.\n");
}
@@ -959,6 +960,7 @@ main(int argc, char **argv) {
if (device->WipeData()) status = INSTALL_ERROR;
if (erase_volume("/data")) status = INSTALL_ERROR;
if (wipe_cache && erase_volume("/cache")) status = INSTALL_ERROR;
if (erase_persistent_partition() == -1 ) status = INSTALL_ERROR;
if (status != INSTALL_SUCCESS) ui->Print("Data wipe failed.\n");
} else if (wipe_cache) {
if (wipe_cache && erase_volume("/cache")) status = INSTALL_ERROR;

View File

@@ -39,6 +39,8 @@ static struct fstab *fstab = NULL;
extern struct selabel_handle *sehandle;
static const char* PERSISTENT_PATH = "/persistent";
void load_volume_table()
{
int i;
@@ -264,6 +266,41 @@ int format_volume(const char* volume) {
return -1;
}
int erase_persistent_partition() {
Volume *v = volume_for_path(PERSISTENT_PATH);
if (v == NULL) {
// most devices won't have /persistent, so this is not an error.
return 0;
}
int fd = open(v->blk_device, O_RDWR);
uint64_t size = get_file_size(fd);
if (size == 0) {
LOGE("failed to stat size of /persistent\n");
close(fd);
return -1;
}
char oem_unlock_enabled;
lseek(fd, size - 1, SEEK_SET);
read(fd, &oem_unlock_enabled, 1);
if (oem_unlock_enabled) {
if (wipe_block_device(fd, size)) {
LOGE("error wiping /persistent: %s\n", strerror(errno));
close(fd);
return -1;
}
lseek(fd, size - 1, SEEK_SET);
write(fd, &oem_unlock_enabled, 1);
}
close(fd);
return (int) oem_unlock_enabled;
}
int setup_install_mounts() {
if (fstab == NULL) {
LOGE("can't set up install mounts: no fstab loaded\n");

View File

@@ -46,6 +46,11 @@ int format_volume(const char* volume);
// mounted (/tmp and /cache) are mounted. Returns 0 on success.
int setup_install_mounts();
// Conditionally wipes the /persistent partition if it's marked
// to wipe. Returns -1 on failure, 1 if the partition was wiped
// and 0 if the partition was not wiped.
int erase_persistent_partition();
#ifdef __cplusplus
}
#endif