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
2011ae768cf1b8348e761ad9c09e98788da1e591b1Christopher Tate#include <sys/stat.h>
2111ae768cf1b8348e761ad9c09e98788da1e591b1Christopher Tate
2216c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/Errors.h>
2316c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/String8.h>
2416c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/KeyedVector.h>
2516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2616c4d154dca43c662571129af31b27433b919a32Adam Lesinskinamespace android {
2716c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2816c4d154dca43c662571129af31b27433b919a32Adam Lesinskienum {
2916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    BACKUP_HEADER_ENTITY_V1 = 0x61746144, // Data (little endian)
3016c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
3116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3216c4d154dca43c662571129af31b27433b919a32Adam Lesinskitypedef struct {
3316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int type; // BACKUP_HEADER_ENTITY_V1
3416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int keyLen; // length of the key name, not including the null terminator
3516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int dataSize; // size of the data, not including the padding, -1 means delete
3616c4d154dca43c662571129af31b27433b919a32Adam Lesinski} entity_header_v1;
3716c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3816c4d154dca43c662571129af31b27433b919a32Adam Lesinskistruct SnapshotHeader {
3916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int magic0;
4016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int fileCount;
4116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int magic1;
4216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int totalSize;
4316c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
4416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
4516c4d154dca43c662571129af31b27433b919a32Adam Lesinskistruct FileState {
4616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int modTime_sec;
4716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int modTime_nsec;
4816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int mode;
4916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int size;
5016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int crc32;
5116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int nameLen;
5216c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
5316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
5416c4d154dca43c662571129af31b27433b919a32Adam Lesinskistruct FileRec {
5516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    String8 file;
5616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool deleted;
5716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    FileState s;
5816c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
5916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
6016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
6116c4d154dca43c662571129af31b27433b919a32Adam Lesinski/**
6216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Writes the data.
6316c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
6416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * If an error occurs, it poisons this object and all write calls will fail
6516c4d154dca43c662571129af31b27433b919a32Adam Lesinski * with the error that occurred.
6616c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
6716c4d154dca43c662571129af31b27433b919a32Adam Lesinskiclass BackupDataWriter
6816c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
6916c4d154dca43c662571129af31b27433b919a32Adam Lesinskipublic:
7016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    BackupDataWriter(int fd);
7116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    // does not close fd
7216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ~BackupDataWriter();
7316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t WriteEntityHeader(const String8& key, size_t dataSize);
7516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    /* Note: WriteEntityData will write arbitrary data into the file without
7716c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * validation or a previously-supplied header.  The full backup implementation
7816c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * uses it this way to generate a controlled binary stream that is not
7916c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * entity-structured.  If the implementation here is changed, either this
8016c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * use case must remain valid, or the full backup implementation should be
8116c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * adjusted to use some other appropriate mechanism.
8216c4d154dca43c662571129af31b27433b919a32Adam Lesinski     */
8316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t WriteEntityData(const void* data, size_t size);
8416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    void SetKeyPrefix(const String8& keyPrefix);
8616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8716c4d154dca43c662571129af31b27433b919a32Adam Lesinskiprivate:
8816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    explicit BackupDataWriter();
8916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t write_padding_for(int n);
9016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
9116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int m_fd;
9216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t m_status;
9316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t m_pos;
9416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int m_entityCount;
9516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    String8 m_keyPrefix;
9616c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
9716c4d154dca43c662571129af31b27433b919a32Adam Lesinski
9816c4d154dca43c662571129af31b27433b919a32Adam Lesinski/**
9916c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Reads the data.
10016c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
10116c4d154dca43c662571129af31b27433b919a32Adam Lesinski * If an error occurs, it poisons this object and all write calls will fail
10216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * with the error that occurred.
10316c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
10416c4d154dca43c662571129af31b27433b919a32Adam Lesinskiclass BackupDataReader
10516c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
10616c4d154dca43c662571129af31b27433b919a32Adam Lesinskipublic:
10716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    BackupDataReader(int fd);
10816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    // does not close fd
10916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ~BackupDataReader();
11016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
11116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t Status();
11216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t ReadNextHeader(bool* done, int* type);
11316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
11416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool HasEntities();
11516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t ReadEntityHeader(String8* key, size_t* dataSize);
11616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t SkipEntityData(); // must be called with the pointer at the beginning of the data.
11716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t ReadEntityData(void* data, size_t size);
11816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
11916c4d154dca43c662571129af31b27433b919a32Adam Lesinskiprivate:
12016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    explicit BackupDataReader();
12116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t skip_padding();
12216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
12316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int m_fd;
12416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool m_done;
12516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t m_status;
12616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t m_pos;
12716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t m_dataEndPos;
12816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int m_entityCount;
12916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    union {
13016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        int type;
13116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        entity_header_v1 entity;
13216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    } m_header;
13316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    String8 m_key;
13416c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
13516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13616c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD,
13716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        char const* const* files, char const* const *keys, int fileCount);
13816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13916c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint write_tarfile(const String8& packageName, const String8& domain,
14011ae768cf1b8348e761ad9c09e98788da1e591b1Christopher Tate        const String8& rootPath, const String8& filePath, off_t* outSize,
14111ae768cf1b8348e761ad9c09e98788da1e591b1Christopher Tate        BackupDataWriter* outputStream);
14216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14316c4d154dca43c662571129af31b27433b919a32Adam Lesinskiclass RestoreHelperBase
14416c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
14516c4d154dca43c662571129af31b27433b919a32Adam Lesinskipublic:
14616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    RestoreHelperBase();
14716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ~RestoreHelperBase();
14816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t WriteFile(const String8& filename, BackupDataReader* in);
15016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    status_t WriteSnapshot(int fd);
15116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
15216c4d154dca43c662571129af31b27433b919a32Adam Lesinskiprivate:
15316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    void* m_buf;
15416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool m_loggedUnknownMetadata;
15516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    KeyedVector<String8,FileRec> m_files;
15616c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
15716c4d154dca43c662571129af31b27433b919a32Adam Lesinski
15843a4a8c777fbb8f71540ac7fbe82674489ef557bChristopher Tate//#define TEST_BACKUP_HELPERS 1
15916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
16016c4d154dca43c662571129af31b27433b919a32Adam Lesinski#if TEST_BACKUP_HELPERS
16116c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_empty();
16216c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_four();
16316c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_files();
16416c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_null_base();
16516c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_missing_file();
16616c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_data_writer();
16716c4d154dca43c662571129af31b27433b919a32Adam Lesinskiint backup_helper_test_data_reader();
16816c4d154dca43c662571129af31b27433b919a32Adam Lesinski#endif
16916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
17016c4d154dca43c662571129af31b27433b919a32Adam Lesinski} // namespace android
17116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
17216c4d154dca43c662571129af31b27433b919a32Adam Lesinski#endif // _UTILS_BACKUP_HELPERS_H
173