From 0e463dfc0d4fdb3d659fb0143a22720f7a7d43d5 Mon Sep 17 00:00:00 2001 From: rocky Date: Thu, 27 Mar 2008 17:40:50 +0000 Subject: [PATCH] Start NetBSD driver --- configure.ac | 8 +- include/cdio/device.h | 32 +- lib/driver/Makefile.am | 3 +- lib/driver/cdio_private.h | 16 +- lib/driver/device.c | 16 +- lib/driver/libcdio.sym | 3 + lib/driver/netbsd.c | 600 ++++++++++++++++++++++++++++++++++++++ test/Makefile.am | 4 +- 8 files changed, 664 insertions(+), 18 deletions(-) create mode 100644 lib/driver/netbsd.c diff --git a/configure.ac b/configure.ac index 4d4752d2..fbdf3867 100644 --- a/configure.ac +++ b/configure.ac @@ -20,7 +20,7 @@ define(RELEASE_NUM, 81) define(CDIO_VERSION_STR, 0.$1cvs) AC_PREREQ(2.52) -AC_REVISION([$Id: configure.ac,v 1.223 2008/03/22 22:43:56 rocky Exp $])dnl +AC_REVISION([$Id: configure.ac,v 1.224 2008/03/27 17:40:50 rocky Exp $])dnl AC_INIT(libcdio, CDIO_VERSION_STR(RELEASE_NUM)) AC_CONFIG_SRCDIR(src/cd-info.c) @@ -461,6 +461,12 @@ int has_timeout=sizeof(test.timeout);], LIBS="$LIBS -lcam" cd_drivers="${cd_drivers}, FreeBSD " ;; + netbsd*) + AC_DEFINE([HAVE_NETBSD_CDROM], [1], + [Define 1 if you have NetBSD CD-ROM support]) + # LIBS="$LIBS -lcam" + cd_drivers="${cd_drivers}, NetBSD " + ;; *) AC_MSG_WARN([Don't have OS CD-reading support for ${host_os}...]) AC_MSG_WARN([Will use generic support.]) diff --git a/include/cdio/device.h b/include/cdio/device.h index cd1d597f..42d36ada 100644 --- a/include/cdio/device.h +++ b/include/cdio/device.h @@ -1,5 +1,5 @@ /* -*- c -*- - $Id: device.h,v 1.37 2008/03/25 15:59:08 karl Exp $ + $Id: device.h,v 1.38 2008/03/27 17:40:50 rocky Exp $ Copyright (C) 2005, 2006, 2008 Rocky Bernstein @@ -158,7 +158,8 @@ extern "C" { DRIVER_SOLARIS, /**< Sun Solaris Driver */ DRIVER_OSX, /**< Apple OSX Driver */ DRIVER_WIN32, /**< Microsoft Windows Driver. Includes ASPI and - ioctl acces. */ + ioctl access. */ + DRIVER_NETBSD, /**< NetBSD Driver. */ DRIVER_CDRDAO, /**< cdrdao format CD image. This is listed before BIN/CUE, to make the code prefer cdrdao over BIN/CUE when both exist. */ @@ -184,7 +185,7 @@ extern "C" { #define CDIO_MIN_DRIVER DRIVER_AIX #define CDIO_MIN_DEVICE_DRIVER CDIO_MIN_DRIVER #define CDIO_MAX_DRIVER DRIVER_NRG -#define CDIO_MAX_DEVICE_DRIVER DRIVER_WIN32 +#define CDIO_MAX_DEVICE_DRIVER DRIVER_NETBSD /** The following are status codes for completion of a given cdio operation. By design 0 is successful completion and -1 is error @@ -440,25 +441,32 @@ extern "C" { /*! True if CD-ROM understand ATAPI commands. */ bool_3way_t cdio_have_atapi (CdIo_t *p_cdio); - /*! True if AIX driver is available. */ + /*! DEPRICATED: use cdio_have_driver(). + True if AIX driver is available. */ bool cdio_have_aix (void); - /*! True if BSDI driver is available. */ + /*! DEPRICATED: use cdio_have_driver(). + True if BSDI driver is available. */ bool cdio_have_bsdi (void); - /*! True if FreeBSD driver is available. */ + /*! DEPRICATED: use cdio_have_driver(). + True if FreeBSD driver is available. */ bool cdio_have_freebsd (void); - /*! True if GNU/Linux driver is available. */ + /*! DEPRICATED: use cdio_have_driver(). + True if GNU/Linux driver is available. */ bool cdio_have_linux (void); - /*! True if Sun Solaris driver is available. */ + /*! DEPRICATED: use cdio_have_driver(). + True if Sun Solaris driver is available. */ bool cdio_have_solaris (void); - /*! True if Apple OSX driver is available. */ + /*! DEPRICATED: use cdio_have_driver(). + True if Apple OSX driver is available. */ bool cdio_have_osx (void); - /*! True if Microsoft Windows driver is available. */ + /*! DEPRICATED: use cdio_have_driver(). + True if Microsoft Windows driver is available. */ bool cdio_have_win32 (void); /*! True if Nero driver is available. */ @@ -586,7 +594,7 @@ extern "C" { the some sort of device name. @return the cdio object for subsequent operations. - NULL on error or there is no BSDI driver. + NULL on error or there is no AIX driver. @see cdio_open */ @@ -597,7 +605,7 @@ extern "C" { the some sort of device name. @return the cdio object for subsequent operations. - NULL on error or there is no BSDI driver. + NULL on error or there is no AIX driver. @see cdio_open */ diff --git a/lib/driver/Makefile.am b/lib/driver/Makefile.am index 62e5f2ff..e66db87b 100644 --- a/lib/driver/Makefile.am +++ b/lib/driver/Makefile.am @@ -1,4 +1,4 @@ -# $Id: Makefile.am,v 1.23 2008/03/20 19:02:38 karl Exp $ +# $Id: Makefile.am,v 1.24 2008/03/27 17:40:50 rocky Exp $ # # Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 # Rocky Bernstein @@ -88,6 +88,7 @@ libcdio_sources = \ MSWindows/win32_ioctl.c \ MSWindows/win32.c \ MSWindows/win32.h \ + netbsd.c \ osx.c \ read.c \ sector.c \ diff --git a/lib/driver/cdio_private.h b/lib/driver/cdio_private.h index 00a7fcf5..b2f877d2 100644 --- a/lib/driver/cdio_private.h +++ b/lib/driver/cdio_private.h @@ -1,5 +1,5 @@ /* - $Id: cdio_private.h,v 1.34 2008/03/21 10:19:38 rocky Exp $ + $Id: cdio_private.h,v 1.35 2008/03/27 17:40:50 rocky Exp $ Copyright (C) 2003, 2004, 2005 Rocky Bernstein @@ -485,10 +485,24 @@ extern "C" { driver_return_code_t close_tray_bsdi (const char *psz_drive); driver_return_code_t close_tray_freebsd (const char *psz_drive); driver_return_code_t close_tray_linux (const char *psz_drive); + driver_return_code_t close_tray_netbsd (const char *psz_drive); driver_return_code_t close_tray_osx (const char *psz_drive); driver_return_code_t close_tray_solaris (const char *psz_drive); driver_return_code_t close_tray_win32 (const char *psz_drive); + bool cdio_have_netbsd(void); + CdIo_t * cdio_open_netbsd (const char *psz_source); + char * cdio_get_default_device_netbsd(void); + char **cdio_get_devices_netbsd(void); + /*! Set up CD-ROM for reading using the NetBSD driver. The device_name is + the some sort of device name. + + NULL is returned on error or there is no FreeBSD driver. + + @see cdio_open_cd, cdio_open + */ + CdIo_t * cdio_open_am_netbsd (const char *psz_source, + const char *psz_access_mode); #ifdef __cplusplus } diff --git a/lib/driver/device.c b/lib/driver/device.c index b4ff95da..fbcade0d 100644 --- a/lib/driver/device.c +++ b/lib/driver/device.c @@ -1,5 +1,5 @@ /* - $Id: device.c,v 1.39 2006/04/04 02:06:13 rocky Exp $ + $Id: device.c,v 1.40 2008/03/27 17:40:50 rocky Exp $ Copyright (C) 2005, 2006 Rocky Bernstein @@ -149,6 +149,19 @@ CdIo_driver_t CdIo_all_drivers[CDIO_MAX_DRIVER+1] = { &close_tray_freebsd }, + {DRIVER_NETBSD, + CDIO_SRC_IS_DEVICE_MASK|CDIO_SRC_IS_NATIVE_MASK|CDIO_SRC_IS_SCSI_MASK, + "NetBSD", + "NetBSD driver", + &cdio_have_netbsd, + &cdio_open_netbsd, + &cdio_open_am_netbsd, + &cdio_get_default_device_netbsd, + &cdio_is_device_generic, + &cdio_get_devices_netbsd, + &close_tray_netbsd + }, + {DRIVER_LINUX, CDIO_SRC_IS_DEVICE_MASK|CDIO_SRC_IS_NATIVE_MASK, "GNU/Linux", @@ -923,6 +936,7 @@ cdio_open_am (const char *psz_orig_source, driver_id_t driver_id, case DRIVER_BSDI: case DRIVER_FREEBSD: case DRIVER_LINUX: + case DRIVER_NETBSD: case DRIVER_SOLARIS: case DRIVER_WIN32: case DRIVER_OSX: diff --git a/lib/driver/libcdio.sym b/lib/driver/libcdio.sym index 4855803d..9382ca51 100644 --- a/lib/driver/libcdio.sym +++ b/lib/driver/libcdio.sym @@ -95,6 +95,7 @@ cdio_have_cdrdao cdio_have_driver cdio_have_freebsd cdio_have_linux +cdio_have_netbsd cdio_have_nrg cdio_have_osx cdio_have_solaris @@ -128,6 +129,7 @@ cdio_open_am_cd cdio_open_am_cdrdao cdio_open_am_freebsd cdio_open_am_linux +cdio_open_am_netbsd cdio_open_am_nrg cdio_open_am_osx cdio_open_am_solaris @@ -139,6 +141,7 @@ cdio_open_cdrdao cdio_open_cue cdio_open_freebsd cdio_open_linux +cdio_open_netbsd cdio_open_nrg cdio_open_osx cdio_open_solaris diff --git a/lib/driver/netbsd.c b/lib/driver/netbsd.c new file mode 100644 index 00000000..188a2fe2 --- /dev/null +++ b/lib/driver/netbsd.c @@ -0,0 +1,600 @@ +/* $NetBSD: _cdio_netbsd.c,v 1.4 2005/05/31 17:05:36 drochner Exp $ */ + +/* + * Copyright (c) 2003 + * Matthias Drochner. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * XXX This is for NetBSD but uses "freebsd" function names to plug + * nicely into the existing libcdio. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "cdio_assert.h" +#include "cdio_private.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __i386__ +#define DEFAULT_CDIO_DEVICE "/dev/rcd0d" +#else +#define DEFAULT_CDIO_DEVICE "/dev/rcd0c" +#endif + +#ifdef HAVE_NETBSD_CDROM +#include +#include + +#define TOTAL_TRACKS (_obj->tochdr.ending_track \ + - _obj->tochdr.starting_track + 1) +#define FIRST_TRACK_NUM (_obj->tochdr.starting_track) + +typedef struct { + generic_img_private_t gen; + + bool toc_valid; + struct ioc_toc_header tochdr; + struct cd_toc_entry tocent[100]; + + bool sessionformat_valid; + int sessionformat[100]; /* format of the session the track is in */ +} _img_private_t; + +static driver_return_code_t +run_scsi_cmd_netbsd(void *p_user_data, unsigned int i_timeout_ms, + unsigned int i_cdb, const mmc_cdb_t *p_cdb, + cdio_mmc_direction_t e_direction, + unsigned int i_buf, void *p_buf ) +{ + const _img_private_t *_obj = p_user_data; + scsireq_t req; + + memset(&req, 0, sizeof(req)); + memcpy(&req.cmd[0], p_cdb, i_cdb); + req.cmdlen = i_cdb; + req.datalen = i_buf; + req.databuf = p_buf; + req.timeout = i_timeout_ms; + req.flags = e_direction == SCSI_MMC_DATA_READ ? SCCMD_READ : SCCMD_WRITE; + + if (ioctl(_obj->gen.fd, SCIOCCOMMAND, &req) < 0) { + perror("SCIOCCOMMAND"); + return -1; + } + if (req.retsts != SCCMD_OK) { + fprintf(stderr, "SCIOCCOMMAND cmd 0x%02x sts %d\n", req.cmd[0], req.retsts); + return -1; + } + + return 0; +} + +static int +_cdio_read_audio_sectors(void *user_data, void *data, lsn_t lsn, + unsigned int nblocks) +{ + scsireq_t req; + _img_private_t *_obj = user_data; + + memset(&req, 0, sizeof(req)); + req.cmd[0] = 0xbe; + req.cmd[1] = 0; + req.cmd[2] = (lsn >> 24) & 0xff; + req.cmd[3] = (lsn >> 16) & 0xff; + req.cmd[4] = (lsn >> 8) & 0xff; + req.cmd[5] = (lsn >> 0) & 0xff; + req.cmd[6] = (nblocks >> 16) & 0xff; + req.cmd[7] = (nblocks >> 8) & 0xff; + req.cmd[8] = (nblocks >> 0) & 0xff; + req.cmd[9] = 0x78; + req.cmdlen = 10; + + req.datalen = nblocks * CDIO_CD_FRAMESIZE_RAW; + req.databuf = data; + req.timeout = 10000; + req.flags = SCCMD_READ; + + if (ioctl(_obj->gen.fd, SCIOCCOMMAND, &req) < 0) { + perror("SCIOCCOMMAND"); + return 1; + } + if (req.retsts != SCCMD_OK) { + fprintf(stderr, "SCIOCCOMMAND cmd 0xbe sts %d\n", req.retsts); + return 1; + } + + return 0; +} + +static int +_cdio_read_mode2_sector(void *user_data, void *data, lsn_t lsn, + bool mode2_form2) +{ + scsireq_t req; + _img_private_t *_obj = user_data; + char buf[M2RAW_SECTOR_SIZE] = { 0, }; + + memset(&req, 0, sizeof(req)); + req.cmd[0] = 0xbe; + req.cmd[1] = 0; + req.cmd[2] = (lsn >> 24) & 0xff; + req.cmd[3] = (lsn >> 16) & 0xff; + req.cmd[4] = (lsn >> 8) & 0xff; + req.cmd[5] = (lsn >> 0) & 0xff; + req.cmd[6] = 0; + req.cmd[7] = 0; + req.cmd[8] = 1; + req.cmd[9] = 0x58; /* subheader + userdata + ECC */ + req.cmdlen = 10; + + req.datalen = M2RAW_SECTOR_SIZE; + req.databuf = buf; + req.timeout = 10000; + req.flags = SCCMD_READ; + + if (ioctl(_obj->gen.fd, SCIOCCOMMAND, &req) < 0) { + perror("SCIOCCOMMAND"); + return 1; + } + if (req.retsts != SCCMD_OK) { + fprintf(stderr, "SCIOCCOMMAND cmd 0xbe sts %d\n", req.retsts); + return 1; + } + + if (mode2_form2) + memcpy(data, buf, M2RAW_SECTOR_SIZE); + else + memcpy(data, buf + CDIO_CD_SUBHEADER_SIZE, CDIO_CD_FRAMESIZE); + + return 0; +} + +static int +_cdio_read_mode2_sectors(void *user_data, void *data, lsn_t lsn, + bool mode2_form2, unsigned int nblocks) +{ + int i, res; + char *buf = data; + + for (i = 0; i < nblocks; i++) { + res = _cdio_read_mode2_sector(user_data, buf, lsn, mode2_form2); + if (res) + return res; + + buf += (mode2_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE); + lsn++; + } + + return 0; +} + +#if USE_CDIO_STAT_SIZE +static uint32_t +_cdio_stat_size(void *user_data) +{ + _img_private_t *_obj = user_data; + struct ioc_read_toc_entry req; + struct cd_toc_entry tocent; + + req.address_format = CD_LBA_FORMAT; + req.starting_track = 0xaa; + req.data_len = sizeof(tocent); + req.data = &tocent; + + if (ioctl(_obj->gen.fd, CDIOREADTOCENTRIES, &req) < 0) { + perror("ioctl(CDIOREADTOCENTRY) leadout"); + exit(EXIT_FAILURE); + } + + return (tocent.addr.lba); +} +#endif + +static int +_cdio_set_arg(void *user_data, const char key[], const char value[]) +{ + _img_private_t *_obj = user_data; + + if (!strcmp(key, "source")) { + if (!value) + return -2; + + free(_obj->gen.source_name); + _obj->gen.source_name = strdup(value); + } else if (!strcmp(key, "access-mode")) { + if (strcmp(value, "READ_CD")) + cdio_error("unknown access type: %s ignored.", value); + } else + return -1; + + return 0; +} + +static bool +_cdio_read_toc(_img_private_t *_obj) +{ + int res; + struct ioc_read_toc_entry req; + + res = ioctl(_obj->gen.fd, CDIOREADTOCHEADER, &_obj->tochdr); + if (res < 0) { + cdio_error("error in ioctl(CDIOREADTOCHEADER): %s\n", + strerror(errno)); + return false; + } + + req.address_format = CD_MSF_FORMAT; + req.starting_track = FIRST_TRACK_NUM; + req.data_len = (TOTAL_TRACKS + 1) /* leadout! */ + * sizeof(struct cd_toc_entry); + req.data = _obj->tocent; + + res = ioctl(_obj->gen.fd, CDIOREADTOCENTRIES, &req); + if (res < 0) { + cdio_error("error in ioctl(CDROMREADTOCENTRIES): %s\n", + strerror(errno)); + return false; + } + + _obj->toc_valid = 1; + return true; +} + +static bool +read_toc_netbsd (void *p_user_data) +{ + + return _cdio_read_toc(p_user_data); +} + +static int +_cdio_read_discinfo(_img_private_t *_obj) +{ + scsireq_t req; +#define FULLTOCBUF (4 + 1000*11) + unsigned char buf[FULLTOCBUF] = { 0, }; + int i, j; + + memset(&req, 0, sizeof(req)); + req.cmd[0] = 0x43; /* READ TOC/PMA/ATIP */ + req.cmd[1] = 0x02; + req.cmd[2] = 0x02; /* full TOC */ + req.cmd[3] = 0; + req.cmd[4] = 0; + req.cmd[5] = 0; + req.cmd[6] = 0; + req.cmd[7] = FULLTOCBUF / 256; + req.cmd[8] = FULLTOCBUF % 256; + req.cmd[9] = 0; + req.cmdlen = 10; + + req.datalen = FULLTOCBUF; + req.databuf = buf; + req.timeout = 10000; + req.flags = SCCMD_READ; + + if (ioctl(_obj->gen.fd, SCIOCCOMMAND, &req) < 0) { + perror("SCIOCCOMMAND"); + return 1; + } + if (req.retsts != SCCMD_OK) { + fprintf(stderr, "SCIOCCOMMAND cmd 0x43 sts %d\n", req.retsts); + return 1; + } +#if 1 + printf("discinfo:"); + for (i = 0; i < 4; i++) + printf(" %02x", buf[i]); + printf("\n"); + for (i = 0; i < buf[1] - 2; i++) { + printf(" %02x", buf[i + 4]); + if (!((i + 1) % 11)) + printf("\n"); + } +#endif + + for (i = 4; i < req.datalen_used; i += 11) { + if (buf[i + 3] == 0xa0) { /* POINT */ + /* XXX: assume entry 0xa1 follows */ + for (j = buf[i + 8] - 1; j <= buf[i + 11 + 8] - 1; j++) + _obj->sessionformat[j] = buf[i + 9]; + } + } + + _obj->sessionformat_valid = true; + return 0; +} + +static int +_cdio_eject_media(void *user_data) { + + _img_private_t *_obj = user_data; + int fd, res, ret = 0; + + fd = open(_obj->gen.source_name, O_RDONLY|O_NONBLOCK); + if (fd < 0) + return 2; + + res = ioctl(fd, CDIOCALLOW); + if (res < 0) { + cdio_error("ioctl(fd, CDIOCALLOW) failed: %s\n", + strerror(errno)); + /* go on... */ + } + res = ioctl(fd, CDIOCEJECT); + if (res < 0) { + cdio_error("ioctl(CDIOCEJECT) failed: %s\n", + strerror(errno)); + ret = 1; + } + + return ret; +} + +static const char * +_cdio_get_arg(void *user_data, const char key[]) +{ + _img_private_t *_obj = user_data; + + if (!strcmp(key, "source")) { + return _obj->gen.source_name; + } else if (!strcmp(key, "access-mode")) { + return "READ_CD"; + } + + return NULL; +} + +static track_t +_cdio_get_first_track_num(void *user_data) +{ + _img_private_t *_obj = user_data; + int res; + + if (!_obj->toc_valid) { + res = _cdio_read_toc(_obj); + if (!res) + return CDIO_INVALID_TRACK; + } + + return FIRST_TRACK_NUM; +} + +static track_t +_cdio_get_num_tracks(void *user_data) +{ + _img_private_t *_obj = user_data; + int res; + + if (!_obj->toc_valid) { + res = _cdio_read_toc(_obj); + if (!res) + return CDIO_INVALID_TRACK; + } + + return TOTAL_TRACKS; +} + +static track_format_t +_cdio_get_track_format(void *user_data, track_t track_num) +{ + _img_private_t *_obj = user_data; + int res; + + if (!_obj->toc_valid) { + res = _cdio_read_toc(_obj); + if (!res) + return CDIO_INVALID_TRACK; + } + + if (track_num > TOTAL_TRACKS || track_num == 0) + return TRACK_FORMAT_ERROR; + + if (_obj->tocent[track_num - 1].control & 0x04) { + if (!_obj->sessionformat_valid) { + res = _cdio_read_discinfo(_obj); + if (res) + return CDIO_INVALID_TRACK; + } + + if (_obj->sessionformat[track_num - 1] == 0x10) + return TRACK_FORMAT_CDI; + else if (_obj->sessionformat[track_num - 1] == 0x20) + return TRACK_FORMAT_XA; + else + return TRACK_FORMAT_DATA; + } else + return TRACK_FORMAT_AUDIO; +} + +static bool +_cdio_get_track_green(void *user_data, track_t track_num) +{ + + return (_cdio_get_track_format(user_data, track_num) + == TRACK_FORMAT_XA); +} + +static bool +_cdio_get_track_msf(void *user_data, track_t track_num, msf_t *msf) +{ + _img_private_t *_obj = user_data; + int res; + + if (!msf) + return false; + + if (!_obj->toc_valid) { + res = _cdio_read_toc(_obj); + if (!res) + return CDIO_INVALID_TRACK; + } + + if (track_num == CDIO_CDROM_LEADOUT_TRACK) + track_num = TOTAL_TRACKS + 1; + + if (track_num > TOTAL_TRACKS + 1 || track_num == 0) + return false; + + msf->m = cdio_to_bcd8(_obj->tocent[track_num - 1].addr.msf.minute); + msf->s = cdio_to_bcd8(_obj->tocent[track_num - 1].addr.msf.second); + msf->f = cdio_to_bcd8(_obj->tocent[track_num - 1].addr.msf.frame); + + return true; +} + +static lsn_t +get_disc_last_lsn_netbsd(void *user_data) +{ + msf_t msf; + + _cdio_get_track_msf(user_data, CDIO_CDROM_LEADOUT_TRACK, &msf); + + return (((msf.m * 60) + msf.s) * 75 + msf.f); +} +#endif /* HAVE_NETBSD_CDROM */ + +char ** +cdio_get_devices_netbsd (void) +{ +#ifndef HAVE_NETBSD_CDROM + return NULL; +#else + return NULL; +#endif /* HAVE_NETBSD_CDROM */ +} + +char * +cdio_get_default_device_netbsd() +{ + return strdup(DEFAULT_CDIO_DEVICE); +} + +driver_return_code_t +close_tray_netbsd (const char *psz_device) +{ +#ifdef HAVE_NETBSD_CDROM + return DRIVER_OP_SUCCESS; +#else + return DRIVER_OP_NO_DRIVER; +#endif +} + +#ifdef HAVE_NETBSD_CDROM +static cdio_funcs_t _funcs = { + .eject_media = _cdio_eject_media, + .free = cdio_generic_free, + .get_arg = _cdio_get_arg, + .get_cdtext = get_cdtext_generic, + .get_default_device = cdio_get_default_device_netbsd, + .get_devices = cdio_get_devices_netbsd, + .get_disc_last_lsn = get_disc_last_lsn_netbsd, + .get_discmode = get_discmode_generic, + .get_drive_cap = get_drive_cap_mmc, + .get_first_track_num= _cdio_get_first_track_num, + .get_mcn = get_mcn_mmc, + .get_num_tracks = _cdio_get_num_tracks, + .get_track_format = _cdio_get_track_format, + .get_track_green = _cdio_get_track_green, + .get_track_lba = NULL, + .get_track_msf = _cdio_get_track_msf, + .lseek = cdio_generic_lseek, + .read = cdio_generic_read, + .read_audio_sectors = _cdio_read_audio_sectors, + .read_data_sectors = read_data_sectors_generic, + .read_mode2_sector = _cdio_read_mode2_sector, + .read_mode2_sectors = _cdio_read_mode2_sectors, + .read_toc = read_toc_netbsd, +#if 1 + .run_mmc_cmd = run_scsi_cmd_netbsd, +#endif + .set_arg = _cdio_set_arg, +#if USE_CDIO_STAT_SIZE + .stat_size = _cdio_stat_size +#endif +}; +#endif /*HAVE_NETBSD_CDROM*/ + +CdIo * +cdio_open_netbsd(const char *source_name) +{ +#ifdef HAVE_NETBSD_CDROM + CdIo *ret; + _img_private_t *_data; + + _data = calloc(1, sizeof(_img_private_t)); + _data->gen.init = false; + _data->gen.fd = -1; + _data->toc_valid = false; + _data->sessionformat_valid = false; + + _cdio_set_arg(_data, "source", + (source_name ? source_name : DEFAULT_CDIO_DEVICE)); + + if (source_name && !cdio_is_device_generic(source_name)) + return (NULL); + + ret = cdio_new(&_data->gen, &_funcs); + if (!ret) + return NULL; + + if (cdio_generic_init(_data, O_RDONLY)) { + return ret; + } else { + cdio_generic_free(_data); + return NULL; + } +#else + return NULL; +#endif /* HAVE_BSDI_CDROM */ +} + +CdIo * +cdio_open_am_netbsd(const char *source_name, const char *am) +{ + return (cdio_open_netbsd(source_name)); +} + +bool +cdio_have_netbsd (void) +{ +#ifdef HAVE_NETBSD_CDROM + return true; +#else + return false; +#endif /* HAVE_NETBSD_CDROM */ +} diff --git a/test/Makefile.am b/test/Makefile.am index b1904885..70b63b7f 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,4 +1,4 @@ -# $Id: Makefile.am,v 1.64 2008/03/22 22:43:56 rocky Exp $ +# $Id: Makefile.am,v 1.65 2008/03/27 17:40:51 rocky Exp $ # # Copyright (C) 2003, 2004, 2006, 2008 Rocky Bernstein # @@ -88,7 +88,7 @@ check_DATA = vcd_demo.right vcd_demo_vcdinfo.right \ EXTRA_DIST = $(check_SCRIPTS) $(check_DATA) \ check_common_fn check_cue.sh.in check_nrg.sh.in \ - testbincue.c.in testnrg.c.in check_iso.sh.in + testbincue.c.in testnrg.c.in check_iso.sh.in p1.cue TESTS = $(check_PROGRAMS) $(check_SCRIPTS) XFAIL_TESTS = testassert