diff --git a/libisofs/ecma119.c b/libisofs/ecma119.c index cdee22a..0f35799 100644 --- a/libisofs/ecma119.c +++ b/libisofs/ecma119.c @@ -1698,7 +1698,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img) system_area = src->system_area_data; system_area_options = src->system_area_options; } else { - system_area_options = opts->system_area_options & 0xfc; + system_area_options = opts->system_area_options & 0xfffffffc; } sa_type = (system_area_options >> 2) & 0x3f; if (sa_type != 0 && sa_type != 3) @@ -2910,7 +2910,7 @@ int iso_write_opts_set_system_area(IsoWriteOpts *opts, char data[32768], memcpy(opts->system_area_data, data, 32768); } if (!(flag & 4)) - opts->system_area_options = options & 0xff; + opts->system_area_options = options & 0x3ff; return ISO_SUCCESS; } diff --git a/libisofs/ecma119.h b/libisofs/ecma119.h index 2c4b9aa..eb2768f 100644 --- a/libisofs/ecma119.h +++ b/libisofs/ecma119.h @@ -575,19 +575,27 @@ struct ecma119_image */ char *system_area_data; /* - * bit0= Only with PC-BIOS DOS MBR + * bit0= Only with DOS MBR * Make bytes 446 - 512 of the system area a partition * table which reserves partition 1 from byte 63*512 to the * end of the ISO image. Assumed are 63 secs/hed, 255 head/cyl. * (GRUB protective msdos label.) * This works with and without system_area_data. - * bit1= Only with PC-BIOS DOS MBR + * bit1= Only with DOS MBR * Apply isohybrid MBR patching to the system area. * This works only with system_area_data plus ISOLINUX boot image * and only if not bit0 is set. * bit2-7= System area type * 0= DOS MBR * 1= MIPS Big Endian Volume Header + * 2= DEC Boot Block for MIPS Little Endian + * 3= SUN Disk Label for SUN SPARC + * bit8-9= Only with DOS MBR + * Cylinder alignment mode eventually pads the image to make it + * end at a cylinder boundary. + * 0 = auto (align if bit1) + * 1 = always align to cylinder boundary + * 2 = never align to cylinder boundary */ int system_area_options; diff --git a/libisofs/libisofs.h b/libisofs/libisofs.h index e0a1b73..65c4c47 100644 --- a/libisofs/libisofs.h +++ b/libisofs/libisofs.h @@ -1959,7 +1959,13 @@ int iso_write_opts_set_fifo_size(IsoWriteOpts *opts, size_t fifo_size); * iso_write_opts_set_partition_img() for partition numbers 2 * to 8. * This will overwrite the first 512 bytes of the submitted - * data. + * bit8-9= Only with System area type 0 = MBR + * @since 1.0.4 + * Cylinder alignment mode eventually pads the image to make it + * end at a cylinder boundary. + * 0 = auto (align if bit1) + * 1 = always align to cylinder boundary + * 2 = never align to cylinder boundary * @param flag * bit0 = invalidate any attached system area data. Same as data == NULL * (This re-activates eventually loaded image System Area data. diff --git a/libisofs/system_area.c b/libisofs/system_area.c index 396abe7..45d34fc 100644 --- a/libisofs/system_area.c +++ b/libisofs/system_area.c @@ -841,17 +841,20 @@ int try_sph(off_t imgsize, int secs_per_head, int *heads_per_cyl, int flag) int iso_align_isohybrid(Ecma119Image *t, int flag) { - int sa_type, ret; + int sa_type, ret, always_align; uint32_t img_blocks; off_t imgsize, cylsize = 0, frac; sa_type = (t->system_area_options >> 2) & 0x3f; if (sa_type != 0) return ISO_SUCCESS; + always_align = (t->system_area_options >> 8) & 3; + if (always_align >= 2) + return ISO_SUCCESS; img_blocks = t->curblock; imgsize = ((off_t) img_blocks) * (off_t) 2048; - if ((t->system_area_options & 3) + if (((t->system_area_options & 3) || always_align) && (off_t) (t->partition_heads_per_cyl * t->partition_secs_per_head * 1024) * (off_t) 512 < imgsize) { /* Choose small values which can represent the image size */ @@ -875,7 +878,7 @@ int iso_align_isohybrid(Ecma119Image *t, int flag) } cylsize = 0; - if (sa_type == 0 && t->catalog != NULL && + if (t->catalog != NULL && (t->catalog->bootimages[0]->isolinux_options & 0x0a) == 0x02) { /* Check for isolinux image with magic number of 3.72 and produce an MBR from our built-in template. (Deprecated since 31 Mar 2010) @@ -883,7 +886,7 @@ int iso_align_isohybrid(Ecma119Image *t, int flag) if (img_blocks >= 0x40000000) return ISO_SUCCESS; cylsize = 64 * 32 * 512; - } else if (sa_type == 0 && (t->system_area_options & 2)) { + } else if ((t->system_area_options & 2) || always_align) { /* Patch externally provided system area as isohybrid MBR */ if (t->catalog == NULL || t->system_area_data == NULL) { /* isohybrid makes only sense together with ISOLINUX boot image