191 lines
4.1 KiB
C++
191 lines
4.1 KiB
C++
|
|
|||
|
/*******************************
|
|||
|
程序功能:解析/debug_ramdisk/mount.cfg配置文件,把文件挂载到tmpfs内存中。避免频繁写入内部存储,提高EMMC使用寿命。
|
|||
|
|
|||
|
mount.cfg格式如下:
|
|||
|
/data/user/0/com.ss.android.ugc.aweme.lite/databases/ss_app_log.db
|
|||
|
/data/user/0/com.ss.android.ugc.aweme.lite/databases/ss_app_log.db-journal
|
|||
|
********************************/
|
|||
|
|
|||
|
#define LOG_TAG "FileInotify"
|
|||
|
#include <iostream>
|
|||
|
#include <fstream>
|
|||
|
#include <string>
|
|||
|
#include <filesystem>
|
|||
|
#include <utils/RefBase.h>
|
|||
|
#include <utils/Log.h>
|
|||
|
#include <cutils/properties.h>
|
|||
|
#include <string.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <unistd.h>
|
|||
|
#include <errno.h>
|
|||
|
#include <sys/inotify.h>
|
|||
|
#include <pthread.h>
|
|||
|
#include <sys/mount.h>
|
|||
|
#include <sys/prctl.h>
|
|||
|
#include <cstring>
|
|||
|
#include <errno.h>
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/stat.h>
|
|||
|
#include <fcntl.h>
|
|||
|
#include <sys/ioctl.h>
|
|||
|
|
|||
|
#define MOUNT_INFO_DEV "/dev/minfo"
|
|||
|
#define CMD_BASE 0xCBAABC10
|
|||
|
#define FK_IS_GET_POWER2 (CMD_BASE + 12)
|
|||
|
#define M_IOCTL_MAGIC 0xB3
|
|||
|
#define MOUNT_INFO _IOW(M_IOCTL_MAGIC, 0x41, unsigned long)
|
|||
|
#define MOUNT_CFG "/debug_ramdisk/mount.cfg" //配置文件路径
|
|||
|
#define MOUNT_MAX_LINE 64 //最大的挂载数
|
|||
|
#define READ_LINE 128 //文件路径缓存大小
|
|||
|
|
|||
|
struct fileinotify_info{
|
|||
|
int containerid; //容器ID
|
|||
|
char src[MOUNT_MAX_LINE][READ_LINE]; //挂载原路径
|
|||
|
char dst[MOUNT_MAX_LINE][READ_LINE]; //挂载目标路径
|
|||
|
int flag[MOUNT_MAX_LINE]; //挂载标记,0x00:未挂载,0xAA:已挂载
|
|||
|
int line; //挂载文件数量
|
|||
|
}__attribute__ ((packed));
|
|||
|
|
|||
|
#if 0
|
|||
|
void createFile(const std::string& path)
|
|||
|
{
|
|||
|
namespace fs = std::filesystem;
|
|||
|
//确保目录存在,如果不存在则创建
|
|||
|
fs::create_directories(fs::path(path).parent_path());
|
|||
|
|
|||
|
//创建文件
|
|||
|
std::ofstream file(path);
|
|||
|
if (file.is_open()) {
|
|||
|
file.close();
|
|||
|
}
|
|||
|
}
|
|||
|
#else
|
|||
|
bool createDirectory(const std::string &path)
|
|||
|
{
|
|||
|
size_t pos = 0;
|
|||
|
std::string currentPath;
|
|||
|
while ((pos = path.find('/', pos)) != std::string::npos)
|
|||
|
{
|
|||
|
currentPath = path.substr(0, pos++);
|
|||
|
if (currentPath.empty()) continue;
|
|||
|
|
|||
|
// 检查当前目录是否存在
|
|||
|
if (mkdir(currentPath.c_str(), 0777) != 0) {
|
|||
|
if (errno != EEXIST) { // 如果目录不存在且无法创建
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 创建完整路径
|
|||
|
if (mkdir(path.c_str(), 0777) != 0 && errno != EEXIST)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
bool createFile(const std::string &filePath) {
|
|||
|
// 提取目录路径
|
|||
|
size_t lastSlash = filePath.find_last_of('/');
|
|||
|
if (lastSlash != std::string::npos)
|
|||
|
{
|
|||
|
std::string directory = filePath.substr(0, lastSlash);
|
|||
|
|
|||
|
// 创建目录
|
|||
|
if (!createDirectory(directory)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 创建文件
|
|||
|
std::ofstream ofs(filePath);
|
|||
|
if (!ofs) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
ofs.close();
|
|||
|
return true;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
int mount_info_init(struct fileinotify_info *info)
|
|||
|
{
|
|||
|
const std::string str = "/data_mirror";
|
|||
|
int i = 0;
|
|||
|
|
|||
|
std::ifstream file(MOUNT_CFG);
|
|||
|
if (!file.is_open()) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
std::string line;
|
|||
|
while (std::getline(file, line)) {
|
|||
|
//std::cout << line << std::endl;
|
|||
|
if(line.size() > 0)
|
|||
|
{
|
|||
|
//create file
|
|||
|
createFile(str + line);
|
|||
|
//save mount info
|
|||
|
sprintf(info->dst[i], "%s", line.c_str());
|
|||
|
sprintf(info->src[i], "/data_mirror%s", line.c_str());
|
|||
|
info->line = i + 1;
|
|||
|
i++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
file.close();
|
|||
|
return info->line;
|
|||
|
}
|
|||
|
|
|||
|
int file_exists(const char *filename)
|
|||
|
{
|
|||
|
return access(filename, F_OK) == 0;
|
|||
|
}
|
|||
|
|
|||
|
int main(void)
|
|||
|
{
|
|||
|
struct fileinotify_info info;
|
|||
|
char buf[READ_LINE];
|
|||
|
int fd, ret;
|
|||
|
int line;
|
|||
|
|
|||
|
//selinux
|
|||
|
prctl(FK_IS_GET_POWER2, 0, 0, 0);
|
|||
|
|
|||
|
//file_exists
|
|||
|
if(!file_exists(MOUNT_CFG))
|
|||
|
goto OUT;
|
|||
|
|
|||
|
//mount info init
|
|||
|
umask(0000);
|
|||
|
mount_info_init(&info);
|
|||
|
//for(int i = 0; i < info.line; i++)
|
|||
|
//{
|
|||
|
// ALOGD("line=%d, src=%s, dst=%s\n", i, info.src[i], info.dst[i]);
|
|||
|
//}
|
|||
|
|
|||
|
fd = open(MOUNT_INFO_DEV, O_RDWR | O_NONBLOCK | O_NOCTTY);
|
|||
|
if(fd < 0)
|
|||
|
{
|
|||
|
ALOGD("open minfo fail.\n");
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
ret = ioctl(fd, MOUNT_INFO, &info);
|
|||
|
if(ret != 0)
|
|||
|
{
|
|||
|
close(fd);
|
|||
|
ALOGD("ioctl minfo fail.\n");
|
|||
|
return -2;
|
|||
|
}
|
|||
|
|
|||
|
close(fd);
|
|||
|
|
|||
|
OUT:
|
|||
|
return 0;
|
|||
|
}
|