liblp: Replace open with GetControlFileOrOpen
... so that fds from init can be used. Bug: 126233777 Test: unit tests Change-Id: Ife652e61305ef4fb6a02edfa765a91b5959d1b4b
This commit is contained in:
parent
567f1874fd
commit
26328e80b1
5 changed files with 30 additions and 4 deletions
|
@ -43,6 +43,11 @@ cc_library {
|
|||
windows: {
|
||||
enabled: true,
|
||||
},
|
||||
android: {
|
||||
shared_libs: [
|
||||
"libcutils",
|
||||
],
|
||||
},
|
||||
},
|
||||
export_include_dirs: ["include"],
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ std::unique_ptr<LpMetadata> ReadFromImageBlob(const void* data, size_t bytes) {
|
|||
}
|
||||
|
||||
std::unique_ptr<LpMetadata> ReadFromImageFile(const std::string& image_file) {
|
||||
unique_fd fd(open(image_file.c_str(), O_RDONLY | O_CLOEXEC));
|
||||
unique_fd fd = GetControlFileOrOpen(image_file.c_str(), O_RDONLY | O_CLOEXEC);
|
||||
if (fd < 0) {
|
||||
PERROR << __PRETTY_FUNCTION__ << " open failed: " << image_file;
|
||||
return nullptr;
|
||||
|
@ -408,7 +408,7 @@ bool SparseBuilder::CheckExtentOrdering() {
|
|||
}
|
||||
|
||||
int SparseBuilder::OpenImageFile(const std::string& file) {
|
||||
android::base::unique_fd source_fd(open(file.c_str(), O_RDONLY | O_CLOEXEC));
|
||||
android::base::unique_fd source_fd = GetControlFileOrOpen(file.c_str(), O_RDONLY | O_CLOEXEC);
|
||||
if (source_fd < 0) {
|
||||
PERROR << "open image file failed: " << file;
|
||||
return -1;
|
||||
|
|
|
@ -45,7 +45,7 @@ std::string GetPartitionAbsolutePath(const std::string& path) {
|
|||
|
||||
bool GetBlockDeviceInfo(const std::string& block_device, BlockDeviceInfo* device_info) {
|
||||
#if defined(__linux__)
|
||||
unique_fd fd(open(block_device.c_str(), O_RDONLY));
|
||||
unique_fd fd = GetControlFileOrOpen(block_device.c_str(), O_RDONLY);
|
||||
if (fd < 0) {
|
||||
PERROR << __PRETTY_FUNCTION__ << "open '" << block_device << "' failed";
|
||||
return false;
|
||||
|
@ -85,7 +85,7 @@ bool GetBlockDeviceInfo(const std::string& block_device, BlockDeviceInfo* device
|
|||
|
||||
unique_fd PartitionOpener::Open(const std::string& partition_name, int flags) const {
|
||||
std::string path = GetPartitionAbsolutePath(partition_name);
|
||||
return unique_fd{open(path.c_str(), flags | O_CLOEXEC)};
|
||||
return GetControlFileOrOpen(path.c_str(), flags | O_CLOEXEC);
|
||||
}
|
||||
|
||||
bool PartitionOpener::GetInfo(const std::string& partition_name, BlockDeviceInfo* info) const {
|
||||
|
|
|
@ -28,6 +28,10 @@
|
|||
#include <ext4_utils/ext4_utils.h>
|
||||
#include <openssl/sha.h>
|
||||
|
||||
#ifdef __ANDROID__
|
||||
#include <cutils/android_get_control_file.h>
|
||||
#endif
|
||||
|
||||
#include "utility.h"
|
||||
|
||||
namespace android {
|
||||
|
@ -171,5 +175,19 @@ bool SetBlockReadonly(int fd, bool readonly) {
|
|||
#endif
|
||||
}
|
||||
|
||||
base::unique_fd GetControlFileOrOpen(const char* path, int flags) {
|
||||
#if defined(__ANDROID__)
|
||||
int fd = android_get_control_file(path);
|
||||
if (fd >= 0) {
|
||||
int newfd = TEMP_FAILURE_RETRY(dup(fd));
|
||||
if (newfd >= 0) {
|
||||
return base::unique_fd(newfd);
|
||||
}
|
||||
PERROR << "Cannot dup fd for already controlled file: " << path << ", reopening...";
|
||||
}
|
||||
#endif
|
||||
return base::unique_fd(open(path, flags));
|
||||
}
|
||||
|
||||
} // namespace fs_mgr
|
||||
} // namespace android
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <sys/types.h>
|
||||
|
||||
#include <android-base/logging.h>
|
||||
#include <android-base/unique_fd.h>
|
||||
|
||||
#include "liblp/liblp.h"
|
||||
|
||||
|
@ -92,6 +93,8 @@ bool UpdatePartitionGroupName(LpMetadataPartitionGroup* group, const std::string
|
|||
// Call BLKROSET ioctl on fd so that fd is readonly / read-writable.
|
||||
bool SetBlockReadonly(int fd, bool readonly);
|
||||
|
||||
::android::base::unique_fd GetControlFileOrOpen(const char* path, int flags);
|
||||
|
||||
} // namespace fs_mgr
|
||||
} // namespace android
|
||||
|
||||
|
|
Loading…
Reference in a new issue