`

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);

}

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

 

 

分享到:
评论

相关推荐

    android recovery代码分析

    Android Recovery 代码分析 ...Android Recovery代码分析了Recovery应用程序的入口点、获取命令行参数、获取默认升级固件路径和名称、解析命令、注册升级命令、升级、格式化、还原和wipe data等方面的内容。

    easyrecovery怎么恢复文件?easyrecovery恢复文件步骤.docx

    在安装好 EasyRecovery 数据恢复工具后,用户需要将手机数据线连接到电脑上,然后在手机上选择"USB 大容量存储",这样电脑就会识别到手机 SD 卡。 三、启动 EasyRecovery 并选择恢复方式 启动 EasyRecovery 数据...

    PDF解密工具 打印复制等功能加密禁止的解除 中文破解版Advanced PDF Password Recovery Pro

    PDF解密工具 打印复制等功能加密禁止的解除 中文破解版Advanced PDF Password Recovery Pro

    Android下按键进入recovery模式

    3. 快速启动(Quick Boot)库:有些开发人员使用C或C++编写快速启动库,使得应用程序能够模拟按键组合,从而在代码级别触发进入Recovery模式。但这通常需要root权限,并且对用户安全性和隐私有一定风险。 四、...

    Android刷Recovery

    源码可以在GitHub等开源平台找到,例如AOSP(Android Open Source Project)项目中包含了Recovery的相关代码。 7. 工具介绍: Odin是针对三星设备的刷机工具,支持刷入Recovery、固件等。Fastboot是Android设备的...

    android recovery升级教程

    将Recovery程序复制到SD卡中,并通过USB线将手机与电脑连接,但避免在连接状态下将SD卡挂载到电脑。在电脑上,按下Shift键并右键点击adb程序文件夹,选择“在此处打开命令窗口”。输入`adb shell`进入shell模式,...

    密码恢复PasswordRecovery和smtp发送邮件程序

    密码恢复PasswordRecovery和smtp发送邮件密码恢复PasswordRecovery和smtp发送邮件密码恢复PasswordRecovery和smtp发送邮件密码恢复PasswordRecovery和smtp发送邮件密码恢复PasswordRecovery和smtp发送邮件密码恢复...

    recovery刷入中兴v955一键代码刷入

    【标题】"recovery刷入中兴v955一键代码刷入"涉及的主要知识点是Android设备的系统恢复模式(recovery mode)以及如何通过代码和工具进行刷入操作。在Android系统中,recovery模式是一种特殊的系统状态,用户可以在...

    android recovery原理讲解

    - **`command`字段**: 可以有`"boot-recovery"`和`"update-hboot/radio"`两个值,分别表示进入Recovery模式和更新固件。 - **`recovery`字段**: 包含具体的操作命令,如`"--wipe_data"`、`"--update_package"`等。 ...

    Recovery解包打包工具_mkboot

    3. **打包Recovery**: 完成修改后,mkboot工具可以将这些文件重新打包成一个新的Recovery映像,供用户安装到手机上。 4. **安全检查**: 在打包过程中,mkboot可能会进行校验,确保生成的映像是有效的,并且不会导致...

    华为通用官方recovery恢复教程(同样适用于第三方recovery刷入)

    2. **验证结果**:重启手机进入Recovery模式(关机状态下同时按下音量上键和电源键),如果显示的是官方Recovery界面,则表示恢复成功。 通过以上步骤,即使是在进行了Root操作之后丢失官方Recovery的华为手机,也...

    小米6刷入recovery工具

    在IT领域,特别是Android系统定制和个性化中,"小米6刷入recovery工具"是一个常见的操作,用于替换手机原厂的恢复环境(Recovery Mode)以实现更多功能。本文将详细解析这一过程及相关知识点。 首先,我们要理解...

    华为c8816和荣耀3c电信版recovery

    2. 文件来源:使用可靠的资源下载Recovery和更新文件,避免下载携带病毒或恶意代码的文件。 3. 遵循教程:对于不熟悉Android系统或Recovery模式的用户,应按照详细教程操作,以免误操作导致设备无法正常使用。 总...

    自制recovery简易教程

    - 注意设备兼容性:不同的Android设备可能需要特定的recovery版本,确保你使用的recovery源代码是为你的设备定制的。 - 避免错误操作:误操作可能导致设备变砖,因此一定要按照步骤仔细操作。 7. **后续使用** ...

    小米助手(刷Recovery工具及小米5recovery.img)最新官方版

    Recovery.img是一个镜像文件,包含了Recovery系统的完整代码和功能。通过这个工具,用户可以安装第三方Recovery,比如TWRP或CWM,从而实现更多的自定义选项,如安装非官方ROM、备份和恢复系统等。 "高通机型线刷...

    Z5 mini 中文recovery

    Recovery Mode是一种特殊的系统状态,用户可以在其中执行一系列高级操作,如安装更新、备份数据、恢复出厂设置等,而不会影响到手机的正常操作系统。 【描述解析】 "中兴努比亚Z5 mini 中文recovery" 表明这是为...

    HTC recovery

    然后,下载匹配的HTC T328W recovery ZIP文件,将文件复制到手机的SD卡根目录。接下来,关机后按照设备特定的快捷键组合进入Recovery模式。在Recovery界面,选择“安装ZIP”来刷入新的Recovery,或者执行其他维护...

    华为,荣耀官方recovery1.0

    【华为,荣耀官方recovery1.0】 在智能手机领域,特别是Android系统中,"recovery"是一个非常重要的概念。...正确使用官方recovery,用户不仅可以提升设备性能,还能在遇到问题时迅速恢复到正常状态。

    Recovery管理器和最新触屏版recovery

    Recovery管理器2.3.9已付费 4EXT Recovery Control是一款功能强大的Recovery管理器,可以在线...注:4EXT Recovery Control需要ROOT和SOFF 和最新触屏版4EXT_Recovery_Touch_v1.0.0.5_RC3 下载后解压即得这两个文件

    如何进入Recovery模式

    安卓手机Recovery模式详解 Recovery模式可以说是安卓手机的高级模式,其功能相当强大。在安卓手机无法格式化SD卡的情况下,进入Recovery模式即可轻松格式化SD卡。另外,再刷机、双wipe等方面均需要进入到该模式下...

Global site tag (gtag.js) - Google Analytics