new prototype for copy_file(), improve error reporting
This commit is contained in:
parent
a8b22a5eed
commit
979489eff6
8 changed files with 89 additions and 62 deletions
|
@ -39,8 +39,10 @@ extern "C" {
|
||||||
#define CAPA_LIST_DELETED 1
|
#define CAPA_LIST_DELETED 1
|
||||||
#define CAPA_LIST_ADS 2
|
#define CAPA_LIST_ADS 2
|
||||||
|
|
||||||
|
typedef enum { CP_OK=0, CP_STAT_FAILED=-1, CP_OPEN_FAILED=-2, CP_READ_FAILED=-3, CP_CREATE_FAILED=-4, CP_NOSPACE=-5, CP_CLOSE_FAILED=-6, CP_NOMEM=-7} copy_file_t;
|
||||||
typedef enum { DIR_PART_ENOIMP=-3, DIR_PART_ENOSYS=-2, DIR_PART_EIO=-1, DIR_PART_OK=0} dir_partition_t;
|
typedef enum { DIR_PART_ENOIMP=-3, DIR_PART_ENOSYS=-2, DIR_PART_EIO=-1, DIR_PART_OK=0} dir_partition_t;
|
||||||
typedef struct dir_data dir_data_t;
|
typedef struct dir_data dir_data_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
struct td_list_head list;
|
struct td_list_head list;
|
||||||
|
@ -65,7 +67,7 @@ struct dir_data
|
||||||
unsigned int param;
|
unsigned int param;
|
||||||
unsigned int capabilities;
|
unsigned int capabilities;
|
||||||
int(*get_dir)(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const unsigned long int first_inode, file_info_t*list);
|
int(*get_dir)(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const unsigned long int first_inode, file_info_t*list);
|
||||||
int (*copy_file)(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file);
|
copy_file_t (*copy_file)(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file);
|
||||||
void (*close)(dir_data_t *dir_data);
|
void (*close)(dir_data_t *dir_data);
|
||||||
char *local_dir;
|
char *local_dir;
|
||||||
void *private_dir_data;
|
void *private_dir_data;
|
||||||
|
|
62
src/dirn.c
62
src/dirn.c
|
@ -49,8 +49,9 @@
|
||||||
#include "askloc.h"
|
#include "askloc.h"
|
||||||
#include "setdate.h"
|
#include "setdate.h"
|
||||||
|
|
||||||
static int 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);
|
typedef enum { CD_FINISHED = 0, CD_STOPPED = 1, CD_NOSPACE = 2 } copy_dir_t;
|
||||||
static int copy_selection(file_info_t*dir_list, WINDOW *window, disk_t *disk, const partition_t *partition, dir_data_t *dir_data, unsigned int *copy_ok, unsigned int *copy_bad);
|
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);
|
||||||
|
static copy_dir_t copy_selection(file_info_t*dir_list, WINDOW *window, disk_t *disk, const partition_t *partition, dir_data_t *dir_data, unsigned int *copy_ok, unsigned int *copy_bad);
|
||||||
|
|
||||||
#define INTER_DIR (LINES-25+15)
|
#define INTER_DIR (LINES-25+15)
|
||||||
#define MAX_DIR_NBR 256
|
#define MAX_DIR_NBR 256
|
||||||
|
@ -79,7 +80,7 @@ static int copy_progress(WINDOW *window, const unsigned int copy_ok, const unsig
|
||||||
return check_enter_key_or_s(window);
|
return check_enter_key_or_s(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void copy_done(WINDOW *window, const unsigned int copy_ok, const unsigned int copy_bad, const unsigned int copy_stopped)
|
static void copy_done(WINDOW *window, const unsigned int copy_ok, const unsigned int copy_bad, const copy_dir_t copy_stopped)
|
||||||
{
|
{
|
||||||
wmove(window,5,0);
|
wmove(window,5,0);
|
||||||
wclrtoeol(window);
|
wclrtoeol(window);
|
||||||
|
@ -90,8 +91,10 @@ static void copy_done(WINDOW *window, const unsigned int copy_ok, const unsigned
|
||||||
else
|
else
|
||||||
wbkgdset(window,' ' | A_BOLD | COLOR_PAIR(2));
|
wbkgdset(window,' ' | A_BOLD | COLOR_PAIR(2));
|
||||||
}
|
}
|
||||||
if(copy_stopped)
|
if(copy_stopped == CD_STOPPED)
|
||||||
wprintw(window,"Copy stopped! %u ok, %u failed", copy_ok, copy_bad);
|
wprintw(window,"Copy stopped! %u ok, %u failed", copy_ok, copy_bad);
|
||||||
|
else if(copy_stopped == CD_NOSPACE)
|
||||||
|
wprintw(window,"Copy stopped! %u ok, %u failed - Not enough space", copy_ok, copy_bad);
|
||||||
else
|
else
|
||||||
wprintw(window,"Copy done! %u ok, %u failed", copy_ok, copy_bad);
|
wprintw(window,"Copy done! %u ok, %u failed", copy_ok, copy_bad);
|
||||||
if(has_colors())
|
if(has_colors())
|
||||||
|
@ -434,7 +437,7 @@ static long int dir_aff_ncurses(disk_t *disk, const partition_t *partition, dir_
|
||||||
{
|
{
|
||||||
unsigned int copy_bad=0;
|
unsigned int copy_bad=0;
|
||||||
unsigned int copy_ok=0;
|
unsigned int copy_ok=0;
|
||||||
unsigned int copy_stopped=0;
|
copy_dir_t copy_stopped=CD_FINISHED;
|
||||||
aff_copy(window);
|
aff_copy(window);
|
||||||
wmove(window,3,0);
|
wmove(window,3,0);
|
||||||
aff_part(window, AFF_PART_ORDER|AFF_PART_STATUS, disk, partition);
|
aff_part(window, AFF_PART_ORDER|AFF_PART_STATUS, disk, partition);
|
||||||
|
@ -450,8 +453,12 @@ static long int dir_aff_ncurses(disk_t *disk, const partition_t *partition, dir_
|
||||||
}
|
}
|
||||||
else if(LINUX_S_ISREG(tmp->st_mode)!=0)
|
else if(LINUX_S_ISREG(tmp->st_mode)!=0)
|
||||||
{
|
{
|
||||||
|
copy_file_t res;
|
||||||
copy_progress(window, copy_ok, copy_bad);
|
copy_progress(window, copy_ok, copy_bad);
|
||||||
if(dir_data->copy_file(disk, partition, dir_data, tmp)==0)
|
res=dir_data->copy_file(disk, partition, dir_data, tmp);
|
||||||
|
if(res==CP_NOSPACE)
|
||||||
|
copy_stopped=CD_NOSPACE;
|
||||||
|
if(res==CP_OK)
|
||||||
copy_ok++;
|
copy_ok++;
|
||||||
else
|
else
|
||||||
copy_bad++;
|
copy_bad++;
|
||||||
|
@ -487,7 +494,7 @@ static long int dir_aff_ncurses(disk_t *disk, const partition_t *partition, dir_
|
||||||
{
|
{
|
||||||
unsigned int copy_bad=0;
|
unsigned int copy_bad=0;
|
||||||
unsigned int copy_ok=0;
|
unsigned int copy_ok=0;
|
||||||
unsigned int copy_stopped;
|
copy_dir_t copy_stopped;
|
||||||
aff_copy(window);
|
aff_copy(window);
|
||||||
wmove(window,3,0);
|
wmove(window,3,0);
|
||||||
aff_part(window, AFF_PART_ORDER|AFF_PART_STATUS, disk, partition);
|
aff_part(window, AFF_PART_ORDER|AFF_PART_STATUS, disk, partition);
|
||||||
|
@ -682,7 +689,7 @@ static int can_copy_dir(const file_info_t *current_file, const unsigned long int
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int 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)
|
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)
|
||||||
{
|
{
|
||||||
static unsigned int dir_nbr=0;
|
static unsigned int dir_nbr=0;
|
||||||
static unsigned long int inode_known[MAX_DIR_NBR];
|
static unsigned long int inode_known[MAX_DIR_NBR];
|
||||||
|
@ -692,7 +699,7 @@ static int copy_dir(WINDOW *window, disk_t *disk, const partition_t *partition,
|
||||||
struct td_list_head *file_walker = NULL;
|
struct td_list_head *file_walker = NULL;
|
||||||
TD_INIT_LIST_HEAD(&dir_list.list);
|
TD_INIT_LIST_HEAD(&dir_list.list);
|
||||||
if(dir_data->get_dir==NULL || dir_data->copy_file==NULL)
|
if(dir_data->get_dir==NULL || dir_data->copy_file==NULL)
|
||||||
return 0;
|
return CD_FINISHED;
|
||||||
inode_known[dir_nbr++]=dir->st_ino;
|
inode_known[dir_nbr++]=dir->st_ino;
|
||||||
dir_name=mkdir_local(dir_data->local_dir, dir_data->current_directory);
|
dir_name=mkdir_local(dir_data->local_dir, dir_data->current_directory);
|
||||||
dir_data->get_dir(disk, partition, dir_data, (const unsigned long int)dir->st_ino, &dir_list);
|
dir_data->get_dir(disk, partition, dir_data, (const unsigned long int)dir->st_ino, &dir_list);
|
||||||
|
@ -703,7 +710,7 @@ static int copy_dir(WINDOW *window, disk_t *disk, const partition_t *partition,
|
||||||
dir_data->current_directory[current_directory_namelength]='\0';
|
dir_data->current_directory[current_directory_namelength]='\0';
|
||||||
if(current_directory_namelength+1+strlen(current_file->name)<sizeof(dir_data->current_directory)-1)
|
if(current_directory_namelength+1+strlen(current_file->name)<sizeof(dir_data->current_directory)-1)
|
||||||
{
|
{
|
||||||
int copy_stopped=0;
|
copy_dir_t copy_stopped=CD_FINISHED;
|
||||||
if(strcmp(dir_data->current_directory,"/"))
|
if(strcmp(dir_data->current_directory,"/"))
|
||||||
strcat(dir_data->current_directory,"/");
|
strcat(dir_data->current_directory,"/");
|
||||||
strcat(dir_data->current_directory,current_file->name);
|
strcat(dir_data->current_directory,current_file->name);
|
||||||
|
@ -716,20 +723,27 @@ static int copy_dir(WINDOW *window, disk_t *disk, const partition_t *partition,
|
||||||
}
|
}
|
||||||
else if(LINUX_S_ISREG(current_file->st_mode)!=0)
|
else if(LINUX_S_ISREG(current_file->st_mode)!=0)
|
||||||
{
|
{
|
||||||
copy_stopped=copy_progress(window, *copy_ok, *copy_bad);
|
if(copy_progress(window, *copy_ok, *copy_bad))
|
||||||
if(dir_data->copy_file(disk, partition, dir_data, current_file)==0)
|
copy_stopped=CD_STOPPED;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const copy_file_t res=dir_data->copy_file(disk, partition, dir_data, current_file);
|
||||||
|
if(res==CP_NOSPACE)
|
||||||
|
copy_stopped=CD_NOSPACE;
|
||||||
|
if(res==CP_OK)
|
||||||
(*copy_ok)++;
|
(*copy_ok)++;
|
||||||
else
|
else
|
||||||
(*copy_bad)++;
|
(*copy_bad)++;
|
||||||
}
|
}
|
||||||
if(copy_stopped)
|
}
|
||||||
|
if(copy_stopped != CD_FINISHED)
|
||||||
{
|
{
|
||||||
dir_data->current_directory[current_directory_namelength]='\0';
|
dir_data->current_directory[current_directory_namelength]='\0';
|
||||||
delete_list_file(&dir_list);
|
delete_list_file(&dir_list);
|
||||||
set_date(dir_name, dir->td_atime, dir->td_mtime);
|
set_date(dir_name, dir->td_atime, dir->td_mtime);
|
||||||
free(dir_name);
|
free(dir_name);
|
||||||
dir_nbr--;
|
dir_nbr--;
|
||||||
return 1;
|
return copy_stopped;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -738,15 +752,16 @@ static int copy_dir(WINDOW *window, disk_t *disk, const partition_t *partition,
|
||||||
set_date(dir_name, dir->td_atime, dir->td_mtime);
|
set_date(dir_name, dir->td_atime, dir->td_mtime);
|
||||||
free(dir_name);
|
free(dir_name);
|
||||||
dir_nbr--;
|
dir_nbr--;
|
||||||
return 0;
|
return CD_FINISHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int copy_selection(file_info_t*dir_list, WINDOW *window, disk_t *disk, const partition_t *partition, dir_data_t *dir_data, unsigned int *copy_ok, unsigned int *copy_bad)
|
static copy_dir_t copy_selection(file_info_t*dir_list, WINDOW *window, disk_t *disk, const partition_t *partition, dir_data_t *dir_data, unsigned int *copy_ok, unsigned int *copy_bad)
|
||||||
{
|
{
|
||||||
const unsigned int current_directory_namelength=strlen(dir_data->current_directory);
|
const unsigned int current_directory_namelength=strlen(dir_data->current_directory);
|
||||||
struct td_list_head *tmpw=NULL;
|
struct td_list_head *tmpw=NULL;
|
||||||
td_list_for_each(tmpw, &dir_list->list)
|
td_list_for_each(tmpw, &dir_list->list)
|
||||||
{
|
{
|
||||||
|
copy_dir_t copy_stopped=CD_FINISHED;
|
||||||
file_info_t *tmp=td_list_entry(tmpw, file_info_t, list);
|
file_info_t *tmp=td_list_entry(tmpw, file_info_t, list);
|
||||||
if((tmp->status&FILE_STATUS_MARKED)!=0 &&
|
if((tmp->status&FILE_STATUS_MARKED)!=0 &&
|
||||||
current_directory_namelength + 1 + strlen(tmp->name) <
|
current_directory_namelength + 1 + strlen(tmp->name) <
|
||||||
|
@ -759,23 +774,30 @@ static int copy_selection(file_info_t*dir_list, WINDOW *window, disk_t *disk, co
|
||||||
strcat(dir_data->current_directory,tmp->name);
|
strcat(dir_data->current_directory,tmp->name);
|
||||||
if(LINUX_S_ISDIR(tmp->st_mode)!=0)
|
if(LINUX_S_ISDIR(tmp->st_mode)!=0)
|
||||||
{
|
{
|
||||||
if(copy_dir(window, disk, partition, dir_data, tmp, copy_ok, copy_bad))
|
copy_stopped=copy_dir(window, disk, partition, dir_data, tmp, copy_ok, copy_bad);
|
||||||
|
if(copy_stopped!=CD_FINISHED)
|
||||||
{
|
{
|
||||||
dir_data->current_directory[current_directory_namelength]='\0';
|
dir_data->current_directory[current_directory_namelength]='\0';
|
||||||
return 1;
|
return copy_stopped;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(LINUX_S_ISREG(tmp->st_mode)!=0)
|
else if(LINUX_S_ISREG(tmp->st_mode)!=0)
|
||||||
{
|
{
|
||||||
|
copy_file_t res;
|
||||||
copy_progress(window, *copy_ok, *copy_bad);
|
copy_progress(window, *copy_ok, *copy_bad);
|
||||||
if(dir_data->copy_file(disk, partition, dir_data, tmp) == 0)
|
res=dir_data->copy_file(disk, partition, dir_data, tmp);
|
||||||
|
if(res==CP_NOSPACE)
|
||||||
|
copy_stopped=CD_NOSPACE;
|
||||||
|
if(res == CP_OK)
|
||||||
(*copy_ok)++;
|
(*copy_ok)++;
|
||||||
else
|
else
|
||||||
(*copy_bad)++;
|
(*copy_bad)++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dir_data->current_directory[current_directory_namelength]='\0';
|
dir_data->current_directory[current_directory_namelength]='\0';
|
||||||
|
if(copy_stopped!=CD_FINISHED)
|
||||||
|
return copy_stopped;
|
||||||
}
|
}
|
||||||
return 0;
|
return CD_FINISHED;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -63,7 +63,7 @@ struct exfat_dir_struct
|
||||||
|
|
||||||
|
|
||||||
static int exfat_dir(disk_t *disk, const partition_t *partition, dir_data_t *dir_data, const unsigned long int first_cluster, file_info_t *dir_list);
|
static int exfat_dir(disk_t *disk, const partition_t *partition, dir_data_t *dir_data, const unsigned long int first_cluster, file_info_t *dir_list);
|
||||||
static int exfat_copy(disk_t *disk, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file);
|
static copy_file_t exfat_copy(disk_t *disk, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file);
|
||||||
static void dir_partition_exfat_close(dir_data_t *dir_data);
|
static void dir_partition_exfat_close(dir_data_t *dir_data);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -426,7 +426,7 @@ static void dir_partition_exfat_close(dir_data_t *dir_data)
|
||||||
free(ls);
|
free(ls);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int exfat_copy(disk_t *disk, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file)
|
static copy_file_t exfat_copy(disk_t *disk, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file)
|
||||||
{
|
{
|
||||||
char *new_file;
|
char *new_file;
|
||||||
FILE *f_out;
|
FILE *f_out;
|
||||||
|
@ -446,7 +446,7 @@ static int exfat_copy(disk_t *disk, const partition_t *partition, dir_data_t *di
|
||||||
log_critical("Can't create file %s: \n",new_file);
|
log_critical("Can't create file %s: \n",new_file);
|
||||||
free(new_file);
|
free(new_file);
|
||||||
free(buffer_file);
|
free(buffer_file);
|
||||||
return -1;
|
return CP_CREATE_FAILED;
|
||||||
}
|
}
|
||||||
cluster = file->st_ino;
|
cluster = file->st_ino;
|
||||||
start_exfat1=(uint64_t)le32(exfat_header->fat_blocknr) << exfat_header->blocksize_bits;
|
start_exfat1=(uint64_t)le32(exfat_header->fat_blocknr) << exfat_header->blocksize_bits;
|
||||||
|
@ -473,7 +473,7 @@ static int exfat_copy(disk_t *disk, const partition_t *partition, dir_data_t *di
|
||||||
set_date(new_file, file->td_atime, file->td_mtime);
|
set_date(new_file, file->td_atime, file->td_mtime);
|
||||||
free(new_file);
|
free(new_file);
|
||||||
free(buffer_file);
|
free(buffer_file);
|
||||||
return -1;
|
return CP_NOSPACE;
|
||||||
}
|
}
|
||||||
file_size -= toread;
|
file_size -= toread;
|
||||||
if(file_size>0)
|
if(file_size>0)
|
||||||
|
@ -501,5 +501,5 @@ static int exfat_copy(disk_t *disk, const partition_t *partition, dir_data_t *di
|
||||||
set_date(new_file, file->td_atime, file->td_mtime);
|
set_date(new_file, file->td_atime, file->td_mtime);
|
||||||
free(new_file);
|
free(new_file);
|
||||||
free(buffer_file);
|
free(buffer_file);
|
||||||
return 0;
|
return CP_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,7 @@ static errcode_t my_read_blk64(io_channel channel, unsigned long long block, int
|
||||||
static errcode_t my_write_blk64(io_channel channel, unsigned long long block, int count, const void *buf);
|
static errcode_t my_write_blk64(io_channel channel, unsigned long long block, int count, const void *buf);
|
||||||
|
|
||||||
static void dir_partition_ext2_close(dir_data_t *dir_data);
|
static void dir_partition_ext2_close(dir_data_t *dir_data);
|
||||||
static int ext2_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file);
|
static copy_file_t ext2_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file);
|
||||||
|
|
||||||
static struct struct_io_manager my_struct_manager = {
|
static struct struct_io_manager my_struct_manager = {
|
||||||
.magic = EXT2_ET_MAGIC_IO_MANAGER,
|
.magic = EXT2_ET_MAGIC_IO_MANAGER,
|
||||||
|
@ -289,9 +289,9 @@ static void dir_partition_ext2_close(dir_data_t *dir_data)
|
||||||
free(ls);
|
free(ls);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ext2_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file)
|
static copy_file_t ext2_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file)
|
||||||
{
|
{
|
||||||
int error=0;
|
copy_file_t error=CP_OK;
|
||||||
FILE *f_out;
|
FILE *f_out;
|
||||||
const struct ext2_dir_struct *ls = (const struct ext2_dir_struct *)dir_data->private_dir_data;
|
const struct ext2_dir_struct *ls = (const struct ext2_dir_struct *)dir_data->private_dir_data;
|
||||||
char *new_file;
|
char *new_file;
|
||||||
|
@ -300,7 +300,7 @@ static int ext2_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
|
||||||
{
|
{
|
||||||
log_critical("Can't create file %s: %s\n", new_file, strerror(errno));
|
log_critical("Can't create file %s: %s\n", new_file, strerror(errno));
|
||||||
free(new_file);
|
free(new_file);
|
||||||
return -4;
|
return CP_CREATE_FAILED;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
errcode_t retval;
|
errcode_t retval;
|
||||||
|
@ -312,7 +312,7 @@ static int ext2_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
|
||||||
{
|
{
|
||||||
free(new_file);
|
free(new_file);
|
||||||
fclose(f_out);
|
fclose(f_out);
|
||||||
return -1;
|
return CP_STAT_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = ext2fs_file_open(ls->current_fs, file->st_ino, 0, &e2_file);
|
retval = ext2fs_file_open(ls->current_fs, file->st_ino, 0, &e2_file);
|
||||||
|
@ -320,9 +320,9 @@ static int ext2_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
|
||||||
log_error("Error while opening ext2 file %s\n", dir_data->current_directory);
|
log_error("Error while opening ext2 file %s\n", dir_data->current_directory);
|
||||||
free(new_file);
|
free(new_file);
|
||||||
fclose(f_out);
|
fclose(f_out);
|
||||||
return -2;
|
return CP_OPEN_FAILED;
|
||||||
}
|
}
|
||||||
while (1)
|
while (error!=CP_NOSPACE)
|
||||||
{
|
{
|
||||||
int nbytes;
|
int nbytes;
|
||||||
unsigned int got;
|
unsigned int got;
|
||||||
|
@ -330,7 +330,7 @@ static int ext2_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
|
||||||
if (retval)
|
if (retval)
|
||||||
{
|
{
|
||||||
log_error("Error while reading ext2 file %s\n", dir_data->current_directory);
|
log_error("Error while reading ext2 file %s\n", dir_data->current_directory);
|
||||||
error = -3;
|
error = CP_READ_FAILED;
|
||||||
}
|
}
|
||||||
if (got == 0)
|
if (got == 0)
|
||||||
break;
|
break;
|
||||||
|
@ -338,14 +338,14 @@ static int ext2_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
|
||||||
if ((unsigned) nbytes != got)
|
if ((unsigned) nbytes != got)
|
||||||
{
|
{
|
||||||
log_error("Error while writing file %s\n", new_file);
|
log_error("Error while writing file %s\n", new_file);
|
||||||
error = -5;
|
error = CP_NOSPACE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
retval = ext2fs_file_close(e2_file);
|
retval = ext2fs_file_close(e2_file);
|
||||||
if (retval)
|
if (retval)
|
||||||
{
|
{
|
||||||
log_error("Error while closing ext2 file\n");
|
log_error("Error while closing ext2 file\n");
|
||||||
error = -6;
|
error = CP_CLOSE_FAILED;
|
||||||
}
|
}
|
||||||
fclose(f_out);
|
fclose(f_out);
|
||||||
set_date(new_file, file->td_atime, file->td_mtime);
|
set_date(new_file, file->td_atime, file->td_mtime);
|
||||||
|
|
|
@ -77,7 +77,7 @@ static int fat1x_rootdir(disk_t *disk_car, const partition_t *partition, const d
|
||||||
@ requires \valid(file);
|
@ requires \valid(file);
|
||||||
@ requires \separated(disk_car, partition, dir_data, file);
|
@ requires \separated(disk_car, partition, dir_data, file);
|
||||||
@*/
|
@*/
|
||||||
static int fat_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file);
|
static copy_file_t fat_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file);
|
||||||
|
|
||||||
/*@
|
/*@
|
||||||
@ requires \valid(dir_data);
|
@ requires \valid(dir_data);
|
||||||
|
@ -535,7 +535,7 @@ static void dir_partition_fat_close(dir_data_t *dir_data)
|
||||||
@ requires \separated(disk_car, partition, dir_data, file);
|
@ requires \separated(disk_car, partition, dir_data, file);
|
||||||
@ decreases 0;
|
@ decreases 0;
|
||||||
@*/
|
@*/
|
||||||
static int fat_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file)
|
static copy_file_t fat_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file)
|
||||||
{
|
{
|
||||||
char *new_file;
|
char *new_file;
|
||||||
FILE *f_out;
|
FILE *f_out;
|
||||||
|
@ -555,7 +555,7 @@ static int fat_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *
|
||||||
log_critical("Can't create file %s: \n",new_file);
|
log_critical("Can't create file %s: \n",new_file);
|
||||||
free(new_file);
|
free(new_file);
|
||||||
free(buffer_file);
|
free(buffer_file);
|
||||||
return -1;
|
return CP_CREATE_FAILED;
|
||||||
}
|
}
|
||||||
cluster = file->st_ino;
|
cluster = file->st_ino;
|
||||||
fat_length=le16(fat_header->fat_length)>0?le16(fat_header->fat_length):le32(fat_header->fat32_length);
|
fat_length=le16(fat_header->fat_length)>0?le16(fat_header->fat_length):le32(fat_header->fat32_length);
|
||||||
|
@ -585,7 +585,7 @@ static int fat_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *
|
||||||
set_date(new_file, file->td_atime, file->td_mtime);
|
set_date(new_file, file->td_atime, file->td_mtime);
|
||||||
free(new_file);
|
free(new_file);
|
||||||
free(buffer_file);
|
free(buffer_file);
|
||||||
return -1;
|
return CP_NOSPACE;
|
||||||
}
|
}
|
||||||
file_size -= toread;
|
file_size -= toread;
|
||||||
if(file_size>0)
|
if(file_size>0)
|
||||||
|
@ -613,5 +613,5 @@ static int fat_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *
|
||||||
set_date(new_file, file->td_atime, file->td_mtime);
|
set_date(new_file, file->td_atime, file->td_mtime);
|
||||||
free(new_file);
|
free(new_file);
|
||||||
free(buffer_file);
|
free(buffer_file);
|
||||||
return 0;
|
return CP_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,7 +152,7 @@ static void strip_fn(char *fn)
|
||||||
fn[i]='\0';
|
fn[i]='\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fat_copy_file(disk_t *disk, const partition_t *partition, const unsigned int cluster_size, const uint64_t start_data, const char *recup_dir, const unsigned int dir_num, const unsigned int inode_num, const file_info_t *file)
|
static copy_file_t fat_copy_file(disk_t *disk, const partition_t *partition, const unsigned int cluster_size, const uint64_t start_data, const char *recup_dir, const unsigned int dir_num, const unsigned int inode_num, const file_info_t *file)
|
||||||
{
|
{
|
||||||
char *new_file;
|
char *new_file;
|
||||||
FILE *f_out;
|
FILE *f_out;
|
||||||
|
@ -188,7 +188,7 @@ static int fat_copy_file(disk_t *disk, const partition_t *partition, const unsig
|
||||||
log_critical("Can't create file %s: \n",new_file);
|
log_critical("Can't create file %s: \n",new_file);
|
||||||
free(new_file);
|
free(new_file);
|
||||||
free(buffer_file);
|
free(buffer_file);
|
||||||
return -1;
|
return CP_CREATE_FAILED;
|
||||||
}
|
}
|
||||||
while(cluster>=2 && cluster<=no_of_cluster+2 && file_size>0)
|
while(cluster>=2 && cluster<=no_of_cluster+2 && file_size>0)
|
||||||
{
|
{
|
||||||
|
@ -207,7 +207,7 @@ static int fat_copy_file(disk_t *disk, const partition_t *partition, const unsig
|
||||||
set_date(new_file, file->td_atime, file->td_mtime);
|
set_date(new_file, file->td_atime, file->td_mtime);
|
||||||
free(new_file);
|
free(new_file);
|
||||||
free(buffer_file);
|
free(buffer_file);
|
||||||
return -1;
|
return CP_NOSPACE;
|
||||||
}
|
}
|
||||||
file_size -= toread;
|
file_size -= toread;
|
||||||
cluster++;
|
cluster++;
|
||||||
|
@ -216,7 +216,7 @@ static int fat_copy_file(disk_t *disk, const partition_t *partition, const unsig
|
||||||
set_date(new_file, file->td_atime, file->td_mtime);
|
set_date(new_file, file->td_atime, file->td_mtime);
|
||||||
free(new_file);
|
free(new_file);
|
||||||
free(buffer_file);
|
free(buffer_file);
|
||||||
return 0;
|
return CP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static pstatus_t fat_unformat_aux(struct ph_param *params, const struct ph_options *options, const uint64_t start_data, alloc_data_t *list_search_space)
|
static pstatus_t fat_unformat_aux(struct ph_param *params, const struct ph_options *options, const uint64_t start_data, alloc_data_t *list_search_space)
|
||||||
|
|
|
@ -113,7 +113,7 @@ static int ntfs_td_list_entry( struct ntfs_dir_struct *ls, const ntfschar *name
|
||||||
const int name_len, const int name_type, const s64 pos,
|
const int name_len, const int name_type, const s64 pos,
|
||||||
const MFT_REF mref, const unsigned dt_type);
|
const MFT_REF mref, const unsigned dt_type);
|
||||||
static int ntfs_dir(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const unsigned long int cluster, file_info_t *dir_list);
|
static int ntfs_dir(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const unsigned long int cluster, file_info_t *dir_list);
|
||||||
static int ntfs_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file);
|
static copy_file_t ntfs_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file);
|
||||||
static void dir_partition_ntfs_close(dir_data_t *dir_data);
|
static void dir_partition_ntfs_close(dir_data_t *dir_data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -337,15 +337,16 @@ static int ntfs_dir(disk_t *disk_car, const partition_t *partition, dir_data_t *
|
||||||
|
|
||||||
enum { bufsize = 4096 };
|
enum { bufsize = 4096 };
|
||||||
|
|
||||||
static int ntfs_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file)
|
static copy_file_t ntfs_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file)
|
||||||
{
|
{
|
||||||
const unsigned long int first_inode=file->st_ino;
|
const unsigned long int first_inode=file->st_ino;
|
||||||
ntfs_inode *inode;
|
ntfs_inode *inode;
|
||||||
struct ntfs_dir_struct *ls=(struct ntfs_dir_struct*)dir_data->private_dir_data;
|
struct ntfs_dir_struct *ls=(struct ntfs_dir_struct*)dir_data->private_dir_data;
|
||||||
|
copy_file_t res=CP_OK;
|
||||||
inode = ntfs_inode_open (ls->vol, first_inode);
|
inode = ntfs_inode_open (ls->vol, first_inode);
|
||||||
if (!inode) {
|
if (!inode) {
|
||||||
log_error("ntfs_copy: ntfs_inode_open failed for %s\n", dir_data->current_directory);
|
log_error("ntfs_copy: ntfs_inode_open failed for %s\n", dir_data->current_directory);
|
||||||
return -1;
|
return CP_STAT_FAILED;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
char *buffer;
|
char *buffer;
|
||||||
|
@ -359,7 +360,7 @@ static int ntfs_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
{
|
{
|
||||||
ntfs_inode_close(inode);
|
ntfs_inode_close(inode);
|
||||||
return -2;
|
return CP_NOMEM;
|
||||||
}
|
}
|
||||||
stream_name=strrchr(dir_data->current_directory, ':');
|
stream_name=strrchr(dir_data->current_directory, ':');
|
||||||
if(stream_name)
|
if(stream_name)
|
||||||
|
@ -384,7 +385,7 @@ static int ntfs_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
|
||||||
log_error("Cannot find attribute type 0x%lx.\n", (long) AT_DATA);
|
log_error("Cannot find attribute type 0x%lx.\n", (long) AT_DATA);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
ntfs_inode_close(inode);
|
ntfs_inode_close(inode);
|
||||||
return -3;
|
return CP_STAT_FAILED;
|
||||||
}
|
}
|
||||||
if ((inode->mft_no < 2) && (attr->type == AT_DATA))
|
if ((inode->mft_no < 2) && (attr->type == AT_DATA))
|
||||||
block_size = ls->vol->mft_record_size;
|
block_size = ls->vol->mft_record_size;
|
||||||
|
@ -413,7 +414,7 @@ static int ntfs_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
|
||||||
ntfs_attr_close(attr);
|
ntfs_attr_close(attr);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
ntfs_inode_close(inode);
|
ntfs_inode_close(inode);
|
||||||
return -4;
|
return CP_CREATE_FAILED;
|
||||||
}
|
}
|
||||||
offset = 0;
|
offset = 0;
|
||||||
for (;;)
|
for (;;)
|
||||||
|
@ -429,6 +430,7 @@ static int ntfs_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
|
||||||
//ntfs_log_info("read %lld bytes\n", bytes_read);
|
//ntfs_log_info("read %lld bytes\n", bytes_read);
|
||||||
if (bytes_read < 0) {
|
if (bytes_read < 0) {
|
||||||
log_error("ERROR: Couldn't read file");
|
log_error("ERROR: Couldn't read file");
|
||||||
|
res=CP_READ_FAILED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!bytes_read)
|
if (!bytes_read)
|
||||||
|
@ -438,6 +440,7 @@ static int ntfs_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
|
||||||
if (written != bytes_read)
|
if (written != bytes_read)
|
||||||
{
|
{
|
||||||
log_error("ERROR: Couldn't output all data!");
|
log_error("ERROR: Couldn't output all data!");
|
||||||
|
res=CP_NOSPACE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
offset += bytes_read;
|
offset += bytes_read;
|
||||||
|
@ -450,7 +453,7 @@ static int ntfs_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
|
||||||
}
|
}
|
||||||
/* Finished with the inode; release it. */
|
/* Finished with the inode; release it. */
|
||||||
ntfs_inode_close(inode);
|
ntfs_inode_close(inode);
|
||||||
return 0;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dir_partition_ntfs_close(dir_data_t *dir_data)
|
static void dir_partition_ntfs_close(dir_data_t *dir_data)
|
||||||
|
|
|
@ -471,20 +471,20 @@ static void dir_partition_reiser_close(dir_data_t *dir_data)
|
||||||
free(ls);
|
free(ls);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int reiser_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file)
|
static copy_file_t reiser_copy(disk_t *disk_car, const partition_t *partition, dir_data_t *dir_data, const file_info_t *file)
|
||||||
{
|
{
|
||||||
reiserfs_file_t *in;
|
reiserfs_file_t *in;
|
||||||
FILE *f_out;
|
FILE *f_out;
|
||||||
char *new_file;
|
char *new_file;
|
||||||
struct rfs_dir_struct *ls=(struct rfs_dir_struct*)dir_data->private_dir_data;
|
struct rfs_dir_struct *ls=(struct rfs_dir_struct*)dir_data->private_dir_data;
|
||||||
int error=0;
|
copy_file_t error=CP_OK;
|
||||||
uint64_t file_size;
|
uint64_t file_size;
|
||||||
f_out=fopen_local(&new_file, dir_data->local_dir, dir_data->current_directory);
|
f_out=fopen_local(&new_file, dir_data->local_dir, dir_data->current_directory);
|
||||||
if(!f_out)
|
if(!f_out)
|
||||||
{
|
{
|
||||||
log_critical("Can't create file %s: %s\n", new_file, strerror(errno));
|
log_critical("Can't create file %s: %s\n", new_file, strerror(errno));
|
||||||
free(new_file);
|
free(new_file);
|
||||||
return -4;
|
return CP_CREATE_FAILED;
|
||||||
}
|
}
|
||||||
log_error("Try to open rfs file %s\n", dir_data->current_directory);
|
log_error("Try to open rfs file %s\n", dir_data->current_directory);
|
||||||
log_flush();
|
log_flush();
|
||||||
|
@ -494,7 +494,7 @@ static int reiser_copy(disk_t *disk_car, const partition_t *partition, dir_data_
|
||||||
log_error("Error while opening rfs file %s\n", dir_data->current_directory);
|
log_error("Error while opening rfs file %s\n", dir_data->current_directory);
|
||||||
free(new_file);
|
free(new_file);
|
||||||
fclose(f_out);
|
fclose(f_out);
|
||||||
return -1;
|
return CP_OPEN_FAILED;
|
||||||
}
|
}
|
||||||
log_error("open rfs file %s done\n", dir_data->current_directory);
|
log_error("open rfs file %s done\n", dir_data->current_directory);
|
||||||
log_flush();
|
log_flush();
|
||||||
|
@ -506,12 +506,12 @@ static int reiser_copy(disk_t *disk_car, const partition_t *partition, dir_data_
|
||||||
if (reiserfs_file_read(in, buf, file_size) != file_size)
|
if (reiserfs_file_read(in, buf, file_size) != file_size)
|
||||||
{
|
{
|
||||||
log_error("Error while reading rfs file %s\n", dir_data->current_directory);
|
log_error("Error while reading rfs file %s\n", dir_data->current_directory);
|
||||||
error = -3;
|
error = CP_READ_FAILED;
|
||||||
}
|
}
|
||||||
else if (fwrite(buf, file_size, 1, f_out) != 1)
|
else if (fwrite(buf, file_size, 1, f_out) != 1)
|
||||||
{
|
{
|
||||||
log_error("Error while writing file %s\n", new_file);
|
log_error("Error while writing file %s\n", new_file);
|
||||||
error = -5;
|
error = CP_NOSPACE;
|
||||||
}
|
}
|
||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
|
@ -525,12 +525,12 @@ static int reiser_copy(disk_t *disk_car, const partition_t *partition, dir_data_
|
||||||
if (reiserfs_file_read(in, buf, read_size) == 0)
|
if (reiserfs_file_read(in, buf, read_size) == 0)
|
||||||
{
|
{
|
||||||
log_error("Error while reading rfs file %s\n", dir_data->current_directory);
|
log_error("Error while reading rfs file %s\n", dir_data->current_directory);
|
||||||
error = -3;
|
error = CP_READ_FAILED;
|
||||||
}
|
}
|
||||||
else if (fwrite(buf, read_size, 1, f_out) != 1)
|
else if (fwrite(buf, read_size, 1, f_out) != 1)
|
||||||
{
|
{
|
||||||
log_error("Error while writing file %s\n", new_file);
|
log_error("Error while writing file %s\n", new_file);
|
||||||
error = -5;
|
error = CP_NOSPACE;
|
||||||
}
|
}
|
||||||
file_size -= read_size;
|
file_size -= read_size;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue