| Index: src/platform/update_engine/update_metadata.proto
 | 
| diff --git a/src/platform/update_engine/update_metadata.proto b/src/platform/update_engine/update_metadata.proto
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..48935d8a6b2b3f5f1ed2569f8047ec3e4689f38c
 | 
| --- /dev/null
 | 
| +++ b/src/platform/update_engine/update_metadata.proto
 | 
| @@ -0,0 +1,127 @@
 | 
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +// Update file format: A delta update file contains all the deltas needed
 | 
| +// to update a system from one specific version to another specific
 | 
| +// version. The update format is represented by this struct pseudocode:
 | 
| +// struct delta_update_file {
 | 
| +//   char magic[4] = "CrAU";
 | 
| +//   uint64 bom_offset;  // Offset of protobuf DeltaArchiveManifest
 | 
| +//   uint64 bom_size;  // Sise of protobuf DeltaArchiveManifest
 | 
| +//
 | 
| +//   // Data blobs for files, no specific format. The specific offset
 | 
| +//   // and length of each data blob is recorded in the DeltaArchiveManifest.
 | 
| +//   struct {
 | 
| +//     char data[];
 | 
| +//   } blobs[];
 | 
| +//
 | 
| +//   // The Gzip compressed DeltaArchiveManifest
 | 
| +//   char bom[];
 | 
| +// };
 | 
| +
 | 
| +// The DeltaArchiveManifest protobuf is an ordered list of File objects.
 | 
| +// These File objects are stored in a linear array in the
 | 
| +// DeltaArchiveManifest, each with a specific index. Each File object
 | 
| +// can contain children in its children list. Each child in the list
 | 
| +// has a name and an index. The index refers to the index within
 | 
| +// DeltaArchiveManifest.files. Thus, the DeltaArchiveManifest.files
 | 
| +// can be seen as a tree structure that mimicks the filesystem.
 | 
| +// The root object (the object an index 0) has no name, since names
 | 
| +// for children are stored in the parent.
 | 
| +
 | 
| +// The DeltaArchiveManifest will contain one File entry for each
 | 
| +// file that will be on the resultant filesystem. Because we have
 | 
| +// a tree structure, and children are ordered alphabetically within
 | 
| +// a parent, we can do log-time˜path lookup on a DeltaArchiveManifest
 | 
| +// object. We can also iterate through a DeltaArchiveManifest object
 | 
| +// using a preorder tree traversal to see each file in the
 | 
| +// DeltaArchiveManifest, seeing each directory before any of its children;
 | 
| +// this takes linear time.
 | 
| +
 | 
| +// Here's an example from Dan Erat showing DeltaArchiveManifest
 | 
| +// for a filesystem with files /bin/cat and /bin/ls.:
 | 
| +
 | 
| +// files[0] {  // "/" directory
 | 
| +//   children[0] {
 | 
| +//     name "bin"
 | 
| +//     index 1
 | 
| +//   }
 | 
| +// }
 | 
| +// files[1] {  // "/bin" directory
 | 
| +//   children[0] {
 | 
| +//     name "cat"
 | 
| +//     index 2
 | 
| +//   }
 | 
| +//   children[1] {
 | 
| +//     name "ls"
 | 
| +//     index 3
 | 
| +//   }
 | 
| +// }
 | 
| +// files[2] {  // "/bin/cat"
 | 
| +// }
 | 
| +// files[3] {  // "/bin/ls"
 | 
| +// }
 | 
| +
 | 
| +// If a file has a data_format set, it should also have data_offset and
 | 
| +// data_length set. data_offset and data_length refer to a range of bytes
 | 
| +// in the delta update file itself which have the format specified by
 | 
| +// data_format. FULL and FULL_GZ mean the entire file is present (FULL_GZ,
 | 
| +// gzip compressed). BSDIFF means the old file with the same path should be
 | 
| +// patched with 'bspatch' to produce the desired output file. COURGETTE
 | 
| +// is not yet used, but it will be another binary diff format.
 | 
| +
 | 
| +// Directories should not have any data.
 | 
| +
 | 
| +// There are other types of files, too: symlinks, block and character devices,
 | 
| +// fifos, and sockets. Fifos and sockets contain no data. Block and
 | 
| +// character devices have data. It must be the format FULL or FULL_GZ, and
 | 
| +// the contents are a serialized LinuxDevice protobuf. Symlinks must either
 | 
| +// be FULL, FULL_GZ, or have no data. A symlink with no data is unchanged,
 | 
| +// and with data it's set to that data.
 | 
| +
 | 
| +// TODO(adlr): Add support for hard links; CL is prepared already.
 | 
| +// Extended attributes are unsupported at this time.
 | 
| +
 | 
| +package chromeos_update_engine;
 | 
| +
 | 
| +message DeltaArchiveManifest {
 | 
| +  message File {
 | 
| +    // This is st_mode from struct stat. It includes file type and permission
 | 
| +    // bits.
 | 
| +    optional uint32 mode = 1;
 | 
| +    optional uint32 uid = 2;
 | 
| +    optional uint32 gid = 3;
 | 
| +
 | 
| +    // File Data, not for directories
 | 
| +    enum DataFormat {
 | 
| +      FULL = 0;  // The data is the complete file
 | 
| +      FULL_GZ = 1;  // The data is the complete file gzipped
 | 
| +      BSDIFF = 2;  // The data is a bsdiff binary diff
 | 
| +      COURGETTE = 3;  // The data is a courgette binary diff
 | 
| +    }
 | 
| +    // If present, there is data associated with this File object and
 | 
| +    // data_offset and data_size must be set.
 | 
| +    optional DataFormat data_format = 4;
 | 
| +    // The offset into the delta file where the data (if any) is stored
 | 
| +    optional uint32 data_offset = 5;
 | 
| +    // The length of the data in the delta file
 | 
| +    optional uint32 data_length = 6;
 | 
| +
 | 
| +    message Child {
 | 
| +      // A File that's a directory (and only those types of File objects)
 | 
| +      // will have exactly one Child submessage per child.
 | 
| +      required string name = 1;  // File name of child
 | 
| +
 | 
| +      // Index into DeltaArchiveManifest.files for the File object of the child.
 | 
| +      required uint32 index = 2;
 | 
| +    }
 | 
| +    repeated Child children = 7;
 | 
| +  }
 | 
| +  repeated File files = 1;
 | 
| +}
 | 
| +
 | 
| +message LinuxDevice {
 | 
| +  required int32 major = 1;
 | 
| +  required int32 minor = 2;
 | 
| +}
 | 
| 
 |