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
172e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato#define LOG_TAG "backup_data"
182e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
19b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/BackupHelpers.h>
204535e40544aeb957d44fad75fbe5676effe03689Joe Onorato#include <utils/ByteOrder.h>
214535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
224535e40544aeb957d44fad75fbe5676effe03689Joe Onorato#include <stdio.h>
234a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate#include <string.h>
244535e40544aeb957d44fad75fbe5676effe03689Joe Onorato#include <unistd.h>
254535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
262e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato#include <cutils/log.h>
272e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
284535e40544aeb957d44fad75fbe5676effe03689Joe Onoratonamespace android {
294535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
304a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tatestatic const bool DEBUG = false;
314a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate
324535e40544aeb957d44fad75fbe5676effe03689Joe Onorato/*
334535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * File Format (v1):
344535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *
354535e40544aeb957d44fad75fbe5676effe03689Joe Onorato * All ints are stored little-endian.
364535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *
374535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *  - An app_header_v1 struct.
384535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *  - The name of the package, utf-8, null terminated, padded to 4-byte boundary.
394535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *  - A sequence of zero or more key/value paires (entities), each with
404535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *      - A entity_header_v1 struct
414535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *      - The key, utf-8, null terminated, padded to 4-byte boundary.
424535e40544aeb957d44fad75fbe5676effe03689Joe Onorato *      - The value, padded to 4 byte boundary
434535e40544aeb957d44fad75fbe5676effe03689Joe Onorato */
444535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
454535e40544aeb957d44fad75fbe5676effe03689Joe Onoratoconst static int ROUND_UP[4] = { 0, 3, 2, 1 };
464535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
474535e40544aeb957d44fad75fbe5676effe03689Joe Onoratostatic inline size_t
484535e40544aeb957d44fad75fbe5676effe03689Joe Onoratoround_up(size_t n)
494535e40544aeb957d44fad75fbe5676effe03689Joe Onorato{
504535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    return n + ROUND_UP[n % 4];
514535e40544aeb957d44fad75fbe5676effe03689Joe Onorato}
524535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
534535e40544aeb957d44fad75fbe5676effe03689Joe Onoratostatic inline size_t
544535e40544aeb957d44fad75fbe5676effe03689Joe Onoratopadding_extra(size_t n)
554535e40544aeb957d44fad75fbe5676effe03689Joe Onorato{
564535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    return ROUND_UP[n % 4];
574535e40544aeb957d44fad75fbe5676effe03689Joe Onorato}
584535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
594535e40544aeb957d44fad75fbe5676effe03689Joe OnoratoBackupDataWriter::BackupDataWriter(int fd)
604535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    :m_fd(fd),
614535e40544aeb957d44fad75fbe5676effe03689Joe Onorato     m_status(NO_ERROR),
624535e40544aeb957d44fad75fbe5676effe03689Joe Onorato     m_pos(0),
634535e40544aeb957d44fad75fbe5676effe03689Joe Onorato     m_entityCount(0)
644535e40544aeb957d44fad75fbe5676effe03689Joe Onorato{
654535e40544aeb957d44fad75fbe5676effe03689Joe Onorato}
664535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
674535e40544aeb957d44fad75fbe5676effe03689Joe OnoratoBackupDataWriter::~BackupDataWriter()
684535e40544aeb957d44fad75fbe5676effe03689Joe Onorato{
694535e40544aeb957d44fad75fbe5676effe03689Joe Onorato}
704535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
714535e40544aeb957d44fad75fbe5676effe03689Joe Onorato// Pad out anything they've previously written to the next 4 byte boundary.
724535e40544aeb957d44fad75fbe5676effe03689Joe Onoratostatus_t
734535e40544aeb957d44fad75fbe5676effe03689Joe OnoratoBackupDataWriter::write_padding_for(int n)
744535e40544aeb957d44fad75fbe5676effe03689Joe Onorato{
754535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    ssize_t amt;
764535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    ssize_t paddingSize;
774535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
784535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    paddingSize = padding_extra(n);
794535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    if (paddingSize > 0) {
804535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        uint32_t padding = 0xbcbcbcbc;
816215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        if (DEBUG) ALOGI("writing %d padding bytes for %d", paddingSize, n);
824535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        amt = write(m_fd, &padding, paddingSize);
834535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        if (amt != paddingSize) {
844535e40544aeb957d44fad75fbe5676effe03689Joe Onorato            m_status = errno;
854535e40544aeb957d44fad75fbe5676effe03689Joe Onorato            return m_status;
864535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        }
874535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        m_pos += amt;
884535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    }
894535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    return NO_ERROR;
904535e40544aeb957d44fad75fbe5676effe03689Joe Onorato}
914535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
924535e40544aeb957d44fad75fbe5676effe03689Joe Onoratostatus_t
934535e40544aeb957d44fad75fbe5676effe03689Joe OnoratoBackupDataWriter::WriteEntityHeader(const String8& key, size_t dataSize)
944535e40544aeb957d44fad75fbe5676effe03689Joe Onorato{
954535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    if (m_status != NO_ERROR) {
964535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        return m_status;
974535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    }
984535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
994535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    ssize_t amt;
1004535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
1014535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    amt = write_padding_for(m_pos);
1024535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    if (amt != 0) {
1034535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        return amt;
1044535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    }
1054535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
10606290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    String8 k;
10706290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    if (m_keyPrefix.length() > 0) {
10806290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato        k = m_keyPrefix;
10906290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato        k += ":";
11006290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato        k += key;
11106290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    } else {
11206290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato        k = key;
11306290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    }
1144a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate    if (DEBUG) {
1155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Writing header: prefix='%s' key='%s' dataSize=%d", m_keyPrefix.string(),
1165baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                key.string(), dataSize);
117568bc32344dce841c8f6958f1a65ff839a1b64c0Joe Onorato    }
11806290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato
1194535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    entity_header_v1 header;
1204535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    ssize_t keyLen;
1214535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
12206290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    keyLen = k.length();
1234535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
124d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    header.type = tolel(BACKUP_HEADER_ENTITY_V1);
1254535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    header.keyLen = tolel(keyLen);
1264535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    header.dataSize = tolel(dataSize);
1274535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
1286215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block    if (DEBUG) ALOGI("writing entity header, %d bytes", sizeof(entity_header_v1));
1294535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    amt = write(m_fd, &header, sizeof(entity_header_v1));
1304535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    if (amt != sizeof(entity_header_v1)) {
1314535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        m_status = errno;
1324535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        return m_status;
1334535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    }
1344535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    m_pos += amt;
1354535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
1366215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block    if (DEBUG) ALOGI("writing entity header key, %d bytes", keyLen+1);
13706290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    amt = write(m_fd, k.string(), keyLen+1);
1384535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    if (amt != keyLen+1) {
1394535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        m_status = errno;
1404535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        return m_status;
1414535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    }
1424535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    m_pos += amt;
1434535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
1444535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    amt = write_padding_for(keyLen+1);
1454535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
1464535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    m_entityCount++;
1474535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
1484535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    return amt;
1494535e40544aeb957d44fad75fbe5676effe03689Joe Onorato}
1504535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
1514535e40544aeb957d44fad75fbe5676effe03689Joe Onoratostatus_t
1524535e40544aeb957d44fad75fbe5676effe03689Joe OnoratoBackupDataWriter::WriteEntityData(const void* data, size_t size)
1534535e40544aeb957d44fad75fbe5676effe03689Joe Onorato{
1545baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    if (DEBUG) ALOGD("Writing data: size=%lu", (unsigned long) size);
1554a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate
1564535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    if (m_status != NO_ERROR) {
1574a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate        if (DEBUG) {
1585baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Not writing data - stream in error state %d (%s)", m_status, strerror(m_status));
1594a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate        }
1604535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        return m_status;
1614535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    }
1624535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
1634535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    // We don't write padding here, because they're allowed to call this several
1644535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    // times with smaller buffers.  We write it at the end of WriteEntityHeader
1654535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    // instead.
1664535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    ssize_t amt = write(m_fd, data, size);
1674535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    if (amt != (ssize_t)size) {
1684535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        m_status = errno;
1695baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        if (DEBUG) ALOGD("write returned error %d (%s)", m_status, strerror(m_status));
1704535e40544aeb957d44fad75fbe5676effe03689Joe Onorato        return m_status;
1714535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    }
1724535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    m_pos += amt;
1734535e40544aeb957d44fad75fbe5676effe03689Joe Onorato    return NO_ERROR;
1744535e40544aeb957d44fad75fbe5676effe03689Joe Onorato}
1754535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
17606290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onoratovoid
17706290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe OnoratoBackupDataWriter::SetKeyPrefix(const String8& keyPrefix)
17806290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato{
17906290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    m_keyPrefix = keyPrefix;
18006290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato}
1814535e40544aeb957d44fad75fbe5676effe03689Joe Onorato
1822e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
1832e1da32203b7f6df76023f25a7382a31fad6b19dJoe OnoratoBackupDataReader::BackupDataReader(int fd)
1842e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    :m_fd(fd),
1855f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato     m_done(false),
1862e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato     m_status(NO_ERROR),
1872e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato     m_pos(0),
1882e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato     m_entityCount(0)
1892e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato{
1902e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    memset(&m_header, 0, sizeof(m_header));
1912e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato}
1922e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
1932e1da32203b7f6df76023f25a7382a31fad6b19dJoe OnoratoBackupDataReader::~BackupDataReader()
1942e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato{
1952e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato}
1962e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
1972e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onoratostatus_t
1982e1da32203b7f6df76023f25a7382a31fad6b19dJoe OnoratoBackupDataReader::Status()
1992e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato{
2002e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    return m_status;
2012e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato}
2022e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
2032e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato#define CHECK_SIZE(actual, expected) \
2042e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    do { \
2052e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        if ((actual) != (expected)) { \
2062e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            if ((actual) == 0) { \
2072e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato                m_status = EIO; \
2089bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                m_done = true; \
2092e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            } else { \
2102e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato                m_status = errno; \
2115baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("CHECK_SIZE(a=%ld e=%ld) failed at line %d m_status='%s'", \
2124cc86e1ae80eb1938500fe5fa06bbdf8b4b7b50dChristopher Tate                    long(actual), long(expected), __LINE__, strerror(m_status)); \
2132e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            } \
2142e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            return m_status; \
2152e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        } \
2162e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    } while(0)
2172e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato#define SKIP_PADDING() \
2182e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    do { \
2192e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        status_t err = skip_padding(); \
2202e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        if (err != NO_ERROR) { \
2215baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("SKIP_PADDING FAILED at line %d", __LINE__); \
2222e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            m_status = err; \
2232e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            return err; \
2242e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        } \
2252e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    } while(0)
2262e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
2272e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onoratostatus_t
2285f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe OnoratoBackupDataReader::ReadNextHeader(bool* done, int* type)
2292e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato{
2305f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    *done = m_done;
2312e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    if (m_status != NO_ERROR) {
2322e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        return m_status;
2332e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    }
2342e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
2352e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    int amt;
2362e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
2378d72569e3b85a352afe0fe1125b784d2ac13cde1Joe Onorato    amt = skip_padding();
2388d72569e3b85a352afe0fe1125b784d2ac13cde1Joe Onorato    if (amt == EIO) {
2399bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        *done = m_done = true;
2408d72569e3b85a352afe0fe1125b784d2ac13cde1Joe Onorato        return NO_ERROR;
2418d72569e3b85a352afe0fe1125b784d2ac13cde1Joe Onorato    }
2428d72569e3b85a352afe0fe1125b784d2ac13cde1Joe Onorato    else if (amt != NO_ERROR) {
2438d72569e3b85a352afe0fe1125b784d2ac13cde1Joe Onorato        return amt;
2448d72569e3b85a352afe0fe1125b784d2ac13cde1Joe Onorato    }
2452e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    amt = read(m_fd, &m_header, sizeof(m_header));
2465f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    *done = m_done = (amt == 0);
2478d72569e3b85a352afe0fe1125b784d2ac13cde1Joe Onorato    if (*done) {
2488d72569e3b85a352afe0fe1125b784d2ac13cde1Joe Onorato        return NO_ERROR;
2498d72569e3b85a352afe0fe1125b784d2ac13cde1Joe Onorato    }
2502e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    CHECK_SIZE(amt, sizeof(m_header));
2515d605dc56b036232e885f6ec36b888b729673060Joe Onorato    m_pos += sizeof(m_header);
2525d605dc56b036232e885f6ec36b888b729673060Joe Onorato    if (type) {
2535d605dc56b036232e885f6ec36b888b729673060Joe Onorato        *type = m_header.type;
2545d605dc56b036232e885f6ec36b888b729673060Joe Onorato    }
2552e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
2562e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    // validate and fix up the fields.
2572e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    m_header.type = fromlel(m_header.type);
2582e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    switch (m_header.type)
2592e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    {
260d2110dbce071a236b6176de344ca797b737542ebJoe Onorato        case BACKUP_HEADER_ENTITY_V1:
2615d605dc56b036232e885f6ec36b888b729673060Joe Onorato        {
2622e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            m_header.entity.keyLen = fromlel(m_header.entity.keyLen);
2632e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            if (m_header.entity.keyLen <= 0) {
2645baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Entity header at %d has keyLen<=0: 0x%08x\n", (int)m_pos,
2652e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato                        (int)m_header.entity.keyLen);
2662e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato                m_status = EINVAL;
2672e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            }
2682e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            m_header.entity.dataSize = fromlel(m_header.entity.dataSize);
2692e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            m_entityCount++;
2705d605dc56b036232e885f6ec36b888b729673060Joe Onorato
2715d605dc56b036232e885f6ec36b888b729673060Joe Onorato            // read the rest of the header (filename)
2725d605dc56b036232e885f6ec36b888b729673060Joe Onorato            size_t size = m_header.entity.keyLen;
2735d605dc56b036232e885f6ec36b888b729673060Joe Onorato            char* buf = m_key.lockBuffer(size);
2745d605dc56b036232e885f6ec36b888b729673060Joe Onorato            if (buf == NULL) {
2755d605dc56b036232e885f6ec36b888b729673060Joe Onorato                m_status = ENOMEM;
2765d605dc56b036232e885f6ec36b888b729673060Joe Onorato                return m_status;
2775d605dc56b036232e885f6ec36b888b729673060Joe Onorato            }
2785d605dc56b036232e885f6ec36b888b729673060Joe Onorato            int amt = read(m_fd, buf, size+1);
2795d605dc56b036232e885f6ec36b888b729673060Joe Onorato            CHECK_SIZE(amt, (int)size+1);
2805d605dc56b036232e885f6ec36b888b729673060Joe Onorato            m_key.unlockBuffer(size);
2815d605dc56b036232e885f6ec36b888b729673060Joe Onorato            m_pos += size+1;
2825d605dc56b036232e885f6ec36b888b729673060Joe Onorato            SKIP_PADDING();
2835d605dc56b036232e885f6ec36b888b729673060Joe Onorato            m_dataEndPos = m_pos + m_header.entity.dataSize;
2845d605dc56b036232e885f6ec36b888b729673060Joe Onorato
2852e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            break;
2865d605dc56b036232e885f6ec36b888b729673060Joe Onorato        }
2872e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        default:
2885baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Chunk header at %d has invalid type: 0x%08x",
28928cdb9e104e03680d61c3e6dd654d1beff51427dChristopher Tate                    (int)(m_pos - sizeof(m_header)), (int)m_header.type);
2902e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato            m_status = EINVAL;
2912e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    }
2922e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
2932e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    return m_status;
2942e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato}
2952e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
2962e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onoratobool
2972e1da32203b7f6df76023f25a7382a31fad6b19dJoe OnoratoBackupDataReader::HasEntities()
2982e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato{
299d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    return m_status == NO_ERROR && m_header.type == BACKUP_HEADER_ENTITY_V1;
3002e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato}
3012e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
3022e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onoratostatus_t
3032e1da32203b7f6df76023f25a7382a31fad6b19dJoe OnoratoBackupDataReader::ReadEntityHeader(String8* key, size_t* dataSize)
3042e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato{
3052e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    if (m_status != NO_ERROR) {
3062e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        return m_status;
3072e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    }
308d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    if (m_header.type != BACKUP_HEADER_ENTITY_V1) {
3092e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        return EINVAL;
3102e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    }
3115d605dc56b036232e885f6ec36b888b729673060Joe Onorato    *key = m_key;
3122e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    *dataSize = m_header.entity.dataSize;
3132e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    return NO_ERROR;
3142e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato}
3152e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
3162e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onoratostatus_t
317d2110dbce071a236b6176de344ca797b737542ebJoe OnoratoBackupDataReader::SkipEntityData()
318d2110dbce071a236b6176de344ca797b737542ebJoe Onorato{
319d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    if (m_status != NO_ERROR) {
320d2110dbce071a236b6176de344ca797b737542ebJoe Onorato        return m_status;
321d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    }
322d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    if (m_header.type != BACKUP_HEADER_ENTITY_V1) {
323d2110dbce071a236b6176de344ca797b737542ebJoe Onorato        return EINVAL;
324d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    }
325d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    if (m_header.entity.dataSize > 0) {
3265f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato        int pos = lseek(m_fd, m_dataEndPos, SEEK_SET);
327ee5bbb7f6304c4930899d069c82fe02e49f050aaJoe Onorato        if (pos == -1) {
328ee5bbb7f6304c4930899d069c82fe02e49f050aaJoe Onorato            return errno;
329ee5bbb7f6304c4930899d069c82fe02e49f050aaJoe Onorato        }
3305067685ccf6c294a77a3e7f0577190600a0e6238Christopher Tate        m_pos = pos;
331d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    }
332ee5bbb7f6304c4930899d069c82fe02e49f050aaJoe Onorato    SKIP_PADDING();
333ee5bbb7f6304c4930899d069c82fe02e49f050aaJoe Onorato    return NO_ERROR;
334d2110dbce071a236b6176de344ca797b737542ebJoe Onorato}
335d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
336efd0fab04b96d7ab0c1d8bf3b79397c8621e31c5Joe Onoratossize_t
3372e1da32203b7f6df76023f25a7382a31fad6b19dJoe OnoratoBackupDataReader::ReadEntityData(void* data, size_t size)
3382e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato{
3392e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    if (m_status != NO_ERROR) {
3405d605dc56b036232e885f6ec36b888b729673060Joe Onorato        return -1;
3412e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    }
3425f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    int remaining = m_dataEndPos - m_pos;
3435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    //ALOGD("ReadEntityData size=%d m_pos=0x%x m_dataEndPos=0x%x remaining=%d\n",
344efd0fab04b96d7ab0c1d8bf3b79397c8621e31c5Joe Onorato    //        size, m_pos, m_dataEndPos, remaining);
3455f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    if (remaining <= 0) {
3465f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato        return 0;
3475f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    }
34806290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    if (((int)size) > remaining) {
3495d605dc56b036232e885f6ec36b888b729673060Joe Onorato        size = remaining;
3505d605dc56b036232e885f6ec36b888b729673060Joe Onorato    }
3515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    //ALOGD("   reading %d bytes", size);
3522e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    int amt = read(m_fd, data, size);
3535d605dc56b036232e885f6ec36b888b729673060Joe Onorato    if (amt < 0) {
3545d605dc56b036232e885f6ec36b888b729673060Joe Onorato        m_status = errno;
3555d605dc56b036232e885f6ec36b888b729673060Joe Onorato        return -1;
3565d605dc56b036232e885f6ec36b888b729673060Joe Onorato    }
3579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    if (amt == 0) {
3589bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        m_status = EIO;
3599bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        m_done = true;
3609bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
3615d605dc56b036232e885f6ec36b888b729673060Joe Onorato    m_pos += amt;
362efd0fab04b96d7ab0c1d8bf3b79397c8621e31c5Joe Onorato    return amt;
3632e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato}
3642e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
3652e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onoratostatus_t
3662e1da32203b7f6df76023f25a7382a31fad6b19dJoe OnoratoBackupDataReader::skip_padding()
3672e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato{
3682e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    ssize_t amt;
3692e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    ssize_t paddingSize;
3702e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
3712e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    paddingSize = padding_extra(m_pos);
3722e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    if (paddingSize > 0) {
3732e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        uint32_t padding;
3742e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        amt = read(m_fd, &padding, paddingSize);
3752e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        CHECK_SIZE(amt, paddingSize);
3762e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato        m_pos += amt;
3772e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    }
3782e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato    return NO_ERROR;
3792e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato}
3802e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
3812e1da32203b7f6df76023f25a7382a31fad6b19dJoe Onorato
3824535e40544aeb957d44fad75fbe5676effe03689Joe Onorato} // namespace android
383