Fix "adb remount" for when the root directory is in system.img

When the root directory has been built into system.img, it is
mounted at /.

Change-Id: If01d12efeaa53b4ae59e801a6e9b802a9ae5882d
This commit is contained in:
Daniel Rosenberg 2015-06-29 17:30:28 -07:00
parent c9aeae2740
commit d6eba89f83
1 changed files with 34 additions and 2 deletions

View File

@ -33,9 +33,12 @@
#include "adb_io.h"
#include "adb_utils.h"
#include "cutils/properties.h"
#include "fs_mgr.h"
const std::string kFstab_Prefix = "/fstab.";
// Returns the device used to mount a directory in /proc/mounts.
static std::string find_mount(const char* dir) {
static std::string find_proc_mount(const char* dir) {
std::unique_ptr<FILE, int(*)(FILE*)> fp(setmntent("/proc/mounts", "r"), endmntent);
if (!fp) {
return "";
@ -50,6 +53,29 @@ static std::string find_mount(const char* dir) {
return "";
}
// Returns the device used to mount a directory in the fstab.
static std::string find_fstab_mount(const char* dir) {
char propbuf[PROPERTY_VALUE_MAX];
property_get("ro.hardware", propbuf, "");
std::string fstab_filename = kFstab_Prefix + propbuf;
struct fstab* fstab = fs_mgr_read_fstab(fstab_filename.c_str());
struct fstab_rec* rec = fs_mgr_get_entry_for_mount_point(fstab, dir);
std::string dev = rec ? std::string(rec->blk_device) : "";
fs_mgr_free_fstab(fstab);
return dev;
}
// The proc entry for / is full of lies, so check fstab instead.
// /proc/mounts lists rootfs and /dev/root, neither of which is what we want.
static std::string find_mount(const char* dir) {
if (strcmp(dir, "/") == 0) {
return find_fstab_mount(dir);
} else {
return find_proc_mount(dir);
}
}
bool make_block_device_writable(const std::string& dev) {
int fd = unix_open(dev.c_str(), O_RDONLY | O_CLOEXEC);
if (fd == -1) {
@ -112,7 +138,13 @@ void remount_service(int fd, void* cookie) {
}
bool success = true;
success &= remount_partition(fd, "/system");
property_get("ro.build.system_root_image", prop_buf, "");
bool system_root = !strcmp(prop_buf, "true");
if (system_root) {
success &= remount_partition(fd, "/");
} else {
success &= remount_partition(fd, "/system");
}
success &= remount_partition(fd, "/vendor");
success &= remount_partition(fd, "/oem");