/******************************************************************************
版权所有：	
文件名称：	rt_file.c
文件版本：	01.01
创建作者：	sunxi
创建日期：	2020-06-18
功能说明：	实时微系统文件系统接口。
其它说明：
修改记录：
*/
/*------------------------------- 头文件 --------------------------------------
*/
#include "rt_file.h"
 #include <dirent.h>
/*------------------------------- 宏定义 --------------------------------------
*/


/*------------------------------ 类型结构 -------------------------------------
*/


/*------------------------------ 全局变量 -------------------------------------
*/


/*------------------------------ 函数声明 -------------------------------------
*/
extern void start_sync(void);


/*------------------------------ 外部函数 -------------------------------------
外部函数供其它实体文件引用，必须仔细检查传入参数的合法性.
*/
int rt_file_open(const char *filename, int flags, int mode)
{
	return open(filename, flags);
}

int rt_file_close(int fd, int id)
{
	return close(fd);
}

int rt_file_llseek(int fd, long offset, int origin)
{
	return lseek(fd, offset, origin);
}


int rt_file_read(int fd, char *buf, size_t count, off_t *pos)
{
	int result;

	if(pos != NULL)
		lseek(fd, *pos, SEEK_SET);
	result = read(fd, buf, count);

	if(pos != NULL)
		*pos += count;		//  add by sunxi 20221223

	return result;
}


int rt_file_write(int fd, const char  *buf, size_t count, off_t *pos)
{
	int result;

	if(pos != NULL)
		lseek(fd, *pos, SEEK_SET);
	result = write(fd, buf, count);

	if(pos != NULL)
		*pos += count;		//  add by niyh 20201125

	start_sync();
	
	return result;
}

int rt_file_getfile_size(int fd)
{
	struct stat st;
	if(fd < 0)
		return -1;

	// 检查文件长度是否正确
	if(fstat(fd, &st) < 0)
	{
		return -2;
	}
	return (int)st.st_size;
}

int rt_file_cp(char *src, char *dst)
{
  	int ret;
	
	char argv[256] = {0x00};

	sprintf(argv, "/bin/cp %s %s", src, dst);
	
	ret = system(argv);

	return ret;
}

int rt_file_mv(char *src,char *dst)
{
  	int ret;
	
	char argv[256] = {0x00};

	sprintf(argv, "/bin/mv %s %s", src, dst);
	
	ret = system(argv);

	return ret;
}

int rt_file_del(char *pathname)
{
  	int ret;
	
	char argv[256] = {0x00};

	sprintf(argv, "/bin/rm -f %s", pathname);
	
	ret = system(argv);

	return ret;
}

int rt_file_mkdir(char *dir)
{
  	int ret;

	char argv[256] = {0x00};

	if(opendir((const char *)dir) != NULL)//文件夹已存在
		return 1;

	sprintf(argv, "/bin/mkdir -p %s", dir);	//递归创建文件夹
	
	ret = system(argv);

	return ret;
}

int rt_file_ln(char *src, char *dst)
{
  	int ret;

	char argv[256] = {0x00};

	sprintf(argv, "/bin/ln -s %s %s", src, dst);
	
	ret = system(argv);

	return ret;

}

int rt_rootfs_version(char *pathname)
{
  	int ret;

	char argv[256] = {0x00};

	sprintf(argv, "/bin/cat %s", pathname);

	ret = system(argv);

	return ret;
}

int rt_rootfs_version1(char *pathname, char *pathname1, char *pathname2)
{
  	int ret = 0;

	char argv[256] = {0x00};

	sprintf(argv, "/bin/cat %s %s %s", pathname, pathname1, pathname2);

	return ret;
}

int rt_kernel_version(char *pathname)
{
  	int ret;

	char argv[256] = {0x00};

	sprintf(argv, "/bin/cat %s", pathname);

	ret = system(argv);

	return ret;
}

int rt_printenv_version(char *pathname)
{
  	int ret;

	char argv[256] = {0x00};

	sprintf(argv, "/bin/cat %s", pathname);

	ret = system(argv);

	return ret;
}

int call_usermodehelper(char *cmd, char *cmd_and_argv[], char *envp[], int flag)
{
	int ret;
	int i = 0;
	char cmd_str[512] = {0x00};
	char *ptmp = cmd_and_argv[0];
	while(ptmp != NULL)
	{
		strcat(cmd_str, ptmp);
		strcat(cmd_str, " ");
		i ++;
		ptmp = cmd_and_argv[i];
	}
	ret = system(cmd_str);

	return ret;
}

/*------------------------------ 内部函数 -------------------------------------
内部函数以下划线‘_’开头，不需要检查参数的合法性.
*/
/*------------------------------ 测试函数 -------------------------------------
一个实体文件必须带一个本模块的测试函数来进行单元测试，如果的确不方便在本模块中
进行单元测试，必须在此注明实际的测试位置（例如在哪个实体文件中使用哪个测试函数）.
*/


/*------------------------------ 文件结束 -------------------------------------
*/
