New option -split_size, automated splitting of oversized files
This commit is contained in:
@ -56,12 +56,20 @@
|
||||
|
||||
#endif /* Xorriso_standalonE */
|
||||
|
||||
|
||||
/* Some private in advance declarations */
|
||||
int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive,
|
||||
int flag);
|
||||
|
||||
int Xorriso__read_pacifier(IsoImage *image, IsoFileSource *filesource);
|
||||
|
||||
int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
|
||||
IsoDir *dir, char *disk_path, char *img_name,
|
||||
char *nominal_source, char *nominal_target,
|
||||
off_t offset, off_t cut_size,
|
||||
IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_is_split(struct XorrisO *xorriso, IsoNode *node, int flag);
|
||||
|
||||
|
||||
#define LIBISO_ISDIR(node) (iso_node_get_type(node) == LIBISO_DIR)
|
||||
#define LIBISO_ISREG(node) (iso_node_get_type(node) == LIBISO_FILE)
|
||||
@ -1384,6 +1392,45 @@ int Xorriso_transfer_properties(struct XorrisO *xorriso, struct stat *stbuf,
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_graft_split(struct XorrisO *xorriso, IsoImage *volume,
|
||||
IsoDir *dir, char *disk_path, char *img_name,
|
||||
char *nominal_source, char *nominal_target,
|
||||
off_t size, IsoNode **node, int flag)
|
||||
{
|
||||
int ret;
|
||||
IsoDir *new_dir= NULL;
|
||||
IsoNode *part_node;
|
||||
int partno, total_parts;
|
||||
off_t offset;
|
||||
char part_name[SfileadrL], sfe[5*SfileadrL];
|
||||
|
||||
ret= iso_tree_add_new_dir(dir, img_name, &new_dir);
|
||||
if(ret<0)
|
||||
return(ret);
|
||||
*node= (IsoNode *) new_dir;
|
||||
|
||||
total_parts= size / xorriso->split_size;
|
||||
if(size % xorriso->split_size)
|
||||
total_parts++;
|
||||
for(partno= 1; partno<=total_parts; partno++) {
|
||||
offset = xorriso->split_size * (off_t) (partno-1);
|
||||
Splitpart__compose(part_name, partno, total_parts, offset,
|
||||
xorriso->split_size, size, 0);
|
||||
ret= Xorriso_tree_graft_node(xorriso, volume,
|
||||
new_dir, disk_path, part_name,
|
||||
nominal_source, nominal_target,
|
||||
offset, xorriso->split_size,
|
||||
&part_node, 8);
|
||||
if(ret<=0)
|
||||
return(0);
|
||||
}
|
||||
sprintf(xorriso->info_text, "Split into %d parts: %s",
|
||||
total_parts, Text_shellsafe(nominal_target, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@param flag bit3= cut_out_node: offset and size are valid
|
||||
*/
|
||||
@ -1394,13 +1441,48 @@ int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
|
||||
IsoNode **node, int flag)
|
||||
{
|
||||
int ret;
|
||||
struct stat stbuf;
|
||||
char sfe[5*SfileadrL];
|
||||
off_t size= 0;
|
||||
static off_t limit= ((off_t) 4) * ((off_t) 1024*1024*1024) - (off_t) 1;
|
||||
|
||||
if(flag&8)
|
||||
if(flag&8) {
|
||||
if(cut_size > limit) {
|
||||
sprintf(xorriso->info_text,
|
||||
"File piece exceeds size limit of %.f bytes: %.f from %s\n",
|
||||
(double) limit, (double) cut_size,
|
||||
Text_shellsafe(disk_path, sfe, 0));
|
||||
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,
|
||||
offset, cut_size, node);
|
||||
else
|
||||
ret= iso_tree_add_new_node(volume, dir, img_name, disk_path, node);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
} else {
|
||||
|
||||
if(stat(disk_path, &stbuf)!=-1)
|
||||
if(S_ISREG(stbuf.st_mode))
|
||||
size= stbuf.st_size;
|
||||
if(xorriso->split_size > 0 && size > xorriso->split_size) {
|
||||
ret= Xorriso_graft_split(xorriso, volume, dir, disk_path, img_name,
|
||||
nominal_source, nominal_target, size,
|
||||
node, 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
return(1);
|
||||
} else if(size > limit) {
|
||||
sprintf(xorriso->info_text,
|
||||
"File exceeds size limit of %.f bytes: %s\n",
|
||||
(double) limit, Text_shellsafe(disk_path, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
ret= iso_tree_add_new_node(volume, dir, img_name, disk_path, node);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
}
|
||||
ex:;
|
||||
if(ret<0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
Xorriso_report_iso_error(xorriso, nominal_source, ret,
|
||||
@ -1422,7 +1504,7 @@ int Xorriso_add_tree(struct XorrisO *xorriso, IsoDir *dir,
|
||||
IsoNode *node;
|
||||
IsoSymlink *iso_symlink;
|
||||
int ret, target_is_dir, source_is_dir, source_is_link, fret, was_failure= 0;
|
||||
int do_not_dive;
|
||||
int do_not_dive, target_is_split= 0;
|
||||
struct DirseQ *dirseq= NULL;
|
||||
char *name, *img_name, *srcpt, *stbuf_src= "";
|
||||
struct stat stbuf, hstbuf;
|
||||
@ -1561,12 +1643,16 @@ cannot_lstat:;
|
||||
ret= Xorriso_node_from_path(xorriso, volume, img_path, &node, 1);
|
||||
if(ret>0) {
|
||||
target_is_dir= LIBISO_ISDIR(node);
|
||||
if(!(target_is_dir && source_is_dir)) {
|
||||
target_is_split= 0;
|
||||
if(target_is_dir)
|
||||
target_is_split= Xorriso_is_split(xorriso, node, 0);
|
||||
|
||||
if(!((target_is_dir && !target_is_split) && source_is_dir)) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
|
||||
/* handle overwrite situation */;
|
||||
if(xorriso->do_overwrite==1 ||
|
||||
(xorriso->do_overwrite==2 && !target_is_dir)) {
|
||||
(xorriso->do_overwrite==2 && !(target_is_dir && !target_is_split))) {
|
||||
ret= Xorriso_rmi(xorriso, NULL, (off_t) 0, img_path, 1|8);
|
||||
if(ret<=0)
|
||||
goto was_problem;
|
||||
@ -1778,6 +1864,7 @@ int Xorriso_graft_in(struct XorrisO *xorriso, void *boss_iter,
|
||||
IsoDir *dir, *hdir;
|
||||
IsoNode *node;
|
||||
int done= 0, is_dir= 0, l, ret, target_is_dir, source_is_dir, resolve_link= 0;
|
||||
int target_is_split;
|
||||
struct stat stbuf;
|
||||
|
||||
for(cpt= img_path; 1; cpt++) {
|
||||
@ -1880,12 +1967,17 @@ int Xorriso_graft_in(struct XorrisO *xorriso, void *boss_iter,
|
||||
ret= Xorriso_node_from_path(xorriso, volume, path, &node, 1);
|
||||
if(ret>0) {
|
||||
target_is_dir= LIBISO_ISDIR(node);
|
||||
if(!(target_is_dir && source_is_dir)) {
|
||||
|
||||
target_is_split= 0;
|
||||
if(target_is_dir)
|
||||
target_is_split= Xorriso_is_split(xorriso, node, 0);
|
||||
|
||||
if(!((target_is_dir && !target_is_split) && source_is_dir)) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
|
||||
/* handle overwrite situation */;
|
||||
if(xorriso->do_overwrite==1 ||
|
||||
(xorriso->do_overwrite==2 && !target_is_dir)) {
|
||||
(xorriso->do_overwrite==2 && !(target_is_dir && !target_is_split))) {
|
||||
ret= Xorriso_rmi(xorriso, boss_iter, (off_t) 0, path, 1|8);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
@ -4692,13 +4784,17 @@ int Xorriso_iso_file_close(struct XorrisO *xorriso, void **stream, int flag)
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= in_node is valid, do not resolve iso_adr
|
||||
*/
|
||||
int Xorriso_identify_split(struct XorrisO *xorriso, char *iso_adr,
|
||||
void *in_node,
|
||||
struct SplitparT **parts, int *count,
|
||||
struct stat *total_stbuf, int flag)
|
||||
{
|
||||
int ret, i;
|
||||
int partno, total_parts, first_total_parts= -1;
|
||||
off_t offset, bytes, total_bytes, first_total_bytes= -1, first_bytes, size;
|
||||
off_t offset, bytes, total_bytes, first_total_bytes= -1, first_bytes= -1;
|
||||
off_t size;
|
||||
IsoImage *volume;
|
||||
IsoDir *dir_node;
|
||||
IsoDirIter *iter= NULL;
|
||||
@ -4709,12 +4805,16 @@ int Xorriso_identify_split(struct XorrisO *xorriso, char *iso_adr,
|
||||
*count= 0;
|
||||
*parts= NULL;
|
||||
|
||||
ret= Xorriso_get_volume(xorriso, &volume, 0);
|
||||
if(ret<=0)
|
||||
return(-1);
|
||||
ret= Xorriso_node_from_path(xorriso, volume, iso_adr, &node, 1);
|
||||
if(ret<=0)
|
||||
return(-1);
|
||||
if(flag&1) {
|
||||
node= (IsoNode *) in_node;
|
||||
} else {
|
||||
ret= Xorriso_get_volume(xorriso, &volume, 0);
|
||||
if(ret<=0)
|
||||
return(-1);
|
||||
ret= Xorriso_node_from_path(xorriso, volume, iso_adr, &node, 1);
|
||||
if(ret<=0)
|
||||
return(-1);
|
||||
}
|
||||
if(!LIBISO_ISDIR(node))
|
||||
return(0);
|
||||
dir_node= (IsoDir *) node;
|
||||
@ -4797,3 +4897,17 @@ ex:;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_is_split(struct XorrisO *xorriso, IsoNode *node, int flag)
|
||||
{
|
||||
struct SplitparT *split_parts= NULL;
|
||||
int split_count= 0, ret;
|
||||
struct stat stbuf;
|
||||
|
||||
ret= Xorriso_identify_split(xorriso, "", (void *) node, &split_parts,
|
||||
&split_count, &stbuf, 1);
|
||||
if(split_parts!=NULL)
|
||||
Splitparts_destroy(&split_parts, split_count, 0);
|
||||
return(ret>0);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user