diff options
author | Kaiwen Szu <kwsz@google.com> | 2019-09-05 16:24:25 +0800 |
---|---|---|
committer | Kaiwen Szu <kwsz@google.com> | 2019-09-09 17:37:45 +0800 |
commit | e70853042e8de1eb0d8d66acf3d7e030fa347141 (patch) | |
tree | a4cc7857a27003b8cbf28508190e078bb7cfc179 /vbmeta_tools | |
parent | fe6f4fa2ad6b3a0dc8855797f5850fa6322cee24 (diff) | |
download | extras-e70853042e8de1eb0d8d66acf3d7e030fa347141.tar.gz |
Add vbmake to build super_vbmeta.img
vbmake constructs the super_vbmeta.img with given vbmeta images.
Bug: 137054296
Test: m libvbmeta_test
Test: ./out/host/linux-x86/nativetest/libvbmeta_test/libvbmeta_test
Change-Id: Ic76baa6daa1e58a22b62bdc4f25eb12c8d9004e4
Diffstat (limited to 'vbmeta_tools')
-rw-r--r-- | vbmeta_tools/Android.bp | 26 | ||||
-rw-r--r-- | vbmeta_tools/vbmake.cc | 96 |
2 files changed, 122 insertions, 0 deletions
diff --git a/vbmeta_tools/Android.bp b/vbmeta_tools/Android.bp new file mode 100644 index 00000000..73a9eb7f --- /dev/null +++ b/vbmeta_tools/Android.bp @@ -0,0 +1,26 @@ +// +// Copyright (C) 2019 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +cc_binary { + name: "vbmake", + host_supported: true, + shared_libs: [ + "libvbmeta", + ], + srcs: [ + "vbmake.cc", + ], +}
\ No newline at end of file diff --git a/vbmeta_tools/vbmake.cc b/vbmeta_tools/vbmake.cc new file mode 100644 index 00000000..571b2ad2 --- /dev/null +++ b/vbmeta_tools/vbmake.cc @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <getopt.h> +#include <sysexits.h> + +#include <libvbmeta/libvbmeta.h> + +using android::fs_mgr::WriteToSuperVBMetaFile; + +/* Prints program usage to |where|. */ +static int usage(int /* argc */, char* argv[]) { + fprintf(stderr, + "%s - command-line tool for creating Super VBMeta Image.\n" + "\n" + "Usage:\n" + " %s [options]\n" + "\n" + "Required options:\n" + " -o,--output=FILE Output file.\n" + "\n" + "Optional:\n" + " -i,--image=VBMETA_NAME=FILE include the given vbmeta file as\n" + " initial data for the super vbmeta.\n", + argv[0], argv[0]); + return EX_USAGE; +} + +int main(int argc, char* argv[]) { + struct option options[] = { + { "help", no_argument, nullptr, 'h' }, + { "image", required_argument, nullptr, 'i' }, + { "output", required_argument, nullptr, 'o' }, + { nullptr, 0, nullptr, 0 }, + }; + + std::string output_path; + std::map<std::string, std::string> images; + + int rv; + while ((rv = getopt_long_only(argc, argv, "i:o:", options, NULL)) != -1) { + switch (rv) { + case 'h': + return usage(argc, argv); + case 'i': + { + char* separator = strchr(optarg, '='); + if (!separator || separator == optarg || !strlen(separator + 1)) { + fprintf(stderr, "Expected VBMETA_NAME=FILE.\n"); + return EX_USAGE; + } + *separator = '\0'; + + std::string vbmeta_name(optarg); + std::string file(separator + 1); + images[vbmeta_name] = file; + break; + } + case 'o': + output_path = optarg; + break; + default: + break; + } + } + + // Check for empty arguments so we can print a more helpful message rather + // than error on each individual missing argument. + if (optind == 1) { + return usage(argc, argv); + } + + if (output_path.empty()) { + fprintf(stderr, "--output must specify a valid path.\n"); + return EX_USAGE; + } + + if (!WriteToSuperVBMetaFile(output_path.c_str(), images)) { + return EX_CANTCREAT; + } + + return EX_OK; +} |