|
|
|
@ -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)
|
|
|
|
|
{
|
|
|
|
|