diff --git a/libisofs/ecma119.c b/libisofs/ecma119.c index 053cab5..235c435 100644 --- a/libisofs/ecma119.c +++ b/libisofs/ecma119.c @@ -887,6 +887,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img) target->allow_full_ascii = opts->allow_full_ascii; target->relaxed_vol_atts = opts->relaxed_vol_atts; target->joliet_longer_paths = opts->joliet_longer_paths; + target->rrip_version_1_10 = opts->rrip_version_1_10; target->sort_files = opts->sort_files; target->replace_uid = opts->replace_uid ? 1 : 0; @@ -1483,6 +1484,15 @@ int iso_write_opts_set_joliet_longer_paths(IsoWriteOpts *opts, int allow) return ISO_SUCCESS; } +int iso_write_opts_set_rrip_version_1_10(IsoWriteOpts *opts, int oldvers) +{ + if (opts == NULL) { + return ISO_NULL_POINTER; + } + opts->rrip_version_1_10 = oldvers ? 1 : 0; + return ISO_SUCCESS; +} + int iso_write_opts_set_sort_files(IsoWriteOpts *opts, int sort) { if (opts == NULL) { diff --git a/libisofs/ecma119.h b/libisofs/ecma119.h index a4022ad..5e7499e 100644 --- a/libisofs/ecma119.h +++ b/libisofs/ecma119.h @@ -105,6 +105,13 @@ struct iso_write_opts { */ unsigned int joliet_longer_paths :1; + /** + * Write Rock Ridge info as of specification RRIP-1.10 rather than + * RRIP-1.12: signature "RRIP_1991A" rather than "IEEE_1282", + * field PX without file serial number + */ + unsigned int rrip_version_1_10 :1; + /** If files should be sorted based on their weight. */ unsigned int sort_files :1; @@ -246,6 +253,9 @@ struct ecma119_image /** Allow paths on Joliet tree to be larger than 240 bytes */ unsigned int joliet_longer_paths :1; + /** Write old fashioned RRIP-1.10 rather than RRIP-1.12 */ + unsigned int rrip_version_1_10 :1; + /* * Mode replace. If one of these flags is set, the correspodent values are * replaced with values below. diff --git a/libisofs/libisofs.h b/libisofs/libisofs.h index 61df34e..395b5e3 100644 --- a/libisofs/libisofs.h +++ b/libisofs/libisofs.h @@ -1147,6 +1147,15 @@ int iso_write_opts_set_relaxed_vol_atts(IsoWriteOpts *opts, int allow); */ int iso_write_opts_set_joliet_longer_paths(IsoWriteOpts *opts, int allow); +/** + * Write Rock Ridge info as of specification RRIP-1.10 rather than RRIP-1.12: + * signature "RRIP_1991A" rather than "IEEE_1282", field PX without file + * serial number. + * + * @since 0.6.12 + */ +int iso_write_opts_set_rrip_version_1_10(IsoWriteOpts *opts, int oldvers); + /** * Whether to sort files based on their weight. * diff --git a/libisofs/rockridge.c b/libisofs/rockridge.c index d99411d..ab4e28c 100644 --- a/libisofs/rockridge.c +++ b/libisofs/rockridge.c @@ -94,13 +94,19 @@ int rrip_add_PX(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp) PX[0] = 'P'; PX[1] = 'X'; - PX[2] = 44; + if (!t->rrip_version_1_10) { + PX[2] = 44; + } else { + PX[2] = 36; + } PX[3] = 1; iso_bb(&PX[4], px_get_mode(t, n), 4); iso_bb(&PX[12], n->nlink, 4); iso_bb(&PX[20], px_get_uid(t, n), 4); iso_bb(&PX[28], px_get_gid(t, n), 4); - iso_bb(&PX[36], n->ino, 4); + if (!t->rrip_version_1_10) { + iso_bb(&PX[36], n->ino, 4); + } return susp_append(t, susp, PX); } @@ -467,24 +473,69 @@ int rrip_add_SL(Ecma119Image *t, struct susp_info *susp, uint8_t **comp, static int rrip_add_ER(Ecma119Image *t, struct susp_info *susp) { - unsigned char *ER = malloc(182); - if (ER == NULL) { - return ISO_OUT_OF_MEM; - } + unsigned char *ER; - ER[0] = 'E'; - ER[1] = 'R'; - ER[2] = 182; - ER[3] = 1; - ER[4] = 9; - ER[5] = 72; - ER[6] = 93; - ER[7] = 1; - memcpy(&ER[8], "IEEE_1282", 9); - memcpy(&ER[17], "THE IEEE 1282 PROTOCOL PROVIDES SUPPORT FOR POSIX " - "FILE SYSTEM SEMANTICS.", 72); - memcpy(&ER[89], "PLEASE CONTACT THE IEEE STANDARDS DEPARTMENT, " - "PISCATAWAY, NJ, USA FOR THE 1282 SPECIFICATION.", 93); + if (!t->rrip_version_1_10) { + /* + According to RRIP 1.12 this is the future form: + 4.3 "Specification of the ER System Use Entry Values for RRIP" + talks of "IEEE_P1282" in each of the three strings and finally states + "Note: Upon adoption as an IEEE standard, these lengths will each + decrease by 1." + So "IEEE_P1282" would be the new form, "RRIP_1991A" is the old form. + */ + ER = malloc(182); + if (ER == NULL) { + return ISO_OUT_OF_MEM; + } + + ER[0] = 'E'; + ER[1] = 'R'; + ER[2] = 182; + ER[3] = 1; + ER[4] = 9; + ER[5] = 72; + ER[6] = 93; + ER[7] = 1; + memcpy(&ER[8], "IEEE_1282", 9); + memcpy(&ER[17], "THE IEEE 1282 PROTOCOL PROVIDES SUPPORT FOR POSIX " + "FILE SYSTEM SEMANTICS.", 72); + memcpy(&ER[89], "PLEASE CONTACT THE IEEE STANDARDS DEPARTMENT, " + "PISCATAWAY, NJ, USA FOR THE 1282 SPECIFICATION.", 93); + } else { + /* + RRIP 1.09 and 1.10: + 4.3 Specification of the ER System Use Field Values for RRIP + The Extension Version number for the version of the RRIP defined herein + shall be 1. The content of the Extension Identifier field shall be + "RRIP_1991A". The Identifier Length shall be 10. The recommended + content of the Extension Descriptor shall be "THE ROCK RIDGE + INTERCHANGE PROTOCOL PROVIDES SUPPORT FOR POSIX FILE SYSTEM SEMANTICS." + The corresponding Description Length is 84. + The recommended content of the Extension Source shall be "PLEASE + CONTACT DISC PUBLISHER FOR SPECIFICATION SOURCE. SEE PUBLISHER + IDENTIFIER IN PRIMARY VOLUME DESCRIPTOR FOR CONTACT INFORMATION." + The corresponding Source Length is 135. + */ + + ER = malloc(237); + if (ER == NULL) { + return ISO_OUT_OF_MEM; + } + + ER[0] = 'E'; + ER[1] = 'R'; + ER[2] = 237; + ER[3] = 1; + ER[4] = 10; + ER[5] = 84; + ER[6] = 135; + ER[7] = 1; + + memcpy(&ER[8], "RRIP_1991A", 10); + memcpy(&ER[18], "THE ROCK RIDGE INTERCHANGE PROTOCOL PROVIDES SUPPORT FOR POSIX FILE SYSTEM SEMANTICS", 84); + memcpy(&ER[102], "PLEASE CONTACT DISC PUBLISHER FOR SPECIFICATION SOURCE. SEE PUBLISHER IDENTIFIER IN PRIMARY VOLUME DESCRIPTOR FOR CONTACT INFORMATION.", 135); + } /** This always goes to continuation area */ return susp_append_ce(t, susp, ER);