blob: d3724e930b9c9fe45c8be9d0ba4a7af785b58aff [file] [log] [blame]
/*
* Author: Shoufu Zhao <shoufu.zhao@amlogic.com>
*/
#include "ini_config.h"
#define LOG_TAG "ini_platform"
#define LOG_NDEBUG 0
#include "ini_log.h"
#include "ini_handler.h"
#include "ini_platform.h"
//c basic lib
char* plat_strtok_r(char *str, const char *delim, char **saveptr) {
#if (defined CC_COMPILE_IN_PC || defined CC_COMPILE_IN_ANDROID)
return strtok_r(str, delim, saveptr);
#elif (defined CC_COMPILE_IN_UBOOT)
return strtok(str, delim);
#endif
}
//File functions
#if (defined CC_COMPILE_IN_UBOOT)
static int splitFilePath(const char *file_path, char part_name[], char file_name[], const char *ext_name) {
int i = 0;
char *tmp_start_ptr = NULL;
char *tmp_end_ptr = NULL;
if (file_path == NULL) {
ALOGE("%s, file_path is NULL!!!\n", __FUNCTION__);
return -1;
}
tmp_start_ptr = strchr((char*)file_path,'/');
if (tmp_start_ptr != file_path) {
ALOGE("%s, we need one abstract file path!!! %s.\n", __FUNCTION__, file_path);
return -1;
}
tmp_end_ptr = strchr(tmp_start_ptr + 1,'/');
if (tmp_end_ptr == NULL) {
ALOGE("%s, there is only partition name in the path!!!\n", __FUNCTION__);
return -1;
}
strncpy(part_name, tmp_start_ptr + 1, tmp_end_ptr - tmp_start_ptr - 1);
part_name[tmp_end_ptr - tmp_start_ptr - 1] = '\0';
//ALOGD("%s, partition name is %s\n", __FUNCTION__, part_name);
tmp_start_ptr = tmp_end_ptr;
i = 0;
while (*tmp_end_ptr && i < CC_MAX_INI_FILE_NAME_LEN) {
tmp_end_ptr++;
i++;
}
if (i >= CC_MAX_INI_FILE_NAME_LEN) {
ALOGE("%s, file path is too long (%d)!!!\n", __FUNCTION__, i);
return -1;
}
strncpy(file_name, tmp_start_ptr, i);
file_name[i] = '\0';
//ALOGD("%s, file name is %s\n", __FUNCTION__, file_name);
if (ext_name != NULL) {
if (strlen(ext_name) > 0) {
while (tmp_end_ptr != tmp_start_ptr && *tmp_end_ptr != '.') {
tmp_end_ptr--;
}
if (*tmp_end_ptr != '.') {
ALOGE("%s, the file path \"%s\" doesn't have ext name!!!\n", __FUNCTION__, file_path);
return -1;
} else {
if (strncmp(tmp_end_ptr + 1, ext_name, 128)) {
ALOGE("%s, the ext name of file path \"%s\" not equal to the special ext name \"%s\"!!!\n", __FUNCTION__, file_path, ext_name);
return -1;
}
}
}
}
return 0;
}
#define CS_BLCOK_DEV_INTERFACE "mmc"
#define CS_BLCOK_DEV_MARJOR_NUM "1"
static int setBlockDevice(const char *part_name) {
int part_no = 0;
char part_buf[128] = {0};
char tmp_buf[128] = {0};
part_no = get_partition_num_by_name((char *)part_name);
//ALOGD("%s, part_no is %d\n", __FUNCTION__, part_no);
if (part_no >= 0) {
strcpy(part_buf, CS_BLCOK_DEV_MARJOR_NUM);
strcat(part_buf, ":");
sprintf(tmp_buf, "%x", part_no);
strcat(part_buf, tmp_buf);
return fs_set_blk_dev(CS_BLCOK_DEV_INTERFACE, part_buf, FS_TYPE_EXT);
}
return -1;
}
#endif
int iniIsFileExist(const char *file_path) {
#if (defined CC_COMPILE_IN_PC || defined CC_COMPILE_IN_ANDROID)
if (access(file_path, 0) < 0) {
return 0;
}
return 1;
#elif (defined CC_COMPILE_IN_UBOOT)
char part_name[CC_MAX_INI_FILE_NAME_LEN];
char file_name[CC_MAX_INI_FILE_NAME_LEN];
memset((void *)part_name, 0, CC_MAX_INI_FILE_NAME_LEN);
memset((void *)file_name, 0, CC_MAX_INI_FILE_NAME_LEN);
if (splitFilePath(file_path, part_name, file_name, NULL) < 0) {
return 0;
}
if (setBlockDevice(part_name) < 0) {
return 0;
}
return fs_exists(file_name);
#endif
}
int iniGetFileSize(const char *file_path) {
#if (defined CC_COMPILE_IN_PC || defined CC_COMPILE_IN_ANDROID)
int file_size = 0;
int dev_fd = -1;
dev_fd = open(file_path, O_RDONLY);
if (dev_fd < 0) {
ALOGE("%s, open \"%s\" ERROR(%s)!!\n", __FUNCTION__,
file_path, strerror(errno));
return 0;
}
file_size = lseek(dev_fd, 0L, SEEK_END);
lseek(dev_fd, 0L, SEEK_SET);
return file_size;
#elif (defined CC_COMPILE_IN_UBOOT)
loff_t file_size = 0;
char part_name[CC_MAX_INI_FILE_NAME_LEN];
char file_name[CC_MAX_INI_FILE_NAME_LEN];
memset((void *)part_name, 0, CC_MAX_INI_FILE_NAME_LEN);
memset((void *)file_name, 0, CC_MAX_INI_FILE_NAME_LEN);
if (splitFilePath(file_path, part_name, file_name, NULL) < 0) {
return -1;
}
if (setBlockDevice(part_name) < 0) {
return -1;
}
if (fs_size(file_name, &file_size)) {
return -1;
}
return file_size;
#endif
}
int iniReadFileToBuffer(const char *file_path, int offset, int rd_size, unsigned char data_buf[]) {
#if (defined CC_COMPILE_IN_PC || defined CC_COMPILE_IN_ANDROID)
int rd_cnt = 0, file_size = 0;
int dev_fd = -1;
dev_fd = open(file_path, O_RDONLY);
if (dev_fd < 0) {
ALOGE("%s, open \"%s\" ERROR(%s)!!\n", __FUNCTION__,
file_path, strerror(errno));
return -1;
}
lseek(dev_fd, offset, SEEK_SET);
rd_cnt = read(dev_fd, data_buf, rd_size);
close(dev_fd);
dev_fd = -1;
if (rd_cnt != rd_size) {
ALOGE("%s, read file \"%s\" ERROR(%d, %d)!!!!\n", __FUNCTION__,
file_path, rd_cnt, file_size);
return -1;
}
return rd_cnt;
#elif (defined CC_COMPILE_IN_UBOOT)
int tmp_ret = -1;
loff_t rd_cnt = 0;
char part_name[CC_MAX_INI_FILE_NAME_LEN];
char file_name[CC_MAX_INI_FILE_NAME_LEN];
memset((void *)part_name, 0, CC_MAX_INI_FILE_NAME_LEN);
memset((void *)file_name, 0, CC_MAX_INI_FILE_NAME_LEN);
if (splitFilePath(file_path, part_name, file_name, NULL) < 0) {
return -1;
}
if (setBlockDevice(part_name) < 0) {
return -1;
}
tmp_ret = fs_read(file_name, (unsigned long)data_buf, 0, 0, &rd_cnt);
if (tmp_ret < 0) {
return -1;
}
flush_dcache_range((unsigned long )data_buf, (unsigned long )data_buf + rd_cnt);
return rd_cnt;
#endif
}