Working towards coordination of -compare, -update and -cut_out

This commit is contained in:
Thomas Schmitt 2008-03-25 17:07:58 +00:00
parent 052f992488
commit 6cfbe6fcd0
5 changed files with 391 additions and 71 deletions

View File

@ -2741,12 +2741,12 @@ int Splitparts_new(struct SplitparT **o, int count, int flag)
if((*o)==NULL) if((*o)==NULL)
return(-1); return(-1);
for(i= 0; i<count; i++) { for(i= 0; i<count; i++) {
o[i]->name= NULL; (*o)[i].name= NULL;
o[i]->partno= 0; (*o)[i].partno= 0;
o[i]->total_parts= 0; (*o)[i].total_parts= 0;
o[i]->offset= 0; (*o)[i].offset= 0;
o[i]->bytes= 0; (*o)[i].bytes= 0;
o[i]->total_bytes= 0; (*o)[i].total_bytes= 0;
} }
return(1); return(1);
} }
@ -2759,8 +2759,8 @@ int Splitparts_destroy(struct SplitparT **o, int count, int flag)
if((*o)==NULL) if((*o)==NULL)
return(0); return(0);
for(i= 0; i<count; i++) { for(i= 0; i<count; i++) {
if(o[i]->name!=NULL) if((*o)[i].name!=NULL)
free(o[i]->name); free((*o)[i].name);
} }
free(*o); free(*o);
*o= NULL; *o= NULL;
@ -2768,15 +2768,34 @@ int Splitparts_destroy(struct SplitparT **o, int count, int flag)
} }
int Splitpart_set(struct SplitparT *o, char *name, int partno, int total_parts, int Splitparts_set(struct SplitparT *o, int idx,
char *name, int partno, int total_parts,
off_t offset, off_t bytes, off_t total_bytes, int flag) off_t offset, off_t bytes, off_t total_bytes, int flag)
{ {
o->name= name; if(o[idx].name!=NULL)
o->partno= partno; free(o[idx].name);
o->total_parts= total_parts; o[idx].name= strdup(name);
o->offset= offset; if(o[idx].name==NULL)
o->bytes= bytes; return(-1);
o->total_bytes= total_bytes; o[idx].partno= partno;
o[idx].total_parts= total_parts;
o[idx].offset= offset;
o[idx].bytes= bytes;
o[idx].total_bytes= total_bytes;
return(1);
}
int Splitparts_get(struct SplitparT *o, int idx, char **name, int *partno,
int *total_parts, off_t *offset, off_t *bytes,
off_t *total_bytes, int flag)
{
*name= o[idx].name;
*partno= o[idx].partno;
*total_parts= o[idx].total_parts;
*offset= o[idx].offset;
*bytes= o[idx].bytes;
*total_bytes= o[idx].total_bytes;
return(1); return(1);
} }
@ -2812,25 +2831,25 @@ int Splitpart__parse(char *name, int *partno, int *total_parts,
char *cpt, *ept; char *cpt, *ept;
cpt= name; cpt= name;
ret= Splitpart__read_next_num(name, &ept, &num, 0); ret= Splitpart__read_next_num(cpt, &ept, &num, 0);
if(ret<=0) if(ret<=0)
return(ret); return(ret);
*partno= num; *partno= num;
cpt= ept; cpt= ept;
ret= Splitpart__read_next_num(name, &ept, &num, 0); ret= Splitpart__read_next_num(cpt, &ept, &num, 0);
if(ret<=0) if(ret<=0)
return(ret); return(ret);
*total_parts= num; *total_parts= num;
cpt= ept; cpt= ept;
ret= Splitpart__read_next_num(name, &ept, offset, 0); ret= Splitpart__read_next_num(cpt, &ept, offset, 0);
if(ret<=0) if(ret<=0)
return(ret); return(ret);
cpt= ept; cpt= ept;
ret= Splitpart__read_next_num(name, &ept, bytes, 0); ret= Splitpart__read_next_num(cpt, &ept, bytes, 0);
if(ret<=0) if(ret<=0)
return(ret); return(ret);
cpt= ept; cpt= ept;
ret= Splitpart__read_next_num(name, &ept, total_bytes, 0); ret= Splitpart__read_next_num(cpt, &ept, total_bytes, 0);
if(ret<=0) if(ret<=0)
return(ret); return(ret);
return(1); return(1);
@ -4342,6 +4361,165 @@ much_too_long:;
} }
#define Xorriso_with_compare_2_contentS yes
/*
@param result Bitfield indicationg type of mismatch
bit11= cannot open regular disk file
bit12= cannot open iso file
bit13= early eof of disk file
bit14= early eof of iso file
bit15= content bytes differ
@param flag bit0= mtimes of both file objects are equal
bit29= do not issue pacifier messages
bit31= do not issue result messages
*/
int Xorriso_compare_2_contents(struct XorrisO *xorriso, char *common_adr,
char *disk_adr, off_t disk_size,
off_t offset, off_t bytes,
char *iso_adr, off_t iso_size,
int *result, int flag)
{
int fd1= -1, ret, r1, r2, done, wanted, i;
void *stream2= NULL;
off_t r1count= 0, r2count= 0, diffcount= 0, first_diff= -1;
char *respt, buf1[32*1024], buf2[32*1024], offset_text[80];
respt= xorriso->result_line;
fd1= open(disk_adr, O_RDONLY);
if(fd1==-1) {
sprintf(respt, "- %s (DISK) : cannot open() : %s\n",
disk_adr, strerror(errno));
cannot_address:;
if(!(flag&(1<<31)))
Xorriso_result(xorriso,0);
(*result)|= 2048;
return(0);
}
if(offset>0)
if(lseek(fd1, offset, SEEK_SET)==-1) {
sprintf(respt, "- %s (DISK) : cannot lseek(%.f) : %s\n",
disk_adr, (double) offset, strerror(errno));
close(fd1);
goto cannot_address;
}
ret= Xorriso_iso_file_open(xorriso, iso_adr, &stream2, 0);
if(ret<=0) {
sprintf(respt, "- %s (ISO) : cannot open() file in ISO image\n", iso_adr);
if(!(flag&(1<<31)))
Xorriso_result(xorriso,0);
close(fd1);
(*result)|= 4096;
return(0);
}
done= 0;
while(!done) {
wanted= sizeof(buf1);
if(r1count+offset+wanted>disk_size)
wanted= disk_size-r1count-offset;
if(r1count+wanted>bytes)
wanted= bytes-r1count;
r1= 0;
while(wanted>0) {
ret= read(fd1, buf1, wanted);
if(ret<=0)
break;
wanted-= ret;
r1+= ret;
}
wanted= sizeof(buf2);
if(r2count+wanted>iso_size)
wanted= iso_size-r2count;
/*
if(r2count+wanted>bytes)
wanted= bytes-r2count;
*/
if(wanted>0)
r2= Xorriso_iso_file_read(xorriso, stream2, buf2, wanted, 0);
else
r2= 0;
if(r1<=0 && r2<=0)
break;
if(r1<=0) {
if(r1<0)
r1= 0;
if(disk_size > r1count + r1 + offset) {
sprintf(respt, "- %s (DISK) : early EOF after %.f bytes\n",
disk_adr, (double) r1count);
if(!(flag&(1<<31)))
Xorriso_result(xorriso,0);
(*result)|= 8196;
}
(*result)|= (1<<15);
}
r1count+= r1;
if(r2<=0 || r2<r1) {
if(r2<0)
r2= 0;
if(iso_size > r2count + r2) {
sprintf(respt, "- %s (ISO) : early EOF after %.f bytes\n",
iso_adr, (double) r2count);
if(!(flag&(1<<31)))
Xorriso_result(xorriso,0);
(*result)|= (1<<14);
}
(*result)|= (1<<15);
done= 1;
}
if(r2>r1) {
if(disk_size > r1count + r1 + offset) {
sprintf(respt, "- %s (DISK) : early EOF after %.f bytes\n",
disk_adr, (double) r1count);
if(!(flag&(1<<31)))
Xorriso_result(xorriso,0);
(*result)|= 8196;
}
(*result)|= (1<<15);
done= 1;
}
r2count+= r2;
if(r1>r2)
r1= r2;
for(i= 0; i<r1; i++) {
if(buf1[i]!=buf2[i]) {
if(first_diff<0)
first_diff= i;
diffcount++;
}
}
if(!(flag&(1<<29))) {
xorriso->pacifier_count+= r1;
Xorriso_pacifier_callback(xorriso, "content bytes read",
xorriso->pacifier_count, 0, "", 0);
}
}
if(diffcount>0 || r1count!=r2count) {
if(first_diff<0)
first_diff= (r1count>r2count ? r2count : r1count);
offset_text[0]= 0;
if(offset>0)
sprintf(offset_text, "%.f+", (double) offset);
sprintf(respt, "%s %s : differs by at least %.f bytes. First at %s%.f\n",
common_adr, (flag&1 ? "CONTENT": "content"),
(double) (diffcount + abs(r1count-r2count)),
offset_text, (double) first_diff);
if(!(flag&(1<<31)))
Xorriso_result(xorriso,0);
(*result)|= (1<<15);
}
if(fd1!=-1)
close(fd1);
Xorriso_iso_file_close(xorriso, &stream2, 0);
return(1);
}
/* /*
@param result Bitfield indicationg type of mismatch @param result Bitfield indicationg type of mismatch
bit0= disk_adr not existing bit0= disk_adr not existing
@ -4361,7 +4539,8 @@ much_too_long:;
bit14= early eof of iso file bit14= early eof of iso file
bit15= content bytes differ bit15= content bytes differ
bit16= symbolic link on disk pointing to dir, dir in iso bit16= symbolic link on disk pointing to dir, dir in iso
>>> bit17= file chunks detected and compared bit17= file chunks detected and compared
bit18= incomplete chunk collection encountered
@param flag bit0= compare atime @param flag bit0= compare atime
bit1= compare ctime bit1= compare ctime
bit2= check only existence of both file objects bit2= check only existence of both file objects
@ -4377,12 +4556,23 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
int *result, int flag) int *result, int flag)
{ {
struct stat s1, s2, stbuf; struct stat s1, s2, stbuf;
int ret, r1, r2, fd1= -1, i, done, wanted, missing= 0, is_split= 0; int ret, missing= 0, is_split= 0, i;
void *stream2= NULL;
char *respt; char *respt;
char buf1[32*1024], buf2[32*1024], a[5*SfileadrL], sfe[5*SfileadrL]; char a[5*SfileadrL], sfe[5*SfileadrL];
char ttx1[40], ttx2[40]; char ttx1[40], ttx2[40];
struct SplitparT *split_parts= NULL;
int split_count= 0;
#ifdef Xorriso_with_compare_2_contentS
char part_path[SfileadrL], *part_name;
int partno, total_parts= 0;
off_t offset, bytes, total_bytes;
#else /* Xorriso_with_compare_2_contentS */
void *stream2= NULL;
int fd1= -1, wanted, r1, r2, done;
off_t r1count= 0, r2count= 0, diffcount= 0, first_diff= -1; off_t r1count= 0, r2count= 0, diffcount= 0, first_diff= -1;
char buf1[32*1024], buf2[32*1024];
#endif /* Xorriso_with_compare_2_contentS */
*result= 0; *result= 0;
respt= xorriso->result_line; respt= xorriso->result_line;
@ -4419,21 +4609,21 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
} }
if((flag&4)||missing) if((flag&4)||missing)
return(!missing); {ret= !missing; goto ex;}
/* Splitfile parts */
if((S_ISREG(s1.st_mode) || S_ISBLK(s1.st_mode)) && S_ISDIR(s2.st_mode)) {
is_split= Xorriso_identify_split(xorriso, iso_adr, &split_parts,
&split_count, &s2, 0);
if(is_split>0)
(*result)|= (1<<17);
else
is_split= 0;
}
/* Attributes */ /* Attributes */
if(s1.st_mode != s2.st_mode) { if(s1.st_mode != s2.st_mode) {
if((S_ISREG(s1.st_mode) || S_ISBLK(s1.st_mode)) && S_ISDIR(s2.st_mode)) {
/* >>> SPLIT */
/* >>> check whether there are only part_files in the directory */;
/* >>> is_split= 1; */;
/* >>> count this as content chunk container */;
/* >>> compare access permissions of first chunk */;
}
if((s1.st_mode&~S_IFMT)!=(s2.st_mode&~S_IFMT)) { if((s1.st_mode&~S_IFMT)!=(s2.st_mode&~S_IFMT)) {
sprintf(respt, "%s st_mode : %7.7o <> %7.7o\n", sprintf(respt, "%s st_mode : %7.7o <> %7.7o\n",
a, s1.st_mode, s2.st_mode); a, s1.st_mode, s2.st_mode);
@ -4519,6 +4709,45 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
} }
} }
if(S_ISREG(s1.st_mode) && S_ISREG(s2.st_mode)) { if(S_ISREG(s1.st_mode) && S_ISREG(s2.st_mode)) {
#ifdef Xorriso_with_compare_2_contentS
/* Content */
if(is_split) {
for(i= 0; i<split_count; i++) {
Splitparts_get(split_parts, i, &part_name, &partno, &total_parts,
&offset, &bytes, &total_bytes, 0);
strcpy(part_path, iso_adr);
if(Sfile_add_to_path(part_path, part_name, 0)<=0) {
Xorriso_much_too_long(xorriso, strlen(iso_adr)+strlen(part_path)+1,
2);
{ret= -1; goto ex;}
}
ret= Xorriso_iso_lstat(xorriso, part_path, &stbuf, 0);
if(ret==-1)
continue;
ret= Xorriso_compare_2_contents(xorriso, a, disk_adr, s1.st_size,
offset, bytes,
part_path, stbuf.st_size, result,
(s1.st_mtime==s2.st_mtime) | (flag&((1<<29)|(1<<31))));
}
if(total_parts>0 && split_count!=total_parts) {
sprintf(xorriso->info_text,
"- %s/* (ISO) : Not all split parts present (%d of %d)\n",
iso_adr, split_count, total_parts);
if(!(flag&(1<<31)))
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 1);
(*result)|= 1<<18;
}
} else {
ret= Xorriso_compare_2_contents(xorriso, a, disk_adr, s1.st_size,
(off_t) 0, s1.st_size,
iso_adr, s2.st_size, result,
(s1.st_mtime==s2.st_mtime) | (flag&((1<<29)|(1<<31))));
}
#else /* Xorriso_with_compare_2_contentS */
fd1= open(disk_adr, O_RDONLY); fd1= open(disk_adr, O_RDONLY);
if(fd1==-1) { if(fd1==-1) {
sprintf(respt, "- %s (DISK) : cannot open() : %s\n", sprintf(respt, "- %s (DISK) : cannot open() : %s\n",
@ -4526,7 +4755,7 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
if(!(flag&(1<<31))) if(!(flag&(1<<31)))
Xorriso_result(xorriso,0); Xorriso_result(xorriso,0);
(*result)|= 2048; (*result)|= 2048;
return(0); {ret= 0; goto ex;}
} }
ret= Xorriso_iso_file_open(xorriso, iso_adr, &stream2, 0); ret= Xorriso_iso_file_open(xorriso, iso_adr, &stream2, 0);
@ -4535,18 +4764,11 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
if(!(flag&(1<<31))) if(!(flag&(1<<31)))
Xorriso_result(xorriso,0); Xorriso_result(xorriso,0);
close(fd1); close(fd1);
fd1= -1;
(*result)|= 4096; (*result)|= 4096;
return(0); {ret= 0; goto ex;}
} }
if(is_split) {
/* >>> SPLIT */
/* >>> for each chunk file : do content comparison */;
}
/* Content */
/* >>> SPLIT */
/* <<< outsource this as separate content comparison function */
done= 0; done= 0;
while(!done) { while(!done) {
/* fd1 is a regular file and should deliver full buffers */ /* fd1 is a regular file and should deliver full buffers */
@ -4635,11 +4857,21 @@ I thought to have seen a libisofs bug here but it seems that it was an illusion
Xorriso_result(xorriso,0); Xorriso_result(xorriso,0);
(*result)|= (1<<15); (*result)|= (1<<15);
} }
#endif /* ! Xorriso_with_compare_2_contentS */
} }
ret= (((*result)&~((1<<17)|(1<<18)))==0);
ex:;
#ifndef Xorriso_with_compare_2_contentS
if(fd1!=-1) if(fd1!=-1)
close(fd1); close(fd1);
Xorriso_iso_file_close(xorriso, &stream2, 0); Xorriso_iso_file_close(xorriso, &stream2, 0);
return((*result)==0); #endif /* ! Xorriso_with_compare_2_contentS */
if(split_parts!=NULL)
Splitparts_destroy(&split_parts, split_count, 0);
return(ret);
} }
@ -7293,8 +7525,14 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
int compare_result, char *disk_path, int compare_result, char *disk_path,
char *iso_rr_path, int flag) char *iso_rr_path, int flag)
{ {
int ret, deleted= 0; int ret, deleted= 0, is_split= 0, i;
char sfe[5*SfileadrL]; char sfe[5*SfileadrL];
struct stat stbuf;
struct SplitparT *split_parts= NULL;
int split_count= 0;
char part_path[SfileadrL], *part_name;
int partno, total_parts;
off_t offset, bytes, total_bytes;
if(compare_result&((1<<11)|(1<<13))) { if(compare_result&((1<<11)|(1<<13))) {
/* cannot open regular disk file, early eof of disk file */ /* cannot open regular disk file, early eof of disk file */
@ -7302,14 +7540,23 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
Text_shellsafe(disk_path, sfe, 0)); Text_shellsafe(disk_path, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 1); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 1);
xorriso->find_compare_result= -1; xorriso->find_compare_result= -1;
return(1); ret= 1; goto ex;
} }
xorriso->info_text[0]= 0; xorriso->info_text[0]= 0;
is_split= !!(compare_result & (1<<17));
/* <<< */
if(is_split) {
sprintf(xorriso->info_text, "Split file cannot be updated yet: %s\n",
Text_shellsafe(iso_rr_path, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 1);
{ret= 1; goto ex;}
}
if(compare_result&(8|64)) { if(compare_result&(8|64)) {
/* file type, minor+major with device file */ /* file type, minor+major with device file */
/* <<< SPLIT : cannot happen here */ /* <<< ??? SPLIT : cannot happen here ??? really ? */
ret= Xorriso_rmi(xorriso, boss_iter, (off_t) 0, iso_rr_path, 1); /* rm_r */ ret= Xorriso_rmi(xorriso, boss_iter, (off_t) 0, iso_rr_path, 1); /* rm_r */
if(ret>0) { if(ret>0) {
@ -7323,6 +7570,7 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
/* disk_adr not existing */ /* disk_adr not existing */
/* ??? SPLIT : Shall i recognize a splitfile without disk file ? /* ??? SPLIT : Shall i recognize a splitfile without disk file ?
Does it make any difference ?
*/ */
ret= Xorriso_rmi(xorriso, boss_iter, (off_t) 0, iso_rr_path, 1); ret= Xorriso_rmi(xorriso, boss_iter, (off_t) 0, iso_rr_path, 1);
@ -7333,9 +7581,38 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
/* iso_adr not existing, size, cannot open iso file, early eof of iso file /* iso_adr not existing, size, cannot open iso file, early eof of iso file
content bytes differ */ content bytes differ */
/* >>> SPLIT : differing content or size */ if(is_split) {
/* >>> overwrite all parts in the directory */ /* >>> SPLIT : differing content or size */;
ret= Xorriso_identify_split(xorriso, iso_rr_path,
&split_parts, &split_count, &stbuf, 0);
if(ret<=0)
{ret= -1; goto ex;} /* (should not happen) */
for(i= 0; i<split_count; i++) {
Splitparts_get(split_parts, i, &part_name, &partno, &total_parts,
&offset, &bytes, &total_bytes, 0);
strcpy(part_path, iso_rr_path);
if(Sfile_add_to_path(part_path, part_name, 0)<=0) {
Xorriso_much_too_long(xorriso,
strlen(iso_rr_path)+strlen(part_path)+1, 2);
{ret= -1; goto ex;}
}
/* Delete old part, just in case the name changes */
ret= Xorriso_rmi(xorriso, NULL, (off_t) 0, part_path, 1);
if(ret<=0)
goto ex;
/* overwrite by new parts resp. delete from directory */
ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, part_path,
offset, bytes, 2|(flag&4));
if(ret<=0)
goto ex;
}
/* >>> ??? if disk file grew over part limit : add part ? */;
/* >>> copy file attributes to iso_rr_path */;
} else
ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, iso_rr_path, ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, iso_rr_path,
(off_t) 0, (off_t) 0, 2|(flag&4)); (off_t) 0, (off_t) 0, 2|(flag&4));
sprintf(xorriso->info_text, "Added/overwrote "); sprintf(xorriso->info_text, "Added/overwrote ");
@ -7343,9 +7620,28 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
} else if(compare_result&(4|16|32|256|512|1024)) { } else if(compare_result&(4|16|32|256|512|1024)) {
/* access permissions, user id, group id, mtime, atime, ctime */ /* access permissions, user id, group id, mtime, atime, ctime */
/* >>> SPLIT : differing attributes */ if(is_split) {
/* >>> renew attributes of all parts in the directory */ ret= Xorriso_identify_split(xorriso, iso_rr_path,
&split_parts, &split_count, &stbuf, 0);
if(ret<=0)
{ret= -1; goto ex;} /* (should not happen) */
for(i= 0; i<split_count; i++) {
Splitparts_get(split_parts, i, &part_name, &partno, &total_parts,
&offset, &bytes, &total_bytes, 0);
strcpy(part_path, iso_rr_path);
if(Sfile_add_to_path(part_path, part_name, 0)<=0) {
Xorriso_much_too_long(xorriso,
strlen(iso_rr_path)+strlen(part_path)+1, 2);
{ret= -1; goto ex;}
}
ret= Xorriso_copy_properties(xorriso, disk_path, part_path, 0);
if(ret<=0)
goto ex;
}
/* >>> copy file attributes to iso_rr_path */;
} else
ret= Xorriso_copy_properties(xorriso, disk_path, iso_rr_path, 0); ret= Xorriso_copy_properties(xorriso, disk_path, iso_rr_path, 0);
sprintf(xorriso->info_text, "Adjusted attributes of "); sprintf(xorriso->info_text, "Adjusted attributes of ");
@ -7355,6 +7651,10 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
strcat(xorriso->info_text, Text_shellsafe(iso_rr_path, sfe, 0)); strcat(xorriso->info_text, Text_shellsafe(iso_rr_path, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0);
} }
ret= 1;
ex:;
if(split_parts!=NULL)
Splitparts_destroy(&split_parts, split_count, 0);
if(ret<=0) if(ret<=0)
return(ret); return(ret);
if(deleted) if(deleted)

View File

@ -433,9 +433,14 @@ int Splitparts_new(struct SplitparT **o, int count, int flag);
int Splitparts_destroy(struct SplitparT **o, int count, int flag); int Splitparts_destroy(struct SplitparT **o, int count, int flag);
int Splitpart_set(struct SplitparT *o, char *name, int partno, int total_parts, int Splitparts_set(struct SplitparT *o, int idx,
char *name, int partno, int total_parts,
off_t offset, off_t bytes, off_t total_bytes, int flag); off_t offset, off_t bytes, off_t total_bytes, int flag);
int Splitparts_get(struct SplitparT *o, int idx, char **name, int *partno,
int *total_parts, off_t *offset, off_t *bytes,
off_t *total_bytes, int flag);
int Splitpart__parse(char *name, int *partno, int *total_parts, int Splitpart__parse(char *name, int *partno, int *total_parts,
off_t *offset, off_t *bytes, off_t *total_bytes, int flag); off_t *offset, off_t *bytes, off_t *total_bytes, int flag);

View File

@ -1 +1 @@
#define Xorriso_timestamP "2008.03.22.130128" #define Xorriso_timestamP "2008.03.25.170747"

View File

@ -1829,7 +1829,7 @@ int Xorriso_copy_implict_properties(struct XorrisO *xorriso, IsoDir *dir,
"Copied properties for %s", Text_shellsafe(ni, sfe, 0)); "Copied properties for %s", Text_shellsafe(ni, sfe, 0));
sprintf(xorriso->info_text+strlen(xorriso->info_text), sprintf(xorriso->info_text+strlen(xorriso->info_text),
" from %s", Text_shellsafe(nfd, sfe, 0)); " from %s", Text_shellsafe(nfd, sfe, 0));
if((flag&1) && d==0) if(!((flag&1) && d==0))
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
return(1); return(1);
} }
@ -4846,11 +4846,12 @@ int Xorriso_iso_file_close(struct XorrisO *xorriso, void **stream, int flag)
int Xorriso_identify_split(struct XorrisO *xorriso, char *iso_adr, int Xorriso_identify_split(struct XorrisO *xorriso, char *iso_adr,
struct SplitparT **parts, int *count, int flag) struct SplitparT **parts, int *count,
struct stat *total_stbuf, int flag)
{ {
int ret, i; int ret, i;
int partno, total_parts, first_total_parts= -1; int partno, total_parts, first_total_parts= -1;
off_t offset, bytes, total_bytes, first_total_bytes= -1; off_t offset, bytes, total_bytes, first_total_bytes= -1, size;
IsoImage *volume; IsoImage *volume;
IsoDir *dir_node; IsoDir *dir_node;
IsoDirIter *iter= NULL; IsoDirIter *iter= NULL;
@ -4878,7 +4879,7 @@ cannot_iter:;
return(-1); return(-1);
} }
for(i= 0; iso_dir_iter_next(iter, &node) == 1; ) { for(i= 0; iso_dir_iter_next(iter, &node) == 1; i++) {
name= (char *) iso_node_get_name(node); name= (char *) iso_node_get_name(node);
ret= Splitpart__parse(name, &partno, &total_parts, ret= Splitpart__parse(name, &partno, &total_parts,
&offset, &bytes, &total_bytes, 0); &offset, &bytes, &total_bytes, 0);
@ -4888,6 +4889,7 @@ cannot_iter:;
first_total_parts= total_parts; first_total_parts= total_parts;
first_total_bytes= total_bytes; first_total_bytes= total_bytes;
Xorriso_fake_stbuf(xorriso, "", &first_stbuf, &node, 1); Xorriso_fake_stbuf(xorriso, "", &first_stbuf, &node, 1);
size= first_stbuf.st_size;
} else { } else {
if(first_total_parts!=total_parts || first_total_bytes!=total_bytes) if(first_total_parts!=total_parts || first_total_bytes!=total_bytes)
{ret= 0; goto ex;} {ret= 0; goto ex;}
@ -4899,7 +4901,12 @@ cannot_iter:;
first_stbuf.st_ctime != stbuf.st_ctime || first_stbuf.st_ctime != stbuf.st_ctime ||
first_stbuf.st_atime != stbuf.st_atime) first_stbuf.st_atime != stbuf.st_atime)
{ret= 0; goto ex;} {ret= 0; goto ex;}
size= stbuf.st_size;
} }
/* check for plausible size */
if(!((partno<total_parts && size==bytes) ||
(partno==total_parts && size==(total_bytes-offset) && size<=bytes)))
{ret= 0; goto ex;}
(*count)++; (*count)++;
} }
if((*count)<=0) if((*count)<=0)
@ -4914,20 +4921,27 @@ cannot_iter:;
if(ret<0) if(ret<0)
goto cannot_iter; goto cannot_iter;
for(i= 0; i<*count; i++) { for(i= 0; i<*count; i++) {
ret= iso_dir_iter_next(iter, &node);
if(ret!=1)
break;
name= (char *) iso_node_get_name(node); name= (char *) iso_node_get_name(node);
ret= Splitpart__parse(name, &partno, &total_parts, ret= Splitpart__parse(name, &partno, &total_parts,
&offset, &bytes, &total_bytes, 0); &offset, &bytes, &total_bytes, 0);
if(ret<=0) if(ret<=0)
{ret= 0; goto ex;} {ret= 0; goto ex;}
Splitpart_set(parts[i], name, partno, total_parts, offset, bytes, ret= Splitparts_set(*parts, i, name, partno, total_parts, offset, bytes,
total_bytes, 0); total_bytes, 0);
if(ret<=0)
goto ex;
} }
/* >>> ??? sort list ? */ /* >>> ??? sort list ? */
/* >>> check for equal frequency */; for(i= 0; i<*count; i++) {
/* >>> check for disjointness */ /* >>> check for disjointness */;
/* >>> check for plausible size */ }
memcpy(total_stbuf, &first_stbuf, sizeof(struct stat));
total_stbuf->st_size= total_bytes;
ret= 1; ret= 1;
ex:; ex:;
if(iter!=NULL) if(iter!=NULL)

View File

@ -198,7 +198,8 @@ int Xorriso_cut_out(struct XorrisO *xorriso, char *disk_path,
struct SplitparT; struct SplitparT;
int Xorriso_identify_split(struct XorrisO *xorriso, char *iso_adr, int Xorriso_identify_split(struct XorrisO *xorriso, char *iso_adr,
struct SplitparT **parts, int *count, int flag); struct SplitparT **parts, int *count,
struct stat *total_stbuf, int flag);
#endif /* Xorrisoburn_includeD */ #endif /* Xorrisoburn_includeD */