New -as mkisofs options -hide, -hide-joliet, -hide-list, -hide-joliet-list
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user