mirror of
https://git.FreeBSD.org/ports.git
synced 2024-11-01 22:05:08 +00:00
11ef7f4c05
Use the ioctl's CDIOREADTOCHEADER and CDIOREADTOCENTRYS to determine the size of the data track on the disk, rather than using the DIOCGDINFO ioctl (which doesn't appear to work for all users / CD media under FreeBSD). Submitted by: Keith Jones <keith@mithy.org>
84 lines
2.3 KiB
Plaintext
84 lines
2.3 KiB
Plaintext
--- iodev/cdrom.cc.orig Thu Nov 11 21:44:52 1999
|
|
+++ iodev/cdrom.cc Sun Jan 16 10:47:05 2000
|
|
@@ -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;
|
|
@@ -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);
|
|
+
|
|
}
|
|
#elif defined WIN32
|
|
{
|