Preparations for ISO/HFS+ hybrid images by Vladimir Serbinenko

This commit is contained in:
Thomas Schmitt 2012-05-24 07:13:20 +00:00
parent b6857855f5
commit 4f90dad64b
18 changed files with 218 additions and 67 deletions

View File

@ -188,6 +188,7 @@ Xorriso_option_gid;
Xorriso_option_grow_blindly; Xorriso_option_grow_blindly;
Xorriso_option_hardlinks; Xorriso_option_hardlinks;
Xorriso_option_help; Xorriso_option_help;
Xorriso_option_hfsplus;
Xorriso_option_hide; Xorriso_option_hide;
Xorriso_option_history; Xorriso_option_history;
Xorriso_option_iso_rr_pattern; Xorriso_option_iso_rr_pattern;

View File

@ -134,6 +134,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
m->ino_behavior= 7; m->ino_behavior= 7;
m->iso_level= 3; m->iso_level= 3;
m->do_joliet= 0; m->do_joliet= 0;
m->do_hfsplus= 0;
m->do_rockridge= 1; m->do_rockridge= 1;
m->do_iso1999= 0; m->do_iso1999= 0;
m->do_aaip= 0; m->do_aaip= 0;
@ -291,6 +292,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
m->disk_exclusions= NULL; m->disk_exclusions= NULL;
m->iso_rr_hidings= NULL; m->iso_rr_hidings= NULL;
m->joliet_hidings= NULL; m->joliet_hidings= NULL;
m->hfsplus_hidings= NULL;
m->disk_excl_mode= 1; m->disk_excl_mode= 1;
m->use_stdin= 0; m->use_stdin= 0;
m->result_page_length= 0; m->result_page_length= 0;
@ -414,6 +416,9 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
if(ret<=0) if(ret<=0)
goto failure; goto failure;
ret= Exclusions_new(&(m->joliet_hidings), 0); ret= Exclusions_new(&(m->joliet_hidings), 0);
if(ret<=0)
goto failure;
ret= Exclusions_new(&(m->hfsplus_hidings), 0);
if(ret<=0) if(ret<=0)
goto failure; goto failure;
Xorriso_relax_compliance(m, "default", 0); Xorriso_relax_compliance(m, "default", 0);
@ -482,6 +487,7 @@ int Xorriso_destroy(struct XorrisO **xorriso, int flag)
Exclusions_destroy(&(m->disk_exclusions), 0); Exclusions_destroy(&(m->disk_exclusions), 0);
Exclusions_destroy(&(m->iso_rr_hidings), 0); Exclusions_destroy(&(m->iso_rr_hidings), 0);
Exclusions_destroy(&(m->joliet_hidings), 0); Exclusions_destroy(&(m->joliet_hidings), 0);
Exclusions_destroy(&(m->hfsplus_hidings), 0);
Xorriso_destroy_all_extf(m, 0); Xorriso_destroy_all_extf(m, 0);
Xorriso_lst_destroy_all(&(m->drive_blacklist), 0); Xorriso_lst_destroy_all(&(m->drive_blacklist), 0);
Xorriso_lst_destroy_all(&(m->drive_greylist), 0); Xorriso_lst_destroy_all(&(m->drive_greylist), 0);

View File

@ -92,6 +92,7 @@ libisofs="$libisofs $isofs"fsource.o
libisofs="$libisofs $isofs"image.o libisofs="$libisofs $isofs"image.o
libisofs="$libisofs $isofs"iso1999.o libisofs="$libisofs $isofs"iso1999.o
libisofs="$libisofs $isofs"joliet.o libisofs="$libisofs $isofs"joliet.o
libisofs="$libisofs $isofs"hfsplus.o
libisofs="$libisofs $isofs"libiso_msgs.o libisofs="$libisofs $isofs"libiso_msgs.o
libisofs="$libisofs $isofs"messages.o libisofs="$libisofs $isofs"messages.o
libisofs="$libisofs $isofs"node.o libisofs="$libisofs $isofs"node.o

View File

