BackupData.cpp revision 00adb8685ee996f9d2650d617c8c0e98f13ef406
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 } 29200adb8685ee996f9d2650d617c8c0e98f13ef406Mark Salyzyn 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