New option -clone
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
@ -1204,6 +1204,38 @@ ex:;
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_overwrite_dest(struct XorrisO *xorriso, void *boss_iter,
|
||||
char *eff_dest, int dest_ret, char *activity,
|
||||
int flag)
|
||||
{
|
||||
int ret;
|
||||
char sfe[5*SfileadrL];
|
||||
|
||||
if(dest_ret==2 && xorriso->do_overwrite!=1) {
|
||||
sprintf(xorriso->info_text, "%s: May not overwrite directory: %s",
|
||||
activity, Text_shellsafe(eff_dest, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
} else if (dest_ret==1 && !xorriso->do_overwrite) {
|
||||
sprintf(xorriso->info_text, "%s: May not overwite: %s",
|
||||
activity, Text_shellsafe(eff_dest, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
} else if(dest_ret>0) {
|
||||
ret= Xorriso_rmi(xorriso, boss_iter, (off_t) 0, eff_dest, 1|8);
|
||||
if(ret<=0)
|
||||
return(0);
|
||||
if(ret==3) {
|
||||
sprintf(xorriso->info_text, "%s: User revoked removal of: %s",
|
||||
activity, Text_shellsafe(eff_dest, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
*/
|
||||
@ -1266,27 +1298,10 @@ int Xorriso_rename(struct XorrisO *xorriso, void *boss_iter,
|
||||
}
|
||||
|
||||
/* Check whether destination exists and may be not overwriteable */
|
||||
if(dest_ret==2 && xorriso->do_overwrite!=1) {
|
||||
sprintf(xorriso->info_text, "Renaming may not overwrite directory: %s",
|
||||
Text_shellsafe(eff_dest, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
} else if (dest_ret==1 && !xorriso->do_overwrite) {
|
||||
sprintf(xorriso->info_text, "Renaming may not overwite: %s",
|
||||
Text_shellsafe(eff_dest, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
} else if(dest_ret>0) {
|
||||
ret= Xorriso_rmi(xorriso, boss_iter, (off_t) 0, eff_dest, 1|8);
|
||||
if(ret<=0)
|
||||
return(0);
|
||||
if(ret==3) {
|
||||
sprintf(xorriso->info_text, "User revoked renaming of: %s",
|
||||
Text_shellsafe(eff_origin, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
ret= Xorriso_overwrite_dest(xorriso, boss_iter,
|
||||
eff_dest, dest_ret, "Renaming", 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
/* Ensure existence of destination directory */
|
||||
strcpy(dir_adr, eff_dest);
|
||||
@ -1362,6 +1377,101 @@ int Xorriso_rename(struct XorrisO *xorriso, void *boss_iter,
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_clone_tree(struct XorrisO *xorriso, void *boss_iter,
|
||||
char *origin, char *dest, int flag)
|
||||
{
|
||||
int ret, dest_ret, l;
|
||||
char eff_dest[SfileadrL], eff_origin[SfileadrL], dir_adr[SfileadrL];
|
||||
char *leafname;
|
||||
IsoImage *volume;
|
||||
IsoDir *new_parent;
|
||||
IsoNode *origin_node, *dir_node, *new_node, *dest_node= NULL;
|
||||
|
||||
ret= Xorriso_get_volume(xorriso, &volume, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
ret= Xorriso_normalize_img_path(xorriso, xorriso->wdi, origin, eff_origin, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
ret= Xorriso_node_from_path(xorriso, volume, eff_origin, &origin_node, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
dest_ret= Xorriso_normalize_img_path(xorriso, xorriso->wdi, dest, eff_dest,1);
|
||||
if(dest_ret<0)
|
||||
return(dest_ret);
|
||||
if(dest_ret > 0) {
|
||||
ret= Xorriso_node_from_path(xorriso, volume, eff_dest, &dest_node, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
if(dest_node == origin_node) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Cloning: Original and copy have the same iso_rr_path: ");
|
||||
Text_shellsafe(eff_dest, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
} else {
|
||||
/* obtain eff_dest address despite it does not exist */
|
||||
ret= Xorriso_normalize_img_path(xorriso, xorriso->wdi, dest, eff_dest, 2);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
}
|
||||
|
||||
ret= Xorriso_overwrite_dest(xorriso, boss_iter,
|
||||
eff_dest, dest_ret, "Cloning", 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
/* Obtain parent path and leaf name */
|
||||
strcpy(dir_adr, eff_dest);
|
||||
for(l= strlen(dir_adr); l > 0; ) {
|
||||
if(dir_adr[l - 1] == '/')
|
||||
dir_adr[--l]= 0;
|
||||
else
|
||||
break;
|
||||
}
|
||||
leafname= strrchr(dir_adr, '/');
|
||||
if(leafname == NULL) {
|
||||
leafname= dir_adr;
|
||||
if (leafname[0] == 0) {
|
||||
Xorriso_msgs_submit(xorriso, 0, "Empty file name as clone destination",
|
||||
0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
} else {
|
||||
*leafname= 0;
|
||||
leafname++;
|
||||
if(dir_adr[0] != 0) {
|
||||
/* Ensure existence of destination directory */
|
||||
ret= Xorriso_graft_in(xorriso, boss_iter, NULL, dir_adr,
|
||||
(off_t) 0, (off_t) 0, 1);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
}
|
||||
}
|
||||
|
||||
ret= Xorriso_node_from_path(xorriso, volume, dir_adr, &dir_node, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
new_parent= (IsoDir *) dir_node;
|
||||
|
||||
ret = iso_tree_clone(origin_node, new_parent, leafname, &new_node, 0);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if (ret < 0) {
|
||||
Xorriso_report_iso_error(xorriso, eff_dest, 0, "Cannot clone",
|
||||
0, "FAILURE", 1);
|
||||
sprintf(xorriso->info_text, "Failed to clone ");
|
||||
Text_shellsafe(eff_origin, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
Xorriso_set_change_pending(xorriso, 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_set_st_mode(struct XorrisO *xorriso, char *in_path,
|
||||
mode_t mode_and, mode_t mode_or, int flag)
|
||||
{
|
||||
|
Reference in New Issue
Block a user