@ -1,7 +1,7 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images. /* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net> Copyright 2007-2012 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
@ -573,7 +573,10 @@ ex:;
/* @param flag bit1= add '+' to perms /* @param flag bit1= add '+' to perms
bit2-3: hidden_state : 0=off, 1=iso_rr, 2=joliet= 3=on bit2-7: hidden_state :
bit2= hide in ISO/RR
bit3= hide in Joliet
bit4= hide in HFS+
*/ */
int Xorriso__mode_to_perms(mode_t st_mode, char perms[11], int flag) int Xorriso__mode_to_perms(mode_t st_mode, char perms[11], int flag)
{ {
@ -607,12 +610,15 @@ int Xorriso__mode_to_perms(mode_t st_mode, char perms[11], int flag)
else else
perms[8]= 'T'; perms[8]= 'T';
} }
hidden_state= (flag >> 2) & 3;
hidden_state= (flag >> 2) & 63;
if(hidden_state == 1) if(hidden_state == 1)
perms[9]= 'I'; perms[9]= 'I';
else if(hidden_state == 2) else if(hidden_state == 2)
perms[9]= 'J'; perms[9]= 'J';
else if(hidden_state == 3) else if(hidden_state == 4)
perms[9]= 'A';
else if(hidden_state)
perms[9]= 'H'; perms[9]= 'H';
if(flag & 2) { if(flag & 2) {
if(hidden_state) if(hidden_state)
@ -626,7 +632,10 @@ int Xorriso__mode_to_perms(mode_t st_mode, char perms[11], int flag)
/* @param flag bit0= recognize Xorriso_IFBOOT as file type /* @param flag bit0= recognize Xorriso_IFBOOT as file type
bit1= add '+' to perms bit1= add '+' to perms
bit2-3: hidden_state : 0=off, 1=iso_rr, 2=joliet= 3=on bit2-7: hidden_state :
bit2= hide in ISO/RR
bit3= hide in Joliet
bit4= hide in HFS+
*/ */
int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag) int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag)
{ {
@ -660,7 +669,7 @@ int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag)
else else
strcat(rpt, "?"); strcat(rpt, "?");
Xorriso__mode_to_perms(st_mode, perms, flag & (2 | 12)); Xorriso__mode_to_perms(st_mode, perms, flag & (2 | 252));
strcat(rpt, perms); strcat(rpt, perms);
sprintf(rpt+strlen(rpt)," %3u ",(unsigned int) stbuf->st_nlink); sprintf(rpt+strlen(rpt)," %3u ",(unsigned int) stbuf->st_nlink);

View File

@ -575,7 +575,7 @@ int Xorriso_genisofs_count_args(struct XorrisO *xorriso, int argc, char **argv,
"--protective-msdos-label", "--boot-catalog-hide", "--no-emul-toc", "--protective-msdos-label", "--boot-catalog-hide", "--no-emul-toc",
"--emul-toc", "-disallow_dir_id_ext", "--old-empty", "--emul-toc", "-disallow_dir_id_ext", "--old-empty",
"--old-root-no-md5", "--old-root-devno", "--old-root-no-ino", "--old-root-no-md5", "--old-root-devno", "--old-root-no-ino",
"--no_rc", "--norock" "--no_rc", "--norock", "-hfsplus",
"" ""
}; };
static char arg1_options[][41]= { static char arg1_options[][41]= {
@ -583,6 +583,7 @@ int Xorriso_genisofs_count_args(struct XorrisO *xorriso, int argc, char **argv,
"-boot-load-size", "-C", "-c", "-check-session", "-copyright", "-boot-load-size", "-C", "-c", "-check-session", "-copyright",
"-dir-mode", "-file-mode", "-G", "-gid", "-hide", "-hide-list", "-dir-mode", "-file-mode", "-G", "-gid", "-hide", "-hide-list",
"-hidden", "-hidden-list", "-hide-joliet", "-hide-joliet-list", "-hidden", "-hidden-list", "-hide-joliet", "-hide-joliet-list",
"-hide-hfsplus", "-hide-hfsplus-list",
"-hide-udf", "-hide-udf-list", "-input-charset", "-output-charset", "-hide-udf", "-hide-udf-list", "-input-charset", "-output-charset",
"-iso-level", "-jcharset", "-log-file", "-m", "-exclude-list", "-M", "-iso-level", "-jcharset", "-log-file", "-m", "-exclude-list", "-M",
"-dev", "-new-dir-mode", "-o", "-p", "-preparer", "-dev", "-new-dir-mode", "-o", "-p", "-preparer",
@ -723,6 +724,17 @@ int Xorriso_genisofs_help(struct XorrisO *xorriso, int flag)
" -hide-list FILE File with list of ISO9660/RR files to hide", " -hide-list FILE File with list of ISO9660/RR files to hide",
" -hide-joliet GLOBFILE Hide Joliet file", " -hide-joliet GLOBFILE Hide Joliet file",
" -hide-joliet-list FILE File with list of Joliet files to hide", " -hide-joliet-list FILE File with list of Joliet files to hide",
#ifdef Xorriso_with_hfspluS
/* >>> ts B20523 : To be activated when HFS+ works */
" -hide-hfsplus GLOBFILE Hide HFS+ file",
" -hide-hfsplus-list FILE File with list of HFS+ files to hide",
" -hfsplus Generate HFS+ filesystem",
#endif
" -input-charset CHARSET Local input charset for file name conversion", " -input-charset CHARSET Local input charset for file name conversion",
" -output-charset CHARSET Output charset for file name conversion", " -output-charset CHARSET Output charset for file name conversion",
" -iso-level LEVEL Set ISO9660 conformance level (1..3) or 4 for ISO9660 version 2", " -iso-level LEVEL Set ISO9660 conformance level (1..3) or 4 for ISO9660 version 2",
@ -860,6 +872,11 @@ int Xorriso_genisofs_help(struct XorrisO *xorriso, int flag)
mkisofs pathspec would matter (e.g. "./" versus ""). mkisofs pathspec would matter (e.g. "./" versus "").
But xorriso normalizes disk_paths before further processing. Thus But xorriso normalizes disk_paths before further processing. Thus
the literal form does not matter. the literal form does not matter.
@param hide_attrs
bit0= hide in ISO/RR
bit1= hide in Joliet
bit2= hide in HFS+
bit3 to bit5 are reserved for future hidings
*/ */
int Xorriso_genisofs_hide(struct XorrisO *xorriso, char *whom, int Xorriso_genisofs_hide(struct XorrisO *xorriso, char *whom,
char *pattern, int hide_attrs, int flag) char *pattern, int hide_attrs, int flag)
@ -867,14 +884,15 @@ int Xorriso_genisofs_hide(struct XorrisO *xorriso, char *whom,
int zero= 0, ret; int zero= 0, ret;
char *argv[1]; char *argv[1];
if((hide_attrs & 3) == 0) if((hide_attrs & 63) == 0)
return(2); return(2);
if(strchr(pattern, '/') != NULL) { if(strchr(pattern, '/') != NULL) {
argv[0]= pattern; argv[0]= pattern;
ret= Xorriso_option_not_paths(xorriso, 1, argv, &zero, ret= Xorriso_option_not_paths(xorriso, 1, argv, &zero,
4 | (hide_attrs & 3)); 4 | ((hide_attrs & 63) << 8));
} else { } else {
ret= Xorriso_option_not_leaf(xorriso, pattern, hide_attrs & 3); ret= Xorriso_option_not_leaf(xorriso, pattern, hide_attrs & 63);
} }
return(ret); return(ret);
} }
@ -885,13 +903,16 @@ int Xorriso_genisofs_hide_list(struct XorrisO *xorriso, char *whom,
char *adr, int hide_attrs, int flag) char *adr, int hide_attrs, int flag)
{ {
int ret, linecount= 0, argc= 0, was_failure= 0, i, fret; int ret, linecount= 0, argc= 0, was_failure= 0, i, fret;
char **argv= NULL; char **argv= NULL, *id= "";
FILE *fp= NULL; FILE *fp= NULL;
if(adr[0]==0) { if(adr[0]==0) {
if (hide_attrs & 2)
id = "joliet-";
else if (hide_attrs & 4)
id = "hfsplus-";
sprintf(xorriso->info_text, sprintf(xorriso->info_text,
"Empty file name given with -as %s -hide-%slist", "Empty file name given with -as %s -hide-%slist", whom, id);
whom, hide_attrs == 1 ? "" : "joliet-");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
return(0); return(0);
} }
@ -1232,7 +1253,9 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
} else if(strcmp(argpt, "-hide") == 0 || } else if(strcmp(argpt, "-hide") == 0 ||
strcmp(argpt, "-hide-list") == 0 || strcmp(argpt, "-hide-list") == 0 ||
strcmp(argpt, "-hide-joliet") == 0 || strcmp(argpt, "-hide-joliet") == 0 ||
strcmp(argpt, "-hide-joliet-list") == 0) { strcmp(argpt, "-hide-joliet-list") == 0 ||
strcmp(argpt, "-hide-hfsplus") == 0 ||
strcmp(argpt, "-hide-hfsplus-list") == 0) {
if(i+1>=argc) if(i+1>=argc)
goto not_enough_args; goto not_enough_args;
i++; i++;
@ -1244,6 +1267,10 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
ret= Xorriso_genisofs_hide(xorriso, whom, argv[i], 2, 0); ret= Xorriso_genisofs_hide(xorriso, whom, argv[i], 2, 0);
else if(strcmp(argpt, "-hide-joliet-list") == 0) else if(strcmp(argpt, "-hide-joliet-list") == 0)
ret= Xorriso_genisofs_hide_list(xorriso, whom, argv[i], 2, 0); ret= Xorriso_genisofs_hide_list(xorriso, whom, argv[i], 2, 0);
else if(strcmp(argpt, "-hide-hfsplus") == 0)
ret= Xorriso_genisofs_hide(xorriso, whom, argv[i], 4, 0);
else if(strcmp(argpt, "-hide-hfsplus-list") == 0)
ret= Xorriso_genisofs_hide_list(xorriso, whom, argv[i], 4, 0);
if(ret <= 0) if(ret <= 0)
goto problem_handler_1; goto problem_handler_1;
@ -1477,6 +1504,8 @@ illegal_c:;
} else if(strcmp(argpt, "-joliet-long")==0) { } else if(strcmp(argpt, "-joliet-long")==0) {
Xorriso_relax_compliance(xorriso, Xorriso_relax_compliance(xorriso,
"joliet_long_paths:joliet_long_names", 0); "joliet_long_paths:joliet_long_names", 0);
} else if(strcmp(argpt, "-hfsplus")==0) {
xorriso->do_hfsplus= 1;
} else if(strcmp(argpt, "-graft-points")==0) { } else if(strcmp(argpt, "-graft-points")==0) {
xorriso->allow_graft_points= 1; xorriso->allow_graft_points= 1;
} else if(strcmp(argpt, "-path-list")==0 || } else if(strcmp(argpt, "-path-list")==0 ||
@ -1686,7 +1715,9 @@ not_enough_args:;
} else if(strcmp(argpt, "-hide") == 0 || } else if(strcmp(argpt, "-hide") == 0 ||
strcmp(argpt, "-hide-list") == 0 || strcmp(argpt, "-hide-list") == 0 ||
strcmp(argpt, "-hide-joliet") == 0 || strcmp(argpt, "-hide-joliet") == 0 ||
strcmp(argpt, "-hide-joliet-list") == 0) { strcmp(argpt, "-hide-joliet-list") == 0 ||
strcmp(argpt, "-hide-hfsplus") == 0 ||
strcmp(argpt, "-hide-hfsplus-list") == 0) {
if(i+1>=argc) if(i+1>=argc)
goto not_enough_args; goto not_enough_args;
i++; i++;

View File

@ -588,8 +588,10 @@ no_image:;
} }
if(bin_path_in_use) { if(bin_path_in_use) {
is_default= !xorriso->boot_image_cat_hidden; is_default= !xorriso->boot_image_cat_hidden;
hpt= Xorriso__hide_mode_text(xorriso->boot_image_cat_hidden & 3, 0); hpt= Xorriso__hide_mode_text(xorriso->boot_image_cat_hidden & 63, 0);
sprintf(line, "-boot_image %s cat_hidden=%s\n", form, hpt); if(hpt != NULL)
sprintf(line, "-boot_image %s cat_hidden=%s\n", form, hpt);
Xorriso_free_meM(hpt);
if(!(is_default && no_defaults)) if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2); Xorriso_status_result(xorriso,filter,fp,flag&2);
} }

