From 5d00144aa68de9137d6183e74e738bcfd5a6a8c3 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sat, 10 Mar 2012 14:51:04 +0000 Subject: [PATCH] New API calls isoburn_igopt_set_rr_reloc(), isoburn_igopt_get_rr_reloc() --- libisoburn/isoburn.c | 37 +++++++++++++++++++++++++++++++++ libisoburn/isoburn.h | 15 ++++++++++++++ libisoburn/libisoburn.h | 41 ++++++++++++++++++++++++++++++++++++- libisoburn/libisoburn.ver | 2 ++ xorriso/xorriso_timestamp.h | 2 +- 5 files changed, 95 insertions(+), 2 deletions(-) diff --git a/libisoburn/isoburn.c b/libisoburn/isoburn.c index 3b7aef44..fcbc67f8 100644 --- a/libisoburn/isoburn.c +++ b/libisoburn/isoburn.c @@ -481,6 +481,7 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d, iso_write_opts_set_allow_dir_id_ext(wopts, opts->allow_dir_id_ext); iso_write_opts_set_omit_version_numbers(wopts, opts->omit_version_numbers); iso_write_opts_set_allow_deep_paths(wopts, opts->allow_deep_paths); + iso_write_opts_set_rr_reloc(wopts, opts->rr_reloc_dir, opts->rr_reloc_flags); iso_write_opts_set_allow_longer_paths(wopts, opts->allow_longer_paths); iso_write_opts_set_max_37_char_filenames(wopts, opts->max_37_char_filenames); iso_write_opts_set_no_force_dots(wopts, opts->no_force_dots); @@ -974,6 +975,8 @@ int isoburn_igopt_new(struct isoburn_imgen_opts **new_o, int flag) o->allow_dir_id_ext = 0; o->omit_version_numbers= 0; o->allow_deep_paths= 1; + o->rr_reloc_dir= NULL; + o->rr_reloc_flags= 0; o->allow_longer_paths= 0; o->max_37_char_filenames= 0; o->no_force_dots= 0; @@ -1023,6 +1026,8 @@ int isoburn_igopt_destroy(struct isoburn_imgen_opts **o, int flag) if(*o==NULL) return(0); + if((*o)->rr_reloc_dir != NULL) + free((*o)->rr_reloc_dir); for(i= 0; i < Libisoburn_max_appended_partitionS; i++) if((*o)->appended_partitions[i] != NULL) free((*o)->appended_partitions[i]); @@ -1114,6 +1119,38 @@ int isoburn_igopt_get_relaxed(struct isoburn_imgen_opts *o, int *relax) return(1); } + +int isoburn_igopt_set_rr_reloc(struct isoburn_imgen_opts *o, char *name, + int flags) +{ + if(o->rr_reloc_dir != name) { + if(o->rr_reloc_dir != NULL) + free(o->rr_reloc_dir); + o->rr_reloc_dir= NULL; + if(name != NULL) { + o->rr_reloc_dir= strdup(name); + if(o->rr_reloc_dir == NULL) { + isoburn_msgs_submit(NULL, 0x00060000, + "Cannot allocate memory for image generation options", + 0, "FATAL", 0); + return(-1); + } + } + } + o->rr_reloc_flags = flags & 1; + return 1; +} + + +int isoburn_igopt_get_rr_reloc(struct isoburn_imgen_opts *o, char **name, + int *flags) +{ + *name= o->rr_reloc_dir; + *flags= o->rr_reloc_flags; + return(1); +} + + int isoburn_igopt_set_untranslated_name_len(struct isoburn_imgen_opts *o, int len) { diff --git a/libisoburn/isoburn.h b/libisoburn/isoburn.h index 62de6dd2..826b45ae 100644 --- a/libisoburn/isoburn.h +++ b/libisoburn/isoburn.h @@ -443,6 +443,21 @@ struct isoburn_imgen_opts { */ unsigned int allow_deep_paths :1; + /** + * If not allow_deep_paths is in effect, then it may become + * necessary to relocate directories so that no ECMA-119 file path + * has more than 8 components. These directories are grafted into either + * the root directory of the ISO image or into a dedicated relocation + * directory. For details see libisofs.h, iso_write_opts_set_rr_reloc(). + */ + char *rr_reloc_dir; /* IsoNode name in root directory. NULL or + empty text means root itself. */ + int rr_reloc_flags; /* bit0= mark auto-created rr_reloc_dir by RE + bit1= not settable via API (used internally) + */ + + + /** * Allow path in the ISO-9660 tree to have more than 255 characters. */ diff --git a/libisoburn/libisoburn.h b/libisoburn/libisoburn.h index 32815e7b..6ef3c50e 100644 --- a/libisoburn/libisoburn.h +++ b/libisoburn/libisoburn.h @@ -242,7 +242,7 @@ void isoburn_version(int *major, int *minor, int *micro); */ #define isoburn_libisofs_req_major 1 #define isoburn_libisofs_req_minor 2 -#define isoburn_libisofs_req_micro 0 +#define isoburn_libisofs_req_micro 1 /** The minimum version of libburn to be used with this version of libisoburn at compile time. @@ -1187,6 +1187,45 @@ int isoburn_igopt_set_relaxed(struct isoburn_imgen_opts *o, int relax); int isoburn_igopt_get_relaxed(struct isoburn_imgen_opts *o, int *relax); +/** If not isoburn_igopt_allow_deep_paths is in effect, then it may become + necessary to relocate directories so that no ECMA-119 file path + has more than 8 components. These directories are grafted into either + the root directory of the ISO image or into a dedicated relocation + directory. For details see libisofs.h. + Wrapper for: iso_write_opts_set_rr_reloc() + @since 1.2.2 + @param o The option set to work on + @param name The name of the relocation directory in the root directory. + Do not prepend "/". An empty name or NULL will direct + relocated directories into the root directory. This is the + default. + If the given name does not exist in the root directory when + isoburn_disc_write() is called, and if there are directories + at path level 8, then directory /name will be created + automatically. + @param flags Bitfield for control purposes. + bit0= Mark the relocation directory by a Rock Ridge RE entry, + if it gets created during isoburn_disc_write(). This + will make it invisible for most Rock Ridge readers. + bit1= not settable via API (used internally) + @return > 0 success, <= 0 failure +*/ +int isoburn_igopt_set_rr_reloc(struct isoburn_imgen_opts *o, char *name, + int flags); + +/** Obtain the settings of isoburn_igopt_set_rr_reloc(). + @since 1.2.2 + @param o The option set to work on + @param name Will return NULL or a pointer to the name of the relocation + directory in the root directory. Do not alter or dispose the + memory which holds this name. + @param flags Will return the flags bitfield. + @return > 0 success, <= 0 failure +*/ +int isoburn_igopt_get_rr_reloc(struct isoburn_imgen_opts *o, char **name, + int *flags); + + /** Caution: This option breaks any assumptions about names that are supported by ECMA-119 specifications. Try to omit any translation which would make a file name compliant to the diff --git a/libisoburn/libisoburn.ver b/libisoburn/libisoburn.ver index 09a693ab..2b841249 100644 --- a/libisoburn/libisoburn.ver +++ b/libisoburn/libisoburn.ver @@ -38,6 +38,7 @@ isoburn_igopt_get_over_ugid; isoburn_igopt_get_partition_img; isoburn_igopt_get_pvd_times; isoburn_igopt_get_relaxed; +isoburn_igopt_get_rr_reloc; isoburn_igopt_get_scdbackup_tag; isoburn_igopt_get_sort_files; isoburn_igopt_get_system_area; @@ -54,6 +55,7 @@ isoburn_igopt_set_over_ugid; isoburn_igopt_set_partition_img; isoburn_igopt_set_pvd_times; isoburn_igopt_set_relaxed; +isoburn_igopt_set_rr_reloc; isoburn_igopt_set_scdbackup_tag; isoburn_igopt_set_sort_files; isoburn_igopt_set_system_area; diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index e3186653..ec2d93c9 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2012.03.10.112727" +#define Xorriso_timestamP "2012.03.10.145124"