BackupHelpers.h revision 43a4a8c777fbb8f71540ac7fbe82674489ef557b
116c4d154dca43c662571129af31b27433b919a32Adam Lesinski/*
216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Copyright (C) 2009 The Android Open Source Project
316c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
516c4d154dca43c662571129af31b27433b919a32Adam Lesinski * you may not use this file except in compliance with the License.
616c4d154dca43c662571129af31b27433b919a32Adam Lesinski * You may obtain a copy of the License at
716c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
816c4d154dca43c662571129af31b27433b919a32Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
916c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
1016c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Unless required by applicable law or agreed to in writing, software
1116c4d154dca43c662571129af31b27433b919a32Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
1216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1316c4d154dca43c662571129af31b27433b919a32Adam Lesinski * See the License for the specific language governing permissions and
1416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * limitations under the License.
1516c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
1616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
1716c4d154dca43c662571129af31b27433b919a32Adam Lesinski#ifndef _UTILS_BACKUP_HELPERS_H
1816c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define _UTILS_BACKUP_HELPERS_H
1916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2016c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/Errors.h>
2116c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/String8.h>
2216c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/KeyedVector.h>
2316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2416c4d154dca43c662571129af31b27433b919a32Adam Lesinskinamespace android {
2516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2616c4d154dca43c662571129af31b27433b919a32Adam Lesinskienum {
2716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    BACKUP_HEADER_ENTITY_V1 = 0x61746144, // Data (little endian)
2816c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
2916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3016c4d154dca43c662571129af31b27433b919a32Adam Lesinskitypedef struct {
3116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int type; // BACKUP_HEADER_ENTITY_V1
3216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int keyLen; // length of the key name, not including the null terminator
3316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int dataSize; // size of the data, not including the padding, -1 means delete
3416c4d154dca43c662571129af31b27433b919a32Adam Lesinski} entity_header_v1;
3516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3616c4d154dca43c662571129af31b27433b919a32Adam Lesinskistruct SnapshotHeader {
3716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int magic0;
3816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int fileCount;
3916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int magic1;
4016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int totalSize;
4116c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
4216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
4316c4d154dca43c662571129af31b27433b919a32Adam Lesinskistruct FileState {
4416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int modTime_sec;
4516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int modTime_nsec;
4616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int mode;
4716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int size;
4816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int crc32;
4916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int nameLen;
5016c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
5116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
5216c4d154dca43c662571129af31b27433b919a32Adam Lesinskistruct FileRec {
5316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    String8 file;
5416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool deleted;
5516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    FileState s;
5616c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
5716c4d154dca43c662571129af31b27433b919a32Adam Lesinski
5816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
5916c4d154dca43c662571129af31b27433b919a32Adam Lesinski/**
6016c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Writes the data.
6116c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
6216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * If an error occurs, it poisons this object and all write calls will fail
6316c4d154dca43c662571129af31b27433b919a32Adam Lesinski * with the error that occurred.
6416c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
6516c4d154dca43c662571129af31b27433b919a32Adam Lesinskiclass BackupDataWriter
6616c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
6716c4d154dca43c662571129af31b27433b919a32Adam Lesinskipublic:
6816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    BackupDataWriter(int fd);
6916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    // does not close fd
7016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ~BackupDataWriter();
7116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t WriteEntityHeader(const String8& key, size_t dataSize);
7316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    /* Note: WriteEntityData will write arbitrary data into the file without
7516c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * validation or a previously-supplied header.  The full backup implementation
7616c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * uses it this way to generate a controlled binary stream that is not
7716c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * entity-structured.  If the implementation here is changed, either this
7816c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * use case must remain valid, or the full backup implementation should be
7916c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * adjusted to use some other appropriate mechanism.
8016c4d154dca43c662571129af31b27433b919a32Adam Lesinski     */
8116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t WriteEntityData(const void* data, size_t size);
8216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    void SetKeyPrefix(const String8& keyPrefix);
8416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8516c4d154dca43c662571129af31b27433b919a32Adam Lesinskiprivate:
8616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    explicit BackupDataWriter();
8716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t write_padding_for(int n);
8816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int m_fd;
9016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t m_status;
9116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t m_pos;
9216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int m_entityCount;
9316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    String8 m_keyPrefix;
9416c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
9516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
9616c4d154dca43c662571129af31b27433b919a32Adam Lesinski/**
9716c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Reads the data.
9816c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
9916c4d154dca43c662571129af31b27433b919a32Adam Lesinski * If an error occurs, it poisons this object and all write calls will fail
10016c4d154dca43c662571129af31b27433b919a32Adam Lesinski * with the error that occurred.
10116c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
10216c4d154dca43c662571129af31b27433b919a32Adam Lesinskiclass BackupDataReader
10316c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
10416c4d154dca43c662571129af31b27433b919a32Adam Lesinskipublic:
10516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    BackupDataReader(int fd);
10616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    // does not close fd
10716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ~BackupDataReader();
10816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
10916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t Status();
11016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t ReadNextHeader(bool* done, int* type);
11116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
11216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool HasEntities();
11316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t ReadEntityHeader(String8* key, size_t* dataSize);
11416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t SkipEntityData(); // must be called with the pointer at the beginning of the data.
11516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t ReadEntityData(void* data, size_t size);
11616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
11716c4d154dca43c662571129af31b27433b919a32Adam Lesinskiprivate:
11816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    explicit BackupDataReader();
11916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t skip_padding();
12016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
12116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int m_fd;
12216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool m_done;
12316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t m_status;
12416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t m_pos;
12516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t m_dataEndPos;
12616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int m_entityCount;
12716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    union {
12816c4d154dca43c662571129af31b27433b919a32Adam Lesinski        int type;
12916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        entity_header_v1 entity;
13016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    } m_header;
13116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    String8 m_key;
13216c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
13316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13416c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD,
13516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        char const* const* files, char const* const *keys, int fileCount);
13616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13716c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint write_tarfile(const String8& packageName, const String8& domain,
13816c4d154dca43c662571129af31b27433b919a32Adam Lesinski        const String8& rootPath, const String8& filePath, BackupDataWriter* outputStream);
13916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14016c4d154dca43c662571129af31b27433b919a32Adam Lesinskiclass RestoreHelperBase
14116c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
14216c4d154dca43c662571129af31b27433b919a32Adam Lesinskipublic:
14316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    RestoreHelperBase();
14416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ~RestoreHelperBase();
14516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t WriteFile(const String8& filename, BackupDataReader* in);
14716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t WriteSnapshot(int fd);
14816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14916c4d154dca43c662571129af31b27433b919a32Adam Lesinskiprivate:
15016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    void* m_buf;
15116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool m_loggedUnknownMetadata;
15216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    KeyedVector<String8,FileRec> m_files;
15316c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
15416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
15543a4a8c777fbb8f71540ac7fbe82674489ef557bChristopher Tate//#define TEST_BACKUP_HELPERS 1
15616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
15716c4d154dca43c662571129af31b27433b919a32Adam Lesinski#if TEST_BACKUP_HELPERS
15816c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_empty();
15916c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_four();
16016c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_files();
16116c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_null_base();
16216c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_missing_file();
16316c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_data_writer();
16416c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_data_reader();
16516c4d154dca43c662571129af31b27433b919a32Adam Lesinski#endif
16616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
16716c4d154dca43c662571129af31b27433b919a32Adam Lesinski} // namespace android
16816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
16916c4d154dca43c662571129af31b27433b919a32Adam Lesinski#endif // _UTILS_BACKUP_HELPERS_H
170