diff --git a/services/init/include/init.h b/services/init/include/init.h index 0a5fe4b3770c64824a07fe35869c126a0d6fb1d4..2268363cbf493f9b934f5355a184495ac5a3a540 100644 --- a/services/init/include/init.h +++ b/services/init/include/init.h @@ -47,6 +47,8 @@ void SystemConfig(void); void SystemRun(void); void SystemExecuteRcs(void); +void ParseInitCfgByPriority(void); +int ParseInitCfg(const char *configFile, void *context); void ReadConfig(void); void SignalInit(void); diff --git a/services/init/init_config.c b/services/init/init_config.c index bc1dcd699d55c8536656e4a5bad9a026d288fd84..f859dafb59119735b7895aa5db7a467b3a21d9c7 100644 --- a/services/init/init_config.c +++ b/services/init/init_config.c @@ -103,8 +103,7 @@ void ReadConfig(void) ReadFileInDir(OTHER_CHARGE_PATH, ".cfg", ParseInitCfg, NULL); } else if (InUpdaterMode() == 0) { ParseInitCfg(INIT_CONFIGURATION_FILE, NULL); - ReadFileInDir(OTHER_CFG_PATH, ".cfg", ParseInitCfg, NULL); - ReadFileInDir("/vendor/etc/init", ".cfg", ParseInitCfg, NULL); + ParseInitCfgByPriority(); } else { ReadFileInDir("/etc", ".cfg", ParseInitCfg, NULL); } diff --git a/services/init/lite/init.c b/services/init/lite/init.c index 2719496b93476d237e8f33815bdb0b132cf30796..cc285a01099a363e769b3ff588c52e23980bb8fb 100644 --- a/services/init/lite/init.c +++ b/services/init/lite/init.c @@ -50,6 +50,12 @@ void SystemPrepare(void) { } +void ParseInitCfgByPriority(void) +{ + ReadFileInDir(OTHER_CFG_PATH, ".cfg", ParseInitCfg, NULL); + ReadFileInDir("/vendor/etc/init", ".cfg", ParseInitCfg, NULL); +} + void SystemConfig(void) { InitServiceSpace(); diff --git a/services/init/standard/init.c b/services/init/standard/init.c index 58b7111ae11d6cbea49e9184ba3db566699dbcec..3f7772b9687f28048cd33ce4c95ebba9e27664f0 100755 --- a/services/init/standard/init.c +++ b/services/init/standard/init.c @@ -370,6 +370,19 @@ INIT_STATIC void TriggerServices(int startMode) } } +void ParseInitCfgByPriority(void) +{ + CfgFiles *files = GetCfgFiles("etc/init"); + for (int i = 0; files && i < MAX_CFG_POLICY_DIRS_CNT; i++) { + if (files->paths[i]) { + if (ReadFileInDir(files->paths[i], ".cfg", ParseInitCfg, NULL) < 0) { + break; + } + } + } + FreeCfgFiles(files); +} + void SystemConfig(void) { INIT_TIMING_STAT timingStat; diff --git a/services/init/standard/init_signal_handler.c b/services/init/standard/init_signal_handler.c index a71f638ff026affca2c50f53a0180d4b11d721c0..3e8fe9bcca56a647689ba69f3ccb9f68c53408c8 100644 --- a/services/init/standard/init_signal_handler.c +++ b/services/init/standard/init_signal_handler.c @@ -39,12 +39,14 @@ INIT_STATIC void ProcessSignal(const struct signalfd_siginfo *siginfo) Service* service = GetServiceByPid(sigPID); // check child process exit status if (WIFSIGNALED(procStat)) { - INIT_LOGE("Child process %s(pid %d) exit with code : %d", + INIT_LOGE("Child process %s(pid %d) exit with signal : %d", service == NULL ? "Unknown" : service->name, sigPID, WTERMSIG(procStat)); - } - if (WIFEXITED(procStat)) { + } else if (WIFEXITED(procStat)) { INIT_LOGE("Child process %s(pid %d) exit with code : %d", service == NULL ? "Unknown" : service->name, sigPID, WEXITSTATUS(procStat)); + } else { + INIT_LOGE("Child process %s(pid %d) exit with invalid status : %d", + service == NULL ? "Unknown" : service->name, sigPID, procStat); } CmdServiceProcessDelClient(sigPID); INIT_LOGI("SigHandler, SIGCHLD received, Service:%s pid:%d uid:%d status:%d.",