diff --git a/xorriso/emulators.c b/xorriso/emulators.c index 747c3399..2aa5cbdf 100644 --- a/xorriso/emulators.c +++ b/xorriso/emulators.c @@ -616,7 +616,7 @@ int Xorriso_genisofs_count_args(struct XorrisO *xorriso, int argc, char **argv, "" }; static char arg3_options[][41]= { - "-append_partition", + "-append_partition", "-hfsplus-file-creator-type", "" }; static char final_options[][41]= { @@ -732,6 +732,8 @@ int Xorriso_genisofs_help(struct XorrisO *xorriso, int flag) " -hide-hfsplus GLOBFILE Hide HFS+ file", " -hide-hfsplus-list FILE File with list of HFS+ files to hide", " -hfsplus Generate HFS+ filesystem", +" -hfsplus-file-creator-type CREATOR TYPE iso_rr_path", +" Attach creator and type to a File.", #endif @@ -1504,8 +1506,17 @@ 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) { + } else if(strcmp(argpt, "-hfsplus") == 0) { xorriso->do_hfsplus= 1; + } else if(strcmp(argpt, "-hfsplus-file-creator-type") == 0) { + if(i + 3 >= argc) + goto not_enough_args; + /* Memorize command until all pathspecs are processed */ + delay_opt_list[delay_opt_count++]= i; + if(argv[i] != argpt) + delay_opt_list[delay_opt_count - 1]|= 1<<31; + i+= 3; + } else if(strcmp(argpt, "-graft-points")==0) { xorriso->allow_graft_points= 1; } else if(strcmp(argpt, "-path-list")==0 || @@ -2068,15 +2079,14 @@ problem_handler_2:; if(option_d) Xorriso_relax_compliance(xorriso, "deep_paths:long_paths", 0); - /* After all pathspecs are added: perform boot related options */ + /* After all pathspecs are added: perform delayed options, mostly boot related + */ for(j= 0; j < delay_opt_count; j++) { i= delay_opt_list[j] & ~(1 << 31); if(delay_opt_list[j] & (1 << 31)) argpt= argv[i] + 1; else argpt= argv[i]; - if(ret <= 0) - goto ex; if(strcmp(argpt, "-no-emul-boot")==0) { emul_boot= xorriso->boot_image_emul= 0; } else if(strcmp(argpt, "-hard-disk-boot")==0) { @@ -2196,7 +2206,13 @@ problem_handler_2:; if(ret <= 0) goto ex; - ret = Xorriso_option_boot_image(xorriso, "any", sfe, 0); + ret= Xorriso_option_boot_image(xorriso, "any", sfe, 0); + if(ret <= 0) + goto problem_handler_boot; + + } else if(strcmp(argpt, "-hfsplus-file-creator-type") == 0) { + ret= Xorriso_hfsplus_file_creator_type(xorriso, argv[i + 3], NULL, + argv[i + 1], argv[i + 2], 0); if(ret <= 0) goto problem_handler_boot; diff --git a/xorriso/iso_manip.c b/xorriso/iso_manip.c index 4ac24d8d..e03972c9 100644 --- a/xorriso/iso_manip.c +++ b/xorriso/iso_manip.c @@ -3460,3 +3460,61 @@ set_error:; return(1); } + +int Xorriso_hfsplus_file_creator_type(struct XorrisO *xorriso, char *path, + void *in_node, + char *creator, char *hfs_type, int flag) +{ + int ret; + IsoNode *node; + struct iso_hfsplus_xinfo_data *hfs_data; + + if(in_node == NULL) { + ret= Xorriso_node_from_path(xorriso, NULL, path, &node, 0); + if(ret <= 0) + return(ret); + } else + node= (IsoNode *) in_node; + + hfs_data= iso_hfsplus_xinfo_new(0); + if(hfs_data == NULL) { + Xorriso_no_malloc_memory(xorriso, NULL, 0); + return(-1); + } + if(strlen(creator) != 4 || strlen(hfs_type) != 4) { + strcat(xorriso->info_text, + "HFS+ file creator code or type code are not exactly 4 characters long"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + return(0); + } + memcpy(hfs_data->creator_code, creator, 4); + memcpy(hfs_data->type_code, hfs_type, 4); + + ret= iso_node_remove_xinfo(node, iso_hfsplus_xinfo_func); + Xorriso_process_msg_queues(xorriso, 0); + if(ret < 0) { + Xorriso_report_iso_error(xorriso, path, ret, + "Cannot overwrite HFS+ creator and type of ISO node", + 0, "FAILURE", 1); + goto failure; + } + ret= iso_node_add_xinfo(node, iso_hfsplus_xinfo_func, (void *) hfs_data); + Xorriso_process_msg_queues(xorriso, 0); + if(ret < 0) { + Xorriso_report_iso_error(xorriso, path, ret, + "Cannot attach HFS+ creator and type to ISO node", 0, "FAILURE", 1); + goto failure; + } else if(ret == 0) { + strcat(xorriso->info_text, + "Programm error: iso_node_add_xinfo refuses to attach HFS+ creator and type"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + goto failure; + } + Xorriso_set_change_pending(xorriso, 0); + return(1); + +failure: + iso_hfsplus_xinfo_func(hfs_data, 1); + return(0); +} + diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 2e32c8d8..5cce40b3 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2012.05.24.093552" +#define Xorriso_timestamP "2012.05.25.084641" diff --git a/xorriso/xorrisoburn.h b/xorriso/xorrisoburn.h index f2b5e202..dce046e2 100644 --- a/xorriso/xorrisoburn.h +++ b/xorriso/xorrisoburn.h @@ -598,5 +598,9 @@ int Xorriso_list_extras(struct XorrisO *xorriso, char *mode, int flag); int Xorriso_set_data_cache(struct XorrisO *xorriso, void *ropts, int num_tiles, int tile_blocks, int flag); +int Xorriso_hfsplus_file_creator_type(struct XorrisO *xorriso, char *path, + void *in_node, + char *creator, char *hfs_type, int flag); + #endif /* Xorrisoburn_includeD */