recovery增加打印到串口和增加复制代码

项目里需要调试recover,网上查了部分资料,增加了打印及复制的接口,写下来以后便于查阅

bootable/recovery/recovery.cpp

//添加打印函数打印到串口
#define USE_UART_DEBUG

#ifdef USE_UART_DEBUG
#define DEBUG_UART_PORT  "/dev/console"
#endif
static int landsem_dbg_log(const char *fmt, ...) {
   int ret;
   va_list ap;
   va_start(ap, fmt);
#ifdef USE_UART_DEBUG
   FILE *tty_out = fopen(DEBUG_UART_PORT, "w+");
   if(NULL != tty_out)	{
	  ret = vfprintf(tty_out, fmt, ap);
	  fclose(tty_out);
	  tty_out = NULL;
   }
   else {
	   ret = vfprintf(stdout, fmt, ap);
   }
#else
   ret = vfprintf(stdout, fmt, ap);
#endif
   va_end(ap);
   return ret;
}

////////////////////////////////添加复制目录相关的函数

static void change_path(const char *path) {
	landsem_dbg_log("==>hold:Leave %s Successed . . .\n", getcwd(NULL, 0));

	if (chdir(path) == -1) {
		landsem_dbg_log("==>hold: chdir path==-1 %s \n", path);
		return;
	}

	landsem_dbg_log("==>hold:Entry %s Successed . . .\n", getcwd(NULL, 0));
}

static char *get_rel_path(const char *dir, const char *name) {
	char *rel_path;
	unsigned long name_len, dir_len;
	landsem_dbg_log("==>hold:get_rel_path %s %s\n", dir,name);

	name_len = strlen(name);
	dir_len = strlen(dir);

	rel_path = malloc(name_len+dir_len+2);

	if(rel_path == NULL){
		landsem_dbg_log("==>hold:malloc error\n");
	}

	bzero(rel_path,name_len+dir_len+2);

	strncpy(rel_path,dir,dir_len);

	if(rel_path[dir_len-1] != '/'){
		strncat(rel_path, "/", sizeof(char));
	}

	strncat(rel_path, name, name_len);
	landsem_dbg_log("==>hold:get_rel_path ret: %s\n",rel_path);
	return rel_path;
}

static void _copy_file(const char *old_path, const char *new_path) {

	landsem_dbg_log("==>hold:will copy file %s to %s \n", old_path,new_path);
	FILE *in, *out;
	size_t len;
	char buf[64];
//	char *p = getcwd(NULL, 0);

	if ((in = fopen(old_path, "rb")) == NULL) {
		landsem_dbg_log("==>hold: fopen old_path %s error\n", old_path);
		return;
	}
//	change_path(new_path);

	if ((out = fopen(new_path, "wb")) == NULL) {
		landsem_dbg_log("==>hold:fopen new_path %s error\n", new_path);
		return;
	}

	while (!feof(in)) {
		bzero(buf, sizeof(buf));
		len = fread(&buf, 1, sizeof(buf) - 1, in);
		fwrite(&buf, len, 1, out);
	}

	fclose(in);
	fclose(out);

//	change_path(p);
}

static void copy_dir(const char *oldDir, const char *newDir) {
	DIR *dir;
	struct stat buf;
	struct dirent *dirp;
	char *p = getcwd(NULL, 0);
	landsem_dbg_log("==>hold:copy dir %s to %s\n", oldDir,newDir);
	if ((dir = opendir(oldDir)) == NULL) {

		landsem_dbg_log("==>hold:dir=opendir oldDir %s error\n", oldDir);
		return;
	}
	//700为 /data/hold的权限,这里改得和它一样

	if (access(newDir, F_OK) == -1) {
		umask(0);
		if (mkdir(newDir, 0700) == -1) {

			landsem_dbg_log("==>hold:mkdir newDir %s error\n", newDir);
			return;
		}
	}

	//linux下面执行stat需要先切换到当前目录
	change_path(oldDir);

	while ((dirp = readdir(dir))) {

		landsem_dbg_log("==>hold:will copy %s \n", dirp->d_name);
		if (strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0)
			continue;

		//取得文件状态
		if (stat(dirp->d_name, &buf) == -1) {

			landsem_dbg_log("==>hold:stat dirp->d_name %s error:%d\n", dirp->d_name,errno);
			return;
		}

		//如果是文件夹
		if (S_ISDIR(buf.st_mode)) {
			copy_dir(dirp->d_name,  newDir);
			continue;
		}

		char * from = get_rel_path(oldDir, dirp->d_name);
		char * to = get_rel_path(newDir, dirp->d_name);
		_copy_file(from,to);
		free(from);
		free(to);
	}

	closedir(dir);
	change_path(p);

}

//////////////////////////////////////////////////////////

猜你喜欢

转载自blog.csdn.net/jingzitakk66/article/details/89146700