Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 May 2011 17:27:32 +0200
From:      Baptiste Daroussin <bapt@freebsd.org>
To:        Nathan Whitehorn <nwhitehorn@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r221387 - head/usr.sbin/makefs/cd9660
Message-ID:  <BANLkTi=i_nKhQeNHPb%2BnRD0kJz%2BdAz4YKg@mail.gmail.com>
In-Reply-To: <201105031512.p43FC1Jr099140@svn.freebsd.org>
References:  <201105031512.p43FC1Jr099140@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help

2011/5/3 Nathan Whitehorn <nwhitehorn@freebsd.org>:
> Author: nwhitehorn
> Date: Tue May  3 15:12:01 2011
> New Revision: 221387
> URL: http://svn.freebsd.org/changeset/base/221387
>
> Log:
>  Add support for synthesizing an APM partition map to map Mac PowerPC
>  bootstrap partitions from the ISO9660 boot catalog. This preserves OS X's
>  ability to mount the CD, while allowing us a way to provide HFS-ified
>  bootstrap code for Open Firmware.
>
> Modified:
>  head/usr.sbin/makefs/cd9660/cd9660_eltorito.c
>
> Modified: head/usr.sbin/makefs/cd9660/cd9660_eltorito.c
> ==============================================================================
> --- head/usr.sbin/makefs/cd9660/cd9660_eltorito.c       Tue May  3 14:43:16 2011        (r221386)
> +++ head/usr.sbin/makefs/cd9660/cd9660_eltorito.c       Tue May  3 15:12:01 2011        (r221387)
> @@ -31,6 +31,9 @@
>  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
>  * OF SUCH DAMAGE.
>  */
> +
> +#include <netinet/in.h>
> +
>  #include "cd9660.h"
>  #include "cd9660_eltorito.h"
>
> @@ -497,11 +500,43 @@ cd9660_setup_boot_volume_descriptor(volu
>        return 1;
>  }
>
> +static int
> +cd9660_write_apm_partition_entry(FILE *fd, int index, int total_partitions,
> +    off_t sector_start, off_t nsectors, off_t sector_size,
> +    const char *part_name, const char *part_type) {
> +       uint32_t apm32;
> +       uint16_t apm16;
> +
> +       fseeko(fd, (off_t)(index + 1) * sector_size, SEEK_SET);
> +
> +       /* Signature */
> +       apm16 = htons(0x504d);
> +       fwrite(&apm16, sizeof(apm16), 1, fd);
> +       apm16 = 0;
> +       fwrite(&apm16, sizeof(apm16), 1, fd);
> +
> +       /* Total number of partitions */
> +       apm32 = htonl(total_partitions);
> +       fwrite(&apm32, sizeof(apm32), 1, fd);
> +       /* Bounds */
> +       apm32 = htonl(sector_start);
> +       fwrite(&apm32, sizeof(apm32), 1, fd);
> +       apm32 = htonl(nsectors);
> +       fwrite(&apm32, sizeof(apm32), 1, fd);
> +
> +       fwrite(part_name, strlen(part_name) + 1, 1, fd);
> +       fseek(fd, 32 - strlen(part_name) - 1, SEEK_CUR);
> +       fwrite(part_type, strlen(part_type) + 1, 1, fd);
> +
> +       return 0;
> +}
> +
>  int
>  cd9660_write_boot(FILE *fd)
>  {
>        struct boot_catalog_entry *e;
>        struct cd9660_boot_image *t;
> +       int apm_partitions = 0;
>
>        /* write boot catalog */
>        if (fseeko(fd, (off_t)diskStructure.boot_catalog_sector *
> @@ -533,7 +568,51 @@ cd9660_write_boot(FILE *fd)
>                            t->filename, t->sector);
>                }
>                cd9660_copy_file(fd, t->sector, t->filename);
> +
> +               if (t->system == ET_SYS_MAC)
> +                       apm_partitions++;
> +       }
> +
> +       if (apm_partitions > 0) {
> +               /* Write DDR and global APM info */
> +               uint32_t apm32;
> +               uint16_t apm16;
> +               int total_parts;
> +
> +               fseek(fd, 0, SEEK_SET);
> +               apm16 = htons(0x4552);
> +               fwrite(&apm16, sizeof(apm16), 1, fd);
> +               apm16 = htons(diskStructure.sectorSize);
> +               fwrite(&apm16, sizeof(apm16), 1, fd);
> +               apm32 = htonl(diskStructure.totalSectors);
> +               fwrite(&apm32, sizeof(apm32), 1, fd);
> +
> +               /* Count total needed entries */
> +               total_parts = 2 + apm_partitions; /* Self + ISO9660 */
> +
> +               /* Write self-descriptor */
> +               cd9660_write_apm_partition_entry(fd, 0,
> +                   total_parts, 1, total_parts, diskStructure.sectorSize,
> +                   "Apple", "Apple_partition_map");
> +
> +               /* Write ISO9660 descriptor, enclosing the whole disk */
> +               cd9660_write_apm_partition_entry(fd, 1,
> +                   total_parts, 0, diskStructure.totalSectors,
> +                   diskStructure.sectorSize, "", "CD_ROM_Mode_1");
> +
> +               /* Write all partition entries */
> +               apm_partitions = 0;
> +               TAILQ_FOREACH(t, &diskStructure.boot_images, image_list) {
> +                       if (t->system != ET_SYS_MAC)
> +                               continue;
> +
> +                       cd9660_write_apm_partition_entry(fd,
> +                           2 + apm_partitions++, total_parts,
> +                           t->sector, t->num_sectors, diskStructure.sectorSize,
> +                           "CD Boot", "Apple_Bootstrap");
> +               }
>        }
>
>        return 0;
>  }
> +
> _______________________________________________
> svn-src-all@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/svn-src-all
> To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
>

Nice,

Do not forget to send this to the netbsd folks so that both makefs
keep as in sync as possible, christos@NetBSD.org should be interested
by this.

if you already did this, sorry for the noise.

regards,
Bapt



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?BANLkTi=i_nKhQeNHPb%2BnRD0kJz%2BdAz4YKg>