Expand getting drive capabilities. We now have 3 masks where we had

only one before.
This commit is contained in:
rocky
2004-07-17 22:16:46 +00:00
parent c4cd69693c
commit e84c6316b0
33 changed files with 679 additions and 528 deletions

View File

@@ -1,5 +1,5 @@
/*
$Id: _cdio_linux.c,v 1.67 2004/07/17 08:59:44 rocky Exp $
$Id: _cdio_linux.c,v 1.68 2004/07/17 22:16:47 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -27,7 +27,7 @@
# include "config.h"
#endif
static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.67 2004/07/17 08:59:44 rocky Exp $";
static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.68 2004/07/17 22:16:47 rocky Exp $";
#include <string.h>
@@ -930,17 +930,63 @@ _get_mcn_linux (const void *env) {
string when done with it.
*/
static cdio_drive_cap_t
_get_drive_cap_linux (const void *env) {
static void
_get_drive_cap_linux (const void *env,
cdio_drive_read_cap_t *p_read_cap,
cdio_drive_write_cap_t *p_write_cap,
cdio_drive_misc_cap_t *p_misc_cap)
{
const _img_private_t *_obj = env;
int32_t i_drivetype;
i_drivetype = ioctl (_obj->gen.fd, CDROM_GET_CAPABILITY, CDSL_CURRENT);
if (i_drivetype < 0) return CDIO_DRIVE_CAP_ERROR;
if (i_drivetype < 0) {
*p_read_cap = CDIO_DRIVE_CAP_ERROR;
*p_write_cap = CDIO_DRIVE_CAP_ERROR;
*p_misc_cap = CDIO_DRIVE_CAP_ERROR;
return;
}
*p_read_cap = 0;
*p_write_cap = 0;
*p_misc_cap = 0;
/* If >= 0 we can safely cast as cdio_drive_cap_t and return */
return (cdio_drive_cap_t) i_drivetype;
/* Reader */
if (i_drivetype & CDC_PLAY_AUDIO)
*p_read_cap |= CDIO_DRIVE_CAP_READ_AUDIO;
if (i_drivetype & CDC_CD_R)
*p_read_cap |= CDIO_DRIVE_CAP_READ_CD_R;
if (i_drivetype & CDC_CD_RW)
*p_read_cap |= CDIO_DRIVE_CAP_READ_CD_RW;
if (i_drivetype & CDC_DVD)
*p_read_cap |= CDIO_DRIVE_CAP_READ_DVD_ROM;
/* Writer */
if (i_drivetype & CDC_CD_RW)
*p_read_cap |= CDIO_DRIVE_CAP_WRITE_CD_RW;
if (i_drivetype & CDC_DVD_R)
*p_read_cap |= CDIO_DRIVE_CAP_WRITE_DVD_R;
if (i_drivetype & CDC_DVD_RAM)
*p_read_cap |= CDIO_DRIVE_CAP_WRITE_DVD_RAM;
/* Misc */
if (i_drivetype & CDC_CLOSE_TRAY)
*p_misc_cap |= CDIO_DRIVE_CAP_MISC_CLOSE_TRAY;
if (i_drivetype & CDC_OPEN_TRAY)
*p_misc_cap |= CDIO_DRIVE_CAP_MISC_OPEN_TRAY;
if (i_drivetype & CDC_LOCK)
*p_misc_cap |= CDIO_DRIVE_CAP_MISC_LOCK;
if (i_drivetype & CDC_SELECT_SPEED)
*p_misc_cap |= CDIO_DRIVE_CAP_MISC_SELECT_SPEED;
if (i_drivetype & CDC_SELECT_DISC)
*p_misc_cap |= CDIO_DRIVE_CAP_MISC_SELECT_DISC;
if (i_drivetype & CDC_MULTI_SESSION)
*p_misc_cap |= CDIO_DRIVE_CAP_MISC_MULTI_SESSION;
if (i_drivetype & CDC_MEDIA_CHANGED)
*p_misc_cap |= CDIO_DRIVE_CAP_MISC_MEDIA_CHANGED;
if (i_drivetype & CDC_RESET)
*p_misc_cap |= CDIO_DRIVE_CAP_MISC_RESET;
}
/*!

View File

@@ -1,5 +1,5 @@
/*
$Id: _cdio_sunos.c,v 1.52 2004/07/17 15:43:57 rocky Exp $
$Id: _cdio_sunos.c,v 1.53 2004/07/17 22:16:47 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -38,7 +38,7 @@
#ifdef HAVE_SOLARIS_CDROM
static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.52 2004/07/17 15:43:57 rocky Exp $";
static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.53 2004/07/17 22:16:47 rocky Exp $";
#ifdef HAVE_GLOB_H
#include <glob.h>
@@ -142,7 +142,7 @@ _cdio_init (_img_private_t *env)
*/
static int
_cdio_read_audio_sectors (void *user_data, void *data, lsn_t lsn,
_read_audio_sectors_solaris (void *user_data, void *data, lsn_t lsn,
unsigned int nblocks)
{
char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
@@ -189,8 +189,8 @@ _cdio_read_audio_sectors (void *user_data, void *data, lsn_t lsn,
from lsn. Returns 0 if no error.
*/
static int
_cdio_read_mode1_sector (void *env, void *data, lsn_t lsn,
bool b_form2)
_read_mode1_sector_solaris (void *env, void *data, lsn_t lsn,
bool b_form2)
{
#if FIXED
@@ -207,8 +207,8 @@ _cdio_read_mode1_sector (void *env, void *data, lsn_t lsn,
Returns 0 if no error.
*/
static int
_cdio_read_mode1_sectors (void *user_data, void *data, lsn_t lsn,
bool b_form2, unsigned int nblocks)
_read_mode1_sectors_solaris (void *user_data, void *data, lsn_t lsn,
bool b_form2, unsigned int nblocks)
{
_img_private_t *env = user_data;
unsigned int i;
@@ -216,9 +216,9 @@ _cdio_read_mode1_sectors (void *user_data, void *data, lsn_t lsn,
unsigned int blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE;
for (i = 0; i < nblocks; i++) {
if ( (retval = _cdio_read_mode1_sector (env,
if ( (retval = _read_mode1_sector_solaris (env,
((char *)data) + (blocksize * i),
lsn + i, b_form2)) )
lsn + i, b_form2)) )
return retval;
}
return 0;
@@ -229,8 +229,8 @@ _cdio_read_mode1_sectors (void *user_data, void *data, lsn_t lsn,
Returns 0 if no error.
*/
static int
_cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn,
bool b_form2)
_read_mode2_sector_solaris (void *user_data, void *data, lsn_t lsn,
bool b_form2)
{
char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
struct cdrom_msf *msf = (struct cdrom_msf *) &buf;
@@ -288,8 +288,8 @@ _cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn,
Returns 0 if no error.
*/
static int
_cdio_read_mode2_sectors (void *user_data, void *data, lsn_t lsn,
bool b_form2, unsigned int nblocks)
_read_mode2_sectors_solaris (void *user_data, void *data, lsn_t lsn,
bool b_form2, unsigned int nblocks)
{
_img_private_t *env = user_data;
unsigned int i;
@@ -297,9 +297,9 @@ _cdio_read_mode2_sectors (void *user_data, void *data, lsn_t lsn,
unsigned int blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE;
for (i = 0; i < nblocks; i++) {
if ( (retval = _cdio_read_mode2_sector (env,
if ( (retval = _read_mode2_sector_solaris (env,
((char *)data) + (blocksize * i),
lsn + i, b_form2)) )
lsn + i, b_form2)) )
return retval;
}
return 0;
@@ -497,7 +497,7 @@ _get_cdtext_solaris (void *user_data, track_t i_track)
also free obj.
*/
static int
_cdio_eject_media (void *user_data) {
_eject_media_solaris (void *user_data) {
_img_private_t *env = user_data;
int ret;
@@ -536,7 +536,7 @@ _cdio_malloc_and_zero(size_t size) {
Return the value associated with the key "arg".
*/
static const char *
_cdio_get_arg (void *user_data, const char key[])
_get_arg_solaris (void *user_data, const char key[])
{
_img_private_t *env = user_data;
@@ -593,13 +593,15 @@ cdio_get_default_device_solaris(void)
string when done with it.
*/
static cdio_drive_cap_t
_cdio_get_drive_cap_solaris (const void *user_data)
static void
_get_drive_cap_solaris (const void *user_data,
cdio_drive_read_cap_t *p_read_cap,
cdio_drive_write_cap_t *p_write_cap,
cdio_drive_misc_cap_t *p_misc_cap)
{
const _img_private_t *env = user_data;
int status;
struct uscsi_cmd my_cmd;
int32_t i_drivetype = 0;
uint8_t buf[192] = { 0, };
unsigned char my_rq_buf[26] = {0, };
@@ -643,7 +645,7 @@ _cdio_get_drive_cap_solaris (const void *user_data)
/* Don't handle these yet. */
break;
case CDIO_MMC_CAPABILITIES_PAGE:
i_drivetype |= cdio_get_drive_cap_mmc(p);
cdio_get_drive_cap_mmc(p, p_read_cap, p_write_cap, p_misc_cap);
break;
default: ;
}
@@ -665,7 +667,7 @@ _cdio_get_drive_cap_solaris (const void *user_data)
*/
static char *
_cdio_get_mcn_solaris (const void *user_data)
_get_mcn_solaris (const void *user_data)
{
const _img_private_t *env = user_data;
struct uscsi_cmd my_cmd;
@@ -885,15 +887,15 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode)
char *psz_source;
cdio_funcs _funcs = {
.eject_media = _cdio_eject_media,
.eject_media = _eject_media_solaris,
.free = cdio_generic_free,
.get_arg = _cdio_get_arg,
.get_arg = _get_arg_solaris,
.get_cdtext = _get_cdtext_solaris,
.get_devices = cdio_get_devices_solaris,
.get_default_device = cdio_get_default_device_solaris,
.get_drive_cap = _cdio_get_drive_cap_solaris,
.get_drive_cap = _get_drive_cap_solaris,
.get_first_track_num= _cdio_get_first_track_num,
.get_mcn = _cdio_get_mcn_solaris,
.get_mcn = _get_mcn_solaris,
.get_num_tracks = _cdio_get_num_tracks,
.get_track_format = _cdio_get_track_format,
.get_track_green = _cdio_get_track_green,
@@ -901,11 +903,11 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode)
.get_track_msf = _cdio_get_track_msf,
.lseek = cdio_generic_lseek,
.read = cdio_generic_read,
.read_audio_sectors = _cdio_read_audio_sectors,
.read_mode1_sector = _cdio_read_mode1_sector,
.read_mode1_sectors = _cdio_read_mode1_sectors,
.read_mode2_sector = _cdio_read_mode2_sector,
.read_mode2_sectors = _cdio_read_mode2_sectors,
.read_audio_sectors = _read_audio_sectors_solaris,
.read_mode1_sector = _read_mode1_sector_solaris,
.read_mode1_sectors = _read_mode1_sectors_solaris,
.read_mode2_sector = _read_mode2_sector_solaris,
.read_mode2_sectors = _read_mode2_sectors_solaris,
.stat_size = _cdio_stat_size,
.set_arg = _set_arg_solaris
};
@@ -918,7 +920,7 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode)
_data->b_cdtext_init = false;
if (NULL == psz_orig_source) {
psz_source=cdio_get_default_device_solaris();
psz_source=_get_default_device_solaris();
if (NULL == psz_source) return NULL;
_set_arg_solaris(_data, "source", psz_source);
free(psz_source);

View File

@@ -1,5 +1,5 @@
/*
$Id: cdio.c,v 1.61 2004/07/17 02:18:28 rocky Exp $
$Id: cdio.c,v 1.62 2004/07/17 22:16:47 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
@@ -39,7 +39,7 @@
#include <cdio/logging.h>
#include "cdio_private.h"
static const char _rcsid[] = "$Id: cdio.c,v 1.61 2004/07/17 02:18:28 rocky Exp $";
static const char _rcsid[] = "$Id: cdio.c,v 1.62 2004/07/17 22:16:47 rocky Exp $";
const char *track_format2str[6] =
@@ -427,19 +427,22 @@ cdio_get_devices_with_cap (char* search_devices[],
string when done with it.
*/
cdio_drive_cap_t
cdio_get_drive_cap (const CdIo *cdio)
void
cdio_get_drive_cap (const CdIo *cdio,
cdio_drive_read_cap_t *p_read_cap,
cdio_drive_write_cap_t *p_write_cap,
cdio_drive_misc_cap_t *p_misc_cap)
{
cdio_drive_cap_t i_drivetype =
CDIO_DRIVE_CAP_UNKNOWN | CDIO_DRIVE_CAP_CD_AUDIO; /* A safe guess. */
/* This seems like a safe bet. */
*p_read_cap = CDIO_DRIVE_CAP_UNKNOWN;
*p_write_cap = CDIO_DRIVE_CAP_UNKNOWN;
*p_misc_cap = CDIO_DRIVE_CAP_UNKNOWN;
if (cdio && cdio->op.get_drive_cap) {
i_drivetype=cdio->op.get_drive_cap(cdio->env);
cdio->op.get_drive_cap(cdio->env, p_read_cap, p_write_cap, p_misc_cap);
}
return i_drivetype;
}
/*!
Return the the kind of drive capabilities of device.
@@ -447,18 +450,23 @@ cdio_get_drive_cap (const CdIo *cdio)
string when done with it.
*/
cdio_drive_cap_t
cdio_get_drive_cap_dev (const char *device)
void
cdio_get_drive_cap_dev (const char *device,
cdio_drive_read_cap_t *p_read_cap,
cdio_drive_write_cap_t *p_write_cap,
cdio_drive_misc_cap_t *p_misc_cap)
{
cdio_drive_cap_t i_drivetype = CDIO_DRIVE_CAP_UNKNOWN;
/* This seems like a safe bet. */
*p_read_cap = CDIO_DRIVE_CAP_UNKNOWN;
*p_write_cap = CDIO_DRIVE_CAP_UNKNOWN;
*p_misc_cap = CDIO_DRIVE_CAP_UNKNOWN;
CdIo *cdio=scan_for_driver(CDIO_MIN_DRIVER, CDIO_MAX_DRIVER,
device, NULL);
if (cdio) {
i_drivetype=cdio_get_drive_cap(cdio);
cdio_get_drive_cap(cdio, p_read_cap, p_write_cap, p_misc_cap);
cdio_destroy(cdio);
}
return i_drivetype;
}

View File

@@ -1,5 +1,5 @@
/*
$Id: cdio_private.h,v 1.29 2004/07/17 02:18:28 rocky Exp $
$Id: cdio_private.h,v 1.30 2004/07/17 22:16:47 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -87,8 +87,10 @@ extern "C" {
See cd_types.h for a list of bitmasks for the drive type;
*/
cdio_drive_cap_t (*get_drive_cap) (const void *env);
void (*get_drive_cap) (const void *env,
cdio_drive_read_cap_t *p_read_cap,
cdio_drive_write_cap_t *p_write_cap,
cdio_drive_misc_cap_t *p_misc_cap);
/*!
Return the media catalog number MCN from the CD or NULL if
there is none or we don't have the ability to get it.

View File

@@ -1,5 +1,5 @@
/*
$Id: bincue.c,v 1.34 2004/07/17 02:18:28 rocky Exp $
$Id: bincue.c,v 1.35 2004/07/17 22:16:47 rocky Exp $
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
@@ -26,7 +26,7 @@
(*.cue).
*/
static const char _rcsid[] = "$Id: bincue.c,v 1.34 2004/07/17 02:18:28 rocky Exp $";
static const char _rcsid[] = "$Id: bincue.c,v 1.35 2004/07/17 22:16:47 rocky Exp $";
#include "image.h"
#include "cdio_assert.h"
@@ -838,23 +838,6 @@ cdio_get_default_device_bincue(void)
return drive;
}
/*!
Return the the kind of drive capabilities of device.
Note: string is malloc'd so caller should free() then returned
string when done with it.
*/
static cdio_drive_cap_t
_get_drive_cap_bincue (const void *user_data) {
/* There may be more in the future but these we can handle now.
Also, we know we can't handle
LOCK, OPEN_TRAY, CLOSE_TRAY, SELECT_SPEED, SELECT_DISC
*/
return CDIO_DRIVE_CAP_FILE | CDIO_DRIVE_CAP_MCN | CDIO_DRIVE_CAP_CD_AUDIO ;
}
/*!
Return the number of tracks in the current medium.
CDIO_INVALID_TRACK is returned on error.
@@ -1029,7 +1012,7 @@ cdio_open_cue (const char *psz_cue_name)
.get_cdtext = _get_cdtext_image,
.get_devices = cdio_get_devices_bincue,
.get_default_device = cdio_get_default_device_bincue,
.get_drive_cap = _get_drive_cap_bincue,
.get_drive_cap = _get_drive_cap_image,
.get_first_track_num= _get_first_track_num_image,
.get_mcn = _get_mcn_image,
.get_num_tracks = _get_num_tracks_image,

View File

@@ -1,5 +1,5 @@
/*
$Id: cdrdao.c,v 1.19 2004/07/11 14:25:07 rocky Exp $
$Id: cdrdao.c,v 1.20 2004/07/17 22:16:47 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
toc reading routine adapted from cuetools
@@ -25,7 +25,7 @@
(*.cue).
*/
static const char _rcsid[] = "$Id: cdrdao.c,v 1.19 2004/07/11 14:25:07 rocky Exp $";
static const char _rcsid[] = "$Id: cdrdao.c,v 1.20 2004/07/17 22:16:47 rocky Exp $";
#include "image.h"
#include "cdio_assert.h"
@@ -878,23 +878,6 @@ cdio_get_default_device_cdrdao(void)
return drive;
}
/*!
Return the the kind of drive capabilities of device.
Note: string is malloc'd so caller should free() then returned
string when done with it.
*/
static cdio_drive_cap_t
_get_drive_cap_cdrdao (const void *user_data) {
/* There may be more in the future but these we can handle now.
Also, we know we can't handle
LOCK, OPEN_TRAY, CLOSE_TRAY, SELECT_SPEED, SELECT_DISC
*/
return CDIO_DRIVE_CAP_FILE | CDIO_DRIVE_CAP_MCN | CDIO_DRIVE_CAP_CD_AUDIO ;
}
/*!
Return the number of tracks in the current medium.
CDIO_INVALID_TRACK is returned on error.
@@ -1008,7 +991,7 @@ cdio_open_cdrdao (const char *psz_cue_name)
.get_cdtext = _get_cdtext_image,
.get_devices = cdio_get_devices_cdrdao,
.get_default_device = cdio_get_default_device_cdrdao,
.get_drive_cap = _get_drive_cap_cdrdao,
.get_drive_cap = _get_drive_cap_image,
.get_first_track_num= _get_first_track_num_image,
.get_mcn = _get_mcn_image,
.get_num_tracks = _get_num_tracks_image,

View File

@@ -1,5 +1,5 @@
/*
$Id: nrg.c,v 1.31 2004/07/11 14:25:07 rocky Exp $
$Id: nrg.c,v 1.32 2004/07/17 22:16:47 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2001, 2003 Herbert Valerio Riedel <hvr@gnu.org>
@@ -45,7 +45,7 @@
#include "_cdio_stdio.h"
#include "nrg.h"
static const char _rcsid[] = "$Id: nrg.c,v 1.31 2004/07/11 14:25:07 rocky Exp $";
static const char _rcsid[] = "$Id: nrg.c,v 1.32 2004/07/17 22:16:47 rocky Exp $";
/* reader */
@@ -1088,23 +1088,6 @@ cdio_get_default_device_nrg(void)
return drive;
}
/*!
Return the the kind of drive capabilities of device.
Note: string is malloc'd so caller should free() then returned
string when done with it.
*/
static cdio_drive_cap_t
_get_drive_cap_nrg (const void *user_data) {
/* There may be more in the future but these we can handle now.
Also, we know we can't handle
LOCK, OPEN_TRAY, CLOSE_TRAY, SELECT_SPEED, SELECT_DISC
*/
return CDIO_DRIVE_CAP_FILE | CDIO_DRIVE_CAP_MCN | CDIO_DRIVE_CAP_CD_AUDIO ;
}
/*!
Return the number of tracks in the current medium.
CDIO_INVALID_TRACK is returned on error.
@@ -1206,7 +1189,7 @@ cdio_open_nrg (const char *psz_source)
.get_cdtext = _get_cdtext_image,
.get_devices = cdio_get_devices_nrg,
.get_default_device = cdio_get_default_device_nrg,
.get_drive_cap = _get_drive_cap_nrg,
.get_drive_cap = _get_drive_cap_image,
.get_first_track_num= _get_first_track_num_image,
.get_mcn = _get_mcn_image,
.get_num_tracks = _get_num_tracks_image,

View File

@@ -1,5 +1,5 @@
/*
$Id: image_common.h,v 1.12 2004/07/17 02:18:28 rocky Exp $
$Id: image_common.h,v 1.13 2004/07/17 22:16:47 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
@@ -217,4 +217,29 @@ _set_arg_image (void *user_data, const char key[], const char value[])
return 0;
}
/*!
Return the the kind of drive capabilities of device.
*/
static void
_get_drive_cap_image (const void *user_data,
cdio_drive_read_cap_t *p_read_cap,
cdio_drive_write_cap_t *p_write_cap,
cdio_drive_misc_cap_t *p_misc_cap)
{
*p_read_cap = CDIO_DRIVE_CAP_READ_AUDIO
| CDIO_DRIVE_CAP_READ_CD_G
| CDIO_DRIVE_CAP_READ_CD_R
| CDIO_DRIVE_CAP_READ_CD_RW
;
*p_write_cap = 0;
/* In the future we may want to simulate
LOCK, OPEN_TRAY, CLOSE_TRAY, SELECT_SPEED, etc.
*/
*p_misc_cap = CDIO_DRIVE_CAP_MISC_FILE;
}
#endif /* __CDIO_IMAGE_COMMON_H__ */

View File

@@ -1,6 +1,6 @@
/* Common MMC routines.
$Id: scsi_mmc.c,v 1.3 2004/06/28 00:39:21 rocky Exp $
$Id: scsi_mmc.c,v 1.4 2004/07/17 22:16:47 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
@@ -31,25 +31,27 @@
in p. We interpret this and return a bit mask set according to the
capabilities.
*/
cdio_drive_cap_t
cdio_get_drive_cap_mmc(const uint8_t *p)
void
cdio_get_drive_cap_mmc(const uint8_t *p,
cdio_drive_read_cap_t *p_read_cap,
cdio_drive_write_cap_t *p_write_cap,
cdio_drive_misc_cap_t *p_misc_cap)
{
cdio_drive_cap_t i_drivetype=0;
/* Reader */
if (p[2] & 0x02) i_drivetype |= CDIO_DRIVE_CAP_CD_RW;
if (p[2] & 0x08) i_drivetype |= CDIO_DRIVE_CAP_DVD;
if (p[5] & 0x01) i_drivetype |= CDIO_DRIVE_CAP_CD_AUDIO;
if (p[2] & 0x02) *p_read_cap |= CDIO_DRIVE_CAP_READ_CD_RW;
if (p[2] & 0x08) *p_read_cap |= CDIO_DRIVE_CAP_READ_DVD_ROM;
if (p[5] & 0x01) *p_read_cap |= CDIO_DRIVE_CAP_READ_AUDIO;
/* Writer */
if (p[3] & 0x01) i_drivetype |= CDIO_DRIVE_CAP_CD_R;
if (p[3] & 0x10) i_drivetype |= CDIO_DRIVE_CAP_DVD_R;
if (p[3] & 0x20) i_drivetype |= CDIO_DRIVE_CAP_DVD_RAM;
if (p[3] & 0x01) *p_write_cap |= CDIO_DRIVE_CAP_WRITE_CD_R;
if (p[3] & 0x10) *p_write_cap |= CDIO_DRIVE_CAP_WRITE_DVD_R;
if (p[3] & 0x20) *p_write_cap |= CDIO_DRIVE_CAP_WRITE_DVD_RAM;
if (p[4] & 0x40) i_drivetype |= CDIO_DRIVE_CAP_MULTI_SESSION;
/* Misc */
if (p[4] & 0x40) *p_misc_cap |= CDIO_DRIVE_CAP_MISC_MULTI_SESSION;
if (p[6] & 0x01) i_drivetype |= CDIO_DRIVE_CAP_LOCK;
if (p[6] & 0x08) i_drivetype |= CDIO_DRIVE_CAP_OPEN_TRAY;
if (p[6] & 0x01) *p_misc_cap |= CDIO_DRIVE_CAP_MISC_LOCK;
if (p[6] & 0x08) *p_misc_cap |= CDIO_DRIVE_CAP_MISC_OPEN_TRAY;
if (p[6] >> 5 != 0)
i_drivetype |= CDIO_DRIVE_CAP_CLOSE_TRAY;
return i_drivetype;
*p_misc_cap |= CDIO_DRIVE_CAP_MISC_CLOSE_TRAY;
}