From dc738eaf1547c250979bb9f1ffb64b0836a5e7f3 Mon Sep 17 00:00:00 2001 From: Hung-ying Tyan Date: Thu, 14 Jan 2016 11:18:21 +0800 Subject: [PATCH] Allow paths of .rc files to be specified at mount_all In current implementation, the mount_all command imports all .rc files under /{system,vendor,odm}/etc/init/ after mouting filesystems is complete. There's a need from ODMs to import different .rc files under different boot modes (e.g., factory mode). Without this support, they will have to fiddle around the init implementation. This commit makes mount_all import the .rc files/directories specified as additional arguments. If no path is given, the original ones are applied the same way as the current implementation. BUG: 26549689 Change-Id: Ie67ce13dde4c440ff8bf534826bc392c882a433f --- init/builtins.cpp | 37 +++++++++++++++++++++++++------------ init/readme.txt | 11 ++++++++--- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/init/builtins.cpp b/init/builtins.cpp index d2291bb50..35f1a9e04 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -418,20 +418,32 @@ static int wipe_data_via_recovery() { while (1) { pause(); } // never reached } -static void import_late() { - static const std::vector init_directories = { - "/system/etc/init", - "/vendor/etc/init", - "/odm/etc/init" - }; - +/* 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 + */ +static void import_late(const std::vector& args, size_t start_index) { Parser& parser = Parser::GetInstance(); - for (const auto& dir : init_directories) { - parser.ParseConfig(dir.c_str()); + if (args.size() <= start_index) { + // Use the default set if no path is given + static const std::vector init_directories = { + "/system/etc/init", + "/vendor/etc/init", + "/odm/etc/init" + }; + + for (const auto& dir : init_directories) { + parser.ParseConfig(dir); + } + } else { + for (size_t i = start_index; i < args.size(); ++i) { + parser.ParseConfig(args[i]); + } } } -/* +/* mount_all [ ]* + * * This function might request a reboot, in which case it will * not return. */ @@ -478,7 +490,8 @@ static int do_mount_all(const std::vector& args) { return -1; } - import_late(); + /* Paths of .rc files are specified at the 2nd argument and beyond */ + import_late(args, 2); if (ret == FS_MGR_MNTALL_DEV_NEEDS_ENCRYPTION) { property_set("vold.decrypt", "trigger_encryption"); @@ -900,7 +913,7 @@ BuiltinFunctionMap::Map& BuiltinFunctionMap::map() const { {"load_system_props", {0, 0, do_load_system_props}}, {"loglevel", {1, 1, do_loglevel}}, {"mkdir", {1, 4, do_mkdir}}, - {"mount_all", {1, 1, do_mount_all}}, + {"mount_all", {1, kMax, do_mount_all}}, {"mount", {3, kMax, do_mount}}, {"powerctl", {1, 1, do_powerctl}}, {"restart", {1, 1, do_restart}}, diff --git a/init/readme.txt b/init/readme.txt index bacd6bdf2..5a1cf440c 100644 --- a/init/readme.txt +++ b/init/readme.txt @@ -49,6 +49,8 @@ The intention of these directories is as follows actions or daemons needed for motion sensor or other peripheral functionality. +One may specify paths in the mount_all command line to have it import +.rc files at the specified paths instead of the default ones described above. Actions ------- @@ -263,8 +265,10 @@ mkdir [mode] [owner] [group] owned by the root user and root group. If provided, the mode, owner and group will be updated if the directory exists already. -mount_all - Calls fs_mgr_mount_all on the given fs_mgr-format fstab. +mount_all [ ]* + Calls fs_mgr_mount_all on the given fs_mgr-format fstab and imports .rc files + at the specified paths (e.g., on the partitions just mounted). Refer to the + section of "Init .rc Files" for detail. mount [ ]* [] Attempt to mount the named device at the directory @@ -358,7 +362,8 @@ import There are only two times where the init executable imports .rc files, 1) When it imports /init.rc during initial boot - 2) When it imports /{system,vendor,odm}/etc/init/ during mount_all + 2) When it imports /{system,vendor,odm}/etc/init/ or .rc files at specified + paths during mount_all Properties