diff options
-rw-r--r-- | adbbu/Android.mk | 2 | ||||
-rw-r--r-- | adbbu/libtwadbbu.cpp | 2 | ||||
-rw-r--r-- | adbbu/twadbstream.h | 2 | ||||
-rw-r--r-- | adbbu/twrpback.cpp | 296 | ||||
-rw-r--r-- | adbbu/twrpback.hpp | 2 | ||||
-rw-r--r-- | partition.cpp | 3 | ||||
-rw-r--r-- | twrpAdbBuFifo.cpp | 77 |
7 files changed, 246 insertions, 138 deletions
diff --git a/adbbu/Android.mk b/adbbu/Android.mk index efb5f9ae5..8f8dbd0fb 100644 --- a/adbbu/Android.mk +++ b/adbbu/Android.mk @@ -3,7 +3,7 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libtwadbbu LOCAL_MODULE_TAGS := optional -LOCAL_CFLAGS = -fno-strict-aliasing -D_LARGFILE_SOURCE +LOCAL_CFLAGS = -fno-strict-aliasing -D_LARGFILE_SOURCE #-D_DEBUG_ADB_BACKUP LOCAL_C_INCLUDES += bionic external/zlib ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) LOCAL_C_INCLUDES += external/stlport/stlport diff --git a/adbbu/libtwadbbu.cpp b/adbbu/libtwadbbu.cpp index 64e688c37..39803b0ce 100644 --- a/adbbu/libtwadbbu.cpp +++ b/adbbu/libtwadbbu.cpp @@ -75,7 +75,7 @@ std::vector<std::string> twadbbu::Get_ADB_Backup_Files(std::string fname) { return std::vector<std::string>(); } - while (1) { + while (true) { std::string cmdstr; int readbytes; if ((readbytes = read(fd, &buf, sizeof(buf))) > 0) { diff --git a/adbbu/twadbstream.h b/adbbu/twadbstream.h index fd8eba9f4..bef463cf8 100644 --- a/adbbu/twadbstream.h +++ b/adbbu/twadbstream.h @@ -39,7 +39,7 @@ #define TWMD5 "twverifymd5" //This command is compared to the md5trailer by ORS to verify transfer #define TWENDADB "twendadb" //End Protocol #define TWERROR "twerror" //Send error -#define ADB_BACKUP_VERSION 2 //Backup Version +#define ADB_BACKUP_VERSION 3 //Backup Version #define DATA_MAX_CHUNK_SIZE 1048576 //Maximum size between each data header #define MAX_ADB_READ 512 //align with default tar size for amount to read fom adb stream diff --git a/adbbu/twrpback.cpp b/adbbu/twrpback.cpp index d88a9c9da..56bc13d48 100644 --- a/adbbu/twrpback.cpp +++ b/adbbu/twrpback.cpp @@ -42,14 +42,15 @@ #include "../twrpAdbBuFifo.hpp" twrpback::twrpback(void) { + adbd_fp = NULL; read_fd = 0; write_fd = 0; adb_control_twrp_fd = 0; adb_control_bu_fd = 0; adb_read_fd = 0; adb_write_fd = 0; - adb_write_fd = 0; ors_fd = 0; + debug_adb_fd = 0; firstPart = true; createFifos(); adbloginit(); @@ -60,30 +61,32 @@ twrpback::~twrpback(void) { closeFifos(); } +void twrpback::printErrMsg(std::string msg, int errNum) { + std::stringstream str; + str << strerror(errNum); + adblogwrite(msg + " " + str.str() + "\n"); +} + void twrpback::createFifos(void) { if (mkfifo(TW_ADB_BU_CONTROL, 0666) < 0) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Unable to create TW_ADB_BU_CONTROL fifo: " + str.str() + "\n"); + std::string msg = "Unable to create TW_ADB_BU_CONTROL fifo: "; + printErrMsg(msg, errno); } if (mkfifo(TW_ADB_TWRP_CONTROL, 0666) < 0) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Unable to create TW_ADB_TWRP_CONTROL fifo: " + str.str() + "\n"); + std::string msg = "Unable to create TW_ADB_TWRP_CONTROL fifo: "; + printErrMsg(msg, errno); unlink(TW_ADB_BU_CONTROL); } } void twrpback::closeFifos(void) { if (unlink(TW_ADB_BU_CONTROL) < 0) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Unable to remove TW_ADB_BU_CONTROL: " + str.str()); + std::string msg = "Unable to remove TW_ADB_BU_CONTROL: "; + printErrMsg(msg, errno); } if (unlink(TW_ADB_TWRP_CONTROL) < 0) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Unable to remove TW_ADB_TWRP_CONTROL: " + str.str()); + std::string msg = "Unable to remove TW_ADB_TWRP_CONTROL: "; + printErrMsg(msg, errno); } } @@ -104,6 +107,10 @@ void twrpback::close_backup_fds() { close(adb_read_fd); if (adb_control_bu_fd > 0) close(adb_control_bu_fd); + #ifdef _DEBUG_ADB_BACKUP + if (debug_adb_fd > 0) + close(debug_adb_fd); + #endif if (adbd_fp != NULL) fclose(adbd_fp); if (access(TW_ADB_BACKUP, F_OK) == 0) @@ -123,15 +130,17 @@ void twrpback::close_restore_fds() { fclose(adbd_fp); if (access(TW_ADB_RESTORE, F_OK) == 0) unlink(TW_ADB_RESTORE); + #ifdef _DEBUG_ADB_BACKUP + if (debug_adb_fd > 0) + close(debug_adb_fd); + #endif } bool twrpback::backup(std::string command) { twrpMD5 digest; - bool breakloop = false; int bytes = 0, errctr = 0; char adbReadStream[MAX_ADB_READ]; uint64_t totalbytes = 0, dataChunkBytes = 0, fileBytes = 0; - int64_t count = false; // Count of how many blocks set uint64_t md5fnsize = 0; struct AdbBackupControlType endadb; @@ -153,13 +162,15 @@ bool twrpback::backup(std::string command) { } adblogwrite("opening TW_ADB_FIFO\n"); + write_fd = open(TW_ADB_FIFO, O_WRONLY); while (write_fd < 0) { write_fd = open(TW_ADB_FIFO, O_WRONLY); usleep(10000); errctr++; if (errctr > ADB_BU_MAX_ERROR) { - adblogwrite("Unable to open TW_ADB_FIFO\n"); + std::string msg = "Unable to open TW_ADB_FIFO"; + printErrMsg(msg, errno); close_backup_fds(); return false; } @@ -197,7 +208,7 @@ bool twrpback::backup(std::string command) { } //loop until TWENDADB sent - while (!breakloop) { + while (true) { if (read(adb_control_bu_fd, &cmd, sizeof(cmd)) > 0) { struct AdbBackupControlType structcmd; @@ -219,16 +230,15 @@ bool twrpback::backup(std::string command) { std::stringstream str; str << totalbytes; adblogwrite(str.str() + " total bytes written\n"); - breakloop = true; + break; } //we recieved the TWSTREAMHDR structure metadata to write to adb else if (cmdtype == TWSTREAMHDR) { writedata = false; adblogwrite("writing TWSTREAMHDR\n"); if (fwrite(cmd, 1, sizeof(cmd), adbd_fp) != sizeof(cmd)) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Error writing TWSTREAMHDR to adbd" + str.str() + "\n"); + std::string msg = "Error writing TWSTREAMHDR to adbd"; + printErrMsg(msg, errno); close_backup_fds(); return false; } @@ -245,6 +255,14 @@ bool twrpback::backup(std::string command) { md5fnsize = twimghdr.size; compressed = false; + #ifdef _DEBUG_ADB_BACKUP + std::string debug_fname = "/data/media/"; + debug_fname.append(basename(twimghdr.name)); + debug_fname.append("-backup.img"); + debug_adb_fd = open(debug_fname.c_str(), O_WRONLY | O_CREAT, 0666); + adblogwrite("Opening adb debug tar\n"); + #endif + if (fwrite(cmd, 1, sizeof(cmd), adbd_fp) != sizeof(cmd)) { adblogwrite("Error writing TWIMG to adbd\n"); close_backup_fds(); @@ -268,6 +286,14 @@ bool twrpback::backup(std::string command) { compressed = twfilehdr.compressed == 1 ? true: false; + #ifdef _DEBUG_ADB_BACKUP + std::string debug_fname = "/data/media/"; + debug_fname.append(basename(twfilehdr.name)); + debug_fname.append("-backup.tar"); + debug_adb_fd = open(debug_fname.c_str(), O_WRONLY | O_CREAT, 0666); + adblogwrite("Opening adb debug tar\n"); + #endif + if (fwrite(cmd, 1, sizeof(cmd), adbd_fp) != sizeof(cmd)) { adblogwrite("Error writing TWFN to adbd\n"); close_backup_fds(); @@ -296,30 +322,44 @@ bool twrpback::backup(std::string command) { digest.update((unsigned char *) writeAdbReadStream, bytes); if (fwrite(writeAdbReadStream, 1, bytes, adbd_fp) < 0) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Cannot write to adbd stream: " + str.str() + "\n"); + std::string msg = "Cannot write to adbd stream: "; + printErrMsg(msg, errno); + } + #if defined(_DEBUG_ADB_BACKUP) + if (write(debug_adb_fd, writeAdbReadStream, bytes) < 1) { + std::string msg = "Cannot write to ADB_CONTROL_READ_FD: "; + printErrMsg(msg, errno); + close_restore_fds(); + return false; } + #endif fflush(adbd_fp); delete [] writeAdbReadStream; memset(adbReadStream, 0, sizeof(adbReadStream)); } - count = fileBytes / DATA_MAX_CHUNK_SIZE + 1; - count = count * DATA_MAX_CHUNK_SIZE; - if (fileBytes % DATA_MAX_CHUNK_SIZE != 0) { - char padding[count - fileBytes]; + int64_t count = fileBytes / DATA_MAX_CHUNK_SIZE + 1; + uint64_t ceilingBytes = count * DATA_MAX_CHUNK_SIZE; + char padding[ceilingBytes - fileBytes]; int paddingBytes = sizeof(padding); + memset(padding, 0, paddingBytes); std::stringstream paddingStr; paddingStr << paddingBytes; - memset(padding, 0, paddingBytes); adblogwrite("writing padding to stream: " + paddingStr.str() + " bytes\n"); if (fwrite(padding, 1, paddingBytes, adbd_fp) != sizeof(padding)) { adblogwrite("Error writing padding to adbd\n"); close_backup_fds(); return false; } + #if defined(_DEBUG_ADB_BACKUP) + if (write(debug_adb_fd, padding, paddingBytes) < 1) { + std::string msg = "Cannot write to ADB_CONTROL_READ_FD: "; + printErrMsg(msg, errno); + close_restore_fds(); + return false; + } + #endif totalbytes += paddingBytes; digest.update((unsigned char *) padding, paddingBytes); fflush(adbd_fp); @@ -353,6 +393,7 @@ bool twrpback::backup(std::string command) { fileBytes = 0; } memset(&cmd, 0, sizeof(cmd)); + dataChunkBytes = 0; } //If we are to write data because of a new file stream, lets write all the data. //This will allow us to not write data after a command structure has been written @@ -365,6 +406,7 @@ bool twrpback::backup(std::string command) { close_backup_fds(); return false; } + fileBytes += MAX_ADB_READ; fflush(adbd_fp); firstDataPacket = false; dataChunkBytes += sizeof(adbReadStream); @@ -383,6 +425,14 @@ bool twrpback::backup(std::string command) { close_backup_fds(); return false; } + #ifdef _DEBUG_ADB_BACKUP + if (write(debug_adb_fd, writeAdbReadStream, bytes) < 1) { + std::string msg = "Cannot write to ADB_CONTROL_READ_FD: "; + printErrMsg(msg, errno); + close_restore_fds(); + return false; + } + #endif fflush(adbd_fp); delete [] writeAdbReadStream; @@ -409,12 +459,19 @@ bool twrpback::backup(std::string command) { digest.update((unsigned char *) writeAdbReadStream, bytes); if (fwrite(writeAdbReadStream, 1, bytes, adbd_fp) < 0) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Cannot write to adbd stream: " + str.str() + "\n"); + std::string msg = "Cannot write to adbd stream: "; + printErrMsg(msg, errno); close_restore_fds(); return false; } + #ifdef _DEBUG_ADB_BACKUP + if (write(debug_adb_fd, writeAdbReadStream, bytes) < 1) { + std::string msg = "Cannot write to ADB_CONTROL_READ_FD: "; + printErrMsg(msg, errno); + close_restore_fds(); + return false; + } + #endif fflush(adbd_fp); delete [] writeAdbReadStream; } @@ -440,7 +497,7 @@ bool twrpback::backup(std::string command) { } fflush(adbd_fp); close_backup_fds(); - return 0; + return true; } bool twrpback::restore(void) { @@ -450,16 +507,15 @@ bool twrpback::restore(void) { struct AdbBackupControlType structcmd; int errctr = 0; uint64_t totalbytes = 0, dataChunkBytes = 0; - uint64_t md5fnsize = 0; + uint64_t md5fnsize = 0, fileBytes = 0; bool writedata, read_from_adb; - bool breakloop, eofsent, md5trsent; - bool compressed; - bool md5TrailerReceived = false; + bool eofsent, md5trsent, md5sumdata; + bool compressed, tweofrcvd, extraData; - breakloop = false; read_from_adb = true; signal(SIGPIPE, SIG_IGN); + signal(SIGHUP, SIG_IGN); adbd_fp = fdopen(adbd_fd, "r"); if (adbd_fp == NULL) { @@ -481,7 +537,8 @@ bool twrpback::restore(void) { write_fd = open(TW_ADB_FIFO, O_WRONLY); errctr++; if (errctr > ADB_BU_MAX_ERROR) { - adblogwrite("Unable to open TW_ADB_FIFO\n"); + std::string msg = "Unable to open TW_ADB_FIFO."; + printErrMsg(msg, errno); close_restore_fds(); return false; } @@ -501,9 +558,8 @@ bool twrpback::restore(void) { adblogwrite("opening TW_ADB_BU_CONTROL\n"); adb_control_bu_fd = open(TW_ADB_BU_CONTROL, O_RDONLY | O_NONBLOCK); if (adb_control_bu_fd < 0) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Unable to open TW_ADB_BU_CONTROL for writing. " + str.str() + "\n"); + std::string msg = "Unable to open TW_ADB_BU_CONTROL for writing."; + printErrMsg(msg, errno); close_restore_fds(); return false; } @@ -511,9 +567,8 @@ bool twrpback::restore(void) { adblogwrite("opening TW_ADB_TWRP_CONTROL\n"); adb_control_twrp_fd = open(TW_ADB_TWRP_CONTROL, O_WRONLY | O_NONBLOCK); if (adb_control_twrp_fd < 0) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Unable to open TW_ADB_TWRP_CONTROL for writing. " + str.str() + ". Retrying...\n"); + std::string msg = "Unable to open TW_ADB_TWRP_CONTROL for writing. Retrying..."; + printErrMsg(msg, errno); while (adb_control_twrp_fd < 0) { adb_control_twrp_fd = open(TW_ADB_TWRP_CONTROL, O_WRONLY | O_NONBLOCK); usleep(10000); @@ -527,7 +582,7 @@ bool twrpback::restore(void) { } //Loop until we receive TWENDADB from TWRP - while (!breakloop) { + while (true) { memset(&cmd, 0, sizeof(cmd)); if (read(adb_control_bu_fd, &cmd, sizeof(cmd)) > 0) { struct AdbBackupControlType structcmd; @@ -537,17 +592,14 @@ bool twrpback::restore(void) { //If we receive TWEOF from TWRP close adb data fifo if (cmdtype == TWEOF) { adblogwrite("Received TWEOF\n"); - struct AdbBackupControlType tweof; - - memset(&tweof, 0, sizeof(tweof)); - memcpy(&tweof, readAdbStream, sizeof(readAdbStream)); read_from_adb = true; + tweofrcvd = true; + close(adb_write_fd); } //Break when TWRP sends TWENDADB else if (cmdtype == TWENDADB) { adblogwrite("Received TWENDADB\n"); - breakloop = true; - close_restore_fds(); + break; } //we received an error, exit and unlink else if (cmdtype == TWERROR) { @@ -568,6 +620,7 @@ bool twrpback::restore(void) { struct AdbBackupControlType endadb; uint32_t crc, endadbcrc; + md5sumdata = false; memset(&endadb, 0, sizeof(endadb)); memcpy(&endadb, readAdbStream, sizeof(readAdbStream)); endadbcrc = endadb.crc; @@ -576,11 +629,10 @@ bool twrpback::restore(void) { crc = crc32(crc, (const unsigned char*) &endadb, sizeof(endadb)); if (crc == endadbcrc) { - adblogwrite("Sending TWENDADB\n"); + adblogwrite("sending TWENDADB\n"); if (write(adb_control_twrp_fd, &endadb, sizeof(endadb)) < 1) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Cannot write to ADB_CONTROL_READ_FD: " + str.str() + "\n"); + std::string msg = "Cannot write to ADB_CONTROL_READ_FD: "; + printErrMsg(msg, errno); close_restore_fds(); return false; } @@ -599,6 +651,7 @@ bool twrpback::restore(void) { ADBSTRUCT_STATIC_ASSERT(sizeof(cnthdr) == MAX_ADB_READ); + md5sumdata = false; memset(&cnthdr, 0, sizeof(cnthdr)); memcpy(&cnthdr, readAdbStream, sizeof(readAdbStream)); cnthdrcrc = cnthdr.crc; @@ -609,9 +662,8 @@ bool twrpback::restore(void) { if (crc == cnthdrcrc) { adblogwrite("Restoring TWSTREAMHDR\n"); if (write(adb_control_twrp_fd, readAdbStream, sizeof(readAdbStream)) < 0) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Cannot write to adb_control_twrp_fd: " + str.str() + "\n"); + std::string msg = "Cannot write to adb_control_twrp_fd: "; + printErrMsg(msg, errno); close_restore_fds(); return false; } @@ -626,6 +678,11 @@ bool twrpback::restore(void) { else if (cmdtype == TWIMG) { struct twfilehdr twimghdr; uint32_t crc, twimghdrcrc; + md5sumdata = false; + fileBytes = 0; + read_from_adb = true; + dataChunkBytes = 0; + extraData = false; digest.init(); adblogwrite("Restoring TWIMG\n"); @@ -639,9 +696,8 @@ bool twrpback::restore(void) { crc = crc32(crc, (const unsigned char*) &twimghdr, sizeof(twimghdr)); if (crc == twimghdrcrc) { if (write(adb_control_twrp_fd, readAdbStream, sizeof(readAdbStream)) < 1) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Cannot write to adb_control_twrp_fd: " + str.str() + "\n"); + std::string msg = "Cannot write to adb_control_twrp_fd: "; + printErrMsg(msg, errno); close_restore_fds(); return false; } @@ -651,6 +707,16 @@ bool twrpback::restore(void) { close_restore_fds(); return false; } + + #ifdef _DEBUG_ADB_BACKUP + std::string debug_fname = "/data/media/"; + debug_fname.append(basename(twimghdr.name)); + debug_fname.append("-restore.img"); + adblogwrite("image: " + debug_fname + "\n"); + debug_adb_fd = open(debug_fname.c_str(), O_WRONLY | O_CREAT, 0666); + adblogwrite("Opened restore image\n"); + #endif + adblogwrite("opening TW_ADB_RESTORE\n"); adb_write_fd = open(TW_ADB_RESTORE, O_WRONLY); } @@ -658,6 +724,11 @@ bool twrpback::restore(void) { else if (cmdtype == TWFN) { struct twfilehdr twfilehdr; uint32_t crc, twfilehdrcrc; + fileBytes = 0; + md5sumdata = false; + read_from_adb = true; + dataChunkBytes = 0; + extraData = false; digest.init(); adblogwrite("Restoring TWFN\n"); @@ -672,9 +743,8 @@ bool twrpback::restore(void) { if (crc == twfilehdrcrc) { if (write(adb_control_twrp_fd, readAdbStream, sizeof(readAdbStream)) < 1) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Cannot write to adb_control_twrp_fd: " + str.str() + "\n"); + std::string msg = "Cannot write to adb_control_twrp_fd: "; + printErrMsg(msg, errno); close_restore_fds(); return false; } @@ -685,75 +755,104 @@ bool twrpback::restore(void) { return false; } + #ifdef _DEBUG_ADB_BACKUP + std::string debug_fname = "/data/media/"; + debug_fname.append(basename(twfilehdr.name)); + debug_fname.append("-restore.tar"); + adblogwrite("tar: " + debug_fname + "\n"); + debug_adb_fd = open(debug_fname.c_str(), O_WRONLY | O_CREAT, 0666); + adblogwrite("Opened restore tar\n"); + #endif + + compressed = twfilehdr.compressed == 1 ? true: false; adblogwrite("opening TW_ADB_RESTORE\n"); adb_write_fd = open(TW_ADB_RESTORE, O_WRONLY); } else if (cmdtype == MD5TRAILER) { - read_from_adb = false; //don't read from adb until TWRP sends TWEOF - close(adb_write_fd); - md5TrailerReceived = true; + if (fileBytes >= md5fnsize) + close(adb_write_fd); + if (tweofrcvd) { + read_from_adb = true; + tweofrcvd = false; + } + else + read_from_adb = false; //don't read from adb until TWRP sends TWEOF + md5sumdata = false; if (!checkMD5Trailer(readAdbStream, md5fnsize, &digest)) { close_restore_fds(); - return false; + break; } + continue; } //Send the tar or partition image md5 to TWRP else if (cmdtype == TWDATA) { dataChunkBytes += sizeof(readAdbStream); - while (1) { + while (true) { if ((readbytes = fread(readAdbStream, 1, sizeof(readAdbStream), adbd_fp)) != sizeof(readAdbStream)) { close_restore_fds(); return false; } - memcpy(&structcmd, readAdbStream, sizeof(readAdbStream)); - - char *readAdbReadStream = new char [readbytes]; - memcpy(readAdbReadStream, readAdbStream, readbytes); std::string cmdtype = structcmd.get_type(); + dataChunkBytes += readbytes; - delete [] readAdbReadStream; totalbytes += readbytes; - digest.update((unsigned char*)readAdbReadStream, readbytes); + fileBytes += readbytes; if (cmdtype == MD5TRAILER) { - read_from_adb = false; //don't read from adb until TWRP sends TWEOF - close(adb_write_fd); + if (fileBytes >= md5fnsize) + close(adb_write_fd); + if (tweofrcvd) { + tweofrcvd = false; + read_from_adb = true; + } + else + read_from_adb = false; //don't read from adb until TWRP sends TWEOF if (!checkMD5Trailer(readAdbStream, md5fnsize, &digest)) { close_restore_fds(); - return false; + break; } break; } + digest.update((unsigned char*)readAdbStream, readbytes); + + read_from_adb = true; + + #ifdef _DEBUG_ADB_BACKUP + if (write(debug_adb_fd, readAdbStream, sizeof(readAdbStream)) < 0) { + std::string msg = "Cannot write to ADB_CONTROL_READ_FD: "; + printErrMsg(msg, errno); + close_restore_fds(); + return false; + } + #endif if (write(adb_write_fd, readAdbStream, sizeof(readAdbStream)) < 0) { - adblogwrite("end of stream reached.\n"); + std::string msg = "Cannot write to TWRP ADB FIFO: "; + md5sumdata = true; + printErrMsg(msg, errno); + adblogwrite("end of stream reached.\n"); break; } + if (dataChunkBytes == DATA_MAX_CHUNK_SIZE) { dataChunkBytes = 0; + md5sumdata = false; break; } - memset(&readAdbStream, 0, sizeof(readAdbStream)); } } - else { - if (!md5TrailerReceived) { - char *readAdbReadStream = new char [readbytes]; - memcpy(readAdbReadStream, readAdbStream, readbytes); - digest.update((unsigned char*)readAdbReadStream, readbytes); - totalbytes += readbytes; - delete [] readAdbReadStream; - } - + else if (md5sumdata) { + digest.update((unsigned char*)readAdbStream, sizeof(readAdbStream)); + md5sumdata = true; } } } } - std::stringstream str; str << totalbytes; + close_restore_fds(); adblogwrite(str.str() + " bytes restored from adbbackup\n"); return true; } @@ -786,7 +885,6 @@ bool twrpback::checkMD5Trailer(char readAdbStream[], uint64_t md5fnsize, twrpMD5 uint32_t crc, md5trcrc, md5ident, md5identmatch; ADBSTRUCT_STATIC_ASSERT(sizeof(md5tr) == MAX_ADB_READ); - memset(&md5tr, 0, sizeof(md5tr)); memcpy(&md5tr, readAdbStream, MAX_ADB_READ); md5ident = md5tr.ident; @@ -804,9 +902,8 @@ bool twrpback::checkMD5Trailer(char readAdbStream[], uint64_t md5fnsize, twrpMD5 crc = crc32(crc, (const unsigned char*) &md5tr, sizeof(md5tr)); if (crc == md5trcrc) { if (write(adb_control_twrp_fd, &md5tr, sizeof(md5tr)) < 1) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Cannot write to adb_control_twrp_fd: " + str.str() + "\n"); + std::string msg = "Cannot write to adb_control_twrp_fd: "; + printErrMsg(msg, errno); close_restore_fds(); return false; } @@ -825,13 +922,10 @@ bool twrpback::checkMD5Trailer(char readAdbStream[], uint64_t md5fnsize, twrpMD5 std::string md5string = digest->return_digest_string(); strncpy(md5.md5, md5string.c_str(), sizeof(md5.md5)); - adblogwrite("sending MD5 verification\n"); - std::stringstream dstr; - dstr << adb_control_twrp_fd; + adblogwrite("sending MD5 verification: " + md5string + "\n"); if (write(adb_control_twrp_fd, &md5, sizeof(md5)) < 1) { - std::stringstream str; - str << strerror(errno); - adblogwrite("Cannot write to adb_control_twrp_fd: " + str.str() + "\n"); + std::string msg = "Cannot write to adb_control_twrp_fd: "; + printErrMsg(msg, errno); close_restore_fds(); return false; } diff --git a/adbbu/twrpback.hpp b/adbbu/twrpback.hpp index c52da3ea7..edc162651 100644 --- a/adbbu/twrpback.hpp +++ b/adbbu/twrpback.hpp @@ -42,6 +42,7 @@ private: int adb_control_bu_fd; // fd for twrp to bu communication int adb_read_fd; // adb read data stream int adb_write_fd; // adb write data stream + int debug_adb_fd; // fd to write debug tars bool firstPart; // first partition in the stream FILE *adbd_fp; // file pointer for adb stream char cmd[512]; // store result of commands @@ -54,6 +55,7 @@ private: void close_backup_fds(); // close backup resources void close_restore_fds(); // close restore resources bool checkMD5Trailer(char adbReadStream[], uint64_t md5fnsize, twrpMD5* digest); // Check MD5 Trailer + void printErrMsg(std::string msg, int errNum); // print error msg to adb log }; #endif // _TWRPBACK_HPP diff --git a/partition.cpp b/partition.cpp index 59bd16831..0272708cd 100644 --- a/partition.cpp +++ b/partition.cpp @@ -2414,8 +2414,9 @@ bool TWPartition::Raw_Read_Write(PartitionSettings *part_settings) { srcfn = Actual_Block_Device; if (part_settings->adbbackup) destfn = TW_ADB_BACKUP; - else + else { destfn = part_settings->Backup_Folder + "/" + Backup_FileName; + } } else { destfn = Actual_Block_Device; diff --git a/twrpAdbBuFifo.cpp b/twrpAdbBuFifo.cpp index 0c7dd1524..1147d63db 100644 --- a/twrpAdbBuFifo.cpp +++ b/twrpAdbBuFifo.cpp @@ -103,6 +103,8 @@ bool twrpAdbBuFifo::Backup_ADB_Command(std::string Options) { if (args[1].compare("--twrp") != 0) { gui_err("twrp_adbbu_option=--twrp option is required to enable twrp adb backup"); + if (!twadbbu::Write_TWERROR()) + LOGERR("Unable to write to ADB Backup\n"); sleep(2); return false; } @@ -130,9 +132,11 @@ bool twrpAdbBuFifo::Backup_ADB_Command(std::string Options) { } else { gui_msg(Msg(msg::kError, "partition_not_found=path: {1} not found in partition list")(path)); - return false; - } + if (!twadbbu::Write_TWERROR()) + LOGERR("Unable to write to TWRP ADB Backup.\n"); + return false; } +} if (Backup_List.empty()) { DataManager::GetValue("tw_backup_list", Backup_List); @@ -187,7 +191,7 @@ bool twrpAdbBuFifo::Restore_ADB_Backup(void) { DataManager::SetValue("tw_action_text2", ""); gui_changePage("action_page"); - while (1) { + while (true) { memset(&cmd, 0, sizeof(cmd)); if (read(adb_control_twrp_fd, cmd, sizeof(cmd)) > 0) { struct AdbBackupControlType cmdstruct; @@ -202,37 +206,49 @@ bool twrpAdbBuFifo::Restore_ADB_Backup(void) { LOGINFO("ADB version: %" PRIu64 "\n", twhdr.version); if (twhdr.version != ADB_BACKUP_VERSION) { LOGERR("Incompatible adb backup version!\n"); + ret = false; break; } partition_count = twhdr.partition_count; } else if (cmdtype == MD5TRAILER) { - LOGINFO("Restoring MD5TRAILER\n"); + LOGINFO("Reading ADB Backup MD5TRAILER\n"); memcpy(&adbmd5, cmd, sizeof(cmd)); } else if (cmdtype == TWMD5) { - struct AdbBackupFileTrailer md5check; - LOGINFO("Restoring TWMD5\n"); - - memset(&md5check, 0, sizeof(md5check)); - memcpy(&md5check, cmd, sizeof(cmd)); - if (strcmp(md5check.md5, adbmd5.md5) != 0) { - LOGERR("md5 doesn't match!\n"); - LOGERR("file md5: %s\n", adbmd5.md5); - LOGERR("check md5: %s\n", md5check.md5); - ret = false; - break; - } - else { - LOGINFO("adbrestore md5 matches\n"); - LOGINFO("adbmd5.md5: %s\n", adbmd5.md5); - LOGINFO("md5check.md5: %s\n", md5check.md5); - ret = true; - break; + int check_digest; + + DataManager::GetValue(TW_SKIP_DIGEST_CHECK_VAR, check_digest); + if (check_digest > 0) { + TWFunc::GUI_Operation_Text(TW_VERIFY_DIGEST_TEXT, gui_parse_text("{@verifying_digest}")); + gui_msg("verifying_digest=Verifying Digest"); + struct AdbBackupFileTrailer md5check; + LOGINFO("Verifying md5sums\n"); + + memset(&md5check, 0, sizeof(md5check)); + memcpy(&md5check, cmd, sizeof(cmd)); + if (strcmp(md5check.md5, adbmd5.md5) != 0) { + LOGERR("md5 doesn't match!\n"); + LOGERR("Stored file md5: %s\n", adbmd5.md5); + LOGERR("ADB Backup check md5: %s\n", md5check.md5); + ret = false; + break; + } + else { + LOGINFO("ADB Backup md5 matches\n"); + LOGINFO("Stored file md5: %s\n", adbmd5.md5); + LOGINFO("ADB Backup check md5: %s\n", md5check.md5); + continue; + } + } else { + gui_msg("skip_digest=Skipping Digest check based on user setting."); + continue; } + } else if (cmdtype == TWENDADB) { LOGINFO("received TWENDADB\n"); + ret = 1; break; } else { @@ -270,6 +286,7 @@ bool twrpAdbBuFifo::Restore_ADB_Backup(void) { if (!PartitionManager.Restore_Partition(&part_settings)) { LOGERR("ADB Restore failed.\n"); ret = false; + break; } } else if (cmdtype == TWFN) { @@ -296,17 +313,11 @@ bool twrpAdbBuFifo::Restore_ADB_Backup(void) { if (path.compare("/system") == 0) { if (part_settings.Part->Is_Read_Only()) { - struct AdbBackupControlType twerror; - strncpy(twerror.start_of_header, TWRP, sizeof(twerror.start_of_header)); - strncpy(twerror.type, TWERROR, sizeof(twerror.type)); - memset(twerror.space, 0, sizeof(twerror.space)); - twerror.crc = crc32(0L, Z_NULL, 0); - twerror.crc = crc32(twerror.crc, (const unsigned char*) &twerror, sizeof(twerror)); - if (write(adb_control_bu_fd, &twerror, sizeof(twerror)) < 0) { - LOGERR("Cannot write to ADB_CONTROL_BU_FD: %s\n", strerror(errno)); - } + if (!twadbbu::Write_TWERROR()) + LOGERR("Unable to write to TWRP ADB Backup.\n"); gui_msg(Msg(msg::kError, "restore_read_only=Cannot restore {1} -- mounted read only.")(part_settings.Part->Backup_Display_Name)); - return false; + ret = false; + break; } } @@ -320,6 +331,7 @@ bool twrpAdbBuFifo::Restore_ADB_Backup(void) { if (!PartitionManager.Restore_Partition(&part_settings)) { LOGERR("ADB Restore failed.\n"); ret = false; + break; } } } @@ -337,6 +349,5 @@ bool twrpAdbBuFifo::Restore_ADB_Backup(void) { DataManager::SetValue("ui_progress", 100); gui_changePage("main"); close(adb_control_bu_fd); - close(adb_control_twrp_fd); return ret; } |