diff --git a/interfaces/innerkits/fs_manager/fstab.c b/interfaces/innerkits/fs_manager/fstab.c index 8a6654249c0f954d9926923f8dfaa3d6cff16742..3d07e44c28f814848b5270e0612755aee5cdcc88 100755 --- a/interfaces/innerkits/fs_manager/fstab.c +++ b/interfaces/innerkits/fs_manager/fstab.c @@ -190,13 +190,14 @@ Fstab *ReadFstabFromFile(const char *file, bool procMounts) ssize_t readn = 0; Fstab *fstab = NULL; + FILE *fp = NULL; char *realPath = GetRealPath(file); - if (realPath == NULL) { - BEGET_LOGE("Invalid file"); - return NULL; + if (realPath != NULL) { + fp = fopen(realPath, "r"); + free(realPath); + } else { + fp = fopen(file, "r"); // no file system, can not get real path } - FILE *fp = fopen(realPath, "r"); - free(realPath); if (fp == NULL) { BEGET_LOGE("Open %s failed, err = %d", file, errno); return NULL; diff --git a/interfaces/innerkits/reboot/init_reboot_innerkits.c b/interfaces/innerkits/reboot/init_reboot_innerkits.c index 9d5eb4e2198d9dda0873aef95218cd889d982560..d9bc510cad746daf358ce61f074e2c51c770fcd7 100755 --- a/interfaces/innerkits/reboot/init_reboot_innerkits.c +++ b/interfaces/innerkits/reboot/init_reboot_innerkits.c @@ -50,10 +50,10 @@ int DoReboot(const char *option) BEGET_ERROR_CHECK(ret >= 0, return -1, "Failed to copy boot option \" %s \"", option); if (strcmp(option, DEVICE_CMD_SUSPEND) == 0) { - ret = SystemSetParameter(STARTUP_DEVICE_CTL, DEVICE_CMD_SUSPEND); + ret = SystemSetParameter(STARTUP_DEVICE_CTL, DEVICE_CMD_STOP); BEGET_ERROR_CHECK(ret == 0, return -1, "Failed to set stop param"); } else if (strcmp(option, DEVICE_CMD_FREEZE) == 0) { - ret = SystemSetParameter(STARTUP_DEVICE_CTL, DEVICE_CMD_FREEZE); + ret = SystemSetParameter(STARTUP_DEVICE_CTL, DEVICE_CMD_STOP); BEGET_ERROR_CHECK(ret == 0, return -1, "Failed to set stop param"); } else { ret = SystemSetParameter(STARTUP_DEVICE_CTL, DEVICE_CMD_STOP); diff --git a/services/BUILD.gn b/services/BUILD.gn index f0ffcb113ac5db4ec2590f809d9779149def0824..77146a06819012702c7584301bd0aedce6bf5b73 100755 --- a/services/BUILD.gn +++ b/services/BUILD.gn @@ -301,12 +301,19 @@ if (defined(ohos_lite)) { part_name = "init" } + ohos_prebuilt_etc("init.reboot") { + source = "//base/startup/init_lite/services/etc/init.reboot.cfg" + part_name = "init" + module_install_dir = "etc/init" + } + group("init_etc") { deps = [ ":boot.group", ":charing.group", ":group", ":init.cfg", + ":init.reboot", ":init.usb.cfg", ":init.usb.configfs.cfg", ":ohos.para", diff --git a/services/begetctl/init_cmd_reboot.c b/services/begetctl/init_cmd_reboot.c index 5438fa06f33a4dcdbd5f3d93ac867ec3090936c2..0f1f252c4568d5c520c80c3849f52faab1038e32 100755 --- a/services/begetctl/init_cmd_reboot.c +++ b/services/begetctl/init_cmd_reboot.c @@ -29,6 +29,7 @@ static int main_cmd(BShellHandle shell, int argc, char* argv[]) if (argc == REBOOT_CMD_NUMBER && strcmp(argv[1], "shutdown") != 0 && strcmp(argv[1], "updater") != 0 && + strcmp(argv[1], "suspend") != 0 && strcmp(argv[1], "flashd") != 0 && #ifdef INIT_TEST strcmp(argv[1], "charing") != 0 && @@ -63,6 +64,7 @@ MODULE_CONSTRUCTOR(void) CmdInfo infos[] = { {"reboot", main_cmd, "reboot system", "reboot", ""}, {"reboot", main_cmd, "shutdown system", "reboot shutdown", ""}, + {"reboot", main_cmd, "suspend system", "reboot suspend", ""}, {"reboot", main_cmd, "reboot and boot into updater", "reboot updater", ""}, {"reboot", main_cmd, "reboot and boot into updater", "reboot updater[:options]", ""}, {"reboot", main_cmd, "reboot and boot into flashd", "reboot flashd", ""}, diff --git a/services/begetctl/main.c b/services/begetctl/main.c index bb1943223893f192e0c1e7d321c7a0e94fcb5a5b..406346eed7148ff3d60f375503196aef055083a5 100755 --- a/services/begetctl/main.c +++ b/services/begetctl/main.c @@ -64,6 +64,9 @@ int main(int argc, char *argv[]) number = argc - 1; args = argv + 1; } + if (number >= 1 && strcmp(args[0], "devctl") == 0) { + (void)memcpy_s(args[0], strlen(args[0]), "reboot", strlen("reboot")); + } SetInitLogLevel(0); BShellParamCmdRegister(g_handle, 0); #ifdef INIT_TEST diff --git a/services/etc/init.cfg b/services/etc/init.cfg index 18cf6857021beeffa62c88d800c90e7e0bc3fc84..f0cb2059df865de057a5ebb9cd3b981db74ac100 100755 --- a/services/etc/init.cfg +++ b/services/etc/init.cfg @@ -428,15 +428,6 @@ "chmod 0773 /data/misc/trace", "chmod 0775 /data/misc/wmtrace" ] - }, { - "name" : "reboot", - "cmds" : [ - "stopAllServices ", - "sync ", - "umount /vendor", - "umount /data MNT_FORCE", - "sync " - ] } ], "services" : [{ diff --git a/services/etc/init.reboot.cfg b/services/etc/init.reboot.cfg new file mode 100755 index 0000000000000000000000000000000000000000..9c2a11af6ced69afc5dd1a4de7f2fa2454f2a5b1 --- /dev/null +++ b/services/etc/init.reboot.cfg @@ -0,0 +1,23 @@ +{ + "jobs" : [{ + "name" : "reboot", + "cmds" : [ + "stopAllServices true", + "sync ", + "umount /vendor", + "umount /data MNT_FORCE", + "sync " + ] + }, { + "name" : "suspend", + "cmds" : [ + "stopAllServices false", + "sync ", + "umount /vendor", + "umount /data MNT_FORCE", + "sync " + ] + } + ], + "services" : [] +} diff --git a/services/init/include/init_service.h b/services/init/include/init_service.h index 450f0a57af21366656cf2f331eb7e1a8f10e449b..dde5469001e7fbc0df61537fca60307ec215ce4e 100755 --- a/services/init/include/init_service.h +++ b/services/init/include/init_service.h @@ -51,6 +51,7 @@ extern "C" { #define SERVICE_ATTR_DYNAMIC 0x100 // dynamic service #define SERVICE_ATTR_ONDEMAND 0x200 // ondemand, manage socket by init #define SERVICE_ATTR_TIMERSTART 0x400 // Mark a service will be started by timer +#define SERVICE_ATTR_NEEDWAIT 0x800 // Mark a service will be started by timer #define MAX_SERVICE_NAME 32 #define MAX_APL_NAME 32 diff --git a/services/init/init_service_manager.c b/services/init/init_service_manager.c index ab955cd9a773b6dbd530a0c685f1ca1a3065234b..a97704fd05d9cd46ea6cff25756568ab3d096aa7 100755 --- a/services/init/init_service_manager.c +++ b/services/init/init_service_manager.c @@ -961,7 +961,7 @@ void StopAllServices(int flags, const char **exclude, int size, int (*filter)(const Service *service, const char **exclude, int size)) { Service *service = GetServiceByName("appspawn"); - if (service != NULL && service->pid != 0) { + if (((SERVICE_ATTR_NEEDWAIT & flags) == SERVICE_ATTR_NEEDWAIT) && service != NULL && service->pid != 0) { waitpid(service->pid, 0, 0); } @@ -977,7 +977,7 @@ void StopAllServices(int flags, const char **exclude, int size, node = GetNextGroupNode(NODE_TYPE_SERVICES, node); continue; } - service->attribute |= flags; + service->attribute |= (flags & SERVICE_ATTR_INVALID); int ret = ServiceStop(service); if (ret != SERVICE_SUCCESS) { INIT_LOGE("Service %s stop failed!", service->name); diff --git a/services/init/standard/init_cmds.c b/services/init/standard/init_cmds.c index eda20e21873090711e75c244705a71e7515a86c4..60a565d2b5ba7485e8842e9bf7c6b1143c5ad686 100755 --- a/services/init/standard/init_cmds.c +++ b/services/init/standard/init_cmds.c @@ -319,7 +319,13 @@ static int FilterService(const Service *service, const char **exclude, int size) static void DoStopAllServices(const struct CmdArgs *ctx) { - StopAllServices(SERVICE_ATTR_INVALID, (const char **)ctx->argv, ctx->argc, FilterService); + int flags = SERVICE_ATTR_INVALID; + if (ctx->argc >= 1 && strcmp(ctx->argv[0], "true") == 0) { + flags |= SERVICE_ATTR_NEEDWAIT; + StopAllServices(flags, (const char **)(&ctx->argv[1]), ctx->argc - 1, FilterService); + } else { + StopAllServices(flags, (const char **)ctx->argv, ctx->argc, FilterService); + } return; } diff --git a/services/init/standard/init_reboot.c b/services/init/standard/init_reboot.c index 20d0802e3c7f91e7f1e345b58991908d848e9bb3..91bee4adf8dfb135aca3189d99693e04af6fd5c6 100755 --- a/services/init/standard/init_reboot.c +++ b/services/init/standard/init_reboot.c @@ -131,89 +131,98 @@ static int CheckAndRebootToUpdater(const char *valueData, const char *cmd, INIT_ERROR_CHECK(ret == 0, return -1, "Failed to format update for %s.", cmd); } - ret = -1; if (RBMiscWriteUpdaterMessage(miscFile, &msg) == 0) { - ret = 0; -#ifndef STARTUP_INIT_TEST - ret = reboot(RB_AUTOBOOT); -#endif + return 0; } - return ret; + return -1; } -int DoRebootCmd(const char *cmd, const char *opt) +static int DoRebootCmd(const char *cmd, const char *opt) { // by job to stop service and unmount DoJobNow("reboot"); -#ifndef PRODUCT_RK - return CheckAndRebootToUpdater(NULL, "reboot", NULL, NULL); -#else - reboot(RB_AUTOBOOT); - return 0; + int ret = CheckAndRebootToUpdater(NULL, "reboot", NULL, NULL); + if (ret == 0) { +#ifndef STARTUP_INIT_TEST + return reboot(RB_AUTOBOOT); #endif + } + return 0; } -int DoShutdownCmd(const char *cmd, const char *opt) +static int DoShutdownCmd(const char *cmd, const char *opt) { // by job to stop service and unmount DoJobNow("reboot"); + int ret = CheckAndRebootToUpdater(NULL, "reboot", NULL, NULL); + if (ret == 0) { #ifndef STARTUP_INIT_TEST - return reboot(RB_POWER_OFF); -#else - return 0; + return reboot(RB_POWER_OFF); #endif + } + return 0; } -int DoUpdaterCmd(const char *cmd, const char *opt) +static int DoUpdaterCmd(const char *cmd, const char *opt) { // by job to stop service and unmount DoJobNow("reboot"); - return CheckAndRebootToUpdater(opt, "updater", "updater:", "boot_updater"); + int ret = CheckAndRebootToUpdater(opt, "updater", "updater:", "boot_updater"); + if (ret == 0) { +#ifndef STARTUP_INIT_TEST + return reboot(RB_AUTOBOOT); +#endif + } + return 0; } -int DoFlashdCmd(const char *cmd, const char *opt) +static int DoFlashdCmd(const char *cmd, const char *opt) { // by job to stop service and unmount DoJobNow("reboot"); - return CheckAndRebootToUpdater(opt, "flash", "flash:", "boot_flash"); + int ret = CheckAndRebootToUpdater(opt, "flash", "flash:", "boot_flash"); + if (ret == 0) { +#ifndef STARTUP_INIT_TEST + return reboot(RB_AUTOBOOT); +#endif + } + return 0; } #ifdef PRODUCT_RK -int DoLoaderCmd(const char *cmd, const char *opt) +static int DoLoaderCmd(const char *cmd, const char *opt) { syscall(__NR_reboot, REBOOT_MAGIC1, REBOOT_MAGIC2, REBOOT_CMD_RESTART2, "loader"); return 0; } #endif -int DoSuspendCmd(const char *cmd, const char *opt) +static int DoSuspendCmd(const char *cmd, const char *opt) { // by job to stop service and unmount DoJobNow("suspend"); + int ret = CheckAndRebootToUpdater(NULL, "reboot", NULL, NULL); + if (ret == 0) { #ifndef STARTUP_INIT_TEST - return reboot(RB_POWER_OFF); -#else - return 0; + INIT_LOGE("DoSuspendCmd %s RB_SW_SUSPEND.", cmd); + return reboot(RB_AUTOBOOT); #endif -} - -int DoFreezeCmd(const char *cmd, const char *opt) -{ - // by job to stop service and unmount - DoJobNow("freeze"); -#ifndef STARTUP_INIT_TEST - return reboot(RB_POWER_OFF); -#else + } return 0; -#endif } #ifdef INIT_TEST -int DoCharingCmd() +static int DoCharingCmd() { // by job to stop service and unmount DoJobNow("reboot"); - return CheckAndRebootToUpdater(NULL, "charing", "charing:", "boot_charing"); + int ret = CheckAndRebootToUpdater(NULL, "charing", "charing:", "boot_charing"); + if (ret == 0) { +#ifndef STARTUP_INIT_TEST + return reboot(RB_AUTOBOOT); +#endif + } + return 0; } #endif @@ -230,7 +239,6 @@ struct { { "loader", DoLoaderCmd }, #endif { "suspend", DoSuspendCmd }, - { "freeze", DoFreezeCmd }, #ifdef INIT_TEST { "charing", DoCharingCmd } #endif @@ -249,14 +257,14 @@ void ExecReboot(const char *value) return; } - INIT_LOGE("ExecReboot %s.", cmd); + INIT_LOGI("ExecReboot %s param %s.", cmd, value); for (int i = 0; i < (int)ARRAY_LENGTH(g_rebootCmd); i++) { if (strncmp(cmd, g_rebootCmd[i].cmdName, strlen(g_rebootCmd[i].cmdName)) == 0) { int ret = g_rebootCmd[i].doCmd(cmd, cmd); - INIT_LOGI("Reboot %s %s.", value, (ret == 0) ? "success" : "fail"); + INIT_LOGI("Reboot %s %s errno %d .", cmd, (ret == 0) ? "success" : "fail", errno); return; } } - INIT_LOGE("Invalid rebot cmd %s.", value); + INIT_LOGE("Invalid reboot cmd %s.", value); return; } diff --git a/services/init/standard/init_signal_handler.c b/services/init/standard/init_signal_handler.c index 710592eff1d73c0037dda51ebafdcc78109a1ef9..9b6dff6c3ee3dc7cec7eec2d18eb2aa9e1209b47 100755 --- a/services/init/standard/init_signal_handler.c +++ b/services/init/standard/init_signal_handler.c @@ -17,6 +17,7 @@ #include "init_adapter.h" #include "init_log.h" +#include "init_param.h" #include "init_service_manager.h" #include "loop_event.h" @@ -48,7 +49,9 @@ static void ProcessSignal(const struct signalfd_siginfo *siginfo) } case SIGTERM: { INIT_LOGI("SigHandler, SIGTERM received."); - StopAllServices(0, NULL, 0, NULL); + SystemWriteParam("startup.device.ctl", "stop"); + // exec reboot use toybox reboot cmd + ExecReboot("reboot"); break; } default: diff --git a/services/param/trigger/trigger_processor.c b/services/param/trigger/trigger_processor.c index 4b1f548e8af9b334d898e150bd1123b9b071e074..44d8cac57f876da135b4e30c11d4cd280b431ee9 100755 --- a/services/param/trigger/trigger_processor.c +++ b/services/param/trigger/trigger_processor.c @@ -228,7 +228,7 @@ static int GetTriggerType(const char *type) } const char *triggerTypeStr[] = { "pre-init", "boot", "early-init", "init", "early-init", "late-init", "post-init", - "fs", "early-fs", "post-fs", "late-fs", "early-boot", "post-fs-data", "reboot" + "fs", "early-fs", "post-fs", "late-fs", "early-boot", "post-fs-data", "reboot", "suspend" }; for (size_t i = 0; i < ARRAY_LENGTH(triggerTypeStr); i++) { if (strcmp(triggerTypeStr[i], type) == 0) { diff --git a/services/utils/init_utils.c b/services/utils/init_utils.c index a4900701b33959951f7a10be250f99775de6884d..0f6a2702f427360fec0010d4f8b3d944054f88b3 100755 --- a/services/utils/init_utils.c +++ b/services/utils/init_utils.c @@ -168,8 +168,9 @@ int GetProcCmdlineValue(const char *name, const char *buffer, char *value, int l endIndex = i; break; } - if (*tmp == ' ') { + if (*tmp == ' ' || *tmp == '\n' || *tmp == '\r' || *tmp == '\t') { endIndex = i; + break; } if (*tmp == '=') { if (endIndex != 0) { // for root=uuid=xxxx