Merge "Switch to <android-base/unique_fd.h>."
This commit is contained in:
+5
-5
@@ -29,7 +29,7 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "mtdutils/mtdutils.h"
|
#include "mtdutils/mtdutils.h"
|
||||||
#include "roots.h"
|
#include "roots.h"
|
||||||
#include "unique_fd.h"
|
#include <android-base/unique_fd.h>
|
||||||
|
|
||||||
static int get_bootloader_message_mtd(bootloader_message* out, const Volume* v);
|
static int get_bootloader_message_mtd(bootloader_message* out, const Volume* v);
|
||||||
static int set_bootloader_message_mtd(const bootloader_message* in, const Volume* v);
|
static int set_bootloader_message_mtd(const bootloader_message* in, const Volume* v);
|
||||||
@@ -191,8 +191,8 @@ static int get_bootloader_message_block(bootloader_message* out,
|
|||||||
static int set_bootloader_message_block(const bootloader_message* in,
|
static int set_bootloader_message_block(const bootloader_message* in,
|
||||||
const Volume* v) {
|
const Volume* v) {
|
||||||
wait_for_device(v->blk_device);
|
wait_for_device(v->blk_device);
|
||||||
unique_fd fd(open(v->blk_device, O_WRONLY | O_SYNC));
|
android::base::unique_fd fd(open(v->blk_device, O_WRONLY | O_SYNC));
|
||||||
if (fd.get() == -1) {
|
if (fd == -1) {
|
||||||
LOGE("failed to open \"%s\": %s\n", v->blk_device, strerror(errno));
|
LOGE("failed to open \"%s\": %s\n", v->blk_device, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -201,7 +201,7 @@ static int set_bootloader_message_block(const bootloader_message* in,
|
|||||||
const uint8_t* start = reinterpret_cast<const uint8_t*>(in);
|
const uint8_t* start = reinterpret_cast<const uint8_t*>(in);
|
||||||
size_t total = sizeof(*in);
|
size_t total = sizeof(*in);
|
||||||
while (written < total) {
|
while (written < total) {
|
||||||
ssize_t wrote = TEMP_FAILURE_RETRY(write(fd.get(), start + written, total - written));
|
ssize_t wrote = TEMP_FAILURE_RETRY(write(fd, start + written, total - written));
|
||||||
if (wrote == -1) {
|
if (wrote == -1) {
|
||||||
LOGE("failed to write %" PRId64 " bytes: %s\n",
|
LOGE("failed to write %" PRId64 " bytes: %s\n",
|
||||||
static_cast<off64_t>(written), strerror(errno));
|
static_cast<off64_t>(written), strerror(errno));
|
||||||
@@ -210,7 +210,7 @@ static int set_bootloader_message_block(const bootloader_message* in,
|
|||||||
written += wrote;
|
written += wrote;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fsync(fd.get()) == -1) {
|
if (fsync(fd) == -1) {
|
||||||
LOGE("failed to fsync \"%s\": %s\n", v->blk_device, strerror(errno));
|
LOGE("failed to fsync \"%s\": %s\n", v->blk_device, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
+52
-51
@@ -61,6 +61,7 @@
|
|||||||
#include <android-base/logging.h>
|
#include <android-base/logging.h>
|
||||||
#include <android-base/stringprintf.h>
|
#include <android-base/stringprintf.h>
|
||||||
#include <android-base/strings.h>
|
#include <android-base/strings.h>
|
||||||
|
#include <android-base/unique_fd.h>
|
||||||
#include <cutils/android_reboot.h>
|
#include <cutils/android_reboot.h>
|
||||||
#include <cutils/properties.h>
|
#include <cutils/properties.h>
|
||||||
#include <fs_mgr.h>
|
#include <fs_mgr.h>
|
||||||
@@ -69,7 +70,6 @@
|
|||||||
#include <log/log.h>
|
#include <log/log.h>
|
||||||
|
|
||||||
#include "bootloader.h"
|
#include "bootloader.h"
|
||||||
#include "unique_fd.h"
|
|
||||||
|
|
||||||
#define WINDOW_SIZE 5
|
#define WINDOW_SIZE 5
|
||||||
|
|
||||||
@@ -174,8 +174,9 @@ static int produce_block_map(const char* path, const char* map_file, const char*
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
std::string tmp_map_file = std::string(map_file) + ".tmp";
|
std::string tmp_map_file = std::string(map_file) + ".tmp";
|
||||||
unique_fd mapfd(open(tmp_map_file.c_str(), O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR));
|
android::base::unique_fd mapfd(open(tmp_map_file.c_str(),
|
||||||
if (!mapfd) {
|
O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR));
|
||||||
|
if (mapfd == -1) {
|
||||||
ALOGE("failed to open %s: %s\n", tmp_map_file.c_str(), strerror(errno));
|
ALOGE("failed to open %s: %s\n", tmp_map_file.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -201,7 +202,7 @@ static int produce_block_map(const char* path, const char* map_file, const char*
|
|||||||
|
|
||||||
std::string s = android::base::StringPrintf("%s\n%" PRId64 " %ld\n",
|
std::string s = android::base::StringPrintf("%s\n%" PRId64 " %ld\n",
|
||||||
blk_dev, sb.st_size, static_cast<long>(sb.st_blksize));
|
blk_dev, sb.st_size, static_cast<long>(sb.st_blksize));
|
||||||
if (!android::base::WriteStringToFd(s, mapfd.get())) {
|
if (!android::base::WriteStringToFd(s, mapfd)) {
|
||||||
ALOGE("failed to write %s: %s", tmp_map_file.c_str(), strerror(errno));
|
ALOGE("failed to write %s: %s", tmp_map_file.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -213,16 +214,16 @@ static int produce_block_map(const char* path, const char* map_file, const char*
|
|||||||
int head_block = 0;
|
int head_block = 0;
|
||||||
int head = 0, tail = 0;
|
int head = 0, tail = 0;
|
||||||
|
|
||||||
unique_fd fd(open(path, O_RDONLY));
|
android::base::unique_fd fd(open(path, O_RDONLY));
|
||||||
if (!fd) {
|
if (fd == -1) {
|
||||||
ALOGE("failed to open %s for reading: %s", path, strerror(errno));
|
ALOGE("failed to open %s for reading: %s", path, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
unique_fd wfd(-1);
|
android::base::unique_fd wfd;
|
||||||
if (encrypted) {
|
if (encrypted) {
|
||||||
wfd = open(blk_dev, O_WRONLY);
|
wfd.reset(open(blk_dev, O_WRONLY));
|
||||||
if (!wfd) {
|
if (wfd == -1) {
|
||||||
ALOGE("failed to open fd for writing: %s", strerror(errno));
|
ALOGE("failed to open fd for writing: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -241,14 +242,14 @@ static int produce_block_map(const char* path, const char* map_file, const char*
|
|||||||
if ((tail+1) % WINDOW_SIZE == head) {
|
if ((tail+1) % WINDOW_SIZE == head) {
|
||||||
// write out head buffer
|
// write out head buffer
|
||||||
int block = head_block;
|
int block = head_block;
|
||||||
if (ioctl(fd.get(), FIBMAP, &block) != 0) {
|
if (ioctl(fd, FIBMAP, &block) != 0) {
|
||||||
ALOGE("failed to find block %d", head_block);
|
ALOGE("failed to find block %d", head_block);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
add_block_to_ranges(ranges, block);
|
add_block_to_ranges(ranges, block);
|
||||||
if (encrypted) {
|
if (encrypted) {
|
||||||
if (write_at_offset(buffers[head].data(), sb.st_blksize, wfd.get(),
|
if (write_at_offset(buffers[head].data(), sb.st_blksize, wfd,
|
||||||
static_cast<off64_t>(sb.st_blksize) * block) != 0) {
|
static_cast<off64_t>(sb.st_blksize) * block) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -260,7 +261,7 @@ static int produce_block_map(const char* path, const char* map_file, const char*
|
|||||||
if (encrypted) {
|
if (encrypted) {
|
||||||
size_t to_read = static_cast<size_t>(
|
size_t to_read = static_cast<size_t>(
|
||||||
std::min(static_cast<off64_t>(sb.st_blksize), sb.st_size - pos));
|
std::min(static_cast<off64_t>(sb.st_blksize), sb.st_size - pos));
|
||||||
if (!android::base::ReadFully(fd.get(), buffers[tail].data(), to_read)) {
|
if (!android::base::ReadFully(fd, buffers[tail].data(), to_read)) {
|
||||||
ALOGE("failed to read: %s", strerror(errno));
|
ALOGE("failed to read: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -277,14 +278,14 @@ static int produce_block_map(const char* path, const char* map_file, const char*
|
|||||||
while (head != tail) {
|
while (head != tail) {
|
||||||
// write out head buffer
|
// write out head buffer
|
||||||
int block = head_block;
|
int block = head_block;
|
||||||
if (ioctl(fd.get(), FIBMAP, &block) != 0) {
|
if (ioctl(fd, FIBMAP, &block) != 0) {
|
||||||
ALOGE("failed to find block %d", head_block);
|
ALOGE("failed to find block %d", head_block);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
add_block_to_ranges(ranges, block);
|
add_block_to_ranges(ranges, block);
|
||||||
if (encrypted) {
|
if (encrypted) {
|
||||||
if (write_at_offset(buffers[head].data(), sb.st_blksize, wfd.get(),
|
if (write_at_offset(buffers[head].data(), sb.st_blksize, wfd,
|
||||||
static_cast<off64_t>(sb.st_blksize) * block) != 0) {
|
static_cast<off64_t>(sb.st_blksize) * block) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -293,38 +294,36 @@ static int produce_block_map(const char* path, const char* map_file, const char*
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!android::base::WriteStringToFd(
|
if (!android::base::WriteStringToFd(
|
||||||
android::base::StringPrintf("%zu\n", ranges.size() / 2), mapfd.get())) {
|
android::base::StringPrintf("%zu\n", ranges.size() / 2), mapfd)) {
|
||||||
ALOGE("failed to write %s: %s", tmp_map_file.c_str(), strerror(errno));
|
ALOGE("failed to write %s: %s", tmp_map_file.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < ranges.size(); i += 2) {
|
for (size_t i = 0; i < ranges.size(); i += 2) {
|
||||||
if (!android::base::WriteStringToFd(
|
if (!android::base::WriteStringToFd(
|
||||||
android::base::StringPrintf("%d %d\n", ranges[i], ranges[i+1]), mapfd.get())) {
|
android::base::StringPrintf("%d %d\n", ranges[i], ranges[i+1]), mapfd)) {
|
||||||
ALOGE("failed to write %s: %s", tmp_map_file.c_str(), strerror(errno));
|
ALOGE("failed to write %s: %s", tmp_map_file.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fsync(mapfd.get()) == -1) {
|
if (fsync(mapfd) == -1) {
|
||||||
ALOGE("failed to fsync \"%s\": %s", tmp_map_file.c_str(), strerror(errno));
|
ALOGE("failed to fsync \"%s\": %s", tmp_map_file.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (close(mapfd.get() == -1)) {
|
if (close(mapfd.release()) == -1) {
|
||||||
ALOGE("failed to close %s: %s", tmp_map_file.c_str(), strerror(errno));
|
ALOGE("failed to close %s: %s", tmp_map_file.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
mapfd = -1;
|
|
||||||
|
|
||||||
if (encrypted) {
|
if (encrypted) {
|
||||||
if (fsync(wfd.get()) == -1) {
|
if (fsync(wfd) == -1) {
|
||||||
ALOGE("failed to fsync \"%s\": %s", blk_dev, strerror(errno));
|
ALOGE("failed to fsync \"%s\": %s", blk_dev, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (close(wfd.get()) == -1) {
|
if (close(wfd.release()) == -1) {
|
||||||
ALOGE("failed to close %s: %s", blk_dev, strerror(errno));
|
ALOGE("failed to close %s: %s", blk_dev, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
wfd = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rename(tmp_map_file.c_str(), map_file) == -1) {
|
if (rename(tmp_map_file.c_str(), map_file) == -1) {
|
||||||
@@ -334,20 +333,19 @@ static int produce_block_map(const char* path, const char* map_file, const char*
|
|||||||
// Sync dir to make rename() result written to disk.
|
// Sync dir to make rename() result written to disk.
|
||||||
std::string file_name = map_file;
|
std::string file_name = map_file;
|
||||||
std::string dir_name = dirname(&file_name[0]);
|
std::string dir_name = dirname(&file_name[0]);
|
||||||
unique_fd dfd(open(dir_name.c_str(), O_RDONLY | O_DIRECTORY));
|
android::base::unique_fd dfd(open(dir_name.c_str(), O_RDONLY | O_DIRECTORY));
|
||||||
if (!dfd) {
|
if (dfd == -1) {
|
||||||
ALOGE("failed to open dir %s: %s", dir_name.c_str(), strerror(errno));
|
ALOGE("failed to open dir %s: %s", dir_name.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (fsync(dfd.get()) == -1) {
|
if (fsync(dfd) == -1) {
|
||||||
ALOGE("failed to fsync %s: %s", dir_name.c_str(), strerror(errno));
|
ALOGE("failed to fsync %s: %s", dir_name.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (close(dfd.get() == -1)) {
|
if (close(dfd.release()) == -1) {
|
||||||
ALOGE("failed to close %s: %s", dir_name.c_str(), strerror(errno));
|
ALOGE("failed to close %s: %s", dir_name.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
dfd = -1;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -371,12 +369,12 @@ static int read_bootloader_message(bootloader_message* out) {
|
|||||||
ALOGE("failed to find /misc partition.");
|
ALOGE("failed to find /misc partition.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
unique_fd fd(open(misc_blk_device.c_str(), O_RDONLY));
|
android::base::unique_fd fd(open(misc_blk_device.c_str(), O_RDONLY));
|
||||||
if (!fd) {
|
if (fd == -1) {
|
||||||
ALOGE("failed to open %s: %s", misc_blk_device.c_str(), strerror(errno));
|
ALOGE("failed to open %s: %s", misc_blk_device.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!android::base::ReadFully(fd.get(), out, sizeof(*out))) {
|
if (!android::base::ReadFully(fd, out, sizeof(*out))) {
|
||||||
ALOGE("failed to read %s: %s", misc_blk_device.c_str(), strerror(errno));
|
ALOGE("failed to read %s: %s", misc_blk_device.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -389,17 +387,17 @@ static int write_bootloader_message(const bootloader_message* in) {
|
|||||||
ALOGE("failed to find /misc partition.");
|
ALOGE("failed to find /misc partition.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
unique_fd fd(open(misc_blk_device.c_str(), O_WRONLY | O_SYNC));
|
android::base::unique_fd fd(open(misc_blk_device.c_str(), O_WRONLY | O_SYNC));
|
||||||
if (!fd) {
|
if (fd == -1) {
|
||||||
ALOGE("failed to open %s: %s", misc_blk_device.c_str(), strerror(errno));
|
ALOGE("failed to open %s: %s", misc_blk_device.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!android::base::WriteFully(fd.get(), in, sizeof(*in))) {
|
if (!android::base::WriteFully(fd, in, sizeof(*in))) {
|
||||||
ALOGE("failed to write %s: %s", misc_blk_device.c_str(), strerror(errno));
|
ALOGE("failed to write %s: %s", misc_blk_device.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
// TODO: O_SYNC and fsync() duplicates each other?
|
// TODO: O_SYNC and fsync() duplicates each other?
|
||||||
if (fsync(fd.get()) == -1) {
|
if (fsync(fd) == -1) {
|
||||||
ALOGE("failed to fsync %s: %s", misc_blk_device.c_str(), strerror(errno));
|
ALOGE("failed to fsync %s: %s", misc_blk_device.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -465,8 +463,9 @@ static int uncrypt(const char* input_path, const char* map_file, int status_fd)
|
|||||||
static int uncrypt_wrapper(const char* input_path, const char* map_file,
|
static int uncrypt_wrapper(const char* input_path, const char* map_file,
|
||||||
const std::string& status_file) {
|
const std::string& status_file) {
|
||||||
// The pipe has been created by the system server.
|
// The pipe has been created by the system server.
|
||||||
unique_fd status_fd(open(status_file.c_str(), O_WRONLY | O_CREAT | O_SYNC, S_IRUSR | S_IWUSR));
|
android::base::unique_fd status_fd(open(status_file.c_str(),
|
||||||
if (!status_fd) {
|
O_WRONLY | O_CREAT | O_SYNC, S_IRUSR | S_IWUSR));
|
||||||
|
if (status_fd == -1) {
|
||||||
ALOGE("failed to open pipe \"%s\": %s", status_file.c_str(), strerror(errno));
|
ALOGE("failed to open pipe \"%s\": %s", status_file.c_str(), strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -474,46 +473,48 @@ static int uncrypt_wrapper(const char* input_path, const char* map_file,
|
|||||||
std::string package;
|
std::string package;
|
||||||
if (input_path == nullptr) {
|
if (input_path == nullptr) {
|
||||||
if (!find_uncrypt_package(UNCRYPT_PATH_FILE, &package)) {
|
if (!find_uncrypt_package(UNCRYPT_PATH_FILE, &package)) {
|
||||||
android::base::WriteStringToFd("-1\n", status_fd.get());
|
android::base::WriteStringToFd("-1\n", status_fd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
input_path = package.c_str();
|
input_path = package.c_str();
|
||||||
}
|
}
|
||||||
CHECK(map_file != nullptr);
|
CHECK(map_file != nullptr);
|
||||||
int status = uncrypt(input_path, map_file, status_fd.get());
|
int status = uncrypt(input_path, map_file, status_fd);
|
||||||
if (status != 0) {
|
if (status != 0) {
|
||||||
android::base::WriteStringToFd("-1\n", status_fd.get());
|
android::base::WriteStringToFd("-1\n", status_fd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
android::base::WriteStringToFd("100\n", status_fd.get());
|
android::base::WriteStringToFd("100\n", status_fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int clear_bcb(const std::string& status_file) {
|
static int clear_bcb(const std::string& status_file) {
|
||||||
unique_fd status_fd(open(status_file.c_str(), O_WRONLY | O_CREAT | O_SYNC, S_IRUSR | S_IWUSR));
|
android::base::unique_fd status_fd(open(status_file.c_str(),
|
||||||
if (!status_fd) {
|
O_WRONLY | O_CREAT | O_SYNC, S_IRUSR | S_IWUSR));
|
||||||
|
if (status_fd == -1) {
|
||||||
ALOGE("failed to open pipe \"%s\": %s", status_file.c_str(), strerror(errno));
|
ALOGE("failed to open pipe \"%s\": %s", status_file.c_str(), strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
bootloader_message boot = {};
|
bootloader_message boot = {};
|
||||||
if (write_bootloader_message(&boot) != 0) {
|
if (write_bootloader_message(&boot) != 0) {
|
||||||
android::base::WriteStringToFd("-1\n", status_fd.get());
|
android::base::WriteStringToFd("-1\n", status_fd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
android::base::WriteStringToFd("100\n", status_fd.get());
|
android::base::WriteStringToFd("100\n", status_fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int setup_bcb(const std::string& command_file, const std::string& status_file) {
|
static int setup_bcb(const std::string& command_file, const std::string& status_file) {
|
||||||
unique_fd status_fd(open(status_file.c_str(), O_WRONLY | O_CREAT | O_SYNC, S_IRUSR | S_IWUSR));
|
android::base::unique_fd status_fd(open(status_file.c_str(),
|
||||||
if (!status_fd) {
|
O_WRONLY | O_CREAT | O_SYNC, S_IRUSR | S_IWUSR));
|
||||||
|
if (status_fd == -1) {
|
||||||
ALOGE("failed to open pipe \"%s\": %s", status_file.c_str(), strerror(errno));
|
ALOGE("failed to open pipe \"%s\": %s", status_file.c_str(), strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
std::string content;
|
std::string content;
|
||||||
if (!android::base::ReadFileToString(command_file, &content)) {
|
if (!android::base::ReadFileToString(command_file, &content)) {
|
||||||
ALOGE("failed to read \"%s\": %s", command_file.c_str(), strerror(errno));
|
ALOGE("failed to read \"%s\": %s", command_file.c_str(), strerror(errno));
|
||||||
android::base::WriteStringToFd("-1\n", status_fd.get());
|
android::base::WriteStringToFd("-1\n", status_fd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
bootloader_message boot = {};
|
bootloader_message boot = {};
|
||||||
@@ -522,10 +523,10 @@ static int setup_bcb(const std::string& command_file, const std::string& status_
|
|||||||
strlcat(boot.recovery, content.c_str(), sizeof(boot.recovery));
|
strlcat(boot.recovery, content.c_str(), sizeof(boot.recovery));
|
||||||
if (write_bootloader_message(&boot) != 0) {
|
if (write_bootloader_message(&boot) != 0) {
|
||||||
ALOGE("failed to set bootloader message");
|
ALOGE("failed to set bootloader message");
|
||||||
android::base::WriteStringToFd("-1\n", status_fd.get());
|
android::base::WriteStringToFd("-1\n", status_fd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
android::base::WriteStringToFd("100\n", status_fd.get());
|
android::base::WriteStringToFd("100\n", status_fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
-62
@@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2015 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UNIQUE_FD_H
|
|
||||||
#define UNIQUE_FD_H
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
class unique_fd {
|
|
||||||
public:
|
|
||||||
unique_fd(int fd) : fd_(fd) { }
|
|
||||||
|
|
||||||
unique_fd(unique_fd&& uf) {
|
|
||||||
fd_ = uf.fd_;
|
|
||||||
uf.fd_ = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
~unique_fd() {
|
|
||||||
if (fd_ != -1) {
|
|
||||||
close(fd_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int get() {
|
|
||||||
return fd_;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Movable.
|
|
||||||
unique_fd& operator=(unique_fd&& uf) {
|
|
||||||
fd_ = uf.fd_;
|
|
||||||
uf.fd_ = -1;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit operator bool() const {
|
|
||||||
return fd_ != -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int fd_;
|
|
||||||
|
|
||||||
// Non-copyable.
|
|
||||||
unique_fd(const unique_fd&) = delete;
|
|
||||||
unique_fd& operator=(const unique_fd&) = delete;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // UNIQUE_FD_H
|
|
||||||
+17
-25
@@ -40,6 +40,7 @@
|
|||||||
|
|
||||||
#include <android-base/parseint.h>
|
#include <android-base/parseint.h>
|
||||||
#include <android-base/strings.h>
|
#include <android-base/strings.h>
|
||||||
|
#include <android-base/unique_fd.h>
|
||||||
|
|
||||||
#include "applypatch/applypatch.h"
|
#include "applypatch/applypatch.h"
|
||||||
#include "edify/expr.h"
|
#include "edify/expr.h"
|
||||||
@@ -48,7 +49,6 @@
|
|||||||
#include "minzip/Hash.h"
|
#include "minzip/Hash.h"
|
||||||
#include "ota_io.h"
|
#include "ota_io.h"
|
||||||
#include "print_sha1.h"
|
#include "print_sha1.h"
|
||||||
#include "unique_fd.h"
|
|
||||||
#include "updater.h"
|
#include "updater.h"
|
||||||
|
|
||||||
#define BLOCKSIZE 4096
|
#define BLOCKSIZE 4096
|
||||||
@@ -368,7 +368,7 @@ struct CommandParameters {
|
|||||||
std::string stashbase;
|
std::string stashbase;
|
||||||
bool canwrite;
|
bool canwrite;
|
||||||
int createdstash;
|
int createdstash;
|
||||||
int fd;
|
android::base::unique_fd fd;
|
||||||
bool foundwrites;
|
bool foundwrites;
|
||||||
bool isunresumable;
|
bool isunresumable;
|
||||||
int version;
|
int version;
|
||||||
@@ -577,9 +577,7 @@ static int LoadStash(CommandParameters& params, const std::string& base, const s
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fd = TEMP_FAILURE_RETRY(ota_open(fn.c_str(), O_RDONLY));
|
android::base::unique_fd fd(TEMP_FAILURE_RETRY(ota_open(fn.c_str(), O_RDONLY)));
|
||||||
unique_fd fd_holder(fd);
|
|
||||||
|
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
fprintf(stderr, "open \"%s\" failed: %s\n", fn.c_str(), strerror(errno));
|
fprintf(stderr, "open \"%s\" failed: %s\n", fn.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
@@ -634,9 +632,9 @@ static int WriteStash(const std::string& base, const std::string& id, int blocks
|
|||||||
|
|
||||||
fprintf(stderr, " writing %d blocks to %s\n", blocks, cn.c_str());
|
fprintf(stderr, " writing %d blocks to %s\n", blocks, cn.c_str());
|
||||||
|
|
||||||
int fd = TEMP_FAILURE_RETRY(ota_open(fn.c_str(), O_WRONLY | O_CREAT | O_TRUNC, STASH_FILE_MODE));
|
android::base::unique_fd fd(TEMP_FAILURE_RETRY(ota_open(fn.c_str(),
|
||||||
unique_fd fd_holder(fd);
|
O_WRONLY | O_CREAT | O_TRUNC,
|
||||||
|
STASH_FILE_MODE)));
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
fprintf(stderr, "failed to create \"%s\": %s\n", fn.c_str(), strerror(errno));
|
fprintf(stderr, "failed to create \"%s\": %s\n", fn.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
@@ -658,9 +656,8 @@ static int WriteStash(const std::string& base, const std::string& id, int blocks
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string dname = GetStashFileName(base, "", "");
|
std::string dname = GetStashFileName(base, "", "");
|
||||||
int dfd = TEMP_FAILURE_RETRY(ota_open(dname.c_str(), O_RDONLY | O_DIRECTORY));
|
android::base::unique_fd dfd(TEMP_FAILURE_RETRY(ota_open(dname.c_str(),
|
||||||
unique_fd dfd_holder(dfd);
|
O_RDONLY | O_DIRECTORY)));
|
||||||
|
|
||||||
if (dfd == -1) {
|
if (dfd == -1) {
|
||||||
fprintf(stderr, "failed to open \"%s\" failed: %s\n", dname.c_str(), strerror(errno));
|
fprintf(stderr, "failed to open \"%s\" failed: %s\n", dname.c_str(), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
@@ -942,8 +939,8 @@ static int LoadSrcTgtVersion3(CommandParameters& params, RangeSet& tgt, size_t&
|
|||||||
tgthash = params.tokens[params.cpos++];
|
tgthash = params.tokens[params.cpos++];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LoadSrcTgtVersion2(params, tgt, src_blocks, params.buffer, params.fd, params.stashbase,
|
if (LoadSrcTgtVersion2(params, tgt, src_blocks, params.buffer, params.fd,
|
||||||
&overlap) == -1) {
|
params.stashbase, &overlap) == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1385,9 +1382,7 @@ static Value* PerformBlockImageUpdate(const char* name, State* state, int /* arg
|
|||||||
return StringValue(strdup(""));
|
return StringValue(strdup(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
params.fd = TEMP_FAILURE_RETRY(ota_open(blockdev_filename->data, O_RDWR));
|
params.fd.reset(TEMP_FAILURE_RETRY(ota_open(blockdev_filename->data, O_RDWR)));
|
||||||
unique_fd fd_holder(params.fd);
|
|
||||||
|
|
||||||
if (params.fd == -1) {
|
if (params.fd == -1) {
|
||||||
fprintf(stderr, "open \"%s\" failed: %s\n", blockdev_filename->data, strerror(errno));
|
fprintf(stderr, "open \"%s\" failed: %s\n", blockdev_filename->data, strerror(errno));
|
||||||
return StringValue(strdup(""));
|
return StringValue(strdup(""));
|
||||||
@@ -1532,7 +1527,7 @@ pbiudone:
|
|||||||
if (ota_fsync(params.fd) == -1) {
|
if (ota_fsync(params.fd) == -1) {
|
||||||
fprintf(stderr, "fsync failed: %s\n", strerror(errno));
|
fprintf(stderr, "fsync failed: %s\n", strerror(errno));
|
||||||
}
|
}
|
||||||
// params.fd will be automatically closed because of the fd_holder above.
|
// params.fd will be automatically closed because it's a unique_fd.
|
||||||
|
|
||||||
// Only delete the stash if the update cannot be resumed, or it's
|
// Only delete the stash if the update cannot be resumed, or it's
|
||||||
// a verification run and we created the stash.
|
// a verification run and we created the stash.
|
||||||
@@ -1653,9 +1648,8 @@ Value* RangeSha1Fn(const char* name, State* state, int /* argc */, Expr* argv[])
|
|||||||
return StringValue(strdup(""));
|
return StringValue(strdup(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
int fd = ota_open(blockdev_filename->data, O_RDWR);
|
android::base::unique_fd fd(ota_open(blockdev_filename->data, O_RDWR));
|
||||||
unique_fd fd_holder(fd);
|
if (fd == -1) {
|
||||||
if (fd < 0) {
|
|
||||||
ErrorAbort(state, "open \"%s\" failed: %s", blockdev_filename->data, strerror(errno));
|
ErrorAbort(state, "open \"%s\" failed: %s", blockdev_filename->data, strerror(errno));
|
||||||
return StringValue(strdup(""));
|
return StringValue(strdup(""));
|
||||||
}
|
}
|
||||||
@@ -1676,7 +1670,7 @@ Value* RangeSha1Fn(const char* name, State* state, int /* argc */, Expr* argv[])
|
|||||||
for (size_t j = rs.pos[i*2]; j < rs.pos[i*2+1]; ++j) {
|
for (size_t j = rs.pos[i*2]; j < rs.pos[i*2+1]; ++j) {
|
||||||
if (read_all(fd, buffer, BLOCKSIZE) == -1) {
|
if (read_all(fd, buffer, BLOCKSIZE) == -1) {
|
||||||
ErrorAbort(state, "failed to read %s: %s", blockdev_filename->data,
|
ErrorAbort(state, "failed to read %s: %s", blockdev_filename->data,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
return StringValue(strdup(""));
|
return StringValue(strdup(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1707,8 +1701,7 @@ Value* CheckFirstBlockFn(const char* name, State* state, int argc, Expr* argv[])
|
|||||||
return StringValue(strdup(""));
|
return StringValue(strdup(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
int fd = ota_open(arg_filename->data, O_RDONLY);
|
android::base::unique_fd fd(ota_open(arg_filename->data, O_RDONLY));
|
||||||
unique_fd fd_holder(fd);
|
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
ErrorAbort(state, "open \"%s\" failed: %s", arg_filename->data, strerror(errno));
|
ErrorAbort(state, "open \"%s\" failed: %s", arg_filename->data, strerror(errno));
|
||||||
return StringValue(strdup(""));
|
return StringValue(strdup(""));
|
||||||
@@ -1718,8 +1711,7 @@ Value* CheckFirstBlockFn(const char* name, State* state, int argc, Expr* argv[])
|
|||||||
std::vector<uint8_t> block0_buffer(BLOCKSIZE);
|
std::vector<uint8_t> block0_buffer(BLOCKSIZE);
|
||||||
|
|
||||||
if (ReadBlocks(blk0, block0_buffer, fd) == -1) {
|
if (ReadBlocks(blk0, block0_buffer, fd) == -1) {
|
||||||
ErrorAbort(state, "failed to read %s: %s", arg_filename->data,
|
ErrorAbort(state, "failed to read %s: %s", arg_filename->data, strerror(errno));
|
||||||
strerror(errno));
|
|
||||||
return StringValue(strdup(""));
|
return StringValue(strdup(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user