View File

@ -2242,6 +2242,8 @@ int Xorriso_set_hidden(struct XorrisO *xorriso, void *in_node, char *path,
hide_attrs|= LIBISO_HIDE_ON_RR; hide_attrs|= LIBISO_HIDE_ON_RR;
if(hide_state & 2) if(hide_state & 2)
hide_attrs|= LIBISO_HIDE_ON_JOLIET; hide_attrs|= LIBISO_HIDE_ON_JOLIET;
if(hide_state & 4)
hide_attrs|= LIBISO_HIDE_ON_HFSPLUS;
} }
iso_node_set_hidden(node, hide_attrs); iso_node_set_hidden(node, hide_attrs);
return(1); return(1);
@ -2780,19 +2782,16 @@ return:
value= !! Exprtest_match_disk_name(xorriso, ftest, node, 0); value= !! Exprtest_match_disk_name(xorriso, ftest, node, 0);
break; case 17: /* -hidden int *arg1 */ break; case 17: /* -hidden int *arg1 */
value= 0; value= 1;
ret= iso_node_get_hidden(node); ret= iso_node_get_hidden(node);
mask= *((int *) arg1) & 3; mask= *((int *) arg1) & 3;
if(mask == 0 && !(ret & (LIBISO_HIDE_ON_RR | LIBISO_HIDE_ON_JOLIET))) if((!!(mask & 1)) ^ (!!(ret & LIBISO_HIDE_ON_RR)))
value= 1; value= 0;
else if(mask == 1 && (ret & LIBISO_HIDE_ON_RR)) if((!!(mask & 2)) ^ (!!(ret & LIBISO_HIDE_ON_JOLIET)))
value= 1; value= 0;
else if(mask == 2 && (ret & LIBISO_HIDE_ON_JOLIET)) if((!!(mask & 3)) ^ (!!(ret & LIBISO_HIDE_ON_HFSPLUS)))
value= 1; value= 0;
else if(mask == 3 && (ret & LIBISO_HIDE_ON_RR) &&
(ret & LIBISO_HIDE_ON_JOLIET))
value= 1;
break; default: break; default:
/* >>> complain about unknown test type */; /* >>> complain about unknown test type */;

