New action estimate_size for -find and -findx

This commit is contained in:
Thomas Schmitt 2010-12-02 11:10:39 +00:00
parent 65fdba8884
commit 025d6f2ee6
10 changed files with 121 additions and 40 deletions

View File

@ -1087,6 +1087,7 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job,
time_t date= 0; time_t date= 0;
mode_t mode_or= 0, mode_and= ~1; mode_t mode_or= 0, mode_and= ~1;
char *target, *text_2, sfe[5*SfileadrL], *disk_prefix, iso_path[SfileadrL]; char *target, *text_2, sfe[5*SfileadrL], *disk_prefix, iso_path[SfileadrL];
char *basename;
struct FindjoB *subjob; struct FindjoB *subjob;
struct stat stbuf; struct stat stbuf;
@ -1167,6 +1168,16 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job,
Xorriso_result(xorriso,0); Xorriso_result(xorriso,0);
} }
{ret= 1; goto ex;} {ret= 1; goto ex;}
} else if(action == 40) { /* estimate_size */
basename= strrchr(abs_path, '/');
if(basename != NULL)
basename++;
else
basename= abs_path;
ret= lstat(abs_path, &stbuf);
if(ret != -1)
ret= Xorriso_estimate_file_size(xorriso, job, basename, stbuf.st_mode,
stbuf.st_size, 0);
} else { } else {
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0)); sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0));
Xorriso_result(xorriso, 0); Xorriso_result(xorriso, 0);

View File

@ -377,6 +377,8 @@ int Findjob_new(struct FindjoB **o, char *start_path, int flag)
if(m->start_path==NULL) if(m->start_path==NULL)
goto failed; goto failed;
m->found_path= NULL; m->found_path= NULL;
m->estim_upper_size= 0;
m->estim_lower_size= 0;
m->subjob= NULL; m->subjob= NULL;
m->errmsg[0]= 0; m->errmsg[0]= 0;
m->errn= 0; m->errn= 0;

View File

@ -154,6 +154,7 @@ struct FindjoB {
37= mkisofs_r 37= mkisofs_r
38= sort_weight number 38= sort_weight number
39= hide on|iso_rr|joliet|off 39= hide on|iso_rr|joliet|off
40= estimate_size
*/ */
int action; int action;
int prune; int prune;
@ -167,6 +168,8 @@ struct FindjoB {
int type; /* see Xorriso_set_time flag, also used as weight */ int type; /* see Xorriso_set_time flag, also used as weight */
time_t date; time_t date;
char *found_path; char *found_path;
off_t estim_upper_size;
off_t estim_lower_size;
struct FindjoB *subjob; struct FindjoB *subjob;
/* Errors */ /* Errors */

View File

@ -1688,6 +1688,29 @@ int Xorriso_set_hidden(struct XorrisO *xorriso, void *in_node, char *path,
} }
/* @param flag bit0= increase only upper estimation
*/
int Xorriso_estimate_file_size(struct XorrisO *xorriso, struct FindjoB *job,
char *basename, mode_t st_mode, off_t st_size, int flag)
{
off_t upper, lower, size;
lower = 3 * strlen(basename) + 34; /* >>> + minimum RR ? */
upper = 3 * strlen(basename) + 2048;
if(S_ISREG(st_mode)) {
size= ((st_size + (off_t) 2047) / (off_t) 2048) * (off_t) 2048;
lower+= size;
upper+= size;
} else if(S_ISDIR(st_mode)) {
upper+= 4096;
}
job->estim_upper_size+= upper;
if(!(flag & 1))
job->estim_lower_size+= lower;
return(1);
}
int Xorriso_cannot_create_iter(struct XorrisO *xorriso, int iso_error,int flag) int Xorriso_cannot_create_iter(struct XorrisO *xorriso, int iso_error,int flag)
{ {
Xorriso_process_msg_queues(xorriso,0); Xorriso_process_msg_queues(xorriso,0);
@ -1823,9 +1846,9 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
gid_t group= 0; gid_t group= 0;
time_t date= 0; time_t date= 0;
mode_t mode_or= 0, mode_and= ~1; mode_t mode_or= 0, mode_and= ~1;
char *target, *text_2, sfe[5*SfileadrL], *iso_prefix, md5[16]; char *target, *text_2, sfe[5*SfileadrL], *iso_prefix, md5[16], *basename;
struct FindjoB *subjob; struct FindjoB *subjob;
struct stat dir_stbuf; struct stat dir_stbuf, stbuf;
action= Findjob_get_action_parms(job, &target, &text_2, &user, &group, action= Findjob_get_action_parms(job, &target, &text_2, &user, &group,
&mode_and, &mode_or, &type, &date, &subjob, 0); &mode_and, &mode_or, &type, &date, &subjob, 0);
@ -1937,6 +1960,16 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
iso_node_set_sort_weight(node, type); iso_node_set_sort_weight(node, type);
} else if(action == 39) { /* hide */ } else if(action == 39) { /* hide */
Xorriso_set_hidden(xorriso, node, NULL, type, 0); Xorriso_set_hidden(xorriso, node, NULL, type, 0);
} else if(action == 40) { /* estimate_size */
basename= strrchr(abs_path, '/');
if(basename != NULL)
basename++;
else
basename= abs_path;
ret= Xorriso_fake_stbuf(xorriso, "", &stbuf, &node, 1);
if(ret > 0)
ret= Xorriso_estimate_file_size(xorriso, job, basename, stbuf.st_mode,
stbuf.st_size, 0);
} else { /* includes : 15 in_iso */ } else { /* includes : 15 in_iso */
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0)); sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0));
Xorriso_result(xorriso, 0); Xorriso_result(xorriso, 0);

