diff --git a/libisoburn/libisoburn.ver b/libisoburn/libisoburn.ver index 2a1fded4..204934e3 100644 --- a/libisoburn/libisoburn.ver +++ b/libisoburn/libisoburn.ver @@ -188,6 +188,7 @@ Xorriso_option_gid; Xorriso_option_grow_blindly; Xorriso_option_hardlinks; Xorriso_option_help; +Xorriso_option_hfsplus; Xorriso_option_hide; Xorriso_option_history; Xorriso_option_iso_rr_pattern; diff --git a/xorriso/base_obj.c b/xorriso/base_obj.c index 0e4e2ae9..f67429d1 100644 --- a/xorriso/base_obj.c +++ b/xorriso/base_obj.c @@ -134,6 +134,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) m->ino_behavior= 7; m->iso_level= 3; m->do_joliet= 0; + m->do_hfsplus= 0; m->do_rockridge= 1; m->do_iso1999= 0; m->do_aaip= 0; @@ -291,6 +292,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) m->disk_exclusions= NULL; m->iso_rr_hidings= NULL; m->joliet_hidings= NULL; + m->hfsplus_hidings= NULL; m->disk_excl_mode= 1; m->use_stdin= 0; m->result_page_length= 0; @@ -414,6 +416,9 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) if(ret<=0) goto failure; ret= Exclusions_new(&(m->joliet_hidings), 0); + if(ret<=0) + goto failure; + ret= Exclusions_new(&(m->hfsplus_hidings), 0); if(ret<=0) goto failure; 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->iso_rr_hidings), 0); Exclusions_destroy(&(m->joliet_hidings), 0); + Exclusions_destroy(&(m->hfsplus_hidings), 0); Xorriso_destroy_all_extf(m, 0); Xorriso_lst_destroy_all(&(m->drive_blacklist), 0); Xorriso_lst_destroy_all(&(m->drive_greylist), 0); diff --git a/xorriso/compile_xorriso.sh b/xorriso/compile_xorriso.sh index fc9013af..025c126c 100755 --- a/xorriso/compile_xorriso.sh +++ b/xorriso/compile_xorriso.sh @@ -92,6 +92,7 @@ libisofs="$libisofs $isofs"fsource.o libisofs="$libisofs $isofs"image.o libisofs="$libisofs $isofs"iso1999.o libisofs="$libisofs $isofs"joliet.o +libisofs="$libisofs $isofs"hfsplus.o libisofs="$libisofs $isofs"libiso_msgs.o libisofs="$libisofs $isofs"messages.o libisofs="$libisofs $isofs"node.o diff --git a/xorriso/disk_ops.c b/xorriso/disk_ops.c index 591d62f8..c2388f14 100644 --- a/xorriso/disk_ops.c +++ b/xorriso/disk_ops.c @@ -1,7 +1,7 @@ /* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images. - Copyright 2007-2011 Thomas Schmitt, + Copyright 2007-2012 Thomas Schmitt, Provided under GPL version 2 or later. @@ -573,7 +573,10 @@ ex:; /* @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) { @@ -607,12 +610,15 @@ int Xorriso__mode_to_perms(mode_t st_mode, char perms[11], int flag) else perms[8]= 'T'; } - hidden_state= (flag >> 2) & 3; + + hidden_state= (flag >> 2) & 63; if(hidden_state == 1) perms[9]= 'I'; else if(hidden_state == 2) perms[9]= 'J'; - else if(hidden_state == 3) + else if(hidden_state == 4) + perms[9]= 'A'; + else if(hidden_state) perms[9]= 'H'; if(flag & 2) { 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 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) { @@ -660,7 +669,7 @@ int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag) else 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); sprintf(rpt+strlen(rpt)," %3u ",(unsigned int) stbuf->st_nlink); diff --git a/xorriso/emulators.c b/xorriso/emulators.c index 7a520165..747c3399 100644 --- a/xorriso/emulators.c +++ b/xorriso/emulators.c @@ -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", "--emul-toc", "-disallow_dir_id_ext", "--old-empty", "--old-root-no-md5", "--old-root-devno", "--old-root-no-ino", - "--no_rc", "--norock" + "--no_rc", "--norock", "-hfsplus", "" }; 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", "-dir-mode", "-file-mode", "-G", "-gid", "-hide", "-hide-list", "-hidden", "-hidden-list", "-hide-joliet", "-hide-joliet-list", + "-hide-hfsplus", "-hide-hfsplus-list", "-hide-udf", "-hide-udf-list", "-input-charset", "-output-charset", "-iso-level", "-jcharset", "-log-file", "-m", "-exclude-list", "-M", "-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-joliet GLOBFILE Hide Joliet file", " -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", " -output-charset CHARSET Output charset for file name conversion", " -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 ""). But xorriso normalizes disk_paths before further processing. Thus 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, char *pattern, int hide_attrs, int flag) @@ -867,14 +884,15 @@ int Xorriso_genisofs_hide(struct XorrisO *xorriso, char *whom, int zero= 0, ret; char *argv[1]; - if((hide_attrs & 3) == 0) + if((hide_attrs & 63) == 0) return(2); + if(strchr(pattern, '/') != NULL) { argv[0]= pattern; ret= Xorriso_option_not_paths(xorriso, 1, argv, &zero, - 4 | (hide_attrs & 3)); + 4 | ((hide_attrs & 63) << 8)); } else { - ret= Xorriso_option_not_leaf(xorriso, pattern, hide_attrs & 3); + ret= Xorriso_option_not_leaf(xorriso, pattern, hide_attrs & 63); } return(ret); } @@ -885,13 +903,16 @@ 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; + char **argv= NULL, *id= ""; FILE *fp= NULL; if(adr[0]==0) { + if (hide_attrs & 2) + id = "joliet-"; + else if (hide_attrs & 4) + id = "hfsplus-"; sprintf(xorriso->info_text, - "Empty file name given with -as %s -hide-%slist", - whom, hide_attrs == 1 ? "" : "joliet-"); + "Empty file name given with -as %s -hide-%slist", whom, id); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0); return(0); } @@ -1232,7 +1253,9 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom, } else if(strcmp(argpt, "-hide") == 0 || strcmp(argpt, "-hide-list") == 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) goto not_enough_args; i++; @@ -1244,6 +1267,10 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom, ret= Xorriso_genisofs_hide(xorriso, whom, argv[i], 2, 0); else if(strcmp(argpt, "-hide-joliet-list") == 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) goto problem_handler_1; @@ -1477,6 +1504,8 @@ illegal_c:; } else if(strcmp(argpt, "-joliet-long")==0) { Xorriso_relax_compliance(xorriso, "joliet_long_paths:joliet_long_names", 0); + } else if(strcmp(argpt, "-hfsplus")==0) { + xorriso->do_hfsplus= 1; } else if(strcmp(argpt, "-graft-points")==0) { xorriso->allow_graft_points= 1; } else if(strcmp(argpt, "-path-list")==0 || @@ -1686,7 +1715,9 @@ not_enough_args:; } else if(strcmp(argpt, "-hide") == 0 || strcmp(argpt, "-hide-list") == 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) goto not_enough_args; i++; diff --git a/xorriso/iso_img.c b/xorriso/iso_img.c index 56f13a58..29c9257f 100644 --- a/xorriso/iso_img.c +++ b/xorriso/iso_img.c @@ -588,8 +588,10 @@ no_image:; } if(bin_path_in_use) { is_default= !xorriso->boot_image_cat_hidden; - hpt= Xorriso__hide_mode_text(xorriso->boot_image_cat_hidden & 3, 0); - sprintf(line, "-boot_image %s cat_hidden=%s\n", form, hpt); + hpt= Xorriso__hide_mode_text(xorriso->boot_image_cat_hidden & 63, 0); + if(hpt != NULL) + sprintf(line, "-boot_image %s cat_hidden=%s\n", form, hpt); + Xorriso_free_meM(hpt); if(!(is_default && no_defaults)) Xorriso_status_result(xorriso,filter,fp,flag&2); } diff --git a/xorriso/iso_manip.c b/xorriso/iso_manip.c index 09d29446..4ac24d8d 100644 --- a/xorriso/iso_manip.c +++ b/xorriso/iso_manip.c @@ -2242,6 +2242,8 @@ int Xorriso_set_hidden(struct XorrisO *xorriso, void *in_node, char *path, hide_attrs|= LIBISO_HIDE_ON_RR; if(hide_state & 2) hide_attrs|= LIBISO_HIDE_ON_JOLIET; + if(hide_state & 4) + hide_attrs|= LIBISO_HIDE_ON_HFSPLUS; } iso_node_set_hidden(node, hide_attrs); return(1); @@ -2780,19 +2782,16 @@ return: value= !! Exprtest_match_disk_name(xorriso, ftest, node, 0); break; case 17: /* -hidden int *arg1 */ - value= 0; + value= 1; ret= iso_node_get_hidden(node); mask= *((int *) arg1) & 3; - if(mask == 0 && !(ret & (LIBISO_HIDE_ON_RR | LIBISO_HIDE_ON_JOLIET))) - value= 1; - else if(mask == 1 && (ret & LIBISO_HIDE_ON_RR)) - value= 1; - else if(mask == 2 && (ret & LIBISO_HIDE_ON_JOLIET)) - value= 1; - else if(mask == 3 && (ret & LIBISO_HIDE_ON_RR) && - (ret & LIBISO_HIDE_ON_JOLIET)) - value= 1; - + if((!!(mask & 1)) ^ (!!(ret & LIBISO_HIDE_ON_RR))) + value= 0; + if((!!(mask & 2)) ^ (!!(ret & LIBISO_HIDE_ON_JOLIET))) + value= 0; + if((!!(mask & 3)) ^ (!!(ret & LIBISO_HIDE_ON_HFSPLUS))) + value= 0; + break; default: /* >>> complain about unknown test type */; diff --git a/xorriso/iso_tree.c b/xorriso/iso_tree.c index 9857d81e..6f1b97f5 100644 --- a/xorriso/iso_tree.c +++ b/xorriso/iso_tree.c @@ -1533,12 +1533,14 @@ int Xorriso_node_eff_hidden(struct XorrisO *xorriso, IsoNode *node, int flag) IsoNode *current, *parent; current= node; - for(current= node; hidden_state != 3;) { + for(current= node; hidden_state != 7;) { ret= iso_node_get_hidden(current); if(ret & LIBISO_HIDE_ON_RR) hidden_state|= 1; if(ret & LIBISO_HIDE_ON_JOLIET) hidden_state|= 2; + if(ret & LIBISO_HIDE_ON_HFSPLUS) + hidden_state|= 4; parent= (IsoNode *) iso_node_get_parent(current); if(parent == current) break; diff --git a/xorriso/misc_funct.c b/xorriso/misc_funct.c index e3fc69b2..2ecc3439 100644 --- a/xorriso/misc_funct.c +++ b/xorriso/misc_funct.c @@ -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) { - if(strcmp(mode, "on") == 0) - return(1 | 2); - else if(strcmp(mode, "iso_rr") == 0) - return(1); - else if(strcmp(mode, "joliet") == 0) - return(2); - else if(strcmp(mode, "off") == 0) - return(0); - return(-1); + char *npt, *cpt; + int l, value= 0; + + npt= cpt= mode; + for(; npt!=NULL; cpt= npt+1) { + npt= strchr(cpt,':'); + if(npt==NULL) + l= strlen(cpt); + 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) { - switch(hide_mode & 3) { - case 0: - return "off"; - case 1: - return "iso_rr"; - case 2: - return "joliet"; - case 3: - return "on"; + char *acc= NULL; + + acc = calloc(1, 80); + if(acc == NULL) + return(NULL); + acc[0]= 0; + if(hide_mode == 0) { + strcat(acc, "off:"); + } 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; } diff --git a/xorriso/opts_d_h.c b/xorriso/opts_d_h.c index 21f54bab..47f9cc93 100644 --- a/xorriso/opts_d_h.c +++ b/xorriso/opts_d_h.c @@ -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 */ int Xorriso_option_hide(struct XorrisO *xorriso, char *hide_state, int argc, char **argv, int *idx, int flag) diff --git a/xorriso/opts_i_o.c b/xorriso/opts_i_o.c index ba727a6c..5d85a446 100644 --- a/xorriso/opts_i_o.c +++ b/xorriso/opts_i_o.c @@ -886,8 +886,10 @@ int Xorriso_option_no_rc(struct XorrisO *xorriso, int flag) /* Option -not_leaf , (-hide_disk_leaf resp. -as mkisofs -hide) */ -/* @param flag bit0= add to iso_rr_hidings rather than disk_exclusions - bit1= add to joliet_hidings rather than disk_exclusions +/* @param flag bit0-bit5= hide rather than adding to 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) { @@ -902,7 +904,7 @@ int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag) Xorriso__bourne_to_reg(pattern, regexpr, 0); if(regcomp(&re, regexpr, 0)!=0) {ret= 0; goto cannot_add;} - if(flag & 3) { + if(flag & 63) { if(flag & 1) { ret= Exclusions_add_not_leafs(xorriso->iso_rr_hidings, pattern, &re, 0); if(ret<=0) @@ -913,6 +915,11 @@ int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag) if(ret<=0) goto cannot_add; } + if(flag & 4) { + ret= Exclusions_add_not_leafs(xorriso->hfsplus_hidings, pattern, &re, 0); + if(ret<=0) + goto cannot_add; + } } else { 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 bit1= add to joliet_hidings rather than disk_exclusions 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 *idx, int flag) { 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, (xorriso->do_disk_pattern == 1 || (flag & 4)) | 2); @@ -1091,20 +1101,23 @@ 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, 2 | ((flag & 4) << 7)); if(ret<=0) goto ex; - if(flag & 3) { - if(flag & 1) { + if(flag & 0x3f03) { + if(flag & 0x0101) { ret= Exclusions_add_not_paths(xorriso->iso_rr_hidings, num_descr, descr, optc, optv, 0); if(ret<=0) { no_hide:; - sprintf(xorriso->info_text, - "Cannot add path list: -hide_disk_paths %s ", - Xorriso__hide_mode_text(flag & 3, 0)); + sprintf(xorriso->info_text, "Cannot add path list: -hide_disk_paths "); + hpt= Xorriso__hide_mode_text(flag & 0x3f03, 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); strcat(xorriso->info_text, num_descr > 1 ? " ... " : " "); strcat(xorriso->info_text, xorriso->list_delimiter); @@ -1112,12 +1125,18 @@ no_hide:; goto ex; } } - if(flag & 2) { + if(flag & 0x0202) { ret= Exclusions_add_not_paths(xorriso->joliet_hidings, num_descr, descr, optc, optv, 0); if(ret<=0) 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 { ret= Exclusions_add_not_paths(xorriso->disk_exclusions, num_descr, descr, optc, optv, 0); diff --git a/xorriso/parse_exec.c b/xorriso/parse_exec.c index b9727078..de215137 100644 --- a/xorriso/parse_exec.c +++ b/xorriso/parse_exec.c @@ -466,14 +466,15 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, "dev","dialog","disk_dev_ino","disk_pattern","displacement", "dummy","dvd_obs","early_stdio_test", "eject", "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", "mark","md5","mount_opts","not_leaf","not_list","not_mgt", "options_from_file","osirrox","outdev","out_charset","overwrite", "pacifier","padding","path_list","pathspecs","pkt_output", "preparer_id","print","print_info","print_mark","prompt", "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", "speed","split_size","status","status_history_max", "stdio_sync","stream_recording","system_id","temp_mem_limit", @@ -659,7 +660,8 @@ int Xorriso_cmd_sorting_rank(struct XorrisO *xorriso, "mount", "* 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", "abstract_file", "biblio_file", "preparer_id", "out_charset", "read_mkisofsrc", @@ -1270,6 +1272,10 @@ next_command:; (*idx)++; 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) { Xorriso_option_help(xorriso,0); @@ -1549,6 +1555,10 @@ next_command:; } else if(strcmp(cmd,"rmdir")==0 || strcmp(cmd,"rmdiri")==0) { 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) { ret= Xorriso_option_rollback(xorriso, 0); @@ -2529,6 +2539,11 @@ failure:; goto failure; if(ret > 0) 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); } diff --git a/xorriso/text_io.c b/xorriso/text_io.c index 0a200b66..56b0ddeb 100644 --- a/xorriso/text_io.c +++ b/xorriso/text_io.c @@ -1,7 +1,7 @@ /* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images. - Copyright 2007-2010 Thomas Schmitt, + Copyright 2007-2012 Thomas Schmitt, 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)) 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_values, &vlst, 0); if(plst == NULL || vlst == NULL) { diff --git a/xorriso/write_run.c b/xorriso/write_run.c index 80c00400..45ded673 100644 --- a/xorriso/write_run.c +++ b/xorriso/write_run.c @@ -753,6 +753,8 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag) hide_attr|= LIBISO_HIDE_ON_RR; if(xorriso->boot_image_cat_hidden & 2) 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); } else if(xorriso->patch_isolinux_image & 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); - ext= isoburn_igopt_rockridge | + ext= ((!!xorriso->do_rockridge) * isoburn_igopt_rockridge) | ((!!xorriso->do_joliet) * isoburn_igopt_joliet) | + ((!!xorriso->do_hfsplus) * isoburn_igopt_hfsplus) | ((!!xorriso->do_iso1999) * isoburn_igopt_iso1999) | (( !(xorriso->ino_behavior & 2)) * isoburn_igopt_hardlinks) | (( (!(xorriso->ino_behavior & 2)) || diff --git a/xorriso/xorriso.h b/xorriso/xorriso.h index 89028cb7..82ff48ae 100644 --- a/xorriso/xorriso.h +++ b/xorriso/xorriso.h @@ -930,6 +930,9 @@ int Xorriso_option_hardlinks(struct XorrisO *xorriso, char *mode, int flag); /* Command -help and part of -prog_help */ 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 */ /* @since 0.6.0 */ 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 bit1= add to joliet hide list rather than disk exclusions @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); @@ -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 @since 0.6.0 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 *idx, int flag); diff --git a/xorriso/xorriso_makefile_am.txt b/xorriso/xorriso_makefile_am.txt index 4284b014..624c31a8 100644 --- a/xorriso/xorriso_makefile_am.txt +++ b/xorriso/xorriso_makefile_am.txt @@ -136,6 +136,8 @@ xorriso_xorriso_SOURCES = \ libisofs/rockridge_read.c \ libisofs/joliet.h \ libisofs/joliet.c \ + libisofs/hfsplus.h \ + libisofs/hfsplus.c \ libisofs/eltorito.h \ libisofs/eltorito.c \ libisofs/data_source.c \ diff --git a/xorriso/xorriso_private.h b/xorriso/xorriso_private.h index 34367b28..1f08bf8e 100644 --- a/xorriso/xorriso_private.h +++ b/xorriso/xorriso_private.h @@ -133,6 +133,7 @@ struct XorrisO { /* the global context of xorriso */ int iso_level; int do_joliet; + int do_hfsplus; int do_rockridge; int do_iso1999; @@ -337,7 +338,8 @@ struct XorrisO { /* the global context of xorriso */ int keep_boot_image; 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 */ char boot_image_bin_path[SfileadrL]; @@ -506,6 +508,7 @@ struct XorrisO { /* the global context of xorriso */ struct ExclusionS *iso_rr_hidings; struct ExclusionS *joliet_hidings; + struct ExclusionS *hfsplus_hidings; int use_stdin; /* use raw stdin even if readline support is compiled */ int result_page_length; diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 790de54b..996f6014 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2012.05.24.070718" +#define Xorriso_timestamP "2012.05.24.071402"