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>
