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