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