diff --git a/interfaces/innerkits/fs_manager/BUILD.gn b/interfaces/innerkits/fs_manager/BUILD.gn index e94c67a1ec56c3ccaa29896fb1b434c73b0b7c55..c745b3d238ffbb33b9f19add30490f0b38b0f1ff 100755 --- a/interfaces/innerkits/fs_manager/BUILD.gn +++ b/interfaces/innerkits/fs_manager/BUILD.gn @@ -24,7 +24,6 @@ fs_manager_include_dirs = [ "//third_party/bounds_checking_function/include", "//base/startup/init_lite/services/log", "//base/startup/init_lite/services/include", - "//base/startup/init_lite/services/log", ] fs_manager_deps = [ diff --git a/interfaces/innerkits/fs_manager/fstab.c b/interfaces/innerkits/fs_manager/fstab.c index ed540c46e84784227a8611dfb33af0c1c55ed45c..9a6ce9679e4dac33505198443f39c06f531ed02f 100755 --- a/interfaces/innerkits/fs_manager/fstab.c +++ b/interfaces/innerkits/fs_manager/fstab.c @@ -289,6 +289,53 @@ FstabItem *FindFstabItemForPath(Fstab fstab, const char *path) return item; } +char *GetFstabFile(void) +{ + char file[PATH_MAX] = {0}; + if (InUpdaterMode() == 1) { + if (strncpy_s(file, PATH_MAX, "/etc/fstab.updater", strlen("/etc/fstab.updater")) != 0) { + FSMGR_LOGE("Failed strncpy_s err=%d", errno); + return NULL; + } + } else { + char hardware[MAX_BUFFER_LEN] = {0}; + char *buffer = ReadFileData("/proc/cmdline"); + if (buffer == NULL) { + FSMGR_LOGE("Failed read \"/proc/cmdline\""); + return NULL; + } + int ret = GetProcCmdlineValue("hardware", buffer, hardware, MAX_BUFFER_LEN); + free(buffer); + if (ret != 0) { + FSMGR_LOGE("Failed get hardware from cmdline"); + return NULL; + } + if (snprintf_s(file, PATH_MAX, PATH_MAX - 1, "/vendor/etc/fstab.%s", hardware) == -1) { + FSMGR_LOGE("Fail snprintf_s err=%d", errno); + return NULL; + } + } + FSMGR_LOGI("file is %s", file); + return strdup(file); // After the return value is used up, it must be free. +} + +int GetBlockDeviceByMountPoint(const char *mountPoint, const Fstab *fstab, char *deviceName, int nameLen) +{ + if (fstab == NULL || mountPoint == NULL || *mountPoint == '\0' || deviceName == NULL) { + return -1; + } + FstabItem *item = FindFstabItemForMountPoint(*fstab, mountPoint); + if (item == NULL) { + FSMGR_LOGE("Failed get fstab item from point \" %s \"", mountPoint); + return -1; + } + if (strncpy_s(deviceName, nameLen, item->deviceName, strlen(item->deviceName)) != 0) { + FSMGR_LOGE("Failed strncpy_s err=%d", errno); + return -1; + } + return 0; +} + static const struct MountFlags mountFlags[] = { { "noatime", MS_NOATIME }, { "noexec", MS_NOEXEC }, @@ -383,4 +430,4 @@ unsigned long GetMountFlags(char *mountFlag, char *fsSpecificData, size_t fsSpec #if __cplusplus } #endif -#endif \ No newline at end of file +#endif diff --git a/interfaces/innerkits/include/fs_manager/fs_manager.h b/interfaces/innerkits/include/fs_manager/fs_manager.h index a0dd953acabe91f3d93d8d785b843a3324e0bd6c..ad351609cf69065309c27e5652b3094e003eaac6 100755 --- a/interfaces/innerkits/include/fs_manager/fs_manager.h +++ b/interfaces/innerkits/include/fs_manager/fs_manager.h @@ -60,7 +60,8 @@ void ReleaseFstab(Fstab *fstab); Fstab *ReadFstabFromFile(const char *file, bool procMounts); FstabItem *FindFstabItemForPath(Fstab fstab, const char *path); FstabItem* FindFstabItemForMountPoint(Fstab fstab, const char *mp); - +char *GetFstabFile(void); +int GetBlockDeviceByMountPoint(const char *mountPoint, const Fstab *fstab, char *deviceName, int nameLen); bool IsSupportedFilesystem(const char *fsType); int DoFormat(const char *devPath, const char *fsType); int MountOneItem(FstabItem *item); diff --git a/services/include/init_utils.h b/services/include/init_utils.h index 87c1aeaf42425a37bedf0561cd0df881bc910912..115ece873c1d63e0afeda7d38b4c4357e9af5395 100755 --- a/services/include/init_utils.h +++ b/services/include/init_utils.h @@ -29,12 +29,13 @@ extern "C" { #define OCTAL_BASE 8 #define DECIMAL_BASE 10 #define WAIT_MAX_COUNT 10 - +#define MAX_BUFFER_LEN 256 #define ARRAY_LENGTH(array) (sizeof((array)) / sizeof((array)[0])) uid_t DecodeUid(const char *name); char *ReadFileToBuf(const char *configFile); int GetProcCmdlineValue(const char *name, const char *buffer, char *value, int length); char *ReadFileData(const char *fileName); + int SplitString(char *srcPtr, const char *del, char **dstPtr, int maxNum); void WaitForFile(const char *source, unsigned int maxCount); size_t WriteAll(int fd, const char *buffer, size_t size); diff --git a/services/init/standard/init_reboot.c b/services/init/standard/init_reboot.c index d85321fd3d9b71b6f17cf89f121c6e51a57c58ac..616226095c87349717fd170928d24aab7f52ccf5 100755 --- a/services/init/standard/init_reboot.c +++ b/services/init/standard/init_reboot.c @@ -13,11 +13,12 @@ * limitations under the License. */ #include +#include #include #include #include -#include +#include "fs_manager/fs_manager.h" #include "init_log.h" #include "init_service.h" #include "init_service_manager.h" @@ -28,10 +29,6 @@ #define MAX_COMMAND_SIZE 20 #define MAX_UPDATE_SIZE 100 -#define REBOOT_MAGIC1 0xfee1dead -#define REBOOT_MAGIC2 672274793 -#define REBOOT_CMD_RESTART2 0xA1B2C3D4 - struct RBMiscUpdateMessage { char command[MAX_COMMAND_SIZE]; char update[MAX_UPDATE_SIZE]; @@ -43,16 +40,16 @@ static int RBMiscWriteUpdaterMessage(const char *path, const struct RBMiscUpdate INIT_CHECK_RETURN_VALUE(realPath != NULL, -1); int ret = 0; FILE *fp = fopen(realPath, "rb+"); - free(realPath); - realPath = NULL; if (fp != NULL) { size_t writeLen = fwrite(boot, sizeof(struct RBMiscUpdateMessage), 1, fp); INIT_ERROR_CHECK(writeLen == 1, ret = -1, "Failed to write misc for reboot"); - (void)fclose(fp); } else { ret = -1; INIT_LOGE("Failed to open %s", path); } + free(realPath); + realPath = NULL; + (void)fclose(fp); return ret; } @@ -62,46 +59,24 @@ static int RBMiscReadUpdaterMessage(const char *path, struct RBMiscUpdateMessage INIT_CHECK_RETURN_VALUE(realPath != NULL, -1); int ret = 0; FILE *fp = fopen(realPath, "rb"); - free(realPath); - realPath = NULL; if (fp != NULL) { size_t readLen = fread(boot, 1, sizeof(struct RBMiscUpdateMessage), fp); INIT_ERROR_CHECK(readLen > 0, ret = -1, "Failed to read misc for reboot"); - (void)fclose(fp); } else { ret = -1; INIT_LOGE("Failed to open %s", path); } - return ret; -} - -static int GetMountStatusForMountPoint(const char *mountPoint) -{ - const int bufferMaxSize = 512; - char buffer[bufferMaxSize]; - size_t n; - const char *mountFile = "/proc/mounts"; - FILE *fp = fopen(mountFile, "r"); - INIT_CHECK_RETURN_VALUE(fp != NULL, 1); - while (fgets(buffer, sizeof(buffer) - 1, fp) != NULL) { - n = strlen(buffer); - if (buffer[n - 1] == '\n') { - buffer[n - 1] = '\0'; - } - if (strstr(buffer, mountPoint) != NULL) { - (void)fclose(fp); - return 1; - } - } + free(realPath); + realPath = NULL; (void)fclose(fp); - return 0; + return ret; } -static int CheckAndRebootToUpdater(const char *valueData, const char *cmd, const char *cmdExt, const char *boot) +static int CheckAndRebootToUpdater(const char *valueData, const char *cmd, + const char *cmdExt, const char *boot, const char *miscFile) { // "updater" or "updater:" - const char *miscFile = "/dev/block/platform/soc/10100000.himci.eMMC/by-name/misc"; struct RBMiscUpdateMessage msg; int ret = RBMiscReadUpdaterMessage(miscFile, &msg); INIT_ERROR_CHECK(ret == 0, return -1, "Failed to get misc info for %s.", cmd); @@ -141,7 +116,7 @@ static int CheckRebootParam(const char *valueData) return 0; } static const char *cmdParams[] = { - "shutdown", "updater", "updater:", "flash", "flash:", "NoArgument", "loader","bootloader" + "shutdown", "updater", "updater:", "flash", "flash:", "NoArgument", "loader", "bootloader" }; size_t i = 0; for (; i < ARRAY_LENGTH(cmdParams); i++) { @@ -164,7 +139,16 @@ void ExecReboot(const char *value) return; } INIT_ERROR_CHECK(CheckRebootParam(valueData) == 0, return, "Invalid arg %s for reboot.", value); - + char *fstabFile = GetFstabFile(); + INIT_ERROR_CHECK(fstabFile != NULL, return, "Failed get fstab file"); + Fstab *fstab = NULL; + INIT_ERROR_CHECK((fstab = ReadFstabFromFile(fstabFile, false)) != NULL, free(fstabFile); return, + "Failed get fstab from %s", fstabFile); + free(fstabFile); + char miscDevice[PATH_MAX] = {0}; + int ret = GetBlockDeviceByMountPoint("/misc", fstab, miscDevice, PATH_MAX); + ReleaseFstab(fstab); + INIT_ERROR_CHECK(ret == 0, return, "Failed to get misc device name."); StopAllServices(SERVICE_ATTR_INVALID); sync(); INIT_CHECK_ONLY_ELOG(GetMountStatusForMountPoint("/vendor") == 0 || umount("/vendor") == 0, @@ -177,23 +161,21 @@ void ExecReboot(const char *value) INIT_LOGE("Failed to get mount point \"/data\""); } - int ret = 0; + ret = 0; if (valueData == NULL) { - ret = CheckAndRebootToUpdater(NULL, "reboot", NULL, NULL); + ret = CheckAndRebootToUpdater(NULL, "reboot", NULL, NULL, miscDevice); } else if (strcmp(valueData, "shutdown") == 0) { #ifndef STARTUP_INIT_TEST ret = reboot(RB_POWER_OFF); #endif } else if (strcmp(valueData, "bootloader") == 0) { #ifndef STARTUP_INIT_TEST - ret = reboot(RB_POWER_OFF); + ret = reboot(RB_POWER_OFF); #endif } else if (strncmp(valueData, "updater", strlen("updater")) == 0) { - ret = CheckAndRebootToUpdater(valueData, "updater", "updater:", "boot_updater"); + ret = CheckAndRebootToUpdater(valueData, "updater", "updater:", "boot_updater", miscDevice); } else if (strncmp(valueData, "flash", strlen("flash")) == 0) { - ret = CheckAndRebootToUpdater(valueData, "flash", "flash:", "boot_flash"); - } else if (strncmp(valueData, "loader", strlen("loader")) == 0) { - syscall(__NR_reboot, REBOOT_MAGIC1, REBOOT_MAGIC2, REBOOT_CMD_RESTART2, "loader"); + ret = CheckAndRebootToUpdater(valueData, "flash", "flash:", "boot_flash", miscDevice); } INIT_LOGI("Reboot %s %s.", value, (ret == 0) ? "success" : "fail"); return;