View File

@ -1007,6 +1007,8 @@ not_enough_exec_arguments:;
goto sorry_ex; goto sorry_ex;
} }
Findjob_set_action_type(job, 39, type, 0); Findjob_set_action_type(job, 39, type, 0);
} else if(strcmp(cpt, "estimate_size")==0) {
Findjob_set_action_target(job, 40, NULL, 0);
} else { } else {
sprintf(xorriso->info_text, "-find -exec: unknown action %s", sprintf(xorriso->info_text, "-find -exec: unknown action %s",
Text_shellsafe(argv[i], sfe, 0)); Text_shellsafe(argv[i], sfe, 0));
@ -1041,6 +1043,15 @@ ex:;
xorriso->pacifier_count, 0, "", 1); xorriso->pacifier_count, 0, "", 1);
if(first_job->action == 35 && !(flag & 1)) if(first_job->action == 35 && !(flag & 1))
Xorriso_report_md5_outcome(xorriso, first_job->target, 0); Xorriso_report_md5_outcome(xorriso, first_job->target, 0);
if(first_job->action == 40) {
sprintf(xorriso->result_line,"Size lower : %lus\n",
(unsigned long) (job->estim_lower_size / (off_t) 2048));
Xorriso_result(xorriso,0);
sprintf(xorriso->result_line,"Size upper : %lus\n",
(unsigned long) ((job->estim_upper_size / (off_t) 2048) +
!!(job->estim_upper_size % 2048)));
Xorriso_result(xorriso,0);
}
if(access_acl_text != NULL) if(access_acl_text != NULL)
free(access_acl_text); free(access_acl_text);
if(default_acl_text != NULL) if(default_acl_text != NULL)

View File

@ -1712,6 +1712,12 @@ E.g.:
.br .br
-find / -disk_name *_secret -exec hide on -find / -disk_name *_secret -exec hide on
.br .br
\fBestimate_size\fR
prints a lower and an upper estimation of the number of blocks which the
found files together will occupy in the emering ISO image.
This does not account for the superblock,
for the directories in the -find path, or for image padding.
.br
\fBfind\fR \fBfind\fR
performs another run of -find on the matching file address. performs another run of -find on the matching file address.
It accepts the same params as -find, except iso_rr_path. It accepts the same params as -find, except iso_rr_path.

View File

