diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2018-10-03 20:33:45 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-10-03 20:33:45 +0000 |
commit | e402db97a8db70aa04c1d226d52377251f352021 (patch) | |
tree | a03c336d16e58abdfdb13dcf32541224b03262fb | |
parent | beeb6ac62e408f0d14506e476ebc41439b46261b (diff) | |
parent | 97ec14b59e30aad604bcc74441bdf717c1a9df6b (diff) | |
download | extras-e402db97a8db70aa04c1d226d52377251f352021.tar.gz |
Merge "partition_tools: Add support for partition groups."
-rw-r--r-- | partition_tools/lpdump.cc | 11 | ||||
-rw-r--r-- | partition_tools/lpmake.cc | 47 |
2 files changed, 55 insertions, 3 deletions
diff --git a/partition_tools/lpdump.cc b/partition_tools/lpdump.cc index 9d03581d..bab05bb8 100644 --- a/partition_tools/lpdump.cc +++ b/partition_tools/lpdump.cc @@ -102,7 +102,9 @@ int main(int argc, char* argv[]) { for (const auto& partition : pt->partitions) { std::string name = GetPartitionName(partition); std::string guid = GetPartitionGuid(partition); + std::string group_name = GetPartitionGroupName(pt->groups[partition.group_index]); printf(" Name: %s\n", name.c_str()); + printf(" Group: %s\n", group_name.c_str()); printf(" GUID: %s\n", guid.c_str()); printf(" Attributes: %s\n", BuildAttributeString(partition.attributes).c_str()); printf(" Extents:\n"); @@ -122,5 +124,14 @@ int main(int argc, char* argv[]) { printf("------------------------\n"); } + printf("Group table:\n"); + printf("------------------------\n"); + for (const auto& group : pt->groups) { + std::string group_name = GetPartitionGroupName(group); + printf(" Name: %s\n", group_name.c_str()); + printf(" Maximum size: %" PRIx64 "\n", group.maximum_size); + } + printf("------------------------\n"); + return EX_OK; } diff --git a/partition_tools/lpmake.cc b/partition_tools/lpmake.cc index 8b0dfad1..caa12a3f 100644 --- a/partition_tools/lpmake.cc +++ b/partition_tools/lpmake.cc @@ -52,6 +52,8 @@ static int usage(int /* argc */, char* argv[]) { " -i,--image=PARTITION=FILE If building a sparse image for fastboot, include\n" " the given file (or sparse file) as initial data for\n" " the named partition.\n" + " -g,--group=GROUP:SIZE Define a named partition group with the given\n" + " maximum size.\n" "\n" "Partition data format:\n" " <name>:<guid>:<attributes>:<size>\n" @@ -73,6 +75,7 @@ int main(int argc, char* argv[]) { { "sparse", no_argument, nullptr, 'S' }, { "block-size", required_argument, nullptr, 'b' }, { "image", required_argument, nullptr, 'i' }, + { "group", required_argument, nullptr, 'g' }, { nullptr, 0, nullptr, 0 }, }; @@ -84,6 +87,7 @@ int main(int argc, char* argv[]) { uint32_t block_size = 4096; std::string output_path; std::vector<std::string> partitions; + std::vector<std::string> groups; std::map<std::string, std::string> images; bool output_sparse = false; @@ -114,6 +118,9 @@ int main(int argc, char* argv[]) { case 'p': partitions.push_back(optarg); break; + case 'g': + groups.push_back(optarg); + break; case 'o': output_path = optarg; break; @@ -195,15 +202,40 @@ int main(int argc, char* argv[]) { std::unique_ptr<MetadataBuilder> builder = MetadataBuilder::New(device_info, metadata_size, metadata_slots); + for (const auto& group_info : groups) { + std::vector<std::string> parts = android::base::Split(group_info, ":"); + if (parts.size() != 2) { + fprintf(stderr, "Partition info has invalid formatting.\n"); + return EX_USAGE; + } + + std::string name = parts[0]; + if (name.empty()) { + fprintf(stderr, "Partition group must have a valid name.\n"); + return EX_USAGE; + } + + uint64_t size; + if (!android::base::ParseUint(parts[1].c_str(), &size)) { + fprintf(stderr, "Partition group must have a valid maximum size.\n"); + return EX_USAGE; + } + + if (!builder->AddGroup(name, size)) { + fprintf(stderr, "Group name %s already exists.\n", name.c_str()); + return EX_SOFTWARE; + } + } + for (const auto& partition_info : partitions) { std::vector<std::string> parts = android::base::Split(partition_info, ":"); - if (parts.size() != 4) { + if (parts.size() > 5) { fprintf(stderr, "Partition info has invalid formatting.\n"); return EX_USAGE; } std::string name = parts[0]; - if (!name.length()) { + if (name.empty()) { fprintf(stderr, "Partition must have a valid name.\n"); return EX_USAGE; } @@ -223,7 +255,16 @@ int main(int argc, char* argv[]) { return EX_USAGE; } - Partition* partition = builder->AddPartition(name, parts[1], attribute_flags); + std::string group_name = "default"; + if (parts.size() >= 5) { + group_name = parts[4]; + } + + Partition* partition = builder->AddPartition(name, group_name, parts[1], attribute_flags); + if (!partition) { + fprintf(stderr, "Could not add partition: %s\n", name.c_str()); + return EX_SOFTWARE; + } if (!builder->ResizePartition(partition, size)) { fprintf(stderr, "Not enough space on device for partition %s with size %" PRIu64 "\n", name.c_str(), size); |