MCPcopy Create free account
hub / github.com/cgsecurity/testdisk / copy_dir

Function copy_dir

src/dirn.c:680–744  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

678}
679
680static copy_dir_t copy_dir(WINDOW *window, disk_t *disk, const partition_t *partition, dir_data_t *dir_data, const file_info_t *dir, unsigned int *copy_ok, unsigned int *copy_bad)
681{
682 static unsigned int dir_nbr=0;
683 static unsigned long int inode_known[MAX_DIR_NBR];
684 file_info_t dir_list;
685 const unsigned int current_directory_namelength=strlen(dir_data->current_directory);
686 char *dir_name;
687 struct td_list_head *file_walker = NULL;
688 TD_INIT_LIST_HEAD(&dir_list.list);
689 if(dir_data->get_dir==NULL || dir_data->copy_file==NULL)
690 return CD_FINISHED;
691 inode_known[dir_nbr++]=dir->st_ino;
692 dir_name=mkdir_local(dir_data->local_dir, dir_data->current_directory);
693 dir_data->get_dir(disk, partition, dir_data, (const unsigned long int)dir->st_ino, &dir_list);
694 td_list_for_each(file_walker, &dir_list.list)
695 {
696 const file_info_t *current_file;
697 current_file=td_list_entry(file_walker, file_info_t, list);
698 dir_data->current_directory[current_directory_namelength]='\0';
699 if(current_directory_namelength+1+strlen(current_file->name)<sizeof(dir_data->current_directory)-1)
700 {
701 copy_dir_t copy_stopped=CD_FINISHED;
702 if(strcmp(dir_data->current_directory,"/"))
703 strcat(dir_data->current_directory,"/");
704 strcat(dir_data->current_directory,current_file->name);
705 if(LINUX_S_ISDIR(current_file->st_mode)!=0)
706 {
707 if(can_copy_dir(current_file, &inode_known[0], dir_nbr) > 0)
708 {
709 copy_stopped=copy_dir(window, disk, partition, dir_data, current_file, copy_ok, copy_bad);
710 }
711 }
712 else if(LINUX_S_ISREG(current_file->st_mode)!=0)
713 {
714 if(copy_progress(window, *copy_ok, *copy_bad))
715 copy_stopped=CD_STOPPED;
716 else
717 {
718 const copy_file_t res=dir_data->copy_file(disk, partition, dir_data, current_file);
719 if(res==CP_NOSPACE)
720 copy_stopped=CD_NOSPACE;
721 if(res==CP_OK)
722 (*copy_ok)++;
723 else
724 (*copy_bad)++;
725 }
726 }
727 if(copy_stopped != CD_FINISHED)
728 {
729 dir_data->current_directory[current_directory_namelength]='\0';
730 delete_list_file(&dir_list);
731 set_date(dir_name, dir->td_atime, dir->td_mtime);
732 free(dir_name);
733 dir_nbr--;
734 return copy_stopped;
735 }
736 }
737 }

Callers 2

dir_aff_ncursesFunction · 0.85
copy_selectionFunction · 0.85

Calls 6

mkdir_localFunction · 0.85
can_copy_dirFunction · 0.85
copy_progressFunction · 0.85
delete_list_fileFunction · 0.85
set_dateFunction · 0.85
td_list_for_eachFunction · 0.70

Tested by

no test coverage detected