@ -1538,6 +1538,11 @@ File: xorriso.info, Node: CmdFind, Next: Filter, Prev: Manip, Up: Options
"joliet", "off". "joliet", "off".
E.g.: E.g.:
-find / -disk_name *_secret -exec hide on -find / -disk_name *_secret -exec hide on
estimate_size
prints a lower and an upper estimation of the number of
blocks which the found files together will occupy in the
emering ISO image. This does not account for the superblock,
for the directories in the -find path, or for image padding.
find find
performs another run of -find on the matching file address. performs another run of -find on the matching file address.
It accepts the same params as -find, except iso_rr_path. It accepts the same params as -find, except iso_rr_path.
@ -4370,42 +4375,42 @@ Node: Insert40593
Node: SetInsert48950 Node: SetInsert48950
Node: Manip57517 Node: Manip57517
Node: CmdFind66198 Node: CmdFind66198
Node: Filter76149 Node: Filter76443
Node: Writing80498 Node: Writing80792
Node: SetWrite86787 Node: SetWrite87081
Node: Bootable98738 Node: Bootable99032
Node: Jigdo111045 Node: Jigdo111339
Node: Charset115303 Node: Charset115597
Node: Exception118054 Node: Exception118348
Node: DialogCtl122569 Node: DialogCtl122863
Node: Inquiry124914 Node: Inquiry125208
Node: Navigate129044 Node: Navigate129338
Node: Verify136642 Node: Verify136936
Node: Restore145062 Node: Restore145356
Node: Emulation151718 Node: Emulation152012
Node: Scripting160007 Node: Scripting160301
Node: Frontend165569 Node: Frontend165863
Node: Examples166864 Node: Examples167158
Node: ExDevices168033 Node: ExDevices168327
Node: ExCreate168667 Node: ExCreate168961
Node: ExDialog169941 Node: ExDialog170235
Node: ExGrowing171203 Node: ExGrowing171497
Node: ExModifying172005 Node: ExModifying172299
Node: ExBootable172506 Node: ExBootable172800
Node: ExCharset173053 Node: ExCharset173347
Node: ExPseudo173881 Node: ExPseudo174175
Node: ExCdrecord174775 Node: ExCdrecord175069
Node: ExMkisofs175090 Node: ExMkisofs175384
Node: ExGrowisofs176093 Node: ExGrowisofs176387
Node: ExException177217 Node: ExException177511
Node: ExTime177671 Node: ExTime177965
Node: ExIncBackup178130 Node: ExIncBackup178424
Node: ExRestore181602 Node: ExRestore181896
Node: ExRecovery182571 Node: ExRecovery182865
Node: Files183137 Node: Files183431
Node: Seealso184365 Node: Seealso184659
Node: Legal184889 Node: Legal185183
Node: CommandIdx185811 Node: CommandIdx186105
Node: ConceptIdx200036 Node: ConceptIdx200330
 
End Tag Table End Tag Table

View File

@ -2077,6 +2077,12 @@ E.g.:
@* @*
-find / -disk_name *_secret -exec hide on -find / -disk_name *_secret -exec hide on
@* @*
@item estimate_size
prints a lower and an upper estimation of the number of blocks which the
found files together will occupy in the emering ISO image.
This does not account for the superblock,
for the directories in the -find path, or for image padding.
@*
@item find @item find
performs another run of -find on the matching file address. performs another run of -find on the matching file address.
It accepts the same params as -find, except iso_rr_path. It accepts the same params as -find, except iso_rr_path.

View File

@ -1 +1 @@
#define Xorriso_timestamP "2010.12.02.063209" #define Xorriso_timestamP "2010.12.02.111029"

View File

@ -552,5 +552,9 @@ int Xorriso_preparer_string(struct XorrisO *xorriso, char xorriso_id[129],
int Xorriso_jigdo_interpreter(struct XorrisO *xorriso, char *aspect, char *arg, int Xorriso_jigdo_interpreter(struct XorrisO *xorriso, char *aspect, char *arg,
int flag); int flag);
int Xorriso_estimate_file_size(struct XorrisO *xorriso, struct FindjoB *job,
char *basename, mode_t st_mode, off_t st_size, int flag);
#endif /* Xorrisoburn_includeD */ #endif /* Xorrisoburn_includeD */