2000-01-14 09:08:05 +00:00
|
|
|
--- iodev/cdrom.cc.orig Thu Nov 11 21:44:52 1999
|
2000-01-16 19:56:01 +00:00
|
|
|
+++ iodev/cdrom.cc Sun Jan 16 10:47:05 2000
|
2000-01-14 09:08:05 +00:00
|
|
|
@@ -34,7 +34,7 @@
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
-#ifdef __OpenBSD__
|
|
|
|
+#if (defined(__OpenBSD__) || defined(__FreeBSD__))
|
|
|
|
// Here is a diff for cdrom.cc which adds support for OpenBSD.
|
|
|
|
//
|
|
|
|
// Note that since the i386 sys/disklabel.h contains code which c++ considers
|
|
|
|
@@ -134,7 +134,7 @@
|
|
|
|
// some ioctl() calls to really eject the CD as well.
|
|
|
|
|
|
|
|
if (fd >= 0) {
|
|
|
|
-#ifdef __OpenBSD__
|
|
|
|
+#if (defined(__OpenBSD__) || defined(__FreeBSD__))
|
|
|
|
(void) ioctl (fd, CDIOCALLOW);
|
|
|
|
if (ioctl (fd, CDIOCEJECT) < 0)
|
|
|
|
fprintf(stderr, "#eject_cdrom: eject returns error.\n");
|
|
|
|
@@ -240,7 +240,7 @@
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
-#elif defined(__OpenBSD__)
|
|
|
|
+#elif (defined(__OpenBSD__) || defined(__FreeBSD__))
|
|
|
|
{
|
|
|
|
struct ioc_toc_header h;
|
|
|
|
struct ioc_read_toc_entry t;
|
2000-01-16 19:56:01 +00:00
|
|
|
@@ -366,6 +366,53 @@
|
|
|
|
|
|
|
|
fprintf(stderr, "#cdrom: capacity: %u\n", lp.d_secperunit);
|
|
|
|
return(lp.d_secperunit);
|
|
|
|
+ }
|
|
|
|
+#elif defined(__FreeBSD__)
|
|
|
|
+ {
|
|
|
|
+ // Read the TOC to get the data size, since disklabel doesn't appear
|
|
|
|
+ // to work, sadly.
|
|
|
|
+ // Keith Jones, 16 January 2000
|
|
|
|
+
|
|
|
|
+#define MAX_TRACKS 100
|
|
|
|
+
|
|
|
|
+ int i, num_tracks, num_sectors;
|
|
|
|
+ struct ioc_toc_header td;
|
|
|
|
+ struct ioc_read_toc_entry rte;
|
|
|
|
+ struct cd_toc_entry toc_buffer[MAX_TRACKS + 1];
|
|
|
|
+
|
|
|
|
+ if (fd < 0)
|
|
|
|
+ bx_panic("cdrom: capacity: file not open.\n");
|
|
|
|
+
|
|
|
|
+ if (ioctl(fd, CDIOREADTOCHEADER, &td) < 0)
|
|
|
|
+ bx_panic("cdrom: ioctl(CDIOREADTOCHEADER) failed\n");
|
|
|
|
+
|
|
|
|
+ num_tracks = (td.ending_track - td.starting_track) + 1;
|
|
|
|
+ if (num_tracks > MAX_TRACKS)
|
|
|
|
+ bx_panic("cdrom: TOC is too large\n");
|
|
|
|
+
|
|
|
|
+ rte.address_format = CD_LBA_FORMAT;
|
|
|
|
+ rte.starting_track = td.starting_track;
|
|
|
|
+ rte.data_len = (num_tracks + 1) * sizeof(struct cd_toc_entry);
|
|
|
|
+ rte.data = toc_buffer;
|
|
|
|
+ if (ioctl(fd, CDIOREADTOCENTRYS, &rte) < 0)
|
|
|
|
+ bx_panic("cdrom: ioctl(CDIOREADTOCENTRYS) failed\n");
|
|
|
|
+
|
|
|
|
+ num_sectors = -1;
|
|
|
|
+ for (i = 0; i < num_tracks; i++) {
|
|
|
|
+ if (rte.data[i].control & 4) { /* data track */
|
|
|
|
+ num_sectors = ntohl(rte.data[i + 1].addr.lba)
|
|
|
|
+ - ntohl(rte.data[i].addr.lba);
|
|
|
|
+ fprintf(stderr, "cdrom: Data track %d, length %d\n",
|
|
|
|
+ rte.data[i].track, num_sectors);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (num_sectors < 0)
|
|
|
|
+ bx_panic("cdrom: no data track found\n");
|
|
|
|
+
|
|
|
|
+ return(num_sectors);
|
|
|
|
+
|
2000-01-14 09:08:05 +00:00
|
|
|
}
|
2000-01-16 19:56:01 +00:00
|
|
|
#elif defined WIN32
|
2000-01-14 09:08:05 +00:00
|
|
|
{
|