diff options
author | Mathieu Arnold <mat@FreeBSD.org> | 2016-07-26 16:51:15 +0000 |
---|---|---|
committer | Mathieu Arnold <mat@FreeBSD.org> | 2016-07-26 16:51:15 +0000 |
commit | 9fa9eb9ac7bf1d3de825ee25a8f0ae81b7b77896 (patch) | |
tree | 9b071a8105704e992946dcd6b801e9fcb7635142 /audio/cdparanoia/files/patch-interface_cooked__interface.c | |
parent | MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out, (diff) |
Cleanup patches, a* categories.
Rename them to follow the make makepatch naming, and regenerate them.
With hat: portmgr
Sponsored by: Absolight
Diffstat (limited to 'audio/cdparanoia/files/patch-interface_cooked__interface.c')
-rw-r--r-- | audio/cdparanoia/files/patch-interface_cooked__interface.c | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/audio/cdparanoia/files/patch-interface_cooked__interface.c b/audio/cdparanoia/files/patch-interface_cooked__interface.c new file mode 100644 index 000000000000..8d739c3f6ad1 --- /dev/null +++ b/audio/cdparanoia/files/patch-interface_cooked__interface.c @@ -0,0 +1,180 @@ +--- interface/cooked_interface.c.orig 2000-04-19 22:41:04 UTC ++++ interface/cooked_interface.c +@@ -1,6 +1,8 @@ + /****************************************************************** + * CopyPolicy: GNU Public License 2 applies + * Copyright (C) Monty xiphmont@mit.edu ++ * FreeBSD porting (c) 2003 ++ * Simon 'corecode' Schubert <corecode@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,142 @@ static long cooked_read (cdrom_drive *d, + 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; ++/* CDIOCREADAUDIO has been removed in FreeBSD 5.1-CURRENT */ ++#if __FreeBSD_version >= 501106 ++ int bsize = CD_FRAMESIZE_RAW; ++#else ++ 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; ++#endif ++ ++#if __FreeBSD_version >= 501106 ++ if (ioctl(d->ioctl_fd, CDRIOCSETBLOCKSIZE, &bsize) == -1) ++ return -7; ++#endif ++ for (;;) { ++/* CDIOCREADAUDIO has been removed in FreeBSD 5.1-CURRENT */ ++#if __FreeBSD_version >= 501106 ++ if (pread(d->ioctl_fd, p, sectors*bsize, begin*bsize) != sectors*bsize) { ++#else ++ arg.nframes = sectors; ++ if (ioctl(d->ioctl_fd, CDIOCREADAUDIO, &arg) == -1) { ++#endif ++ 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 +332,7 @@ static void check_exceptions(cdrom_drive + 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 +383,9 @@ int cooked_init_drive (cdrom_drive *d){ + 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; |