Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a100c02b authored by Christopher Tate's avatar Christopher Tate
Browse files

Compress the backup output stream

Zlib compression, with a full flush between each application's
data.  Encryption will be performed on the already-compressed data
once that's implemented.

On restore, the streamed data is similarly uncompressed on the fly.

Change-Id: I19b65c88e759a66527d10913d18fffa9df0bc011
parent 15a99db8
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -481,6 +481,14 @@ static int write_pax_header_entry(char* buf, const char* key, const char* value)
    return sprintf(buf, "%d %s=%s\n", len, key, value);
}

// Wire format to the backup manager service is chunked:  each chunk is prefixed by
// a 4-byte count of its size.  A chunk size of zero (four zero bytes) indicates EOD.
void send_tarfile_chunk(BackupDataWriter* writer, const char* buffer, size_t size) {
    uint32_t chunk_size_no = htonl(size);
    writer->WriteEntityData(&chunk_size_no, 4);
    if (size != 0) writer->WriteEntityData(buffer, size);
}

int write_tarfile(const String8& packageName, const String8& domain,
        const String8& rootpath, const String8& filepath, BackupDataWriter* writer)
{
@@ -660,16 +668,16 @@ int write_tarfile(const String8& packageName, const String8& domain,

        // Checksum and write the pax block header
        calc_tar_checksum(paxHeader);
        writer->WriteEntityData(paxHeader, 512);
        send_tarfile_chunk(writer, paxHeader, 512);

        // Now write the pax data itself
        int paxblocks = (paxLen + 511) / 512;
        writer->WriteEntityData(paxData, 512 * paxblocks);
        send_tarfile_chunk(writer, paxData, 512 * paxblocks);
    }

    // Checksum and write the 512-byte ustar file header block to the output
    calc_tar_checksum(buf);
    writer->WriteEntityData(buf, 512);
    send_tarfile_chunk(writer, buf, 512);

    // Now write the file data itself, for real files.  We honor tar's convention that
    // only full 512-byte blocks are sent to write().
@@ -699,7 +707,7 @@ int write_tarfile(const String8& packageName, const String8& domain,
                memset(buf + nRead, 0, remainder);
                nRead += remainder;
            }
            writer->WriteEntityData(buf, nRead);
            send_tarfile_chunk(writer, buf, nRead);
            toWrite -= nRead;
        }
    }