项目里需要调试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);
}
//////////////////////////////////////////////////////////