diff options
author | 2009-06-18 18:23:43 -0700 | |
---|---|---|
committer | 2009-06-18 18:41:11 -0700 | |
commit | 5d605dc56b036232e885f6ec36b888b729673060 (patch) | |
tree | 8a29f6a2feb495cbac08bb43b08e0ca9b8cf7dce | |
parent | d2d9ceb7305d593c1b767bbb05de0082a9af4109 (diff) |
backup stuff
-rw-r--r-- | core/java/com/android/internal/backup/LocalTransport.java | 44 | ||||
-rw-r--r-- | include/utils/BackupHelpers.h | 1 | ||||
-rw-r--r-- | libs/utils/BackupData.cpp | 55 | ||||
-rw-r--r-- | libs/utils/BackupHelpers.cpp | 8 | ||||
-rw-r--r-- | services/java/com/android/server/BackupManagerService.java | 1 |
5 files changed, 65 insertions, 44 deletions
diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/core/java/com/android/internal/backup/LocalTransport.java index 5caa0158d134..3ef8666ce722 100644 --- a/core/java/com/android/internal/backup/LocalTransport.java +++ b/core/java/com/android/internal/backup/LocalTransport.java @@ -80,28 +80,35 @@ public class LocalTransport extends IBackupTransport.Stub { byte[] buf = new byte[bufSize]; while (changeSet.readNextHeader()) { String key = changeSet.getKey(); + String base64Key = new String(Base64.encode(key.getBytes())); + File entityFile = new File(packageDir, base64Key); + int dataSize = changeSet.getDataSize(); - String base64Key = new String(Base64.encode(key.getBytes())); if (DEBUG) Log.v(TAG, "Got change set key=" + key + " size=" + dataSize + " key64=" + base64Key); - if (dataSize > bufSize) { - bufSize = dataSize; - buf = new byte[bufSize]; - } - changeSet.readEntityData(buf, 0, dataSize); - if (DEBUG) Log.v(TAG, " + data size " + dataSize); - File entityFile = new File(packageDir, base64Key); - FileOutputStream entity = new FileOutputStream(entityFile); - try { - entity.write(buf, 0, dataSize); - } catch (IOException e) { - Log.e(TAG, "Unable to update key file " - + entityFile.getAbsolutePath()); - err = -1; - } finally { - entity.close(); + if (dataSize >= 0) { + FileOutputStream entity = new FileOutputStream(entityFile); + + if (dataSize > bufSize) { + bufSize = dataSize; + buf = new byte[bufSize]; + } + changeSet.readEntityData(buf, 0, dataSize); + if (DEBUG) Log.v(TAG, " data size " + dataSize); + + try { + entity.write(buf, 0, dataSize); + } catch (IOException e) { + Log.e(TAG, "Unable to update key file " + + entityFile.getAbsolutePath()); + err = -1; + } finally { + entity.close(); + } + } else { + entityFile.delete(); } } } catch (IOException e) { @@ -172,7 +179,8 @@ public class LocalTransport extends IBackupTransport.Stub { int size = (int) f.length(); byte[] buf = new byte[size]; in.read(buf); - out.writeEntityHeader(f.getName(), size); + String key = new String(Base64.decode(f.getName())); + out.writeEntityHeader(key, size); out.writeEntityData(buf, size); } } catch (Exception e) { diff --git a/include/utils/BackupHelpers.h b/include/utils/BackupHelpers.h index fc701fd3a565..c78b99a8dca0 100644 --- a/include/utils/BackupHelpers.h +++ b/include/utils/BackupHelpers.h @@ -116,6 +116,7 @@ private: int type; entity_header_v1 entity; } m_header; + String8 m_key; }; int back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD, diff --git a/libs/utils/BackupData.cpp b/libs/utils/BackupData.cpp index 34b37edd28a0..6a7f05646472 100644 --- a/libs/utils/BackupData.cpp +++ b/libs/utils/BackupData.cpp @@ -205,12 +205,17 @@ BackupDataReader::ReadNextHeader(bool* done, int* type) amt = read(m_fd, &m_header, sizeof(m_header)); *done = m_done = (amt == 0); CHECK_SIZE(amt, sizeof(m_header)); + m_pos += sizeof(m_header); + if (type) { + *type = m_header.type; + } // validate and fix up the fields. m_header.type = fromlel(m_header.type); switch (m_header.type) { case BACKUP_HEADER_ENTITY_V1: + { m_header.entity.keyLen = fromlel(m_header.entity.keyLen); if (m_header.entity.keyLen <= 0) { LOGD("Entity header at %d has keyLen<=0: 0x%08x\n", (int)m_pos, @@ -219,15 +224,27 @@ BackupDataReader::ReadNextHeader(bool* done, int* type) } m_header.entity.dataSize = fromlel(m_header.entity.dataSize); m_entityCount++; + + // read the rest of the header (filename) + size_t size = m_header.entity.keyLen; + char* buf = m_key.lockBuffer(size); + if (buf == NULL) { + m_status = ENOMEM; + return m_status; + } + int amt = read(m_fd, buf, size+1); + CHECK_SIZE(amt, (int)size+1); + m_key.unlockBuffer(size); + m_pos += size+1; + SKIP_PADDING(); + m_dataEndPos = m_pos + m_header.entity.dataSize; + break; + } default: LOGD("Chunk header at %d has invalid type: 0x%08x", (int)m_pos, (int)m_header.type); m_status = EINVAL; } - m_pos += sizeof(m_header); - if (type) { - *type = m_header.type; - } return m_status; } @@ -247,20 +264,8 @@ BackupDataReader::ReadEntityHeader(String8* key, size_t* dataSize) if (m_header.type != BACKUP_HEADER_ENTITY_V1) { return EINVAL; } - size_t size = m_header.entity.keyLen; - char* buf = key->lockBuffer(size); - if (key == NULL) { - key->unlockBuffer(); - m_status = ENOMEM; - return m_status; - } - int amt = read(m_fd, buf, size+1); - CHECK_SIZE(amt, (int)size+1); - key->unlockBuffer(size); - m_pos += size+1; + *key = m_key; *dataSize = m_header.entity.dataSize; - SKIP_PADDING(); - m_dataEndPos = m_pos + *dataSize; return NO_ERROR; } @@ -285,20 +290,24 @@ ssize_t BackupDataReader::ReadEntityData(void* data, size_t size) { if (m_status != NO_ERROR) { - return m_status; + return -1; } int remaining = m_dataEndPos - m_pos; //LOGD("ReadEntityData size=%d m_pos=0x%x m_dataEndPos=0x%x remaining=%d\n", // size, m_pos, m_dataEndPos, remaining); - if (size > remaining) { - size = remaining; - } if (remaining <= 0) { return 0; } + if (size > remaining) { + size = remaining; + } + //LOGD(" reading %d bytes", size); int amt = read(m_fd, data, size); - CHECK_SIZE(amt, (int)size); - m_pos += size; + if (amt < 0) { + m_status = errno; + return -1; + } + m_pos += amt; return amt; } diff --git a/libs/utils/BackupHelpers.cpp b/libs/utils/BackupHelpers.cpp index 99687bc8f636..d65a457f3987 100644 --- a/libs/utils/BackupHelpers.cpp +++ b/libs/utils/BackupHelpers.cpp @@ -414,14 +414,15 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in) if (err != NO_ERROR) { return err; } - + // TODO: World readable/writable for now. mode = 0666; // Write the file and compute the crc crc = crc32(0L, Z_NULL, 0); - fd = open(filename.string(), O_CREAT|O_RDWR, mode); - if (fd != -1) { + fd = open(filename.string(), O_CREAT|O_RDWR|O_TRUNC, mode); + if (fd == -1) { + LOGW("Could not open file %s -- %s", filename.string(), strerror(errno)); return errno; } @@ -429,6 +430,7 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in) err = write(fd, buf, amt); if (err != amt) { close(fd); + LOGW("Error '%s' writing '%s'", strerror(errno), filename.string()); return errno; } crc = crc32(crc, (Bytef*)buf, amt); diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index 6ee826065908..51bee25a9cb2 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -164,6 +164,7 @@ class BackupManagerService extends IBackupManager.Stub { // Set up our transport options and initialize the default transport // TODO: Have transports register themselves somehow? // TODO: Don't create transports that we don't need to? + //mTransportId = BackupManager.TRANSPORT_LOCAL; mTransportId = BackupManager.TRANSPORT_GOOGLE; mLocalTransport = new LocalTransport(context); // This is actually pretty cheap mGoogleTransport = null; |