diff options
author | Steven Laver <lavers@google.com> | 2020-06-02 13:59:20 -0700 |
---|---|---|
committer | Steven Laver <lavers@google.com> | 2020-06-02 13:59:20 -0700 |
commit | 7ff29bfb9872d87dd70f2f8d6a5c521276b794c0 (patch) | |
tree | d28018245e8487abee201a9ecbb80c57945d5de3 /init/builtins.cpp | |
parent | 0120e61f3f134ce53497ef638a62f2e302031d2f (diff) | |
parent | 61df8d47656f4ac5931520cb641f1013c34b757b (diff) |
Merge RP1A.200601.001
Change-Id: I102331b5c7993a089d4350a75dab8788566d6e20
Diffstat (limited to 'init/builtins.cpp')
-rw-r--r-- | init/builtins.cpp | 77 |
1 files changed, 41 insertions, 36 deletions
diff --git a/init/builtins.cpp b/init/builtins.cpp index 4a48522ab..98d1af825 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -518,21 +518,21 @@ static Result<void> do_mount(const BuiltinArguments& args) { /* Imports .rc files from the specified paths. Default ones are applied if none is given. * - * start_index: index of the first path in the args list + * rc_paths: list of paths to rc files to import */ -static void import_late(const std::vector<std::string>& args, size_t start_index, size_t end_index) { +static void import_late(const std::vector<std::string>& rc_paths) { auto& action_manager = ActionManager::GetInstance(); auto& service_list = ServiceList::GetInstance(); Parser parser = CreateParser(action_manager, service_list); - if (end_index <= start_index) { + if (rc_paths.empty()) { // Fallbacks for partitions on which early mount isn't enabled. for (const auto& path : late_import_paths) { parser.ParseConfig(path); } late_import_paths.clear(); } else { - for (size_t i = start_index; i < end_index; ++i) { - parser.ParseConfig(args[i]); + for (const auto& rc_path : rc_paths) { + parser.ParseConfig(rc_path); } } @@ -640,48 +640,44 @@ static Result<void> queue_fs_event(int code, bool userdata_remount) { static int initial_mount_fstab_return_code = -1; -/* mount_all <fstab> [ <path> ]* [--<options>]* +/* <= Q: mount_all <fstab> [ <path> ]* [--<options>]* + * >= R: mount_all [ <fstab> ] [--<options>]* * * This function might request a reboot, in which case it will * not return. */ static Result<void> do_mount_all(const BuiltinArguments& args) { - std::size_t na = 0; - bool import_rc = true; - bool queue_event = true; - int mount_mode = MOUNT_MODE_DEFAULT; - const auto& fstab_file = args[1]; - std::size_t path_arg_end = args.size(); - const char* prop_post_fix = "default"; + auto mount_all = ParseMountAll(args.args); + if (!mount_all.ok()) return mount_all.error(); - for (na = args.size() - 1; na > 1; --na) { - if (args[na] == "--early") { - path_arg_end = na; - queue_event = false; - mount_mode = MOUNT_MODE_EARLY; - prop_post_fix = "early"; - } else if (args[na] == "--late") { - path_arg_end = na; - import_rc = false; - mount_mode = MOUNT_MODE_LATE; - prop_post_fix = "late"; - } + const char* prop_post_fix = "default"; + bool queue_event = true; + if (mount_all->mode == MOUNT_MODE_EARLY) { + prop_post_fix = "early"; + queue_event = false; + } else if (mount_all->mode == MOUNT_MODE_LATE) { + prop_post_fix = "late"; } std::string prop_name = "ro.boottime.init.mount_all."s + prop_post_fix; android::base::Timer t; Fstab fstab; - if (!ReadFstabFromFile(fstab_file, &fstab)) { - return Error() << "Could not read fstab"; + if (mount_all->fstab_path.empty()) { + if (!ReadDefaultFstab(&fstab)) { + return Error() << "Could not read default fstab"; + } + } else { + if (!ReadFstabFromFile(mount_all->fstab_path, &fstab)) { + return Error() << "Could not read fstab"; + } } - auto mount_fstab_return_code = fs_mgr_mount_all(&fstab, mount_mode); + auto mount_fstab_return_code = fs_mgr_mount_all(&fstab, mount_all->mode); SetProperty(prop_name, std::to_string(t.duration().count())); - if (import_rc && SelinuxGetVendorAndroidVersion() <= __ANDROID_API_Q__) { - /* Paths of .rc files are specified at the 2nd argument and beyond */ - import_late(args.args, 2, path_arg_end); + if (mount_all->import_rc) { + import_late(mount_all->rc_paths); } if (queue_event) { @@ -697,11 +693,20 @@ static Result<void> do_mount_all(const BuiltinArguments& args) { return {}; } -/* umount_all <fstab> */ +/* umount_all [ <fstab> ] */ static Result<void> do_umount_all(const BuiltinArguments& args) { + auto umount_all = ParseUmountAll(args.args); + if (!umount_all.ok()) return umount_all.error(); + Fstab fstab; - if (!ReadFstabFromFile(args[1], &fstab)) { - return Error() << "Could not read fstab"; + if (umount_all->empty()) { + if (!ReadDefaultFstab(&fstab)) { + return Error() << "Could not read default fstab"; + } + } else { + if (!ReadFstabFromFile(*umount_all, &fstab)) { + return Error() << "Could not read fstab"; + } } if (auto result = fs_mgr_umount_all(&fstab); result != 0) { @@ -1371,11 +1376,11 @@ const BuiltinFunctionMap& GetBuiltinFunctionMap() { // mount_all is currently too complex to run in vendor_init as it queues action triggers, // imports rc scripts, etc. It should be simplified and run in vendor_init context. // mount and umount are run in the same context as mount_all for symmetry. - {"mount_all", {1, kMax, {false, do_mount_all}}}, + {"mount_all", {0, kMax, {false, do_mount_all}}}, {"mount", {3, kMax, {false, do_mount}}}, {"perform_apex_config", {0, 0, {false, do_perform_apex_config}}}, {"umount", {1, 1, {false, do_umount}}}, - {"umount_all", {1, 1, {false, do_umount_all}}}, + {"umount_all", {0, 1, {false, do_umount_all}}}, {"update_linker_config", {0, 0, {false, do_update_linker_config}}}, {"readahead", {1, 2, {true, do_readahead}}}, {"remount_userdata", {0, 0, {false, do_remount_userdata}}}, |