summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2002-10-19 21:11:43 +0000
committermarcel <marcel@FreeBSD.org>2002-10-19 21:11:43 +0000
commitd8d309f454ecd9ec34b34043180295cf50872d71 (patch)
tree6bb2e9d07b5fc6f701731a14d1b4d4e34b8857dd /sys
parentf3cd77cf07c034f4fe24a432a18d80b63379f1b6 (diff)
downloadFreeBSD-src-d8d309f454ecd9ec34b34043180295cf50872d71.zip
FreeBSD-src-d8d309f454ecd9ec34b34043180295cf50872d71.tar.gz
Implement the CDROMREADAUDIO ioctl.
Diffstat (limited to 'sys')
-rw-r--r--sys/compat/linux/linux_ioctl.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c
index 37cc872..9714433 100644
--- a/sys/compat/linux/linux_ioctl.c
+++ b/sys/compat/linux/linux_ioctl.c
@@ -932,6 +932,13 @@ struct linux_cdrom_subchnl
union linux_cdrom_addr cdsc_reladdr;
};
+struct l_cdrom_read_audio {
+ union linux_cdrom_addr addr;
+ u_char addr_format;
+ l_int nframes;
+ u_char *buf;
+};
+
struct l_dvd_layer {
u_char book_version:4;
u_char book_type:4;
@@ -1070,6 +1077,18 @@ bsd_to_linux_msf_lba(u_char af, union msf_lba *bp, union linux_cdrom_addr *lp)
}
static void
+linux_to_bsd_msf_lba(u_char af, union linux_cdrom_addr *lp, union msf_lba *bp)
+{
+ if (af == CD_LBA_FORMAT)
+ bp->lba = lp->lba;
+ else {
+ bp->msf.minute = lp->msf.minute;
+ bp->msf.second = lp->msf.second;
+ bp->msf.frame = lp->msf.frame;
+ }
+}
+
+static void
set_linux_cdrom_addr(union linux_cdrom_addr *addr, int format, int lba)
{
if (format == LINUX_CDROM_MSF) {
@@ -1377,7 +1396,24 @@ linux_ioctl_cdrom(struct thread *td, struct linux_ioctl_args *args)
/* LINUX_CDROMREADMODE2 */
/* LINUX_CDROMREADMODE1 */
- /* LINUX_CDROMREADAUDIO */
+
+ case LINUX_CDROMREADAUDIO: {
+ struct l_cdrom_read_audio lra;
+ struct ioc_read_audio bra;
+
+ error = copyin((caddr_t)args->arg, &lra, sizeof(lra));
+ if (error)
+ break;
+ bra.address_format = lra.addr_format;
+ linux_to_bsd_msf_lba(bra.address_format, &lra.addr,
+ &bra.address);
+ bra.nframes = lra.nframes;
+ bra.buffer = lra.buf;
+ error = fo_ioctl(fp, CDIOCREADAUDIO, (caddr_t)&bra,
+ td->td_ucred, td);
+ break;
+ }
+
/* LINUX_CDROMEJECT_SW */
/* LINUX_CDROMMULTISESSION */
/* LINUX_CDROM_GET_UPC */
OpenPOWER on IntegriCloud