New -error_behavior behavior occasion "file_extraction"
This commit is contained in:
@ -2556,7 +2556,8 @@ int Xorriso_tree_restore_node(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *img_path, char *disk_path,
|
||||
off_t offset, off_t bytes, int flag)
|
||||
{
|
||||
int ret= 0, write_fd= -1, wanted, wret, open_flags;
|
||||
int ret= 0, write_fd= -1, wanted, wret, open_flags, l_errno= 0;
|
||||
int target_deleted= 0;
|
||||
char *what= "[unknown filetype]", sfe[5*SfileadrL], sfe2[5*SfileadrL];
|
||||
char buf[32*1024], type_text[5], temp_path[SfileadrL];
|
||||
char *link_target, *open_path_pt;
|
||||
@ -2570,6 +2571,7 @@ int Xorriso_tree_restore_node(struct XorrisO *xorriso, IsoNode *node,
|
||||
if(LIBISO_ISDIR(node)) {
|
||||
what= "directory";
|
||||
ret= mkdir(disk_path, 0777);
|
||||
l_errno= errno;
|
||||
|
||||
} else if(LIBISO_ISREG(node)) {
|
||||
what= "regular file";
|
||||
@ -2585,6 +2587,7 @@ int Xorriso_tree_restore_node(struct XorrisO *xorriso, IsoNode *node,
|
||||
"Restore offset demanded. But filesystem path leads to non-data file %s",
|
||||
Text_shellsafe(disk_path, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE",0);
|
||||
l_errno= 0;
|
||||
goto cannot_restore;
|
||||
}
|
||||
} else {
|
||||
@ -2613,6 +2616,7 @@ int Xorriso_tree_restore_node(struct XorrisO *xorriso, IsoNode *node,
|
||||
if(offset==0 || !(flag&2))
|
||||
open_flags|= O_EXCL;
|
||||
write_fd= open(open_path_pt, open_flags, S_IRUSR|S_IWUSR);
|
||||
l_errno= errno;
|
||||
if(write_fd==-1)
|
||||
goto cannot_restore;
|
||||
}
|
||||
@ -2621,6 +2625,7 @@ int Xorriso_tree_restore_node(struct XorrisO *xorriso, IsoNode *node,
|
||||
if(bytes<size)
|
||||
todo= size= bytes;
|
||||
seek_ret= lseek(write_fd, offset, SEEK_SET);
|
||||
l_errno= errno;
|
||||
if(seek_ret == -1) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot address byte %.f in filesystem path %s",
|
||||
@ -2658,9 +2663,13 @@ int Xorriso_tree_restore_node(struct XorrisO *xorriso, IsoNode *node,
|
||||
}
|
||||
close(write_fd);
|
||||
write_fd= -1;
|
||||
if(todo > 0 && xorriso->extract_error_mode == 2) {
|
||||
unlink(open_path_pt);
|
||||
target_deleted= 1;
|
||||
}
|
||||
Xorriso_iso_file_close(xorriso, &data_stream, 0);
|
||||
data_stream= NULL;
|
||||
if(temp_path==open_path_pt) {
|
||||
if(temp_path==open_path_pt && !target_deleted) {
|
||||
ret= rename(temp_path, disk_path);
|
||||
if(ret==-1) {
|
||||
sprintf(xorriso->info_text,
|
||||
@ -2672,12 +2681,14 @@ int Xorriso_tree_restore_node(struct XorrisO *xorriso, IsoNode *node,
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
}
|
||||
ret= (todo==0);
|
||||
ret= -(todo > 0);
|
||||
l_errno= 0;
|
||||
|
||||
} else if(LIBISO_ISLNK(node)) {
|
||||
what= "symbolic link";
|
||||
link_target= (char *) iso_symlink_get_dest((IsoSymlink *) node);
|
||||
ret= symlink(link_target, disk_path);
|
||||
l_errno= errno;
|
||||
|
||||
} else if(LIBISO_ISCHR(node)) {
|
||||
what= "character device";
|
||||
@ -2703,6 +2714,7 @@ probably_damaged:;
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
ret= mknod(disk_path, mode, dev);
|
||||
l_errno= errno;
|
||||
|
||||
} else if(LIBISO_ISBLK(node)) {
|
||||
what= "block device";
|
||||
@ -2715,11 +2727,13 @@ probably_damaged:;
|
||||
if(dev == (dev_t) 1)
|
||||
goto probably_damaged;
|
||||
ret= mknod(disk_path, mode, dev);
|
||||
l_errno= errno;
|
||||
|
||||
} else if(LIBISO_ISFIFO(node)) {
|
||||
what= "named pipe";
|
||||
mode= S_IFIFO | 0777;
|
||||
ret= mknod(disk_path, mode, dev);
|
||||
l_errno= errno;
|
||||
|
||||
} else if(LIBISO_ISSOCK(node)) {
|
||||
what= "unix socket";
|
||||
@ -2737,7 +2751,7 @@ cannot_restore:;
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot restore %s to disk filesystem: %s",
|
||||
what, Text_shellsafe(img_path, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE", 0);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, l_errno, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
|
||||
@ -2747,8 +2761,11 @@ restore_properties:;
|
||||
else
|
||||
ret= Xorriso_restore_properties(xorriso, disk_path, node, flag&1);
|
||||
ex:;
|
||||
if(write_fd>0)
|
||||
if(write_fd >= 0) {
|
||||
close(write_fd);
|
||||
if(ret <= 0 && xorriso->extract_error_mode == 2)
|
||||
unlink(open_path_pt);
|
||||
}
|
||||
if(data_stream!=NULL)
|
||||
Xorriso_iso_file_close(xorriso, &data_stream, 0);
|
||||
return(ret);
|
||||
|
Reference in New Issue
Block a user