14535e40544aeb957d44fad75fbe5676effe03689Joe Onorato/*
24535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * Copyright (C) 2009 The Android Open Source Project
34535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *
44535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
54535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * you may not use this file except in compliance with the License.
64535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * You may obtain a copy of the License at
74535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *
84535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
94535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *
104535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * Unless required by applicable law or agreed to in writing, software
114535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
124535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * See the License for the specific language governing permissions and
144535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * limitations under the License.
154535e40544aeb957d44fad75fbe5676effe03689Joe Onorato */
164535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
173ad977b41c6e4ef30c2f4f316b909b742ffc04aaJoe Onorato#ifndef _UTILS_BACKUP_HELPERS_H
183ad977b41c6e4ef30c2f4f316b909b742ffc04aaJoe Onorato#define _UTILS_BACKUP_HELPERS_H
193ad977b41c6e4ef30c2f4f316b909b742ffc04aaJoe Onorato
204535e40544aeb957d44fad75fbe5676effe03689Joe Onorato#include <utils/Errors.h>
214535e40544aeb957d44fad75fbe5676effe03689Joe Onorato#include <utils/String8.h>
22d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato#include <utils/KeyedVector.h>
234535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
244535e40544aeb957d44fad75fbe5676effe03689Joe Onoratonamespace android {
254535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
26d2110dbce071a236b6176de344ca797b737542ebJoe Onoratoenum {
27d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    BACKUP_HEADER_ENTITY_V1 = 0x61746144, // Data (little endian)
28d2110dbce071a236b6176de344ca797b737542ebJoe Onorato};
293ad977b41c6e4ef30c2f4f316b909b742ffc04aaJoe Onorato
302e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onoratotypedef struct {
31d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    int type; // BACKUP_HEADER_ENTITY_V1
322e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    int keyLen; // length of the key name, not including the null terminator
33d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    int dataSize; // size of the data, not including the padding, -1 means delete
342e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato} entity_header_v1;
352e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
36d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onoratostruct SnapshotHeader {
37d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    int magic0;
38d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    int fileCount;
39d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    int magic1;
40d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    int totalSize;
41d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato};
42d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato
43d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onoratostruct FileState {
44d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    int modTime_sec;
45d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    int modTime_nsec;
4611b157790234d3d2f116ce4c7ed1d3d00fb78bc3Christopher Tate    int mode;
47d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    int size;
48d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    int crc32;
49d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    int nameLen;
50d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato};
51d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato
52d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onoratostruct FileRec {
53d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    String8 file;
54d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    bool deleted;
55d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    FileState s;
56d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato};
57d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato
582e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
594535e40544aeb957d44fad75fbe5676effe03689Joe Onorato/**
602e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato * Writes the data.
614535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *
624535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * If an error occurs, it poisons this object and all write calls will fail
634535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * with the error that occurred.
644535e40544aeb957d44fad75fbe5676effe03689Joe Onorato */
654535e40544aeb957d44fad75fbe5676effe03689Joe Onoratoclass BackupDataWriter
664535e40544aeb957d44fad75fbe5676effe03689Joe Onorato{
674535e40544aeb957d44fad75fbe5676effe03689Joe Onoratopublic:
684535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    BackupDataWriter(int fd);
694535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    // does not close fd
704535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    ~BackupDataWriter();
714535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
724535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    status_t WriteEntityHeader(const String8& key, size_t dataSize);
734a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate
744a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate    /* Note: WriteEntityData will write arbitrary data into the file without
754a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate     * validation or a previously-supplied header.  The full backup implementation
764a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate     * uses it this way to generate a controlled binary stream that is not
774a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate     * entity-structured.  If the implementation here is changed, either this
784a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate     * use case must remain valid, or the full backup implementation should be
794a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate     * adjusted to use some other appropriate mechanism.
804a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate     */
814535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    status_t WriteEntityData(const void* data, size_t size);
824535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
8306290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    void SetKeyPrefix(const String8& keyPrefix);
8406290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato
854535e40544aeb957d44fad75fbe5676effe03689Joe Onoratoprivate:
864535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    explicit BackupDataWriter();
874535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    status_t write_padding_for(int n);
884535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
894535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    int m_fd;
904535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    status_t m_status;
914535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    ssize_t m_pos;
924535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    int m_entityCount;
9306290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    String8 m_keyPrefix;
944535e40544aeb957d44fad75fbe5676effe03689Joe Onorato};
954535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
962e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato/**
972e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato * Reads the data.
982e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato *
992e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato * If an error occurs, it poisons this object and all write calls will fail
1002e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato * with the error that occurred.
1012e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato */
1022e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onoratoclass BackupDataReader
1032e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato{
1042e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onoratopublic:
1052e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    BackupDataReader(int fd);
1062e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    // does not close fd
1072e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    ~BackupDataReader();
1082e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
1092e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    status_t Status();
1105f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    status_t ReadNextHeader(bool* done, int* type);
1112e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
1122e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    bool HasEntities();
1132e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    status_t ReadEntityHeader(String8* key, size_t* dataSize);
1144a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate    status_t SkipEntityData(); // must be called with the pointer at the beginning of the data.
115efd0fab04b96d7ab0c1d8bf3b79397c8621e31c5Joe Onorato    ssize_t ReadEntityData(void* data, size_t size);
1162e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
1172e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onoratoprivate:
1182e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    explicit BackupDataReader();
1192e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    status_t skip_padding();
1202e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
1212e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    int m_fd;
1225f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    bool m_done;
1232e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    status_t m_status;
1242e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    ssize_t m_pos;
1255f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    ssize_t m_dataEndPos;
1262e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    int m_entityCount;
1272e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    union {
1282e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        int type;
1292e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        entity_header_v1 entity;
1302e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    } m_header;
1315d605dc56b036232e885f6ec36b888b729673060Joe Onorato    String8 m_key;
1322e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato};
1332e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
134d2110dbce071a236b6176de344ca797b737542ebJoe Onoratoint back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD,
13523ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato        char const* const* files, char const* const *keys, int fileCount);
136d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
1374a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tateint write_tarfile(const String8& packageName, const String8& domain,
1384a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate        const String8& rootPath, const String8& filePath, BackupDataWriter* outputStream);
1394a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate
140d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onoratoclass RestoreHelperBase
141d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato{
142d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onoratopublic:
143d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    RestoreHelperBase();
144d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    ~RestoreHelperBase();
145d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato
146d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    status_t WriteFile(const String8& filename, BackupDataReader* in);
147d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    status_t WriteSnapshot(int fd);
148d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato
149d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onoratoprivate:
150d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    void* m_buf;
15163bcb79dd437e70593b63cc5a87baab3251c2183Christopher Tate    bool m_loggedUnknownMetadata;
152d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato    KeyedVector<String8,FileRec> m_files;
153d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato};
154d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
155d2110dbce071a236b6176de344ca797b737542ebJoe Onorato#define TEST_BACKUP_HELPERS 1
1563ad977b41c6e4ef30c2f4f316b909b742ffc04aaJoe Onorato
1573ad977b41c6e4ef30c2f4f316b909b742ffc04aaJoe Onorato#if TEST_BACKUP_HELPERS
1583ad977b41c6e4ef30c2f4f316b909b742ffc04aaJoe Onoratoint backup_helper_test_empty();
1593ad977b41c6e4ef30c2f4f316b909b742ffc04aaJoe Onoratoint backup_helper_test_four();
1603ad977b41c6e4ef30c2f4f316b909b742ffc04aaJoe Onoratoint backup_helper_test_files();
16123ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onoratoint backup_helper_test_null_base();
162ce88cb15b52998e16c3ba548a4ec49117a835e21Joe Onoratoint backup_helper_test_missing_file();
1634535e40544aeb957d44fad75fbe5676effe03689Joe Onoratoint backup_helper_test_data_writer();
1642e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onoratoint backup_helper_test_data_reader();
1653ad977b41c6e4ef30c2f4f316b909b742ffc04aaJoe Onorato#endif
1663ad977b41c6e4ef30c2f4f316b909b742ffc04aaJoe Onorato
1674535e40544aeb957d44fad75fbe5676effe03689Joe Onorato} // namespace android
1684535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
1693ad977b41c6e4ef30c2f4f316b909b742ffc04aaJoe Onorato#endif // _UTILS_BACKUP_HELPERS_H
170