| 678 | } |
| 679 | |
| 680 | static 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 | } |
no test coverage detected