提交 21c0c34d 编写于 作者: O openharmony_ci 提交者: Gitee

!183 fix:misc分区写成固定值,不利于其他平台适配

Merge pull request !183 from 熊磊/startup_init_lite1206
...@@ -24,7 +24,6 @@ fs_manager_include_dirs = [ ...@@ -24,7 +24,6 @@ fs_manager_include_dirs = [
"//third_party/bounds_checking_function/include", "//third_party/bounds_checking_function/include",
"//base/startup/init_lite/services/log", "//base/startup/init_lite/services/log",
"//base/startup/init_lite/services/include", "//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/log",
] ]
fs_manager_deps = [ fs_manager_deps = [
......
...@@ -289,6 +289,53 @@ FstabItem *FindFstabItemForPath(Fstab fstab, const char *path) ...@@ -289,6 +289,53 @@ FstabItem *FindFstabItemForPath(Fstab fstab, const char *path)
return item; 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[] = { static const struct MountFlags mountFlags[] = {
{ "noatime", MS_NOATIME }, { "noatime", MS_NOATIME },
{ "noexec", MS_NOEXEC }, { "noexec", MS_NOEXEC },
...@@ -383,4 +430,4 @@ unsigned long GetMountFlags(char *mountFlag, char *fsSpecificData, size_t fsSpec ...@@ -383,4 +430,4 @@ unsigned long GetMountFlags(char *mountFlag, char *fsSpecificData, size_t fsSpec
#if __cplusplus #if __cplusplus
} }
#endif #endif
#endif #endif
\ No newline at end of file
...@@ -60,7 +60,8 @@ void ReleaseFstab(Fstab *fstab); ...@@ -60,7 +60,8 @@ void ReleaseFstab(Fstab *fstab);
Fstab *ReadFstabFromFile(const char *file, bool procMounts); Fstab *ReadFstabFromFile(const char *file, bool procMounts);
FstabItem *FindFstabItemForPath(Fstab fstab, const char *path); FstabItem *FindFstabItemForPath(Fstab fstab, const char *path);
FstabItem* FindFstabItemForMountPoint(Fstab fstab, const char *mp); 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); bool IsSupportedFilesystem(const char *fsType);
int DoFormat(const char *devPath, const char *fsType); int DoFormat(const char *devPath, const char *fsType);
int MountOneItem(FstabItem *item); int MountOneItem(FstabItem *item);
......
...@@ -29,12 +29,13 @@ extern "C" { ...@@ -29,12 +29,13 @@ extern "C" {
#define OCTAL_BASE 8 #define OCTAL_BASE 8
#define DECIMAL_BASE 10 #define DECIMAL_BASE 10
#define WAIT_MAX_COUNT 10 #define WAIT_MAX_COUNT 10
#define MAX_BUFFER_LEN 256
#define ARRAY_LENGTH(array) (sizeof((array)) / sizeof((array)[0])) #define ARRAY_LENGTH(array) (sizeof((array)) / sizeof((array)[0]))
uid_t DecodeUid(const char *name); uid_t DecodeUid(const char *name);
char *ReadFileToBuf(const char *configFile); char *ReadFileToBuf(const char *configFile);
int GetProcCmdlineValue(const char *name, const char *buffer, char *value, int length); int GetProcCmdlineValue(const char *name, const char *buffer, char *value, int length);
char *ReadFileData(const char *fileName); char *ReadFileData(const char *fileName);
int SplitString(char *srcPtr, const char *del, char **dstPtr, int maxNum); int SplitString(char *srcPtr, const char *del, char **dstPtr, int maxNum);
void WaitForFile(const char *source, unsigned int maxCount); void WaitForFile(const char *source, unsigned int maxCount);
size_t WriteAll(int fd, const char *buffer, size_t size); size_t WriteAll(int fd, const char *buffer, size_t size);
......
...@@ -13,11 +13,12 @@ ...@@ -13,11 +13,12 @@
* limitations under the License. * limitations under the License.
*/ */
#include <errno.h> #include <errno.h>
#include <limits.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/mount.h> #include <sys/mount.h>
#include <sys/reboot.h> #include <sys/reboot.h>
#include <sys/syscall.h>
#include "fs_manager/fs_manager.h"
#include "init_log.h" #include "init_log.h"
#include "init_service.h" #include "init_service.h"
#include "init_service_manager.h" #include "init_service_manager.h"
...@@ -28,10 +29,6 @@ ...@@ -28,10 +29,6 @@
#define MAX_COMMAND_SIZE 20 #define MAX_COMMAND_SIZE 20
#define MAX_UPDATE_SIZE 100 #define MAX_UPDATE_SIZE 100
#define REBOOT_MAGIC1 0xfee1dead
#define REBOOT_MAGIC2 672274793
#define REBOOT_CMD_RESTART2 0xA1B2C3D4
struct RBMiscUpdateMessage { struct RBMiscUpdateMessage {
char command[MAX_COMMAND_SIZE]; char command[MAX_COMMAND_SIZE];
char update[MAX_UPDATE_SIZE]; char update[MAX_UPDATE_SIZE];
...@@ -43,16 +40,16 @@ static int RBMiscWriteUpdaterMessage(const char *path, const struct RBMiscUpdate ...@@ -43,16 +40,16 @@ static int RBMiscWriteUpdaterMessage(const char *path, const struct RBMiscUpdate
INIT_CHECK_RETURN_VALUE(realPath != NULL, -1); INIT_CHECK_RETURN_VALUE(realPath != NULL, -1);
int ret = 0; int ret = 0;
FILE *fp = fopen(realPath, "rb+"); FILE *fp = fopen(realPath, "rb+");
free(realPath);
realPath = NULL;
if (fp != NULL) { if (fp != NULL) {
size_t writeLen = fwrite(boot, sizeof(struct RBMiscUpdateMessage), 1, fp); size_t writeLen = fwrite(boot, sizeof(struct RBMiscUpdateMessage), 1, fp);
INIT_ERROR_CHECK(writeLen == 1, ret = -1, "Failed to write misc for reboot"); INIT_ERROR_CHECK(writeLen == 1, ret = -1, "Failed to write misc for reboot");
(void)fclose(fp);
} else { } else {
ret = -1; ret = -1;
INIT_LOGE("Failed to open %s", path); INIT_LOGE("Failed to open %s", path);
} }
free(realPath);
realPath = NULL;
(void)fclose(fp);
return ret; return ret;
} }
...@@ -62,46 +59,24 @@ static int RBMiscReadUpdaterMessage(const char *path, struct RBMiscUpdateMessage ...@@ -62,46 +59,24 @@ static int RBMiscReadUpdaterMessage(const char *path, struct RBMiscUpdateMessage
INIT_CHECK_RETURN_VALUE(realPath != NULL, -1); INIT_CHECK_RETURN_VALUE(realPath != NULL, -1);
int ret = 0; int ret = 0;
FILE *fp = fopen(realPath, "rb"); FILE *fp = fopen(realPath, "rb");
free(realPath);
realPath = NULL;
if (fp != NULL) { if (fp != NULL) {
size_t readLen = fread(boot, 1, sizeof(struct RBMiscUpdateMessage), fp); size_t readLen = fread(boot, 1, sizeof(struct RBMiscUpdateMessage), fp);
INIT_ERROR_CHECK(readLen > 0, ret = -1, "Failed to read misc for reboot"); INIT_ERROR_CHECK(readLen > 0, ret = -1, "Failed to read misc for reboot");
(void)fclose(fp);
} else { } else {
ret = -1; ret = -1;
INIT_LOGE("Failed to open %s", path); 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) { free(realPath);
n = strlen(buffer); realPath = NULL;
if (buffer[n - 1] == '\n') {
buffer[n - 1] = '\0';
}
if (strstr(buffer, mountPoint) != NULL) {
(void)fclose(fp);
return 1;
}
}
(void)fclose(fp); (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:" // "updater" or "updater:"
const char *miscFile = "/dev/block/platform/soc/10100000.himci.eMMC/by-name/misc";
struct RBMiscUpdateMessage msg; struct RBMiscUpdateMessage msg;
int ret = RBMiscReadUpdaterMessage(miscFile, &msg); int ret = RBMiscReadUpdaterMessage(miscFile, &msg);
INIT_ERROR_CHECK(ret == 0, return -1, "Failed to get misc info for %s.", cmd); 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) ...@@ -141,7 +116,7 @@ static int CheckRebootParam(const char *valueData)
return 0; return 0;
} }
static const char *cmdParams[] = { static const char *cmdParams[] = {
"shutdown", "updater", "updater:", "flash", "flash:", "NoArgument", "loader","bootloader" "shutdown", "updater", "updater:", "flash", "flash:", "NoArgument", "loader", "bootloader"
}; };
size_t i = 0; size_t i = 0;
for (; i < ARRAY_LENGTH(cmdParams); i++) { for (; i < ARRAY_LENGTH(cmdParams); i++) {
...@@ -164,7 +139,16 @@ void ExecReboot(const char *value) ...@@ -164,7 +139,16 @@ void ExecReboot(const char *value)
return; return;
} }
INIT_ERROR_CHECK(CheckRebootParam(valueData) == 0, return, "Invalid arg %s for reboot.", value); 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); StopAllServices(SERVICE_ATTR_INVALID);
sync(); sync();
INIT_CHECK_ONLY_ELOG(GetMountStatusForMountPoint("/vendor") == 0 || umount("/vendor") == 0, INIT_CHECK_ONLY_ELOG(GetMountStatusForMountPoint("/vendor") == 0 || umount("/vendor") == 0,
...@@ -177,23 +161,21 @@ void ExecReboot(const char *value) ...@@ -177,23 +161,21 @@ void ExecReboot(const char *value)
INIT_LOGE("Failed to get mount point \"/data\""); INIT_LOGE("Failed to get mount point \"/data\"");
} }
int ret = 0; ret = 0;
if (valueData == NULL) { if (valueData == NULL) {
ret = CheckAndRebootToUpdater(NULL, "reboot", NULL, NULL); ret = CheckAndRebootToUpdater(NULL, "reboot", NULL, NULL, miscDevice);
} else if (strcmp(valueData, "shutdown") == 0) { } else if (strcmp(valueData, "shutdown") == 0) {
#ifndef STARTUP_INIT_TEST #ifndef STARTUP_INIT_TEST
ret = reboot(RB_POWER_OFF); ret = reboot(RB_POWER_OFF);
#endif #endif
} else if (strcmp(valueData, "bootloader") == 0) { } else if (strcmp(valueData, "bootloader") == 0) {
#ifndef STARTUP_INIT_TEST #ifndef STARTUP_INIT_TEST
ret = reboot(RB_POWER_OFF); ret = reboot(RB_POWER_OFF);
#endif #endif
} else if (strncmp(valueData, "updater", strlen("updater")) == 0) { } 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) { } else if (strncmp(valueData, "flash", strlen("flash")) == 0) {
ret = CheckAndRebootToUpdater(valueData, "flash", "flash:", "boot_flash"); ret = CheckAndRebootToUpdater(valueData, "flash", "flash:", "boot_flash", miscDevice);
} else if (strncmp(valueData, "loader", strlen("loader")) == 0) {
syscall(__NR_reboot, REBOOT_MAGIC1, REBOOT_MAGIC2, REBOOT_CMD_RESTART2, "loader");
} }
INIT_LOGI("Reboot %s %s.", value, (ret == 0) ? "success" : "fail"); INIT_LOGI("Reboot %s %s.", value, (ret == 0) ? "success" : "fail");
return; return;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册