ports/57226: audio/cdparanoia fix to work with cooked_ioctl under -CURRENT
Simon Barner
barner at in.tum.de
Wed Nov 5 04:50:23 UTC 2003
The following reply was made to PR ports/57226; it has been noted by GNATS.
From: Simon Barner <barner at in.tum.de>
To: freebsd-gnats-submit at FreeBSD.org, vkushnir at Alfacom.net
Cc:
Subject: Re: ports/57226: audio/cdparanoia fix to work with cooked_ioctl under -CURRENT
Date: Wed, 5 Nov 2003 05:42:32 +0100
I improved the patch to make use of ${OSVERSION}. Since there was no version
bump for ATAng, I used the next version that after sos@'s commit in order to
make a case destinction.
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/sys/param.h.diff?r1=1.165&r2=1.166
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/ata/atapi-cd.c.diff?r1=1.137&r2=1.138
diff -ruN cdparanoia/Makefile cdparanoia.patched/Makefile
--- cdparanoia/Makefile Mon Jul 14 04:52:55 2003
+++ cdparanoia.patched/Makefile Tue Nov 4 20:21:00 2003
@@ -24,7 +24,16 @@
MAN1= cdparanoia.1
+.include <bsd.port.pre.mk>
+
+# CDIOCREADAUDIO support was removed with ATAng
+.if ${OSVERSION} >= 501106
+EXTRA_PATCHES= ${PATCHDIR}/extra-patch-interface-cooked_interface.c-WITHOUT_CDIOCREADAUDIO
+.else
+EXTRA_PATCHES= ${PATCHDIR}/extra-patch-interface-cooked_interface.c
+.endif
+
post-patch:
@${REINPLACE_CMD} -e 's/\(^ *default:\)/\1break;/' ${WRKSRC}/interface/utils.h
-.include <bsd.port.mk>
+.include <bsd.port.post.mk>
diff -ruN cdparanoia/files/extra-patch-interface-cooked_interface.c cdparanoia.patched/files/extra-patch-interface-cooked_interface.c
--- cdparanoia/files/extra-patch-interface-cooked_interface.c Thu Jan 1 01:00:00 1970
+++ cdparanoia.patched/files/extra-patch-interface-cooked_interface.c Tue Nov 4 19:03:39 2003
@@ -0,0 +1,172 @@
+Index: interface/cooked_interface.c
+===================================================================
+RCS file: /home/cvs/cdparanoia/interface/cooked_interface.c,v
+retrieving revision 1.1.1.1
+retrieving revision 1.8
+diff -u -r1.1.1.1 -r1.8
+--- interface/cooked_interface.c 2003/01/05 09:46:26 1.1.1.1
++++ interface/cooked_interface.c 2003/01/11 08:58:45 1.8
+@@ -1,6 +1,8 @@
+ /******************************************************************
+ * CopyPolicy: GNU Public License 2 applies
+ * Copyright (C) Monty xiphmont at mit.edu
++ * FreeBSD porting (c) 2003
++ * Simon 'corecode' Schubert <corecode at corecode.ath.cx>
+ *
+ * CDROM code specific to the cooked ioctl interface
+ *
+@@ -10,6 +12,7 @@
+ #include "common_interface.h"
+ #include "utils.h"
+
++#ifdef Linux
+ static int cooked_readtoc (cdrom_drive *d){
+ int i;
+ int tracks;
+@@ -129,6 +132,128 @@
+ return(sectors);
+ }
+
++#elif defined(__FreeBSD__)
++static int
++cooked_readtoc(cdrom_drive *d)
++{
++ int i;
++ struct ioc_toc_header hdr;
++ struct ioc_read_toc_single_entry entry;
++
++ if (ioctl(d->ioctl_fd, CDIOREADTOCHEADER, &hdr) == -1) {
++ int ret;
++
++ if (errno == EPERM) {
++ ret = -102;
++ cderror(d, "102: ");
++ } else {
++ ret = -4;
++ cderror(d, "004: Unable to read table of contents header: ");
++ }
++ cderror(d, strerror(errno));
++ cderror(d, "\n");
++ return ret;
++ }
++
++ entry.address_format = CD_LBA_FORMAT;
++ for (i = hdr.starting_track; i <= hdr.ending_track; ++i) {
++ entry.track = i;
++
++ if (ioctl(d->ioctl_fd, CDIOREADTOCENTRY, &entry) == -1) {
++ cderror(d, "005: Unable to read table of contents entry\n");
++ return -5;
++ }
++
++ d->disc_toc[i - hdr.starting_track].bFlags = entry.entry.control;
++ d->disc_toc[i - hdr.starting_track].bTrack = entry.entry.track;
++ d->disc_toc[i - hdr.starting_track].dwStartSector = be32_to_cpu(entry.entry.addr.lba);
++ }
++
++ entry.track = 0xaa; /* leadout */
++
++ if (ioctl(d->ioctl_fd, CDIOREADTOCENTRY, &entry) == -1) {
++ cderror(d, "005: Unable to read table of contents entry\n");
++ return -5;
++ }
++
++ d->disc_toc[i - hdr.starting_track].bFlags = entry.entry.control;
++ d->disc_toc[i - hdr.starting_track].bTrack = entry.entry.track;
++ d->disc_toc[i - hdr.starting_track].dwStartSector = be32_to_cpu(entry.entry.addr.lba);
++
++ d->cd_extra = FixupTOC(d, hdr.ending_track - hdr.starting_track + 2); /* with TOC */
++
++ return hdr.ending_track - hdr.starting_track + 1;
++}
++
++static int
++cooked_setspeed(cdrom_drive *d, int speed)
++{
++#ifdef CDRIOCREADSPEED
++ speed *= 177;
++ return ioctl(d->ioctl_fd, CDRIOCREADSPEED, &speed);
++#else
++ return -1;
++#endif
++}
++
++
++static long
++cooked_read(cdrom_drive *d, void *p, long begin, long sectors)
++{
++ int retry_count = 0;
++ struct ioc_read_audio arg;
++
++ if (sectors > d->nsectors)
++ sectors = d->nsectors;
++
++ arg.address_format = CD_LBA_FORMAT;
++ arg.address.lba = begin;
++ arg.buffer = p;
++
++ for (;;) {
++ arg.nframes = sectors;
++ if (ioctl(d->ioctl_fd, CDIOCREADAUDIO, &arg) == -1) {
++ if (!d->error_retry)
++ return -7;
++
++ switch (errno) {
++ case ENOMEM:
++ if (sectors == 1) {
++ cderror(d, "300: Kernel memory error\n");
++ return -300;
++ }
++ /* FALLTHROUGH */
++ default:
++ if (sectors == 1) {
++ if (retry_count > MAX_RETRIES - 1) {
++ char b[256];
++ snprintf(b, sizeof(b),
++ "010: Unable to access sector %ld; "
++ "skipping...\n", begin);
++ cderror(d, b);
++ return -10;
++ }
++ break;
++ }
++ }
++
++ if (retry_count > 4 && sectors > 1)
++ sectors = sectors * 3 / 4;
++
++ ++retry_count;
++
++ if (retry_count > MAX_RETRIES) {
++ cderror(d, "007: Unknown, unrecoverable error reading data\n");
++ return -7;
++ }
++ } else
++ break;
++ }
++
++ return sectors;
++}
++#endif
++
+ /* hook */
+ static int Dummy (cdrom_drive *d,int Switch){
+ return(0);
+@@ -193,6 +318,7 @@
+ int cooked_init_drive (cdrom_drive *d){
+ int ret;
+
++#ifdef Linux
+ switch(d->drive_type){
+ case MATSUSHITA_CDROM_MAJOR: /* sbpcd 1 */
+ case MATSUSHITA_CDROM2_MAJOR: /* sbpcd 2 */
+@@ -243,6 +369,9 @@
+ default:
+ d->nsectors=40;
+ }
++#elif defined(__FreeBSD__)
++ d->nsectors = 26; /* FreeBSD only support 64K I/O transfer size */
++#endif
+ d->enable_cdda = Dummy;
+ d->read_audio = cooked_read;
+ d->set_speed = cooked_setspeed;
diff -ruN cdparanoia/files/extra-patch-interface-cooked_interface.c-WITHOUT_CDIOCREADAUDIO cdparanoia.patched/files/extra-patch-interface-cooked_interface.c-WITHOUT_CDIOCREADAUDIO
--- cdparanoia/files/extra-patch-interface-cooked_interface.c-WITHOUT_CDIOCREADAUDIO Thu Jan 1 01:00:00 1970
+++ cdparanoia.patched/files/extra-patch-interface-cooked_interface.c-WITHOUT_CDIOCREADAUDIO Tue Nov 4 20:18:01 2003
@@ -0,0 +1,161 @@
+--- interface/cooked_interface.c.orig Tue Nov 4 20:16:33 2003
++++ interface/cooked_interface.c Tue Nov 4 20:16:42 2003
+@@ -1,6 +1,8 @@
+ /******************************************************************
+ * CopyPolicy: GNU Public License 2 applies
+ * Copyright (C) Monty xiphmont at mit.edu
++ * FreeBSD porting (c) 2003
++ * Simon 'corecode' Schubert <corecode at corecode.ath.cx>
+ *
+ * CDROM code specific to the cooked ioctl interface
+ *
+@@ -10,6 +12,7 @@
+ #include "common_interface.h"
+ #include "utils.h"
+
++#ifdef Linux
+ static int cooked_readtoc (cdrom_drive *d){
+ int i;
+ int tracks;
+@@ -129,6 +132,123 @@
+ return(sectors);
+ }
+
++#elif defined(__FreeBSD__)
++static int
++cooked_readtoc(cdrom_drive *d)
++{
++ int i;
++ struct ioc_toc_header hdr;
++ struct ioc_read_toc_single_entry entry;
++
++ if (ioctl(d->ioctl_fd, CDIOREADTOCHEADER, &hdr) == -1) {
++ int ret;
++
++ if (errno == EPERM) {
++ ret = -102;
++ cderror(d, "102: ");
++ } else {
++ ret = -4;
++ cderror(d, "004: Unable to read table of contents header: ");
++ }
++ cderror(d, strerror(errno));
++ cderror(d, "\n");
++ return ret;
++ }
++
++ entry.address_format = CD_LBA_FORMAT;
++ for (i = hdr.starting_track; i <= hdr.ending_track; ++i) {
++ entry.track = i;
++
++ if (ioctl(d->ioctl_fd, CDIOREADTOCENTRY, &entry) == -1) {
++ cderror(d, "005: Unable to read table of contents entry\n");
++ return -5;
++ }
++
++ d->disc_toc[i - hdr.starting_track].bFlags = entry.entry.control;
++ d->disc_toc[i - hdr.starting_track].bTrack = entry.entry.track;
++ d->disc_toc[i - hdr.starting_track].dwStartSector = be32_to_cpu(entry.entry.addr.lba);
++ }
++
++ entry.track = 0xaa; /* leadout */
++
++ if (ioctl(d->ioctl_fd, CDIOREADTOCENTRY, &entry) == -1) {
++ cderror(d, "005: Unable to read table of contents entry\n");
++ return -5;
++ }
++
++ d->disc_toc[i - hdr.starting_track].bFlags = entry.entry.control;
++ d->disc_toc[i - hdr.starting_track].bTrack = entry.entry.track;
++ d->disc_toc[i - hdr.starting_track].dwStartSector = be32_to_cpu(entry.entry.addr.lba);
++
++ d->cd_extra = FixupTOC(d, hdr.ending_track - hdr.starting_track + 2); /* with TOC */
++
++ return hdr.ending_track - hdr.starting_track + 1;
++}
++
++static int
++cooked_setspeed(cdrom_drive *d, int speed)
++{
++#ifdef CDRIOCREADSPEED
++ speed *= 177;
++ return ioctl(d->ioctl_fd, CDRIOCREADSPEED, &speed);
++#else
++ return -1;
++#endif
++}
++
++
++static long
++cooked_read(cdrom_drive *d, void *p, long begin, long sectors)
++{
++ int retry_count = 0;
++ int bsize = CD_FRAMESIZE_RAW;
++
++ for (;;) {
++ if (ioctl(d->ioctl_fd, CDRIOCSETBLOCKSIZE, &bsize) == -1) {
++ return -7;
++ }
++ if (pread(d->ioctl_fd, p, sectors*bsize, begin*bsize) != sectors*bsize) {
++ if (!d->error_retry)
++ return -7;
++
++ switch (errno) {
++ case ENOMEM:
++ if (sectors == 1) {
++ cderror(d, "300: Kernel memory error\n");
++ return -300;
++ }
++ /* FALLTHROUGH */
++ default:
++ if (sectors == 1) {
++ if (retry_count > MAX_RETRIES - 1) {
++ char b[256];
++ snprintf(b, sizeof(b),
++ "010: Unable to access sector %ld; "
++ "skipping...\n", begin);
++ cderror(d, b);
++ return -10;
++ }
++ break;
++ }
++ }
++
++ if (retry_count > 4 && sectors > 1)
++ sectors = sectors * 3 / 4;
++
++ ++retry_count;
++
++ if (retry_count > MAX_RETRIES) {
++ cderror(d, "007: Unknown, unrecoverable error reading data\n");
++ return -7;
++ }
++ } else
++ break;
++ }
++
++ return sectors;
++}
++#endif
++
+ /* hook */
+ static int Dummy (cdrom_drive *d,int Switch){
+ return(0);
+@@ -193,6 +313,7 @@
+ int cooked_init_drive (cdrom_drive *d){
+ int ret;
+
++#ifdef Linux
+ switch(d->drive_type){
+ case MATSUSHITA_CDROM_MAJOR: /* sbpcd 1 */
+ case MATSUSHITA_CDROM2_MAJOR: /* sbpcd 2 */
+@@ -243,6 +364,9 @@
+ default:
+ d->nsectors=40;
+ }
++#elif defined(__FreeBSD__)
++ d->nsectors = 26; /* FreeBSD only support 64K I/O transfer size */
++#endif
+ d->enable_cdda = Dummy;
+ d->read_audio = cooked_read;
+ d->set_speed = cooked_setspeed;
diff -ruN cdparanoia/files/patch-interface-cooked_interface.c cdparanoia.patched/files/patch-interface-cooked_interface.c
--- cdparanoia/files/patch-interface-cooked_interface.c Sat Jan 11 10:15:00 2003
+++ cdparanoia.patched/files/patch-interface-cooked_interface.c Thu Jan 1 01:00:00 1970
@@ -1,172 +0,0 @@
-Index: interface/cooked_interface.c
-===================================================================
-RCS file: /home/cvs/cdparanoia/interface/cooked_interface.c,v
-retrieving revision 1.1.1.1
-retrieving revision 1.8
-diff -u -r1.1.1.1 -r1.8
---- interface/cooked_interface.c 2003/01/05 09:46:26 1.1.1.1
-+++ interface/cooked_interface.c 2003/01/11 08:58:45 1.8
-@@ -1,6 +1,8 @@
- /******************************************************************
- * CopyPolicy: GNU Public License 2 applies
- * Copyright (C) Monty xiphmont at mit.edu
-+ * FreeBSD porting (c) 2003
-+ * Simon 'corecode' Schubert <corecode at corecode.ath.cx>
- *
- * CDROM code specific to the cooked ioctl interface
- *
-@@ -10,6 +12,7 @@
- #include "common_interface.h"
- #include "utils.h"
-
-+#ifdef Linux
- static int cooked_readtoc (cdrom_drive *d){
- int i;
- int tracks;
-@@ -129,6 +132,128 @@
- return(sectors);
- }
-
-+#elif defined(__FreeBSD__)
-+static int
-+cooked_readtoc(cdrom_drive *d)
-+{
-+ int i;
-+ struct ioc_toc_header hdr;
-+ struct ioc_read_toc_single_entry entry;
-+
-+ if (ioctl(d->ioctl_fd, CDIOREADTOCHEADER, &hdr) == -1) {
-+ int ret;
-+
-+ if (errno == EPERM) {
-+ ret = -102;
-+ cderror(d, "102: ");
-+ } else {
-+ ret = -4;
-+ cderror(d, "004: Unable to read table of contents header: ");
-+ }
-+ cderror(d, strerror(errno));
-+ cderror(d, "\n");
-+ return ret;
-+ }
-+
-+ entry.address_format = CD_LBA_FORMAT;
-+ for (i = hdr.starting_track; i <= hdr.ending_track; ++i) {
-+ entry.track = i;
-+
-+ if (ioctl(d->ioctl_fd, CDIOREADTOCENTRY, &entry) == -1) {
-+ cderror(d, "005: Unable to read table of contents entry\n");
-+ return -5;
-+ }
-+
-+ d->disc_toc[i - hdr.starting_track].bFlags = entry.entry.control;
-+ d->disc_toc[i - hdr.starting_track].bTrack = entry.entry.track;
-+ d->disc_toc[i - hdr.starting_track].dwStartSector = be32_to_cpu(entry.entry.addr.lba);
-+ }
-+
-+ entry.track = 0xaa; /* leadout */
-+
-+ if (ioctl(d->ioctl_fd, CDIOREADTOCENTRY, &entry) == -1) {
-+ cderror(d, "005: Unable to read table of contents entry\n");
-+ return -5;
-+ }
-+
-+ d->disc_toc[i - hdr.starting_track].bFlags = entry.entry.control;
-+ d->disc_toc[i - hdr.starting_track].bTrack = entry.entry.track;
-+ d->disc_toc[i - hdr.starting_track].dwStartSector = be32_to_cpu(entry.entry.addr.lba);
-+
-+ d->cd_extra = FixupTOC(d, hdr.ending_track - hdr.starting_track + 2); /* with TOC */
-+
-+ return hdr.ending_track - hdr.starting_track + 1;
-+}
-+
-+static int
-+cooked_setspeed(cdrom_drive *d, int speed)
-+{
-+#ifdef CDRIOCREADSPEED
-+ speed *= 177;
-+ return ioctl(d->ioctl_fd, CDRIOCREADSPEED, &speed);
-+#else
-+ return -1;
-+#endif
-+}
-+
-+
-+static long
-+cooked_read(cdrom_drive *d, void *p, long begin, long sectors)
-+{
-+ int retry_count = 0;
-+ struct ioc_read_audio arg;
-+
-+ if (sectors > d->nsectors)
-+ sectors = d->nsectors;
-+
-+ arg.address_format = CD_LBA_FORMAT;
-+ arg.address.lba = begin;
-+ arg.buffer = p;
-+
-+ for (;;) {
-+ arg.nframes = sectors;
-+ if (ioctl(d->ioctl_fd, CDIOCREADAUDIO, &arg) == -1) {
-+ if (!d->error_retry)
-+ return -7;
-+
-+ switch (errno) {
-+ case ENOMEM:
-+ if (sectors == 1) {
-+ cderror(d, "300: Kernel memory error\n");
-+ return -300;
-+ }
-+ /* FALLTHROUGH */
-+ default:
-+ if (sectors == 1) {
-+ if (retry_count > MAX_RETRIES - 1) {
-+ char b[256];
-+ snprintf(b, sizeof(b),
-+ "010: Unable to access sector %ld; "
-+ "skipping...\n", begin);
-+ cderror(d, b);
-+ return -10;
-+ }
-+ break;
-+ }
-+ }
-+
-+ if (retry_count > 4 && sectors > 1)
-+ sectors = sectors * 3 / 4;
-+
-+ ++retry_count;
-+
-+ if (retry_count > MAX_RETRIES) {
-+ cderror(d, "007: Unknown, unrecoverable error reading data\n");
-+ return -7;
-+ }
-+ } else
-+ break;
-+ }
-+
-+ return sectors;
-+}
-+#endif
-+
- /* hook */
- static int Dummy (cdrom_drive *d,int Switch){
- return(0);
-@@ -193,6 +318,7 @@
- int cooked_init_drive (cdrom_drive *d){
- int ret;
-
-+#ifdef Linux
- switch(d->drive_type){
- case MATSUSHITA_CDROM_MAJOR: /* sbpcd 1 */
- case MATSUSHITA_CDROM2_MAJOR: /* sbpcd 2 */
-@@ -243,6 +369,9 @@
- default:
- d->nsectors=40;
- }
-+#elif defined(__FreeBSD__)
-+ d->nsectors = 26; /* FreeBSD only support 64K I/O transfer size */
-+#endif
- d->enable_cdda = Dummy;
- d->read_audio = cooked_read;
- d->set_speed = cooked_setspeed;
More information about the freebsd-ports-bugs
mailing list