Merge "init: add ro.boot.init_rc"
diff --git a/init/init.cpp b/init/init.cpp
index ee5add8..7f17a0c 100644
--- a/init/init.cpp
+++ b/init/init.cpp
@@ -409,7 +409,7 @@
         const char *default_value;
     } prop_map[] = {
         { "ro.boot.serialno",   "ro.serialno",   "", },
-        { "ro.boot.mode",       "ro.bootmode",   "unknown", },
+        { "ro.boot.mode",       "ro.bootmode",   "normal", },
         { "ro.boot.baseband",   "ro.baseband",   "unknown", },
         { "ro.boot.bootloader", "ro.bootloader", "unknown", },
         { "ro.boot.hardware",   "ro.hardware",   "unknown", },
@@ -800,7 +800,13 @@
     parser.AddSectionParser("service",std::make_unique<ServiceParser>());
     parser.AddSectionParser("on", std::make_unique<ActionParser>());
     parser.AddSectionParser("import", std::make_unique<ImportParser>());
-    parser.ParseConfig("/init.rc");
+
+    std::string bootscript = property_get("ro.boot.init_rc");
+    if (bootscript.empty()) {
+        parser.ParseConfig("/init.rc");
+    } else {
+        parser.ParseConfig(bootscript);
+    }
 
     ActionManager& am = ActionManager::GetInstance();
 
@@ -825,7 +831,8 @@
     std::string bootmode = property_get("ro.bootmode");
     if (bootmode == "charger") {
         am.QueueEventTrigger("charger");
-    } else {
+    } else if (bootmode == "normal") {
+        // only trigger late-init in normal boot
         am.QueueEventTrigger("late-init");
     }