aboutsummaryrefslogtreecommitdiffstats
path: root/uncrypt/uncrypt.cpp
diff options
context:
space:
mode:
authorTianjie Xu <xunchang@google.com>2016-06-30 15:31:51 -0700
committerTianjie Xu <xunchang@google.com>2016-11-11 13:51:15 -0800
commit7ceff3e0030cd635f6b67153494df653c8bff3e5 (patch)
treef4ef81c91bc7af1ec97976cdae165c5f9902245a /uncrypt/uncrypt.cpp
parent52e2a97aa78898f9d9bf2ee887f2c3363e29c87b (diff)
downloadandroid_bootable_recovery-7ceff3e0030cd635f6b67153494df653c8bff3e5.tar.gz
android_bootable_recovery-7ceff3e0030cd635f6b67153494df653c8bff3e5.tar.bz2
android_bootable_recovery-7ceff3e0030cd635f6b67153494df653c8bff3e5.zip
Allow uncrypt to work without socket communication
It was inconvenient to uncrypt a update package under adb shell because the uncrypt executable required a socket to start its job. Add a workaround to allow uncrypt executes without socket communication. Test: run uncrypt under adb shell, and the block map generates successfully Bug: 29906218 Change-Id: Ibc328b31636d925dc429ede8dcec7392a721dd53 (cherry picked from commit 28c1e5d3aa9610db6e141380b1435937fc7f07db)
Diffstat (limited to 'uncrypt/uncrypt.cpp')
-rw-r--r--uncrypt/uncrypt.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/uncrypt/uncrypt.cpp b/uncrypt/uncrypt.cpp
index a5d692bb..e1b6a1c2 100644
--- a/uncrypt/uncrypt.cpp
+++ b/uncrypt/uncrypt.cpp
@@ -210,6 +210,11 @@ static const char* find_block_device(const char* path, bool* encryptable, bool*
}
static bool write_status_to_socket(int status, int socket) {
+ // If socket equals -1, uncrypt is in debug mode without socket communication.
+ // Skip writing and return success.
+ if (socket == -1) {
+ return true;
+ }
int status_out = htonl(status);
return android::base::WriteFully(socket, &status_out, sizeof(int));
}
@@ -566,7 +571,7 @@ static void usage(const char* exename) {
}
int main(int argc, char** argv) {
- enum { UNCRYPT, SETUP_BCB, CLEAR_BCB } action;
+ enum { UNCRYPT, SETUP_BCB, CLEAR_BCB, UNCRYPT_DEBUG } action;
const char* input_path = nullptr;
const char* map_file = CACHE_BLOCK_MAP.c_str();
@@ -579,7 +584,7 @@ int main(int argc, char** argv) {
} else if (argc == 3) {
input_path = argv[1];
map_file = argv[2];
- action = UNCRYPT;
+ action = UNCRYPT_DEBUG;
} else {
usage(argv[0]);
return 2;
@@ -593,6 +598,17 @@ int main(int argc, char** argv) {
return 1;
}
+ if (action == UNCRYPT_DEBUG) {
+ LOG(INFO) << "uncrypt called in debug mode, skip socket communication\n";
+ bool success = uncrypt_wrapper(input_path, map_file, -1);
+ if (success) {
+ LOG(INFO) << "uncrypt succeeded\n";
+ } else{
+ LOG(INFO) << "uncrypt failed\n";
+ }
+ return success ? 0 : 1;
+ }
+
// c3. The socket is created by init when starting the service. uncrypt
// will use the socket to communicate with its caller.
android::base::unique_fd service_socket(android_get_control_socket(UNCRYPT_SOCKET.c_str()));