• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _UTILS_BACKUP_HELPERS_H
18 #define _UTILS_BACKUP_HELPERS_H
19 
20 #include <utils/Errors.h>
21 #include <utils/String8.h>
22 #include <utils/KeyedVector.h>
23 
24 namespace android {
25 
26 enum {
27     BACKUP_HEADER_ENTITY_V1 = 0x61746144, // Data (little endian)
28 };
29 
30 typedef struct {
31     int type; // BACKUP_HEADER_ENTITY_V1
32     int keyLen; // length of the key name, not including the null terminator
33     int dataSize; // size of the data, not including the padding, -1 means delete
34 } entity_header_v1;
35 
36 struct SnapshotHeader {
37     int magic0;
38     int fileCount;
39     int magic1;
40     int totalSize;
41 };
42 
43 struct FileState {
44     int modTime_sec;
45     int modTime_nsec;
46     int mode;
47     int size;
48     int crc32;
49     int nameLen;
50 };
51 
52 struct FileRec {
53     String8 file;
54     bool deleted;
55     FileState s;
56 };
57 
58 
59 /**
60  * Writes the data.
61  *
62  * If an error occurs, it poisons this object and all write calls will fail
63  * with the error that occurred.
64  */
65 class BackupDataWriter
66 {
67 public:
68     BackupDataWriter(int fd);
69     // does not close fd
70     ~BackupDataWriter();
71 
72     status_t WriteEntityHeader(const String8& key, size_t dataSize);
73 
74     /* Note: WriteEntityData will write arbitrary data into the file without
75      * validation or a previously-supplied header.  The full backup implementation
76      * uses it this way to generate a controlled binary stream that is not
77      * entity-structured.  If the implementation here is changed, either this
78      * use case must remain valid, or the full backup implementation should be
79      * adjusted to use some other appropriate mechanism.
80      */
81     status_t WriteEntityData(const void* data, size_t size);
82 
83     void SetKeyPrefix(const String8& keyPrefix);
84 
85 private:
86     explicit BackupDataWriter();
87     status_t write_padding_for(int n);
88 
89     int m_fd;
90     status_t m_status;
91     ssize_t m_pos;
92     int m_entityCount;
93     String8 m_keyPrefix;
94 };
95 
96 /**
97  * Reads the data.
98  *
99  * If an error occurs, it poisons this object and all write calls will fail
100  * with the error that occurred.
101  */
102 class BackupDataReader
103 {
104 public:
105     BackupDataReader(int fd);
106     // does not close fd
107     ~BackupDataReader();
108 
109     status_t Status();
110     status_t ReadNextHeader(bool* done, int* type);
111 
112     bool HasEntities();
113     status_t ReadEntityHeader(String8* key, size_t* dataSize);
114     status_t SkipEntityData(); // must be called with the pointer at the beginning of the data.
115     ssize_t ReadEntityData(void* data, size_t size);
116 
117 private:
118     explicit BackupDataReader();
119     status_t skip_padding();
120 
121     int m_fd;
122     bool m_done;
123     status_t m_status;
124     ssize_t m_pos;
125     ssize_t m_dataEndPos;
126     int m_entityCount;
127     union {
128         int type;
129         entity_header_v1 entity;
130     } m_header;
131     String8 m_key;
132 };
133 
134 int back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD,
135         char const* const* files, char const* const *keys, int fileCount);
136 
137 int write_tarfile(const String8& packageName, const String8& domain,
138         const String8& rootPath, const String8& filePath, BackupDataWriter* outputStream);
139 
140 class RestoreHelperBase
141 {
142 public:
143     RestoreHelperBase();
144     ~RestoreHelperBase();
145 
146     status_t WriteFile(const String8& filename, BackupDataReader* in);
147     status_t WriteSnapshot(int fd);
148 
149 private:
150     void* m_buf;
151     bool m_loggedUnknownMetadata;
152     KeyedVector<String8,FileRec> m_files;
153 };
154 
155 #define TEST_BACKUP_HELPERS 1
156 
157 #if TEST_BACKUP_HELPERS
158 int backup_helper_test_empty();
159 int backup_helper_test_four();
160 int backup_helper_test_files();
161 int backup_helper_test_null_base();
162 int backup_helper_test_missing_file();
163 int backup_helper_test_data_writer();
164 int backup_helper_test_data_reader();
165 #endif
166 
167 } // namespace android
168 
169 #endif // _UTILS_BACKUP_HELPERS_H
170