Files
android_bootable_recovery/adbbu/twadbstream.h
bigbiff bigbiff 38b83c1da4 ADB Backup: fix md5 check on restore.
Add debug capability.
Fix backup of images after tarred partitions with too much padding
Add more md5 logging.
Skip digest check if selected.
Change ADB Backup version to 3 for new fixes to image padding.
Change-Id: I0f76c0733c523717e4797d1a14c3ae47d046fc8c
2018-05-25 18:42:16 +02:00

113 lines
5.2 KiB
C++

/*
TWRP is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
TWRP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with TWRP. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __TWADBSTREAM_H
#define __TWADBSTREAM_H
#define TWRPARG "--twrp"
#define TWRP_BACKUP_ARG "backup"
#define TWRP_RESTORE_ARG "restore"
#define TWRP_STREAM_ARG "stream"
#define TW_ADB_BACKUP "/tmp/twadbbackup" //FIFO for adb backup
#define TW_ADB_RESTORE "/tmp/twadbrestore" //FIFO for adb restore
#define TW_ADB_BU_CONTROL "/tmp/twadbbucontrol" //FIFO for sending control from TWRP to ADB Backup
#define TW_ADB_TWRP_CONTROL "/tmp/twadbtwrpcontrol" //FIFO for sending control from ADB Backup to TWRP
#define TWRP "TWRP" //Magic Value
#define ADB_BU_MAX_ERROR 20 //Max amount of errors for while loops
#define ADB_BACKUP_OP "adbbackup"
#define ADB_RESTORE_OP "adbrestore"
//ADB Backup Control Commands
#define TWSTREAMHDR "twstreamheader" //TWRP Parititon Count Control
#define TWFN "twfilename" //TWRP Filename Control
#define TWIMG "twimage" //TWRP Image name Control
#define TWEOF "tweof" //End of File for Image/File
#define MD5TRAILER "md5trailer" //Image/File MD5 Trailer
#define TWDATA "twdatablock" // twrp adb backup data block header
#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 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
/*
structs for adb backup need to align to 512 bytes for reading 512
bytes at a time
Each struct contains a crc field so that when we are checking for commands
and the crc doesn't match we still assume it's data matching the command
struct but not really a command
*/
/* stream format:
| TW ADB Backup Header |
| TW File Stream Header |
| File Data |
| File/Image MD5 Trailer |
| TW File Stream Header |
| File Data |
| File/Image MD5 Trailer |
| etc... |
*/
//determine whether struct is 512 bytes, if not fail compilation
#define ADBSTRUCT_STATIC_ASSERT(structure) typedef char adb_assertion[( !!(structure) )*2-1 ]
//generic cmd structure to align fields for sending commands to and from adb backup
struct AdbBackupControlType {
char start_of_header[8]; //stores the magic value #define TWRP
char type[16]; //stores the type of command, TWENDADB, TWCNT, TWEOF, TWMD5, TWDATA and TWERROR
uint32_t crc; //stores the zlib 32 bit crc of the AdbBackupControlType struct to allow for making sure we are processing metadata
char space[484]; //stores space to align the struct to 512 bytes
//return a C++ string while not reading outside the type char array
std::string get_type() {
return std::string(type, strnlen(type, sizeof(type)-1));
}
};
//general info for file metadata stored in adb backup header
struct twfilehdr {
char start_of_header[8]; //stores the magic value #define TWRP
char type[16]; //stores the type of file header, TWFN or TWIMG
uint64_t size; //stores the size of the file contained after this header in the backup file
uint64_t compressed; //stores whether the file is compressed or not. 1 == compressed and 0 == uncompressed
uint32_t crc; //stores the zlib 32 bit crc of the twfilehdr struct to allow for making sure we are processing metadata
char name[468]; //stores the filename of the file
};
//md5 for files stored as a trailer to files in the adb backup file to check
//that they are restored correctly
struct AdbBackupFileTrailer {
char start_of_trailer[8]; //stores the magic value #define TWRP
char type[16]; //stores the AdbBackupFileTrailer type MD5TRAILER
uint32_t crc; //stores the zlib 32 bit crc of the AdbBackupFileTrailer struct to allow for making sure we are processing metadata
uint32_t ident; //stores crc to determine if header is encapsulated in stream as data
char md5[40]; //stores the md5 computation of the file
char space[440]; //stores space to align the struct to 512 bytes
};
//info for version and number of partitions backed up
struct AdbBackupStreamHeader {
char start_of_header[8]; //stores the magic value #define TWRP
char type[16]; //stores the AdbBackupStreamHeader value TWCNT
uint64_t partition_count; //stores the number of partitions to restore in the stream
uint64_t version; //stores the version of adb backup. increment ADB_BACKUP_VERSION each time the metadata is updated
uint32_t crc; //stores the zlib 32 bit crc of the AdbBackupStreamHeader struct to allow for making sure we are processing metadata
char space[468]; //stores space to align the struct to 512 bytes
};
#endif //__TWADBSTREAM_H