BackupData.cpp revision 16c4d154dca43c662571129af31b27433b919a32
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#define LOG_TAG "backup_data"
1816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
1916c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <androidfw/BackupHelpers.h>
2016c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/ByteOrder.h>
2116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2216c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <stdio.h>
2316c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <string.h>
2416c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <unistd.h>
2516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2616c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <cutils/log.h>
2716c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2816c4d154dca43c662571129af31b27433b919a32Adam Lesinskinamespace android {
2916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3016c4d154dca43c662571129af31b27433b919a32Adam Lesinskistatic const bool DEBUG = false;
3116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3216c4d154dca43c662571129af31b27433b919a32Adam Lesinski/*
3316c4d154dca43c662571129af31b27433b919a32Adam Lesinski * File Format (v1):
3416c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
3516c4d154dca43c662571129af31b27433b919a32Adam Lesinski * All ints are stored little-endian.
3616c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
3716c4d154dca43c662571129af31b27433b919a32Adam Lesinski *  - An app_header_v1 struct.
3816c4d154dca43c662571129af31b27433b919a32Adam Lesinski *  - The name of the package, utf-8, null terminated, padded to 4-byte boundary.
3916c4d154dca43c662571129af31b27433b919a32Adam Lesinski *  - A sequence of zero or more key/value paires (entities), each with
4016c4d154dca43c662571129af31b27433b919a32Adam Lesinski *      - A entity_header_v1 struct
4116c4d154dca43c662571129af31b27433b919a32Adam Lesinski *      - The key, utf-8, null terminated, padded to 4-byte boundary.
4216c4d154dca43c662571129af31b27433b919a32Adam Lesinski *      - The value, padded to 4 byte boundary
4316c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
4416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
4516c4d154dca43c662571129af31b27433b919a32Adam Lesinskiconst static int ROUND_UP[4] = { 0, 3, 2, 1 };
4616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
4716c4d154dca43c662571129af31b27433b919a32Adam Lesinskistatic inline size_t
4816c4d154dca43c662571129af31b27433b919a32Adam Lesinskiround_up(size_t n)
4916c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
5016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return n + ROUND_UP[n % 4];
5116c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
5216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
5316c4d154dca43c662571129af31b27433b919a32Adam Lesinskistatic inline size_t
5416c4d154dca43c662571129af31b27433b919a32Adam Lesinskipadding_extra(size_t n)
5516c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
5616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return ROUND_UP[n % 4];
5716c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
5816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
5916c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataWriter::BackupDataWriter(int fd)
6016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    :m_fd(fd),
6116c4d154dca43c662571129af31b27433b919a32Adam Lesinski     m_status(NO_ERROR),
6216c4d154dca43c662571129af31b27433b919a32Adam Lesinski     m_pos(0),
6316c4d154dca43c662571129af31b27433b919a32Adam Lesinski     m_entityCount(0)
6416c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
6516c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
6616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
6716c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataWriter::~BackupDataWriter()
6816c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
6916c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
7016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7116c4d154dca43c662571129af31b27433b919a32Adam Lesinski// Pad out anything they've previously written to the next 4 byte boundary.
7216c4d154dca43c662571129af31b27433b919a32Adam Lesinskistatus_t
7316c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataWriter::write_padding_for(int n)
7416c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
7516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t amt;
7616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t paddingSize;
7716c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    paddingSize = padding_extra(n);
7916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (paddingSize > 0) {
8016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        uint32_t padding = 0xbcbcbcbc;
8116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if (DEBUG) ALOGI("writing %d padding bytes for %d", paddingSize, n);
8216c4d154dca43c662571129af31b27433b919a32Adam Lesinski        amt = write(m_fd, &padding, paddingSize);
8316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if (amt != paddingSize) {
8416c4d154dca43c662571129af31b27433b919a32Adam Lesinski            m_status = errno;
8516c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return m_status;
8616c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
8716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        m_pos += amt;
8816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
8916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return NO_ERROR;
9016c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
9116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
9216c4d154dca43c662571129af31b27433b919a32Adam Lesinskistatus_t
9316c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataWriter::WriteEntityHeader(const String8& key, size_t dataSize)
9416c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
9516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (m_status != NO_ERROR) {
9616c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return m_status;
9716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
9816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
9916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t amt;
10016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
10116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    amt = write_padding_for(m_pos);
10216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (amt != 0) {
10316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return amt;
10416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
10516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
10616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    String8 k;
10716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (m_keyPrefix.length() > 0) {
10816c4d154dca43c662571129af31b27433b919a32Adam Lesinski        k = m_keyPrefix;
10916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        k += ":";
11016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        k += key;
11116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    } else {
11216c4d154dca43c662571129af31b27433b919a32Adam Lesinski        k = key;
11316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
11416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (DEBUG) {
11516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        ALOGD("Writing header: prefix='%s' key='%s' dataSize=%d", m_keyPrefix.string(),
11616c4d154dca43c662571129af31b27433b919a32Adam Lesinski                key.string(), dataSize);
11716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
11816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
11916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    entity_header_v1 header;
12016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t keyLen;
12116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
12216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    keyLen = k.length();
12316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
12416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    header.type = tolel(BACKUP_HEADER_ENTITY_V1);
12516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    header.keyLen = tolel(keyLen);
12616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    header.dataSize = tolel(dataSize);
12716c4d154dca43c662571129af31b27433b919a32Adam Lesinski
12816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (DEBUG) ALOGI("writing entity header, %d bytes", sizeof(entity_header_v1));
12916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    amt = write(m_fd, &header, sizeof(entity_header_v1));
13016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (amt != sizeof(entity_header_v1)) {
13116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        m_status = errno;
13216c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return m_status;
13316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
13416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    m_pos += amt;
13516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (DEBUG) ALOGI("writing entity header key, %d bytes", keyLen+1);
13716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    amt = write(m_fd, k.string(), keyLen+1);
13816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (amt != keyLen+1) {
13916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        m_status = errno;
14016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return m_status;
14116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
14216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    m_pos += amt;
14316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    amt = write_padding_for(keyLen+1);
14516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    m_entityCount++;
14716c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return amt;
14916c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
15016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
15116c4d154dca43c662571129af31b27433b919a32Adam Lesinskistatus_t
15216c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataWriter::WriteEntityData(const void* data, size_t size)
15316c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
15416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (DEBUG) ALOGD("Writing data: size=%lu", (unsigned long) size);
15516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
15616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (m_status != NO_ERROR) {
15716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if (DEBUG) {
15816c4d154dca43c662571129af31b27433b919a32Adam Lesinski            ALOGD("Not writing data - stream in error state %d (%s)", m_status, strerror(m_status));
15916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
16016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return m_status;
16116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
16216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
16316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    // We don't write padding here, because they're allowed to call this several
16416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    // times with smaller buffers.  We write it at the end of WriteEntityHeader
16516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    // instead.
16616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t amt = write(m_fd, data, size);
16716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (amt != (ssize_t)size) {
16816c4d154dca43c662571129af31b27433b919a32Adam Lesinski        m_status = errno;
16916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if (DEBUG) ALOGD("write returned error %d (%s)", m_status, strerror(m_status));
17016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return m_status;
17116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
17216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    m_pos += amt;
17316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return NO_ERROR;
17416c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
17516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
17616c4d154dca43c662571129af31b27433b919a32Adam Lesinskivoid
17716c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataWriter::SetKeyPrefix(const String8& keyPrefix)
17816c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
17916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    m_keyPrefix = keyPrefix;
18016c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
18116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
18216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
18316c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataReader::BackupDataReader(int fd)
18416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    :m_fd(fd),
18516c4d154dca43c662571129af31b27433b919a32Adam Lesinski     m_done(false),
18616c4d154dca43c662571129af31b27433b919a32Adam Lesinski     m_status(NO_ERROR),
18716c4d154dca43c662571129af31b27433b919a32Adam Lesinski     m_pos(0),
18816c4d154dca43c662571129af31b27433b919a32Adam Lesinski     m_entityCount(0)
18916c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
19016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    memset(&m_header, 0, sizeof(m_header));
19116c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
19216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
19316c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataReader::~BackupDataReader()
19416c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
19516c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
19616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
19716c4d154dca43c662571129af31b27433b919a32Adam Lesinskistatus_t
19816c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataReader::Status()
19916c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
20016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return m_status;
20116c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
20216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
20316c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define CHECK_SIZE(actual, expected) \
20416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    do { \
20516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if ((actual) != (expected)) { \
20616c4d154dca43c662571129af31b27433b919a32Adam Lesinski            if ((actual) == 0) { \
20716c4d154dca43c662571129af31b27433b919a32Adam Lesinski                m_status = EIO; \
20816c4d154dca43c662571129af31b27433b919a32Adam Lesinski                m_done = true; \
20916c4d154dca43c662571129af31b27433b919a32Adam Lesinski            } else { \
21016c4d154dca43c662571129af31b27433b919a32Adam Lesinski                m_status = errno; \
21116c4d154dca43c662571129af31b27433b919a32Adam Lesinski                ALOGD("CHECK_SIZE(a=%ld e=%ld) failed at line %d m_status='%s'", \
21216c4d154dca43c662571129af31b27433b919a32Adam Lesinski                    long(actual), long(expected), __LINE__, strerror(m_status)); \
21316c4d154dca43c662571129af31b27433b919a32Adam Lesinski            } \
21416c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return m_status; \
21516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        } \
21616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    } while(0)
21716c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define SKIP_PADDING() \
21816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    do { \
21916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        status_t err = skip_padding(); \
22016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if (err != NO_ERROR) { \
22116c4d154dca43c662571129af31b27433b919a32Adam Lesinski            ALOGD("SKIP_PADDING FAILED at line %d", __LINE__); \
22216c4d154dca43c662571129af31b27433b919a32Adam Lesinski            m_status = err; \
22316c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return err; \
22416c4d154dca43c662571129af31b27433b919a32Adam Lesinski        } \
22516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    } while(0)
22616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
22716c4d154dca43c662571129af31b27433b919a32Adam Lesinskistatus_t
22816c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataReader::ReadNextHeader(bool* done, int* type)
22916c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
23016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    *done = m_done;
23116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (m_status != NO_ERROR) {
23216c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return m_status;
23316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
23416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
23516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int amt;
23616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
23716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    amt = skip_padding();
23816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (amt == EIO) {
23916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        *done = m_done = true;
24016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return NO_ERROR;
24116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
24216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    else if (amt != NO_ERROR) {
24316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return amt;
24416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
24516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    amt = read(m_fd, &m_header, sizeof(m_header));
24616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    *done = m_done = (amt == 0);
24716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (*done) {
24816c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return NO_ERROR;
24916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
25016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    CHECK_SIZE(amt, sizeof(m_header));
25116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    m_pos += sizeof(m_header);
25216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (type) {
25316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        *type = m_header.type;
25416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
25516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
25616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    // validate and fix up the fields.
25716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    m_header.type = fromlel(m_header.type);
25816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    switch (m_header.type)
25916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    {
26016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        case BACKUP_HEADER_ENTITY_V1:
26116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        {
26216c4d154dca43c662571129af31b27433b919a32Adam Lesinski            m_header.entity.keyLen = fromlel(m_header.entity.keyLen);
26316c4d154dca43c662571129af31b27433b919a32Adam Lesinski            if (m_header.entity.keyLen <= 0) {
26416c4d154dca43c662571129af31b27433b919a32Adam Lesinski                ALOGD("Entity header at %d has keyLen<=0: 0x%08x\n", (int)m_pos,
26516c4d154dca43c662571129af31b27433b919a32Adam Lesinski                        (int)m_header.entity.keyLen);
26616c4d154dca43c662571129af31b27433b919a32Adam Lesinski                m_status = EINVAL;
26716c4d154dca43c662571129af31b27433b919a32Adam Lesinski            }
26816c4d154dca43c662571129af31b27433b919a32Adam Lesinski            m_header.entity.dataSize = fromlel(m_header.entity.dataSize);
26916c4d154dca43c662571129af31b27433b919a32Adam Lesinski            m_entityCount++;
27016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
27116c4d154dca43c662571129af31b27433b919a32Adam Lesinski            // read the rest of the header (filename)
27216c4d154dca43c662571129af31b27433b919a32Adam Lesinski            size_t size = m_header.entity.keyLen;
27316c4d154dca43c662571129af31b27433b919a32Adam Lesinski            char* buf = m_key.lockBuffer(size);
27416c4d154dca43c662571129af31b27433b919a32Adam Lesinski            if (buf == NULL) {
27516c4d154dca43c662571129af31b27433b919a32Adam Lesinski                m_status = ENOMEM;
27616c4d154dca43c662571129af31b27433b919a32Adam Lesinski                return m_status;
27716c4d154dca43c662571129af31b27433b919a32Adam Lesinski            }
27816c4d154dca43c662571129af31b27433b919a32Adam Lesinski            int amt = read(m_fd, buf, size+1);
27916c4d154dca43c662571129af31b27433b919a32Adam Lesinski            CHECK_SIZE(amt, (int)size+1);
28016c4d154dca43c662571129af31b27433b919a32Adam Lesinski            m_key.unlockBuffer(size);
28116c4d154dca43c662571129af31b27433b919a32Adam Lesinski            m_pos += size+1;
28216c4d154dca43c662571129af31b27433b919a32Adam Lesinski            SKIP_PADDING();
28316c4d154dca43c662571129af31b27433b919a32Adam Lesinski            m_dataEndPos = m_pos + m_header.entity.dataSize;
28416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
28516c4d154dca43c662571129af31b27433b919a32Adam Lesinski            break;
28616c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
28716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        default:
28816c4d154dca43c662571129af31b27433b919a32Adam Lesinski            ALOGD("Chunk header at %d has invalid type: 0x%08x",
28916c4d154dca43c662571129af31b27433b919a32Adam Lesinski                    (int)(m_pos - sizeof(m_header)), (int)m_header.type);
29016c4d154dca43c662571129af31b27433b919a32Adam Lesinski            m_status = EINVAL;
29116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
29216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
29316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return m_status;
29416c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
29516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
29616c4d154dca43c662571129af31b27433b919a32Adam Lesinskibool
29716c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataReader::HasEntities()
29816c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
29916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return m_status == NO_ERROR && m_header.type == BACKUP_HEADER_ENTITY_V1;
30016c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
30116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
30216c4d154dca43c662571129af31b27433b919a32Adam Lesinskistatus_t
30316c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataReader::ReadEntityHeader(String8* key, size_t* dataSize)
30416c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
30516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (m_status != NO_ERROR) {
30616c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return m_status;
30716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
30816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (m_header.type != BACKUP_HEADER_ENTITY_V1) {
30916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return EINVAL;
31016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
31116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    *key = m_key;
31216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    *dataSize = m_header.entity.dataSize;
31316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return NO_ERROR;
31416c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
31516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
31616c4d154dca43c662571129af31b27433b919a32Adam Lesinskistatus_t
31716c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataReader::SkipEntityData()
31816c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
31916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (m_status != NO_ERROR) {
32016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return m_status;
32116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
32216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (m_header.type != BACKUP_HEADER_ENTITY_V1) {
32316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return EINVAL;
32416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
32516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (m_header.entity.dataSize > 0) {
32616c4d154dca43c662571129af31b27433b919a32Adam Lesinski        int pos = lseek(m_fd, m_dataEndPos, SEEK_SET);
32716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if (pos == -1) {
32816c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return errno;
32916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
33016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        m_pos = pos;
33116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
33216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    SKIP_PADDING();
33316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return NO_ERROR;
33416c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
33516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
33616c4d154dca43c662571129af31b27433b919a32Adam Lesinskissize_t
33716c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataReader::ReadEntityData(void* data, size_t size)
33816c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
33916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (m_status != NO_ERROR) {
34016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return -1;
34116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
34216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int remaining = m_dataEndPos - m_pos;
34316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    //ALOGD("ReadEntityData size=%d m_pos=0x%x m_dataEndPos=0x%x remaining=%d\n",
34416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    //        size, m_pos, m_dataEndPos, remaining);
34516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (remaining <= 0) {
34616c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return 0;
34716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
34816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (((int)size) > remaining) {
34916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        size = remaining;
35016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
35116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    //ALOGD("   reading %d bytes", size);
35216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int amt = read(m_fd, data, size);
35316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (amt < 0) {
35416c4d154dca43c662571129af31b27433b919a32Adam Lesinski        m_status = errno;
35516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return -1;
35616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
35716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (amt == 0) {
35816c4d154dca43c662571129af31b27433b919a32Adam Lesinski        m_status = EIO;
35916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        m_done = true;
36016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
36116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    m_pos += amt;
36216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return amt;
36316c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
36416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
36516c4d154dca43c662571129af31b27433b919a32Adam Lesinskistatus_t
36616c4d154dca43c662571129af31b27433b919a32Adam LesinskiBackupDataReader::skip_padding()
36716c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
36816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t amt;
36916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ssize_t paddingSize;
37016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
37116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    paddingSize = padding_extra(m_pos);
37216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (paddingSize > 0) {
37316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        uint32_t padding;
37416c4d154dca43c662571129af31b27433b919a32Adam Lesinski        amt = read(m_fd, &padding, paddingSize);
37516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        CHECK_SIZE(amt, paddingSize);
37616c4d154dca43c662571129af31b27433b919a32Adam Lesinski        m_pos += amt;
37716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
37816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return NO_ERROR;
37916c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
38016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
38116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
38216c4d154dca43c662571129af31b27433b919a32Adam Lesinski} // namespace android
383