summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristophe Grenier <[email protected]>2023-08-25 11:43:50 +0200
committerChristophe Grenier <[email protected]>2023-08-25 11:43:50 +0200
commit979489eff64e8df0d6539c63bf7e891213c79816 (patch)
tree7cc02769d767b9aee2c5f72a3c1347787c9e849a
parenta8b22a5eed61b2fac2ffffa1b87cbd9c7a5f9da6 (diff)
new prototype for copy_file(), improve error reporting
-rw-r--r--src/dir_common.h4
-rw-r--r--src/dirn.c66
-rw-r--r--src/exfat_dir.c10
-rw-r--r--src/ext2_dir.c20
-rw-r--r--src/fat_dir.c10
-rw-r--r--src/fat_unformat.c8
-rw-r--r--src/ntfs_dir.c17
-rw-r--r--src/rfs_dir.c16
8 files changed, 89 insertions, 62 deletions
diff --git a/src/dir_common.h b/src/dir_common.h
index 8463d677..5dd9f56a 100644
--- a/src/dir_common.h
+++ b/src/dir_common.h
@@ -39,8 +39,10 @@ extern "C" {
#define CAPA_LIST_DELETED 1
#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 struct dir_data dir_data_t;
+
typedef struct
{
struct td_list_head list;
@@ -65,7 +67,7 @@ struct dir_data
unsigned int param;
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 (*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);
char *local_dir;
void *private_dir_data;
diff --git a/src/dirn.c b/src/dirn.c
index fc6dbecc..8b46b090 100644
--- a/src/dirn.c
+++ b/src/dirn.c
@@ -49,8 +49,9 @@
#include "askloc.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);
-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);
+typedef enum { CD_FINISHED = 0, CD_STOPPED = 1, CD_NOSPACE = 2 } copy_dir_t;
+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 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);
}
-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);
wclrtoeol(window);
@@ -90,8 +91,10 @@ static void copy_done(WINDOW *window, const unsigned int copy_ok, const unsigned
else
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);
+ else if(copy_stopped == CD_NOSPACE)
+ wprintw(window,"Copy stopped! %u ok, %u failed - Not enough space", copy_ok, copy_bad);
else
wprintw(window,"Copy done! %u ok, %u failed", copy_ok, copy_bad);
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_ok=0;
- unsigned int copy_stopped=0;
+ copy_dir_t copy_stopped=CD_FINISHED;
aff_copy(window);
wmove(window,3,0);
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)
{
+ copy_file_t res;
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++;
else
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_ok=0;
- unsigned int copy_stopped;
+ copy_dir_t copy_stopped;
aff_copy(window);
wmove(window,3,0);
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;
}
-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 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;
TD_INIT_LIST_HEAD(&dir_list.list);
if(dir_data->get_dir==NULL || dir_data->copy_file==NULL)
- return 0;
+ return CD_FINISHED;
inode_known[dir_nbr++]=dir->st_ino;
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);
@@ -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';
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,"/"))
strcat(dir_data->current_directory,"/");
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)
{
- copy_stopped=copy_progress(window, *copy_ok, *copy_bad);
- if(dir_data->copy_file(disk, partition, dir_data, current_file)==0)
- (*copy_ok)++;
+ if(copy_progress(window, *copy_ok, *copy_bad))
+ copy_stopped=CD_STOPPED;
else
- (*copy_bad)++;
+ {
+ 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)++;
+ else
+ (*copy_bad)++;
+ }
}
- if(copy_stopped)
+ if(copy_stopped != CD_FINISHED)
{
dir_data->current_directory[current_directory_namelength]='\0';
delete_list_file(&dir_list);
set_date(dir_name, dir->td_atime, dir->td_mtime);
free(dir_name);
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);
free(dir_name);
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);
struct td_list_head *tmpw=NULL;
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);
if((tmp->status&FILE_STATUS_MARKED)!=0 &&
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);
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';
- return 1;
+ return copy_stopped;
}
}
else if(LINUX_S_ISREG(tmp->st_mode)!=0)
{
+ copy_file_t res;
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)++;
else
(*copy_bad)++;
}
}
dir_data->current_directory[current_directory_namelength]='\0';
+ if(copy_stopped!=CD_FINISHED)
+ return copy_stopped;
}
- return 0;
+ return CD_FINISHED;
}
#endif
diff --git a/src/exfat_dir.c b/src/exfat_dir.c
index 2b0ab352..7cdfc147 100644
--- a/src/exfat_dir.c
+++ b/src/exfat_dir.c
@@ -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_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);
#if 0
@@ -426,7 +426,7 @@ static void dir_partition_exfat_close(dir_data_t *dir_data)
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;
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);
free(new_file);
free(buffer_file);
- return -1;
+ return CP_CREATE_FAILED;
}
cluster = file->st_ino;
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);
free(new_file);
free(buffer_file);
- return -1;
+ return CP_NOSPACE;
}
file_size -= toread;
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);
free(new_file);
free(buffer_file);
- return 0;
+ return CP_OK;
}
diff --git a/src/ext2_dir.c b/src/ext2_dir.c
index 1cca7c23..d70b2bcb 100644
--- a/src/ext2_dir.c
+++ b/src/ext2_dir.c
@@ -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 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 = {
.magic = EXT2_ET_MAGIC_IO_MANAGER,
@@ -289,9 +289,9 @@ static void dir_partition_ext2_close(dir_data_t *dir_data)
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;
const struct ext2_dir_struct *ls = (const struct ext2_dir_struct *)dir_data->private_dir_data;
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));
free(new_file);
- return -4;
+ return CP_CREATE_FAILED;
}
{
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);
fclose(f_out);
- return -1;
+ return CP_STAT_FAILED;
}
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);
free(new_file);
fclose(f_out);
- return -2;
+ return CP_OPEN_FAILED;
}
- while (1)
+ while (error!=CP_NOSPACE)
{
int nbytes;
unsigned int got;
@@ -330,7 +330,7 @@ static int ext2_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
if (retval)
{
log_error("Error while reading ext2 file %s\n", dir_data->current_directory);
- error = -3;
+ error = CP_READ_FAILED;
}
if (got == 0)
break;
@@ -338,14 +338,14 @@ static int ext2_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
if ((unsigned) nbytes != got)
{
log_error("Error while writing file %s\n", new_file);
- error = -5;
+ error = CP_NOSPACE;
}
}
retval = ext2fs_file_close(e2_file);
if (retval)
{
log_error("Error while closing ext2 file\n");
- error = -6;
+ error = CP_CLOSE_FAILED;
}
fclose(f_out);
set_date(new_file, file->td_atime, file->td_mtime);
diff --git a/src/fat_dir.c b/src/fat_dir.c
index ca801ef7..7ffae8a9 100644
--- a/src/fat_dir.c
+++ b/src/fat_dir.c
@@ -77,7 +77,7 @@ static int fat1x_rootdir(disk_t *disk_car, const partition_t *partition, const d
@ requires \valid(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);
@@ -535,7 +535,7 @@ static void dir_partition_fat_close(dir_data_t *dir_data)
@ requires \separated(disk_car, partition, dir_data, file);
@ 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;
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);
free(new_file);
free(buffer_file);
- return -1;
+ return CP_CREATE_FAILED;
}
cluster = file->st_ino;
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);
free(new_file);
free(buffer_file);
- return -1;
+ return CP_NOSPACE;
}
file_size -= toread;
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);
free(new_file);
free(buffer_file);
- return 0;
+ return CP_OK;
}
diff --git a/src/fat_unformat.c b/src/fat_unformat.c
index 180a99c4..00e7eb17 100644
--- a/src/fat_unformat.c
+++ b/src/fat_unformat.c
@@ -152,7 +152,7 @@ static void strip_fn(char *fn)
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;
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);
free(new_file);
free(buffer_file);
- return -1;
+ return CP_CREATE_FAILED;
}
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);
free(new_file);
free(buffer_file);
- return -1;
+ return CP_NOSPACE;
}
file_size -= toread;
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);
free(new_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)
diff --git a/src/ntfs_dir.c b/src/ntfs_dir.c
index 9a11e1b8..21a57c03 100644
--- a/src/ntfs_dir.c
+++ b/src/ntfs_dir.c
@@ -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 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_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);
/**
@@ -337,15 +337,16 @@ static int ntfs_dir(disk_t *disk_car, const partition_t *partition, dir_data_t *
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;
ntfs_inode *inode;
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);
if (!inode) {
log_error("ntfs_copy: ntfs_inode_open failed for %s\n", dir_data->current_directory);
- return -1;
+ return CP_STAT_FAILED;
}
{
char *buffer;
@@ -359,7 +360,7 @@ static int ntfs_copy(disk_t *disk_car, const partition_t *partition, dir_data_t
if (!buffer)
{
ntfs_inode_close(inode);
- return -2;
+ return CP_NOMEM;
}
stream_name=strrchr(dir_data->current_directory, ':');
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);
free(buffer);
ntfs_inode_close(inode);
- return -3;
+ return CP_STAT_FAILED;
}
if ((inode->mft_no < 2) && (attr->type == AT_DATA))
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);
free(buffer);
ntfs_inode_close(inode);
- return -4;
+ return CP_CREATE_FAILED;
}
offset = 0;
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);
if (bytes_read < 0) {
log_error("ERROR: Couldn't read file");
+ res=CP_READ_FAILED;
break;
}
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)
{
log_error("ERROR: Couldn't output all data!");
+ res=CP_NOSPACE;
break;
}
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. */
ntfs_inode_close(inode);
- return 0;
+ return res;
}
static void dir_partition_ntfs_close(dir_data_t *dir_data)
diff --git a/src/rfs_dir.c b/src/rfs_dir.c
index 923c95fd..eba68eea 100644
--- a/src/rfs_dir.c
+++ b/src/rfs_dir.c
@@ -471,20 +471,20 @@ static void dir_partition_reiser_close(dir_data_t *dir_data)
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;
FILE *f_out;
char *new_file;
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;
f_out=fopen_local(&new_file, dir_data->local_dir, dir_data->current_directory);
if(!f_out)
{
log_critical("Can't create file %s: %s\n", new_file, strerror(errno));
free(new_file);
- return -4;
+ return CP_CREATE_FAILED;
}
log_error("Try to open rfs file %s\n", dir_data->current_directory);
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);
free(new_file);
fclose(f_out);
- return -1;
+ return CP_OPEN_FAILED;
}
log_error("open rfs file %s done\n", dir_data->current_directory);
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)
{
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)
{
log_error("Error while writing file %s\n", new_file);
- error = -5;
+ error = CP_NOSPACE;
}
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)
{
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)
{
log_error("Error while writing file %s\n", new_file);
- error = -5;
+ error = CP_NOSPACE;
}
file_size -= read_size;
}