View File

@ -1533,12 +1533,14 @@ int Xorriso_node_eff_hidden(struct XorrisO *xorriso, IsoNode *node, int flag)
IsoNode *current, *parent; IsoNode *current, *parent;
current= node; current= node;
for(current= node; hidden_state != 3;) { for(current= node; hidden_state != 7;) {
ret= iso_node_get_hidden(current); ret= iso_node_get_hidden(current);
if(ret & LIBISO_HIDE_ON_RR) if(ret & LIBISO_HIDE_ON_RR)
hidden_state|= 1; hidden_state|= 1;
if(ret & LIBISO_HIDE_ON_JOLIET) if(ret & LIBISO_HIDE_ON_JOLIET)
hidden_state|= 2; hidden_state|= 2;
if(ret & LIBISO_HIDE_ON_HFSPLUS)
hidden_state|= 4;
parent= (IsoNode *) iso_node_get_parent(current); parent= (IsoNode *) iso_node_get_parent(current);
if(parent == current) if(parent == current)
break; break;

View File

@ -1213,31 +1213,58 @@ int Xorriso__bourne_to_reg(char bourne_expr[], char reg_expr[], int flag)
int Xorriso__hide_mode(char *mode, int flag) int Xorriso__hide_mode(char *mode, int flag)
{ {
if(strcmp(mode, "on") == 0) char *npt, *cpt;
return(1 | 2); int l, value= 0;
else if(strcmp(mode, "iso_rr") == 0)
return(1); npt= cpt= mode;
else if(strcmp(mode, "joliet") == 0) for(; npt!=NULL; cpt= npt+1) {
return(2); npt= strchr(cpt,':');
else if(strcmp(mode, "off") == 0) if(npt==NULL)
return(0); l= strlen(cpt);
return(-1); else
l= npt-cpt;
if(l == 0)
continue;
if(l == 2 && strncmp(cpt, "on", l) == 0)
value= 1 | 2 | 4;
else if(l == 6 && strncmp(cpt, "iso_rr", l) == 0)
value |= 1;
else if(l == 6 && strncmp(cpt, "joliet", l) == 0)
value |= 2;
else if(l == 7 && strncmp(cpt, "hfsplus", l) == 0)
value |= 4;
else if(l == 3 && strncmp(cpt, "off", l) == 0)
value= 0;
else
return(-1);
}
return(value);
} }
char *Xorriso__hide_mode_text(int hide_mode, int flag) char *Xorriso__hide_mode_text(int hide_mode, int flag)
{ {
switch(hide_mode & 3) { char *acc= NULL;
case 0:
return "off"; acc = calloc(1, 80);
case 1: if(acc == NULL)
return "iso_rr"; return(NULL);
case 2: acc[0]= 0;
return "joliet"; if(hide_mode == 0) {
case 3: strcat(acc, "off:");
return "on"; } else if(hide_mode == 7) {
strcat(acc, "on:");
} else {
if(hide_mode & 1)
strcat(acc, "iso_rr:");
if(hide_mode & 2)
strcat(acc, "joliet:");
if(hide_mode & 4)
strcat(acc, "hfsplus:");
} }
return "invalid"; if(acc[0])
acc[strlen(acc) - 1]= 0; /* cut off last colon */
return acc;
} }

View File

@ -2096,6 +2096,22 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
} }
/* Option -hfsplus "on"|"off" */
int Xorriso_option_hfsplus(struct XorrisO *xorriso, char *mode, int flag)
{
if(strcmp(mode, "off")==0)
xorriso->do_hfsplus= 0;
else if(strcmp(mode, "on")==0)
xorriso->do_hfsplus= 1;
else {
sprintf(xorriso->info_text, "-hfsplus: unknown mode '%s'", mode);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
return(1);
}
/* Option -hide */ /* Option -hide */
int Xorriso_option_hide(struct XorrisO *xorriso, char *hide_state, int Xorriso_option_hide(struct XorrisO *xorriso, char *hide_state,
int argc, char **argv, int *idx, int flag) int argc, char **argv, int *idx, int flag)

View File

@ -886,8 +886,10 @@ int Xorriso_option_no_rc(struct XorrisO *xorriso, int flag)
/* Option -not_leaf , (-hide_disk_leaf resp. -as mkisofs -hide) */ /* Option -not_leaf , (-hide_disk_leaf resp. -as mkisofs -hide) */
/* @param flag bit0= add to iso_rr_hidings rather than disk_exclusions /* @param flag bit0-bit5= hide rather than adding to disk_exclusions
bit1= add to joliet_hidings rather than disk_exclusions bit0= add to iso_rr_hidings
bit1= add to joliet_hidings
bit2= add to hfsplus_hidings
*/ */
int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag) int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag)
{ {
@ -902,7 +904,7 @@ int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag)
Xorriso__bourne_to_reg(pattern, regexpr, 0); Xorriso__bourne_to_reg(pattern, regexpr, 0);
if(regcomp(&re, regexpr, 0)!=0) if(regcomp(&re, regexpr, 0)!=0)
{ret= 0; goto cannot_add;} {ret= 0; goto cannot_add;}
if(flag & 3) { if(flag & 63) {
if(flag & 1) { if(flag & 1) {
ret= Exclusions_add_not_leafs(xorriso->iso_rr_hidings, pattern, &re, 0); ret= Exclusions_add_not_leafs(xorriso->iso_rr_hidings, pattern, &re, 0);
if(ret<=0) if(ret<=0)
@ -913,6 +915,11 @@ int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag)
if(ret<=0) if(ret<=0)
goto cannot_add; goto cannot_add;
} }
if(flag & 4) {
ret= Exclusions_add_not_leafs(xorriso->hfsplus_hidings, pattern, &re, 0);
if(ret<=0)
goto cannot_add;
}
} else { } else {
ret= Exclusions_add_not_leafs(xorriso->disk_exclusions, pattern, &re, 0); ret= Exclusions_add_not_leafs(xorriso->disk_exclusions, pattern, &re, 0);
} }
@ -1054,13 +1061,16 @@ ex:;
/* @param flag bit0= add to iso_rr_hidings rather than disk_exclusions /* @param flag bit0= add to iso_rr_hidings rather than disk_exclusions
bit1= add to joliet_hidings rather than disk_exclusions bit1= add to joliet_hidings rather than disk_exclusions
bit2= enable disk pattern expansion regardless of -disk_pattern bit2= enable disk pattern expansion regardless of -disk_pattern
bit8-13= consolidated hide state bits, duplicating bit0-1
bit8= add to iso_rr_hidings
bit9= add to joliet_hidings
bit10= add to hfsplus_hidings
*/ */
int Xorriso_option_not_paths(struct XorrisO *xorriso, int argc, char **argv, int Xorriso_option_not_paths(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag) int *idx, int flag)
{ {
int ret, end_idx, num_descr= 0, dummy, optc= 0, i; int ret, end_idx, num_descr= 0, dummy, optc= 0, i;
char **descr= NULL, **optv= NULL, *eff_path= NULL; char **descr= NULL, **optv= NULL, *eff_path= NULL, *hpt= NULL;
end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx, end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx,
(xorriso->do_disk_pattern == 1 || (flag & 4)) | 2); (xorriso->do_disk_pattern == 1 || (flag & 4)) | 2);
@ -1091,20 +1101,23 @@ no_memory:;
goto no_memory; goto no_memory;
} }
ret= Xorriso_opt_args(xorriso, (flag & 3) ? "-hide_disk_paths" : "-not_paths", ret= Xorriso_opt_args(xorriso,
(flag & 0x3f03) ? "-hide_disk_paths" : "-not_paths",
num_descr, descr, 0, &dummy, &optc, &optv, num_descr, descr, 0, &dummy, &optc, &optv,
2 | ((flag & 4) << 7)); 2 | ((flag & 4) << 7));
if(ret<=0) if(ret<=0)
goto ex; goto ex;
if(flag & 3) { if(flag & 0x3f03) {
if(flag & 1) { if(flag & 0x0101) {
ret= Exclusions_add_not_paths(xorriso->iso_rr_hidings, ret= Exclusions_add_not_paths(xorriso->iso_rr_hidings,
num_descr, descr, optc, optv, 0); num_descr, descr, optc, optv, 0);
if(ret<=0) { if(ret<=0) {
no_hide:; no_hide:;
sprintf(xorriso->info_text, sprintf(xorriso->info_text, "Cannot add path list: -hide_disk_paths ");
"Cannot add path list: -hide_disk_paths %s ", hpt= Xorriso__hide_mode_text(flag & 0x3f03, 0);
Xorriso__hide_mode_text(flag & 3, 0)); if(hpt != NULL)
sprintf(xorriso->info_text + strlen(xorriso->info_text), "%s ", hpt);
Xorriso_free_meM(hpt);
Text_shellsafe(argv[*idx], xorriso->info_text, 1); Text_shellsafe(argv[*idx], xorriso->info_text, 1);
strcat(xorriso->info_text, num_descr > 1 ? " ... " : " "); strcat(xorriso->info_text, num_descr > 1 ? " ... " : " ");
strcat(xorriso->info_text, xorriso->list_delimiter); strcat(xorriso->info_text, xorriso->list_delimiter);
@ -1112,12 +1125,18 @@ no_hide:;
goto ex; goto ex;
} }
} }
if(flag & 2) { if(flag & 0x0202) {
ret= Exclusions_add_not_paths(xorriso->joliet_hidings, ret= Exclusions_add_not_paths(xorriso->joliet_hidings,
num_descr, descr, optc, optv, 0); num_descr, descr, optc, optv, 0);
if(ret<=0) if(ret<=0)
goto no_hide; goto no_hide;
} }
if(flag & 0x0400) {
ret= Exclusions_add_not_paths(xorriso->hfsplus_hidings,
num_descr, descr, optc, optv, 0);
if(ret<=0)
goto no_hide;
}
} else { } else {
ret= Exclusions_add_not_paths(xorriso->disk_exclusions, ret= Exclusions_add_not_paths(xorriso->disk_exclusions,
num_descr, descr, optc, optv, 0); num_descr, descr, optc, optv, 0);

View File

@ -466,14 +466,15 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv,
"dev","dialog","disk_dev_ino","disk_pattern","displacement", "dev","dialog","disk_dev_ino","disk_pattern","displacement",
"dummy","dvd_obs","early_stdio_test", "eject", "dummy","dvd_obs","early_stdio_test", "eject",
"iso_rr_pattern","follow","format","fs","gid","grow_blindly","hardlinks", "iso_rr_pattern","follow","format","fs","gid","grow_blindly","hardlinks",
"history","indev","in_charset","joliet", "hfsplus","history","indev","in_charset","joliet",
"list_delimiter","list_extras","list_profiles","local_charset", "list_delimiter","list_extras","list_profiles","local_charset",
"mark","md5","mount_opts","not_leaf","not_list","not_mgt", "mark","md5","mount_opts","not_leaf","not_list","not_mgt",
"options_from_file","osirrox","outdev","out_charset","overwrite", "options_from_file","osirrox","outdev","out_charset","overwrite",
"pacifier","padding","path_list","pathspecs","pkt_output", "pacifier","padding","path_list","pathspecs","pkt_output",
"preparer_id","print","print_info","print_mark","prompt", "preparer_id","print","print_info","print_mark","prompt",
"prog","prog_help","publisher","quoted_not_list","quoted_path_list", "prog","prog_help","publisher","quoted_not_list","quoted_path_list",
"reassure","report_about","rom_toc_scan","rr_reloc_dir","scsi_log", "reassure","report_about","rockridge",
"rom_toc_scan","rr_reloc_dir","scsi_log",
"session_log","signal_handling","sleep", "session_log","signal_handling","sleep",
"speed","split_size","status","status_history_max", "speed","split_size","status","status_history_max",
"stdio_sync","stream_recording","system_id","temp_mem_limit", "stdio_sync","stream_recording","system_id","temp_mem_limit",
@ -659,7 +660,8 @@ int Xorriso_cmd_sorting_rank(struct XorrisO *xorriso,
"mount", "mount",
"* Settings for result writing:", "* Settings for result writing:",
"joliet", "compliance", "rr_reloc_dir", "volid", "volset_id", "publisher", "joliet", "hfsplus","compliance", "rr_reloc_dir",
"volid", "volset_id", "publisher",
"application_id", "system_id", "volume_date", "copyright_file", "application_id", "system_id", "volume_date", "copyright_file",
"abstract_file", "biblio_file", "preparer_id", "out_charset", "abstract_file", "biblio_file", "preparer_id", "out_charset",
"read_mkisofsrc", "read_mkisofsrc",
@ -1270,6 +1272,10 @@ next_command:;
(*idx)++; (*idx)++;
ret= Xorriso_option_hardlinks(xorriso, arg1, 0); ret= Xorriso_option_hardlinks(xorriso, arg1, 0);
} else if(strcmp(cmd,"hfsplus")==0) {
(*idx)++;
ret= Xorriso_option_hfsplus(xorriso, arg1, 0);
} else if(strcmp(cmd,"help")==0) { } else if(strcmp(cmd,"help")==0) {
Xorriso_option_help(xorriso,0); Xorriso_option_help(xorriso,0);
@ -1549,6 +1555,10 @@ next_command:;
} else if(strcmp(cmd,"rmdir")==0 || strcmp(cmd,"rmdiri")==0) { } else if(strcmp(cmd,"rmdir")==0 || strcmp(cmd,"rmdiri")==0) {
ret= Xorriso_option_rmi(xorriso, argc, argv, idx, 2); ret= Xorriso_option_rmi(xorriso, argc, argv, idx, 2);
} else if(strcmp(cmd, "rockridge") == 0) {
(*idx)++;
ret= Xorriso_option_rockridge(xorriso, arg1, 0);
} else if(strcmp(cmd,"rollback")==0) { } else if(strcmp(cmd,"rollback")==0) {
ret= Xorriso_option_rollback(xorriso, 0); ret= Xorriso_option_rollback(xorriso, 0);
@ -2529,6 +2539,11 @@ failure:;
goto failure; goto failure;
if(ret > 0) if(ret > 0)
hide_attrs|= 2; hide_attrs|= 2;
ret= Exclusions_match(xorriso->hfsplus_hidings, path, 0);
if(ret < 0)
goto failure;
if(ret > 0)
hide_attrs|= 4;
return(hide_attrs); return(hide_attrs);
} }

View File

@ -1,7 +1,7 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images. /* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net> Copyright 2007-2012 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
@ -1573,6 +1573,11 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
if(!(is_default && no_defaults)) if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2); Xorriso_status_result(xorriso,filter,fp,flag&2);
is_default= (xorriso->do_hfsplus == 0);
sprintf(line,"-hfsplus %s\n", (xorriso->do_hfsplus == 1 ? "on" : "off"));
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
Xorriso_lst_get_last(xorriso->jigdo_params, &plst, 0); Xorriso_lst_get_last(xorriso->jigdo_params, &plst, 0);
Xorriso_lst_get_last(xorriso->jigdo_values, &vlst, 0); Xorriso_lst_get_last(xorriso->jigdo_values, &vlst, 0);
if(plst == NULL || vlst == NULL) { if(plst == NULL || vlst == NULL) {

View File

@ -753,6 +753,8 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
hide_attr|= LIBISO_HIDE_ON_RR; hide_attr|= LIBISO_HIDE_ON_RR;
if(xorriso->boot_image_cat_hidden & 2) if(xorriso->boot_image_cat_hidden & 2)
hide_attr|= LIBISO_HIDE_ON_JOLIET; hide_attr|= LIBISO_HIDE_ON_JOLIET;
if(xorriso->boot_image_cat_hidden & 4)
hide_attr|= LIBISO_HIDE_ON_HFSPLUS;
iso_image_set_boot_catalog_hidden(image, hide_attr); iso_image_set_boot_catalog_hidden(image, hide_attr);
} else if(xorriso->patch_isolinux_image & 1) { } else if(xorriso->patch_isolinux_image & 1) {
if(is_bootable == 1) { if(is_bootable == 1) {
@ -808,8 +810,9 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
} }
isoburn_igopt_set_level(sopts, xorriso->iso_level); isoburn_igopt_set_level(sopts, xorriso->iso_level);
ext= isoburn_igopt_rockridge | ext= ((!!xorriso->do_rockridge) * isoburn_igopt_rockridge) |
((!!xorriso->do_joliet) * isoburn_igopt_joliet) | ((!!xorriso->do_joliet) * isoburn_igopt_joliet) |
((!!xorriso->do_hfsplus) * isoburn_igopt_hfsplus) |
((!!xorriso->do_iso1999) * isoburn_igopt_iso1999) | ((!!xorriso->do_iso1999) * isoburn_igopt_iso1999) |
(( !(xorriso->ino_behavior & 2)) * isoburn_igopt_hardlinks) | (( !(xorriso->ino_behavior & 2)) * isoburn_igopt_hardlinks) |
(( (!(xorriso->ino_behavior & 2)) || (( (!(xorriso->ino_behavior & 2)) ||

View File

@ -930,6 +930,9 @@ int Xorriso_option_hardlinks(struct XorrisO *xorriso, char *mode, int flag);
/* Command -help and part of -prog_help */ /* Command -help and part of -prog_help */
int Xorriso_option_help(struct XorrisO *xorriso, int flag); int Xorriso_option_help(struct XorrisO *xorriso, int flag);
/* Option -hfsplus "on"|"off" */
int Xorriso_option_hfsplus(struct XorrisO *xorriso, char *mode, int flag);
/* Command -hide */ /* Command -hide */
/* @since 0.6.0 */ /* @since 0.6.0 */
int Xorriso_option_hide(struct XorrisO *xorriso, char *hide_state, int Xorriso_option_hide(struct XorrisO *xorriso, char *hide_state,
@ -1053,6 +1056,8 @@ int Xorriso_option_no_rc(struct XorrisO *xorriso, int flag);
@since 0.6.0 @since 0.6.0
bit1= add to joliet hide list rather than disk exclusions bit1= add to joliet hide list rather than disk exclusions
@since 0.6.0 @since 0.6.0
bit2= add to HFS+ hide list rather than disk exclusions
@since 1.2.4
*/ */
int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag); int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag);
@ -1069,6 +1074,11 @@ int Xorriso_option_not_mgt(struct XorrisO *xorriso, char *setting, int flag);
bit1= add to joliet hide list rather than disk exclusions bit1= add to joliet hide list rather than disk exclusions
@since 0.6.0 @since 0.6.0
bit2= enable disk pattern expansion regardless of -disk_pattern bit2= enable disk pattern expansion regardless of -disk_pattern
bit8-13= consolidated hide state bits, duplicating bit0-1
@since 1.2.4
bit8= add to iso_rr_hidings, same as bit0
bit9= add to joliet_hidings, same as bit1
bit10= add to hfsplus_hidings
*/ */
int Xorriso_option_not_paths(struct XorrisO *xorriso, int argc, char **argv, int Xorriso_option_not_paths(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag); int *idx, int flag);

View File

@ -136,6 +136,8 @@ xorriso_xorriso_SOURCES = \
libisofs/rockridge_read.c \ libisofs/rockridge_read.c \
libisofs/joliet.h \ libisofs/joliet.h \
libisofs/joliet.c \ libisofs/joliet.c \
libisofs/hfsplus.h \
libisofs/hfsplus.c \
libisofs/eltorito.h \ libisofs/eltorito.h \
libisofs/eltorito.c \ libisofs/eltorito.c \
libisofs/data_source.c \ libisofs/data_source.c \

View File

@ -133,6 +133,7 @@ struct XorrisO { /* the global context of xorriso */
int iso_level; int iso_level;
int do_joliet; int do_joliet;
int do_hfsplus;
int do_rockridge; int do_rockridge;
int do_iso1999; int do_iso1999;
@ -337,7 +338,8 @@ struct XorrisO { /* the global context of xorriso */
int keep_boot_image; int keep_boot_image;
char boot_image_cat_path[SfileadrL]; char boot_image_cat_path[SfileadrL];
int boot_image_cat_hidden; /* bit0= hidden in ISO/RR , bit1= in Joliet */ int boot_image_cat_hidden; /* bit0= hidden in ISO/RR , bit1= in Joliet ,
bit2= in HFS+ */
int boot_count; /* number of already attached boot images */ int boot_count; /* number of already attached boot images */
char boot_image_bin_path[SfileadrL]; char boot_image_bin_path[SfileadrL];
@ -506,6 +508,7 @@ struct XorrisO { /* the global context of xorriso */
struct ExclusionS *iso_rr_hidings; struct ExclusionS *iso_rr_hidings;
struct ExclusionS *joliet_hidings; struct ExclusionS *joliet_hidings;
struct ExclusionS *hfsplus_hidings;
int use_stdin; /* use raw stdin even if readline support is compiled */ int use_stdin; /* use raw stdin even if readline support is compiled */
int result_page_length; int result_page_length;

View File

@ -1 +1 @@
#define Xorriso_timestamP "2012.05.24.070718" #define Xorriso_timestamP "2012.05.24.071402"