Loading adb/remount_service.cpp +34 −2 Original line number Diff line number Diff line Loading @@ -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 ""; Loading @@ -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) { Loading Loading @@ -112,7 +138,13 @@ void remount_service(int fd, void* cookie) { } bool success = true; 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"); Loading Loading
adb/remount_service.cpp +34 −2 Original line number Diff line number Diff line Loading @@ -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 ""; Loading @@ -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) { Loading Loading @@ -112,7 +138,13 @@ void remount_service(int fd, void* cookie) { } bool success = true; 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"); Loading