summaryrefslogtreecommitdiffstats
path: root/adbbu/twadbstream.h
blob: 5fa6bde5da464e8d456ea1f8418a465db0f9d31e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
		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 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

//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 1				//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