New -as mkisofs options -hide, -hide-joliet, -hide-list, -hide-joliet-list

This commit is contained in:
2010-06-23 13:43:40 +00:00
parent c933076b4b
commit 558667d32a
14 changed files with 394 additions and 120 deletions

View File

@ -509,7 +509,7 @@ int Xorriso_genisofs_ignore(struct XorrisO *xorriso, char *whom,
""
};
static char ignored_arg1_options[][41]= {
"-biblio", "-check-session", "-p", "-root",
"-biblio", "-check-session", "-hide-hfs", "-hide-hfs-list", "-p", "-root",
"-old-root", "-table-name", "-volset-seqno", "-volset-size",
""
};
@ -566,6 +566,10 @@ int Xorriso_genisofs_help(struct XorrisO *xorriso, int flag)
" -f, -follow-links Follow symbolic links",
" -graft-points Allow to use graft points for filenames",
" -help Print option help",
" -hide GLOBFILE Hide ISO9660/RR file",
" -hide-list FILE File with list of ISO9660/RR files to hide",
" -hide-joliet GLOBFILE Hide Joliet file",
" -hide-joliet-list FILE File with list of Joliet files to hide",
" -input-charset CHARSET Local input charset for file name conversion",
" -output-charset CHARSET Output charset for file name conversion",
" -iso-level LEVEL Set ISO9660 conformance level (1..3)",
@ -642,6 +646,86 @@ int Xorriso_genisofs_help(struct XorrisO *xorriso, int flag)
}
/* Perform hiding.
Cumbersome: The paths and patterns apply to the disk address and not
to the Rock Ridge address. Actually even the literal form of the
mkisofs pathspec would matter (e.g. "./" versus "").
But xorriso normalizes disk_paths before further processing. Thus
the literal form does not matter.
*/
int Xorriso_genisofs_hide(struct XorrisO *xorriso, char *whom,
char *pattern, int hide_attrs, int flag)
{
int zero= 0, ret;
char *argv[1];
if((hide_attrs & 3) == 0)
return(2);
if(strchr(pattern, '/') != NULL) {
argv[0]= pattern;
ret= Xorriso_option_not_paths(xorriso, 1, argv, &zero,
4 | (hide_attrs & 3));
} else {
ret= Xorriso_option_not_leaf(xorriso, pattern, hide_attrs & 3);
}
return(ret);
}
/* @param flag bit0= quoted list */
int Xorriso_genisofs_hide_list(struct XorrisO *xorriso, char *whom,
char *adr, int hide_attrs, int flag)
{
int ret, linecount= 0, argc= 0, was_failure= 0, i, fret;
char **argv= NULL;
FILE *fp= NULL;
if(adr[0]==0) {
sprintf(xorriso->info_text,
"Empty file name given with -as %s -hide-%slist",
whom, hide_attrs == 1 ? "" : "joliet-");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
return(0);
}
ret= Xorriso_afile_fopen(xorriso, adr, "rb", &fp, 0);
if(ret <= 0)
return(0);
if(ret <= 0)
return(0);
while(1) {
ret= Xorriso_read_lines(xorriso, fp, &linecount, &argc, &argv,
4 | (flag & 1) );
if(ret <= 0)
goto ex;
if(ret == 2)
break;
for(i= 0; i < argc; i++) {
if(argv[i][0] == 0)
continue;
ret= Xorriso_genisofs_hide(xorriso, whom, argv[i], hide_attrs, 0);
if(ret <= 0 || xorriso->request_to_abort) {
was_failure= 1;
fret= Xorriso_eval_problem_status(xorriso, ret, 1|2);
if(fret>=0)
continue;
if(ret > 0)
ret= 0;
goto ex;
}
}
}
ret= 1;
ex:;
if(flag & 1)
Xorriso_read_lines(xorriso, fp, &linecount, &argc, &argv, 2);
if(fp != NULL && fp != stdin)
fclose(fp);
if(ret<=0)
return(ret);
return(!was_failure);
}
/* micro emulation of mkisofs */
int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
int argc, char **argv, int flag)
@ -649,8 +733,9 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
int ret, i, j, was_path= 0, was_other_option= 0, mem_graft_points, mem;
int do_print_size= 0, fd, idx, iso_level= 0, no_emul_boot= 0;
int option_b= 0, was_failure= 0, fret, lower_r= 0, zero= 0;
int with_boot_image= 0, with_cat_path= 0;
int *weight_list= NULL, weight_count= 0;
int *boot_opt_list= NULL, boot_opt_count= 0;
int *delay_opt_list= NULL, delay_opt_count= 0;
char sfe[5*SfileadrL], adr[SfileadrL+8], ra_text[80], pathspec[2*SfileadrL];
char *ept, *add_pt, eff_path[SfileadrL], indev[SfileadrL+8], msc[80], *cpt;
char *boot_path;
@ -664,13 +749,15 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
Xorriso_no_malloc_memory(xorriso, NULL, 0);
return(-1);
}
boot_opt_list= TSOB_FELD(int, argc + 1);
if(boot_opt_list == NULL) {
delay_opt_list= TSOB_FELD(int, argc + 1);
if(delay_opt_list == NULL) {
cpt= (char *) weight_list;
Xorriso_no_malloc_memory(xorriso, &cpt, 0);
return(-1);
}
if(xorriso->boot_image_cat_path[0])
with_cat_path= -1;
adr[0]= indev[0]= msc[0]= 0;
for(i= 0; i<argc; i++) {
ret= Xorriso_genisofs_ignore(xorriso, whom, argv, &i, 1);
@ -763,6 +850,25 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
ret= Xorriso_option_charset(xorriso, argv[i], 3);
if(ret <= 0)
goto problem_handler_1;
} else if(strcmp(argv[i], "-hide") == 0 ||
strcmp(argv[i], "-hide-list") == 0 ||
strcmp(argv[i], "-hide-joliet") == 0 ||
strcmp(argv[i], "-hide-joliet-list") == 0) {
if(i+1>=argc)
goto not_enough_args;
i++;
if(strcmp(argv[i - 1], "-hide") == 0)
ret= Xorriso_genisofs_hide(xorriso, whom, argv[i], 1, 0);
else if(strcmp(argv[i - 1], "-hide-list") == 0)
ret= Xorriso_genisofs_hide_list(xorriso, whom, argv[i], 1, 0);
else if(strcmp(argv[i - 1], "-hide-joliet") == 0)
ret= Xorriso_genisofs_hide(xorriso, whom, argv[i], 2, 0);
else if(strcmp(argv[i - 1], "-hide-joliet-list") == 0)
ret= Xorriso_genisofs_hide_list(xorriso, whom, argv[i], 2, 0);
if(ret <= 0)
goto problem_handler_1;
} else if(strcmp(argv[i], "--hardlinks")==0) {
Xorriso_option_hardlinks(xorriso, "on", 0);
} else if(strcmp(argv[i], "--acl")==0) {
@ -993,7 +1099,7 @@ not_enough_args:;
strncmp(argv[i], "isolinux_mbr=", 13)==0 ||
strcmp(argv[i], "-eltorito-alt-boot")==0 ||
strcmp(argv[i], "--protective-msdos-label")==0) {
boot_opt_list[boot_opt_count++]= i;
delay_opt_list[delay_opt_count++]= i;
} else if(strcmp(argv[i], "-b") == 0 ||
strcmp(argv[i], "-eltorito-boot") == 0 ||
strcmp(argv[i], "--efi-boot") == 0 ||
@ -1006,7 +1112,7 @@ not_enough_args:;
strcmp(argv[i], "-isohybrid-mbr")==0) {
if(i+1>=argc)
goto not_enough_args;
boot_opt_list[boot_opt_count++]= i;
delay_opt_list[delay_opt_count++]= i;
i++;
} else if(strncmp(argv[i], "--modification-date=", 20)==0) {
ret= Xorriso_option_volume_date(xorriso, "uuid", argv[i] + 20, 0);
@ -1054,6 +1160,15 @@ not_enough_args:;
Xorriso_relax_compliance(xorriso, "no_force_dots", 0);
} else if(strcmp(argv[i], "-allow-lowercase") == 0) {
Xorriso_relax_compliance(xorriso, "lowercase", 0);
} else if(strcmp(argv[i], "-hide") == 0 ||
strcmp(argv[i], "-hide-list") == 0 ||
strcmp(argv[i], "-hide-joliet") == 0 ||
strcmp(argv[i], "-hide-joliet-list") == 0) {
if(i+1>=argc)
goto not_enough_args;
i++;
/* was already handled in first argument scan */;
} else if(argv[i][0]=='-' && argv[i][1]!=0) {
sprintf(xorriso->info_text, "-as %s: Unknown option %s",
whom, Text_shellsafe(argv[i], sfe, 0));
@ -1132,8 +1247,8 @@ problem_handler_2:;
}
/* After all pathspecs are added: perform boot related options */
for(j= 0; j < boot_opt_count; j++) {
i= boot_opt_list[j];
for(j= 0; j < delay_opt_count; j++) {
i= delay_opt_list[j];
if(strcmp(argv[i], "-no-emul-boot")==0) {
no_emul_boot= 1;
} else if(strcmp(argv[i], "-boot-info-table")==0) {
@ -1171,6 +1286,7 @@ problem_handler_2:;
goto problem_handler_boot;
}
xorriso->keep_boot_image= 0;
with_boot_image= 1;
} else if(strcmp(argv[i], "-c") == 0 ||
strcmp(argv[i], "-eltorito-catalog") == 0) {
if(i+1>=argc)
@ -1183,6 +1299,8 @@ problem_handler_2:;
+ strlen(xorriso->boot_image_cat_path), argv[i], 0);
if(ret <= 0)
goto ex;
if(with_cat_path == 0)
with_cat_path= 1;
} else if(strcmp(argv[i], "-boot-load-size") == 0) {
if(i+1>=argc)
goto not_enough_args;
@ -1223,11 +1341,21 @@ problem_handler_boot:;
continue;
goto ex;
}
if(with_boot_image && with_cat_path == 0)
strcpy(xorriso->boot_image_cat_path, "/boot.catalog");
if(xorriso->boot_image_bin_path[0]) {
ret= Xorriso_genisofs_add_boot(xorriso, whom, &option_b, &no_emul_boot, 0);
if(ret <= 0)
goto ex;
}
/* The boot catalog has to be hidden separately */
if(xorriso->boot_image_cat_path[0]) {
ret= Xorriso_path_is_hidden(xorriso, xorriso->boot_image_cat_path, 0);
if(ret > 0)
xorriso->boot_image_cat_hidden|= ret;
else if(ret < 0)
was_failure= 1;
}
ret= !was_failure;
ex:;
@ -1238,8 +1366,8 @@ ex:;
Xorriso_option_rollback(xorriso, 0);
if(weight_list != NULL)
free(weight_list);
if(boot_opt_list != NULL)
free(boot_opt_list);
if(delay_opt_list != NULL)
free(delay_opt_list);
return(ret);
}