summaryrefslogtreecommitdiffstats
path: root/roots.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'roots.cpp')
-rw-r--r--roots.cpp142
1 files changed, 62 insertions, 80 deletions
diff --git a/roots.cpp b/roots.cpp
index f361cb8ca..6e5ef9810 100644
--- a/roots.cpp
+++ b/roots.cpp
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+#include "roots.h"
+
#include <errno.h>
#include <stdlib.h>
#include <sys/mount.h>
@@ -24,13 +26,13 @@
#include <ctype.h>
#include <fcntl.h>
+#include <android-base/logging.h>
+#include <ext4_utils/make_ext4fs.h>
+#include <ext4_utils/wipe.h>
#include <fs_mgr.h>
-#include "mtdutils/mtdutils.h"
-#include "mtdutils/mounts.h"
-#include "roots.h"
+
#include "common.h"
-#include "make_ext4fs.h"
-#include "wipe.h"
+#include "mounts.h"
#include "cryptfs.h"
static struct fstab *fstab = NULL;
@@ -42,15 +44,15 @@ void load_volume_table()
int i;
int ret;
- fstab = fs_mgr_read_fstab("/etc/recovery.fstab");
+ fstab = fs_mgr_read_fstab_default();
if (!fstab) {
- LOGE("failed to read /etc/recovery.fstab\n");
+ LOG(ERROR) << "failed to read default fstab";
return;
}
ret = fs_mgr_add_entry(fstab, "/tmp", "ramdisk", "ramdisk");
if (ret < 0 ) {
- LOGE("failed to add /tmp entry to fstab\n");
+ LOG(ERROR) << "failed to add /tmp entry to fstab";
fs_mgr_free_fstab(fstab);
fstab = NULL;
return;
@@ -74,7 +76,7 @@ Volume* volume_for_path(const char* path) {
int ensure_path_mounted_at(const char* path, const char* mount_point) {
Volume* v = volume_for_path(path);
if (v == NULL) {
- LOGE("unknown volume for path [%s]\n", path);
+ LOG(ERROR) << "unknown volume for path [" << path << "]";
return -1;
}
if (strcmp(v->fs_type, "ramdisk") == 0) {
@@ -82,10 +84,8 @@ int ensure_path_mounted_at(const char* path, const char* mount_point) {
return 0;
}
- int result;
- result = scan_mounted_volumes();
- if (result < 0) {
- LOGE("failed to scan mounted volumes\n");
+ if (!scan_mounted_volumes()) {
+ LOG(ERROR) << "failed to scan mounted volumes";
return -1;
}
@@ -93,8 +93,7 @@ int ensure_path_mounted_at(const char* path, const char* mount_point) {
mount_point = v->mount_point;
}
- const MountedVolume* mv =
- find_mounted_volume_by_mount_point(mount_point);
+ MountedVolume* mv = find_mounted_volume_by_mount_point(mount_point);
if (mv) {
// volume is already mounted
return 0;
@@ -102,29 +101,30 @@ int ensure_path_mounted_at(const char* path, const char* mount_point) {
mkdir(mount_point, 0755); // in case it doesn't already exist
- if (strcmp(v->fs_type, "yaffs2") == 0) {
- // mount an MTD partition as a YAFFS2 filesystem.
- mtd_scan_partitions();
- const MtdPartition* partition;
- partition = mtd_find_partition_by_name(v->blk_device);
- if (partition == NULL) {
- LOGE("failed to find \"%s\" partition to mount at \"%s\"\n",
- v->blk_device, mount_point);
- return -1;
- }
- return mtd_mount_partition(partition, mount_point, v->fs_type, 0);
- } else if (strcmp(v->fs_type, "ext4") == 0 ||
+ if (strcmp(v->fs_type, "ext4") == 0 ||
strcmp(v->fs_type, "squashfs") == 0 ||
strcmp(v->fs_type, "vfat") == 0) {
- result = mount(v->blk_device, mount_point, v->fs_type,
- v->flags, v->fs_options);
- if (result == 0) return 0;
+ int result = mount(v->blk_device, mount_point, v->fs_type, v->flags, v->fs_options);
+ if (result == -1 && fs_mgr_is_formattable(v)) {
+ LOG(ERROR) << "failed to mount " << mount_point << " (" << strerror(errno)
+ << ") , formatting.....";
+ bool crypt_footer = fs_mgr_is_encryptable(v) && !strcmp(v->key_loc, "footer");
+ if (fs_mgr_do_format(v, crypt_footer) == 0) {
+ result = mount(v->blk_device, mount_point, v->fs_type, v->flags, v->fs_options);
+ } else {
+ PLOG(ERROR) << "failed to format " << mount_point;
+ return -1;
+ }
+ }
- LOGE("failed to mount %s (%s)\n", mount_point, strerror(errno));
- return -1;
+ if (result == -1) {
+ PLOG(ERROR) << "failed to mount " << mount_point;
+ return -1;
+ }
+ return 0;
}
- LOGE("unknown fs_type \"%s\" for %s\n", v->fs_type, mount_point);
+ LOG(ERROR) << "unknown fs_type \"" << v->fs_type << "\" for " << mount_point;
return -1;
}
@@ -136,7 +136,7 @@ int ensure_path_mounted(const char* path) {
int ensure_path_unmounted(const char* path) {
Volume* v = volume_for_path(path);
if (v == NULL) {
- LOGE("unknown volume for path [%s]\n", path);
+ LOG(ERROR) << "unknown volume for path [" << path << "]";
return -1;
}
if (strcmp(v->fs_type, "ramdisk") == 0) {
@@ -144,15 +144,12 @@ int ensure_path_unmounted(const char* path) {
return -1;
}
- int result;
- result = scan_mounted_volumes();
- if (result < 0) {
- LOGE("failed to scan mounted volumes\n");
+ if (!scan_mounted_volumes()) {
+ LOG(ERROR) << "failed to scan mounted volumes";
return -1;
}
- const MountedVolume* mv =
- find_mounted_volume_by_mount_point(v->mount_point);
+ MountedVolume* mv = find_mounted_volume_by_mount_point(v->mount_point);
if (mv == NULL) {
// volume is already unmounted
return 0;
@@ -166,11 +163,11 @@ static int exec_cmd(const char* path, char* const argv[]) {
pid_t child;
if ((child = vfork()) == 0) {
execv(path, argv);
- _exit(-1);
+ _exit(EXIT_FAILURE);
}
waitpid(child, &status, 0);
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
- LOGE("%s failed with status %d\n", path, WEXITSTATUS(status));
+ LOG(ERROR) << path << " failed with status " << WEXITSTATUS(status);
}
return WEXITSTATUS(status);
}
@@ -178,55 +175,32 @@ static int exec_cmd(const char* path, char* const argv[]) {
int format_volume(const char* volume, const char* directory) {
Volume* v = volume_for_path(volume);
if (v == NULL) {
- LOGE("unknown volume \"%s\"\n", volume);
+ LOG(ERROR) << "unknown volume \"" << volume << "\"";
return -1;
}
if (strcmp(v->fs_type, "ramdisk") == 0) {
// you can't format the ramdisk.
- LOGE("can't format_volume \"%s\"", volume);
+ LOG(ERROR) << "can't format_volume \"" << volume << "\"";
return -1;
}
if (strcmp(v->mount_point, volume) != 0) {
- LOGE("can't give path \"%s\" to format_volume\n", volume);
+ LOG(ERROR) << "can't give path \"" << volume << "\" to format_volume";
return -1;
}
if (ensure_path_unmounted(volume) != 0) {
- LOGE("format_volume failed to unmount \"%s\"\n", v->mount_point);
+ LOG(ERROR) << "format_volume failed to unmount \"" << v->mount_point << "\"";
return -1;
}
- if (strcmp(v->fs_type, "yaffs2") == 0 || strcmp(v->fs_type, "mtd") == 0) {
- mtd_scan_partitions();
- const MtdPartition* partition = mtd_find_partition_by_name(v->blk_device);
- if (partition == NULL) {
- LOGE("format_volume: no MTD partition \"%s\"\n", v->blk_device);
- return -1;
- }
-
- MtdWriteContext *write = mtd_write_partition(partition);
- if (write == NULL) {
- LOGW("format_volume: can't open MTD \"%s\"\n", v->blk_device);
- return -1;
- } else if (mtd_erase_blocks(write, -1) == (off_t) -1) {
- LOGW("format_volume: can't erase MTD \"%s\"\n", v->blk_device);
- mtd_write_close(write);
- return -1;
- } else if (mtd_write_close(write)) {
- LOGW("format_volume: can't close MTD \"%s\"\n", v->blk_device);
- return -1;
- }
- return 0;
- }
-
if (strcmp(v->fs_type, "ext4") == 0 || strcmp(v->fs_type, "f2fs") == 0) {
// if there's a key_loc that looks like a path, it should be a
// block device for storing encryption metadata. wipe it too.
if (v->key_loc != NULL && v->key_loc[0] == '/') {
- LOGI("wiping %s\n", v->key_loc);
+ LOG(INFO) << "wiping " << v->key_loc;
int fd = open(v->key_loc, O_WRONLY | O_CREAT, 0644);
if (fd < 0) {
- LOGE("format_volume: failed to open %s\n", v->key_loc);
+ LOG(ERROR) << "format_volume: failed to open " << v->key_loc;
return -1;
}
wipe_block_device(fd, get_file_size(fd));
@@ -241,19 +215,27 @@ int format_volume(const char* volume, const char* directory) {
}
int result;
if (strcmp(v->fs_type, "ext4") == 0) {
- result = make_ext4fs_directory(v->blk_device, length, volume, sehandle, directory);
+ if (v->erase_blk_size != 0 && v->logical_blk_size != 0) {
+ result = make_ext4fs_directory_align(v->blk_device, length, volume, sehandle,
+ directory, v->erase_blk_size, v->logical_blk_size);
+ } else {
+ result = make_ext4fs_directory(v->blk_device, length, volume, sehandle, directory);
+ }
} else { /* Has to be f2fs because we checked earlier. */
if (v->key_loc != NULL && strcmp(v->key_loc, "footer") == 0 && length < 0) {
- LOGE("format_volume: crypt footer + negative length (%zd) not supported on %s\n", length, v->fs_type);
+ LOG(ERROR) << "format_volume: crypt footer + negative length (" << length
+ << ") not supported on " << v->fs_type;
return -1;
}
if (length < 0) {
- LOGE("format_volume: negative length (%zd) not supported on %s\n", length, v->fs_type);
+ LOG(ERROR) << "format_volume: negative length (" << length
+ << ") not supported on " << v->fs_type;
return -1;
}
char *num_sectors;
if (asprintf(&num_sectors, "%zd", length / 512) <= 0) {
- LOGE("format_volume: failed to create %s command for %s\n", v->fs_type, v->blk_device);
+ LOG(ERROR) << "format_volume: failed to create " << v->fs_type
+ << " command for " << v->blk_device;
return -1;
}
const char *f2fs_path = "/sbin/mkfs.f2fs";
@@ -263,13 +245,13 @@ int format_volume(const char* volume, const char* directory) {
free(num_sectors);
}
if (result != 0) {
- LOGE("format_volume: make %s failed on %s with %d(%s)\n", v->fs_type, v->blk_device, result, strerror(errno));
+ PLOG(ERROR) << "format_volume: make " << v->fs_type << " failed on " << v->blk_device;
return -1;
}
return 0;
}
- LOGE("format_volume: fs_type \"%s\" unsupported\n", v->fs_type);
+ LOG(ERROR) << "format_volume: fs_type \"" << v->fs_type << "\" unsupported";
return -1;
}
@@ -279,7 +261,7 @@ int format_volume(const char* volume) {
int setup_install_mounts() {
if (fstab == NULL) {
- LOGE("can't set up install mounts: no fstab loaded\n");
+ LOG(ERROR) << "can't set up install mounts: no fstab loaded";
return -1;
}
for (int i = 0; i < fstab->num_entries; ++i) {
@@ -288,13 +270,13 @@ int setup_install_mounts() {
if (strcmp(v->mount_point, "/tmp") == 0 ||
strcmp(v->mount_point, "/cache") == 0) {
if (ensure_path_mounted(v->mount_point) != 0) {
- LOGE("failed to mount %s\n", v->mount_point);
+ LOG(ERROR) << "failed to mount " << v->mount_point;
return -1;
}
} else {
if (ensure_path_unmounted(v->mount_point) != 0) {
- LOGE("failed to unmount %s\n", v->mount_point);
+ LOG(ERROR) << "failed to unmount " << v->mount_point;
return -1;
}
}