From owner-freebsd-ports-bugs@FreeBSD.ORG Tue Nov 4 20:50:23 2003 Return-Path: Delivered-To: freebsd-ports-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 4639616A4CE for ; Tue, 4 Nov 2003 20:50:23 -0800 (PST) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 4253B43FB1 for ; Tue, 4 Nov 2003 20:50:21 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.9/8.12.9) with ESMTP id hA54oLFY027742 for ; Tue, 4 Nov 2003 20:50:21 -0800 (PST) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.9/8.12.9/Submit) id hA54oLUA027741; Tue, 4 Nov 2003 20:50:21 -0800 (PST) (envelope-from gnats) Date: Tue, 4 Nov 2003 20:50:21 -0800 (PST) Message-Id: <200311050450.hA54oLUA027741@freefall.freebsd.org> To: freebsd-ports-bugs@FreeBSD.org From: Simon Barner Subject: Re: ports/57226: audio/cdparanoia fix to work with cooked_ioctl under -CURRENT X-BeenThere: freebsd-ports-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Simon Barner List-Id: Ports bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 05 Nov 2003 04:50:23 -0000 X-List-Received-Date: Wed, 05 Nov 2003 04:50:23 -0000 The following reply was made to PR ports/57226; it has been noted by GNATS. From: Simon Barner To: freebsd-gnats-submit@FreeBSD.org, vkushnir@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 + +# 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 +.include 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@mit.edu ++ * FreeBSD porting (c) 2003 ++ * Simon 'corecode' Schubert + * + * 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@mit.edu ++ * FreeBSD porting (c) 2003 ++ * Simon 'corecode' Schubert + * + * 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@mit.edu -+ * FreeBSD porting (c) 2003 -+ * Simon 'corecode' Schubert - * - * 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;