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