Narrowed rules for recognizing split file parts

This commit is contained in:
2009-09-27 08:04:05 +00:00
parent 57da7013d3
commit 3adb23071f
4 changed files with 101 additions and 48 deletions

View File

@ -2705,7 +2705,6 @@ int Xorriso_graft_split(struct XorrisO *xorriso, IsoImage *volume,
if(ret<0)
return(ret);
*node= (IsoNode *) new_dir;
total_parts= size / xorriso->split_size;
if(size % xorriso->split_size)
total_parts++;
@ -2767,7 +2766,6 @@ int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
node, 0);
if(ret<=0)
goto ex;
return(1);
} else if(size > xorriso->file_size_limit && xorriso->file_size_limit > 0) {
sprintf(xorriso->info_text,
"File exceeds size limit of %.f bytes: %s\n",
@ -2775,10 +2773,11 @@ int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
Text_shellsafe(disk_path, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
} else {
ret= iso_tree_add_new_node(volume, dir, img_name, disk_path, node);
if(ret<0)
goto ex;
}
ret= iso_tree_add_new_node(volume, dir, img_name, disk_path, node);
if(ret<0)
goto ex;
}
if(stbuf_valid && ((xorriso->do_aaip & 16) || !(xorriso->ino_behavior & 2))) {
@ -2804,6 +2803,7 @@ ex:;
/* @param flag bit0= recursion is active
bit1= do not report added files
bit6= do not delete eventually existing node from di_array
bit7= no special handling of split file directories
*/
int Xorriso_add_tree(struct XorrisO *xorriso, IsoDir *dir,
char *img_dir_path, char *disk_dir_path,
@ -2955,8 +2955,8 @@ cannot_lstat:;
if(ret>0) {
target_is_dir= LIBISO_ISDIR(node);
target_is_split= 0;
if(target_is_dir)
target_is_split= Xorriso_is_split(xorriso, "", (void *) node, 1);
if(target_is_dir && !(flag & 128))
target_is_split= Xorriso_is_split(xorriso, "", (void *) node, 1 | 2);
if(!((target_is_dir && !target_is_split) && source_is_dir)) {
Xorriso_process_msg_queues(xorriso,0);
@ -3014,7 +3014,7 @@ cannot_lstat:;
} else {
ret= Xorriso_add_tree(xorriso, (IsoDir *) node,
img_path, disk_path, own_link_stack,
1 | (flag & (2 | 64)));
1 | (flag & (2 | 64 | 128)));
}
if(ret<=0)
goto was_problem;
@ -3258,8 +3258,8 @@ int Xorriso_graft_in(struct XorrisO *xorriso, void *boss_iter,
target_is_dir= LIBISO_ISDIR(node);
target_is_split= 0;
if(target_is_dir && !(flag&128))
target_is_split= Xorriso_is_split(xorriso, "", (void *) node, 1);
if(target_is_dir && !(flag & 128))
target_is_split= Xorriso_is_split(xorriso, "", (void *) node, 1 | 2);
if(!((target_is_dir && !target_is_split) && source_is_dir)) {
Xorriso_process_msg_queues(xorriso,0);
@ -3325,7 +3325,7 @@ attach_source:;
(IsoNode *) dir, 4 | 32);
if(!(flag&32)) {
ret= Xorriso_add_tree(xorriso, dir, img_path, disk_path, NULL,
flag & (2 | 64));
flag & (2 | 64 | 128));
if(ret<=0)
return(ret);
}
@ -8033,7 +8033,7 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job,
void *dir_node_generic, char *dir_path,
struct stat *dir_stbuf, int depth, int flag)
{
int ret, action= 0, hflag, deleted= 0, no_dive= 0;
int ret, action= 0, hflag, deleted= 0, no_dive= 0, split_flag;
IsoDirIter *iter= NULL;
IsoDir *dir_node= NULL;
IsoNode *node, *iso_node;
@ -8128,7 +8128,10 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job,
}
if(no_dive || !LIBISO_ISDIR((IsoNode *) dir_node))
{ret= 1; goto ex;}
if(Xorriso_is_split(xorriso, dir_path, (IsoNode *) dir_node, 1)>0)
split_flag= 1 | 2;
if(action == 14 || action == 17)
split_flag &= ~2;
if(Xorriso_is_split(xorriso, dir_path, (IsoNode *) dir_node, split_flag)>0)
{ret= 1; goto ex;}
mem= boss_mem;
@ -9236,6 +9239,8 @@ int Xorriso_iso_file_close(struct XorrisO *xorriso, void **stream, int flag)
/* @param flag bit0= in_node is valid, do not resolve iso_adr
bit1= insist in complete collection of part files
??? <<< bit2= recognize and parse split parts despite
xorrio->split_size <= 0
*/
int Xorriso_identify_split(struct XorrisO *xorriso, char *iso_adr,
void *in_node,
@ -9257,6 +9262,13 @@ int Xorriso_identify_split(struct XorrisO *xorriso, char *iso_adr,
*count= 0;
*parts= NULL;
/* <<< remove bit1 and hardcode it
flag|= 2;
*/
if(xorriso->split_size <= 0 && !(flag & 4))
return(0);
if(flag&1) {
node= (IsoNode *) in_node;
} else {
@ -9304,12 +9316,14 @@ cannot_iter:;
size= stbuf.st_size;
}
/* check for plausible size */
if(!((partno<total_parts && size==bytes) ||
(partno==total_parts && size<=bytes)))
if(!((partno != total_parts && size == bytes) ||
(partno == total_parts && size <= bytes)))
{ret= 0; goto ex;}
if(offset != first_bytes * (off_t) (partno - 1))
{ret= 0; goto ex;}
(*count)++;
}
if((*count)<=0)
if(*count <= 0 || (*count != first_total_parts && (flag & 2)))
{ret= 0; goto ex;}
ret= Splitparts_new(parts, (*count)+1, 0); /* (have one end marker item) */