Start NetBSD driver
This commit is contained in:
@@ -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.])
|
||||
|
||||
@@ -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 <rocky@gnu.org>
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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 <rocky@gnu.org>
|
||||
@@ -88,6 +88,7 @@ libcdio_sources = \
|
||||
MSWindows/win32_ioctl.c \
|
||||
MSWindows/win32.c \
|
||||
MSWindows/win32.h \
|
||||
netbsd.c \
|
||||
osx.c \
|
||||
read.c \
|
||||
sector.c \
|
||||
|
||||
@@ -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 <rocky@panix.com>
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 <rocky@panix.com>
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
600
lib/driver/netbsd.c
Normal file
600
lib/driver/netbsd.c
Normal file
@@ -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 <cdio/sector.h>
|
||||
#include <cdio/util.h>
|
||||
#include "cdio_assert.h"
|
||||
#include "cdio_private.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#ifdef __i386__
|
||||
#define DEFAULT_CDIO_DEVICE "/dev/rcd0d"
|
||||
#else
|
||||
#define DEFAULT_CDIO_DEVICE "/dev/rcd0c"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_NETBSD_CDROM
|
||||
#include <sys/cdio.h>
|
||||
#include <sys/scsiio.h>
|
||||
|
||||
#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 */
|
||||
}
|
||||
@@ -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 <rocky@gnu.org>
|
||||
#
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user