New command -file_name_limit, -as mkisofs -file_name_limit

This commit is contained in:
2015-09-17 12:12:41 +00:00
parent 14c55329ea
commit 00eca7055e
23 changed files with 582 additions and 202 deletions

View File

@ -129,8 +129,8 @@ int Xorriso_graft_split(struct XorrisO *xorriso, IsoImage *volume,
Xorriso_alloc_meM(part_name, char, SfileadrL);
ret= iso_tree_add_new_dir(dir, img_name, &new_dir);
if(ret<0)
ret= iso_image_add_new_dir(volume, dir, img_name, &new_dir);
if(ret < 0)
goto ex;
*node= (IsoNode *) new_dir;
if(xorriso->update_flags & 1) {
@ -166,6 +166,7 @@ ex:;
/*
@param flag bit0= ISO_NODE_NAME_NOT_UNIQUE exception mode:
Do not issue message. Return existing node into *node.
bit1= if name truncation happens: copy truncated into img_name
bit3= cut_out_node: offset and size are valid
bit8= hide in iso_rr
bit9= hide in joliet
@ -179,14 +180,31 @@ int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
{
int ret, stbuf_valid= 0;
struct stat stbuf;
char *namept;
char *namept, *eff_name, *trunc_name= NULL;
off_t size= 0;
eff_name= img_name;
if(lstat(disk_path, &stbuf) != -1) {
stbuf_valid= 1;
if(S_ISREG(stbuf.st_mode))
size= stbuf.st_size;
}
if((int) strlen(eff_name) > xorriso->file_name_limit) {
Xorriso_alloc_meM(trunc_name, char, SfileadrL);
strncpy(trunc_name, eff_name, SfileadrL - 1);
trunc_name[SfileadrL - 1]= 0;
ret= iso_truncate_leaf_name(1, xorriso->file_name_limit, trunc_name, 0);
if(ret < 0)
goto ex;
strcpy(xorriso->info_text, "File name had to be truncated and MD5 marked: ");
Text_shellsafe(eff_name, xorriso->info_text, 1);
strcat(xorriso->info_text, " -> ");
Text_shellsafe(trunc_name, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
eff_name= trunc_name;
if(flag & 2)
strcpy(img_name, trunc_name);
}
if(flag&8) {
if(cut_size > xorriso->file_size_limit && xorriso->file_size_limit > 0) {
sprintf(xorriso->info_text,
@ -197,13 +215,13 @@ int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
ret= iso_tree_add_new_cut_out_node(volume, dir, img_name, disk_path,
ret= iso_tree_add_new_cut_out_node(volume, dir, eff_name, disk_path,
offset, cut_size, node);
if(ret<0)
goto ex;
} else {
if(xorriso->split_size > 0 && size > xorriso->split_size) {
ret= Xorriso_graft_split(xorriso, volume, dir, disk_path, img_name,
ret= Xorriso_graft_split(xorriso, volume, dir, disk_path, eff_name,
nominal_source, nominal_target, size,
node, 0);
if(ret<=0)
@ -217,7 +235,7 @@ int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
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);
ret= iso_tree_add_new_node(volume, dir, eff_name, disk_path, node);
if(ret<0)
goto ex;
}
@ -234,7 +252,7 @@ int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
goto ex;
}
if(xorriso->update_flags & 1) {
ret= Xorriso_mark_update_merge(xorriso, img_name, *node, 1);
ret= Xorriso_mark_update_merge(xorriso, eff_name, *node, 1);
if(ret <= 0)
goto ex;
}
@ -242,7 +260,7 @@ int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
ex:;
if(ret<0) {
if(ret == (int) ISO_NODE_NAME_NOT_UNIQUE && (flag & 1)) {
iso_dir_get_node(dir, img_name, node);
iso_image_dir_get_node(volume, dir, eff_name, node, 0);
} else {
Xorriso_process_msg_queues(xorriso,0);
if(ret == (int) ISO_RR_NAME_TOO_LONG ||
@ -254,11 +272,13 @@ ex:;
Xorriso_report_iso_error(xorriso, namept, ret,
"Cannot add node to tree", 0, "FAILURE", 1|2);
}
return(ret);
} else {
if(LIBISO_ISREG(*node))
xorriso->pacifier_byte_count+= iso_file_get_size((IsoFile *) *node);
ret= 1;
}
if(LIBISO_ISREG(*node))
xorriso->pacifier_byte_count+= iso_file_get_size((IsoFile *) *node);
return(1);
Xorriso_free_meM(trunc_name);
return(ret);
}
@ -522,7 +542,7 @@ cannot_lstat:;
/* does a node exist with this name ? */
node= NULL;
if(dir != NULL) {
ret= iso_dir_get_node(dir, img_name, &node);
ret= iso_image_get_dir_node(volume, dir, img_name, &node);
} else {
ret= Xorriso_node_from_path(xorriso, volume, img_path, &node, 1);
}
@ -733,8 +753,12 @@ int Xorriso_add_symlink(struct XorrisO *xorriso, IsoDir *parent,
{
int ret= 0;
IsoSymlink *link= NULL;
IsoImage *volume;
ret= iso_tree_add_new_symlink(parent, leaf_name, link_target, &link);
ret= Xorriso_get_volume(xorriso, &volume, 0);
if(ret <= 0)
return(ret);
ret= iso_image_add_new_symlink(volume, parent, leaf_name, link_target, &link);
Xorriso_process_msg_queues(xorriso,0);
if(ret < 0) {
Xorriso_report_iso_error(xorriso, nominal_path, ret,
@ -924,8 +948,8 @@ int Xorriso_graft_in(struct XorrisO *xorriso, void *boss_iter,
So optimism will pay off only with the leaf. I.e. if(done).
*/
if(source_is_dir) { /* eventually create directory */
ret= iso_dir_get_node(dir, apt, &node);
if(ret > 0) {
ret= iso_image_dir_get_node(volume, dir, apt, &node, 0);
if(ret == 1) {
ret= Xoriso_handle_collision(xorriso, boss_iter, &node, path,
img_path, disk_path,
disk_path[0] ? disk_path : img_path,
@ -937,7 +961,7 @@ int Xorriso_graft_in(struct XorrisO *xorriso, void *boss_iter,
} else
node= NULL;
if(node == NULL) {
ret= iso_tree_add_new_dir(dir, apt, &hdir);
ret= iso_image_add_new_dir(volume, dir, apt, &hdir);
if(ret < 0) {
Xorriso_process_msg_queues(xorriso,0);
if(disk_path[0])
@ -1022,7 +1046,10 @@ attach_source:;
{ret= 0; goto ex;}
}
Xorriso_set_change_pending(xorriso, 0);
iso_node_set_name(node, apt);
/* <<< Why set the name once again ?
iso_image_set_node_name(volume, node, apt, 1);
*/
xorriso->pacifier_count++;
if(xorriso->pacifier_count%100 && !(flag&2))
@ -1036,8 +1063,8 @@ attach_source:;
#else /* Xorriso_optimistic_graft_iN */
node= NULL;
ret= iso_dir_get_node(dir, apt, &node);
if(ret>0) {
ret= iso_image_dir_get_node(volume, dir, apt, &node, 0);
if(ret == 1) {
#ifdef Xorriso_graft_handle_collisioN
@ -1097,7 +1124,7 @@ attach_source:;
handle_path_node:;
if(node==NULL && source_is_dir) { /* make a directory */
ret= iso_tree_add_new_dir(dir, apt, &hdir);
ret= iso_image_add_new_dir(volume, dir, apt, &hdir);
if(ret<0) {
Xorriso_process_msg_queues(xorriso,0);
if(disk_path[0])
@ -1167,7 +1194,7 @@ attach_source:;
{ret= 0; goto ex;}
}
Xorriso_set_change_pending(xorriso, 0);
iso_node_set_name(node, apt);
iso_image_set_node_name(volume, node, apt, 1);
xorriso->pacifier_count++;
if(xorriso->pacifier_count%100 && !(flag&2))
@ -1717,13 +1744,19 @@ int Xorriso_rename(struct XorrisO *xorriso, void *boss_iter,
old_leafname= (char *) iso_node_get_name(node);
if(strcmp(leafname, old_leafname)!=0)
ret= iso_node_set_name(node, leafname);
ret= iso_image_set_node_name(volume, node, leafname, 1);
else
ret= 1;
if(ret<0) {
Xorriso_process_msg_queues(xorriso,0);
Xorriso_report_iso_error(xorriso, eff_dest, 0, "Cannot set name", 0,
Xorriso_report_iso_error(xorriso, eff_dest, ret, "Cannot set name", 0,
"FAILURE", 1);
ret= iso_dir_add_node(origin_dir, node, 0);
Xorriso_process_msg_queues(xorriso,0);
if(ret < 0)
Xorriso_report_iso_error(xorriso, eff_origin, ret,
"Cannot re-instate node at old path",
0, "FAILURE", 1);
{ret= -1; goto ex;}
}
Xorriso_process_msg_queues(xorriso,0);
@ -1837,7 +1870,8 @@ int Xorriso_clone_tree(struct XorrisO *xorriso, void *boss_iter,
goto ex;
new_parent= (IsoDir *) dir_node;
ret = iso_tree_clone(origin_node, new_parent, leafname, &new_node, flag & 1);
ret = iso_image_tree_clone(volume, origin_node, new_parent, leafname,
&new_node, (flag & 1) | 2);
Xorriso_process_msg_queues(xorriso,0);
if(ret < 0) {
Xorriso_cannot_clone(xorriso, eff_origin, eff_dest, ret, 0);
@ -1907,7 +1941,8 @@ int Xorriso_clone_under(struct XorrisO *xorriso, char *origin, char *dest,
ret= 0; goto ex;
}
} else {
ret = iso_tree_clone(origin_node, dest_dir, namept, &new_node, 1);
ret = iso_image_tree_clone(volume, origin_node, dest_dir, namept,
&new_node, 1 | 2);
Xorriso_process_msg_queues(xorriso,0);
if(ret < 0) {
Xorriso_cannot_clone(xorriso, eff_origin, eff_dest, ret, 0);
@ -4226,3 +4261,22 @@ ex:
return(ret);
}
int Xorriso_set_file_name_limit(struct XorrisO *xorriso, int value, int flag)
{
int ret;
IsoImage *volume= NULL;
ret= Xorriso_get_volume(xorriso, &volume, 1);
if(ret < 0)
return(ret);
if (volume != NULL) {
Xorriso_msgs_submit(xorriso, 0,
"-file_name_limit cannot be changed while an ISO images is present",
0, "SORRY", 0);
return(0);
}
xorriso->file_name_limit= value;
return(1);
}