get_mcn paramater is const.

solaris: failed attempt to get mcn and drive capabilities. Some
boilerplate routines used.

scsi_mmc: more defines.

src/cd-drive.c: bugfix when cdio is null
src/util.c: small enhancement.
This commit is contained in:
rocky
2004-04-25 03:52:37 +00:00
parent 1bf5f1e464
commit 36507b3c10
7 changed files with 153 additions and 29 deletions

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_linux.c,v 1.35 2004/04/25 01:19:58 rocky Exp $ $Id: _cdio_linux.c,v 1.36 2004/04/25 03:52:37 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -27,7 +27,7 @@
# include "config.h" # include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.35 2004/04/25 01:19:58 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.36 2004/04/25 03:52:37 rocky Exp $";
#include <string.h> #include <string.h>
@@ -810,7 +810,7 @@ _cdio_get_first_track_num(void *env)
*/ */
static char * static char *
_cdio_get_mcn_linux (void *env) { _cdio_get_mcn_linux (const void *env) {
struct cdrom_mcn mcn; struct cdrom_mcn mcn;
const _img_private_t *_obj = env; const _img_private_t *_obj = env;

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_sunos.c,v 1.25 2004/03/16 12:18:32 rocky Exp $ $Id: _cdio_sunos.c,v 1.26 2004/04/25 03:52:37 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -41,7 +41,7 @@
#ifdef HAVE_SOLARIS_CDROM #ifdef HAVE_SOLARIS_CDROM
static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.25 2004/03/16 12:18:32 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.26 2004/04/25 03:52:37 rocky Exp $";
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@@ -481,6 +481,123 @@ cdio_get_default_device_solaris(void)
return strdup(DEFAULT_CDIO_DEVICE); return strdup(DEFAULT_CDIO_DEVICE);
} }
/*!
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
_cdio_get_drive_cap_solaris (const void *env)
{
#if 1
struct uscsi_cmd my_cmd;
int32_t i_drivetype = 0;
char buf[192] = { 0, };
unsigned char my_rq_buf[26];
unsigned char my_scsi_cdb[6];
const _img_private_t *_obj = env;
int rc;
memset(&my_scsi_cdb, 0, sizeof(my_scsi_cdb));
memset(&my_rq_buf, 0, sizeof(my_rq_buf));
/* Initialize my_scsi_cdb as a Mode Select(6) */
my_scsi_cdb[0] = CDIO_MMC_MODE_SENSE;
my_scsi_cdb[1] = 0x0;
my_scsi_cdb[2] = 0x2a; /* MODE_PAGE_CAPABILITIES*/;
my_scsi_cdb[3] = 0; /* Not used */
my_scsi_cdb[4] = 128;
my_scsi_cdb[5] = 0; /* Not used */
my_cmd.uscsi_flags = (USCSI_READ|USCSI_RQENABLE); /* We're going get data */
my_cmd.uscsi_timeout = 15; /* Allow 15 seconds for completion */
my_cmd.uscsi_cdb = my_scsi_cdb; /* We'll be using the array above for the CDB */
my_cmd.uscsi_bufaddr = buf; /* The block and page data is stored here */
my_cmd.uscsi_buflen = sizeof(buf);
my_cmd.uscsi_cdblen = 6; /* The CDB is 6 bytes long */
my_cmd.uscsi_rqlen = 24; /* The request sense buffer (only valid on a check condition) is 26 bytes long */
my_cmd.uscsi_rqbuf = my_rq_buf; /* Pointer to the request sense buffer */
rc = ioctl(_obj->gen.fd, USCSICMD, &my_cmd);
if(rc == 0) {
unsigned int n=buf[3]+4;
/* Reader? */
if (buf[n+5] & 0x01) i_drivetype |= CDIO_DRIVE_CD_AUDIO;
if (buf[n+2] & 0x02) i_drivetype |= CDIO_DRIVE_CD_RW;
if (buf[n+2] & 0x08) i_drivetype |= CDIO_DRIVE_DVD;
/* Writer? */
if (buf[n+3] & 0x01) i_drivetype |= CDIO_DRIVE_CD_R;
if (buf[n+3] & 0x10) i_drivetype |= CDIO_DRIVE_DVD_R;
if (buf[n+3] & 0x20) i_drivetype |= CDIO_DRIVE_DVD_RAM;
if (buf[n+6] & 0x08) i_drivetype |= CDIO_DRIVE_OPEN_TRAY;
if (buf[n+6] >> 5 != 0) i_drivetype |= CDIO_DRIVE_CLOSE_TRAY;
} else {
i_drivetype = CDIO_DRIVE_CD_AUDIO | CDIO_DRIVE_UNKNOWN;
}
return i_drivetype;
#else
return CDIO_DRIVE_UNKNOWN | CDIO_DRIVE_CD_AUDIO | CDIO_DRIVE_CD_RW;
#endif
}
/*!
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 char *
_cdio_get_mcn_solaris (const void *env)
{
#if 0
struct uscsi_cmd my_cmd;
char buf[192] = { 0, };
unsigned char my_rq_buf[32];
unsigned char my_scsi_cdb[6];
const _img_private_t *_obj = env;
int rc;
memset(&my_scsi_cdb, 0, sizeof(my_scsi_cdb));
memset(&my_rq_buf, 0, sizeof(my_rq_buf));
my_scsi_cdb[0] = CDIO_MMC_GPCMD_READ_SUBCHANNEL;
my_scsi_cdb[1] = 0x0;
my_scsi_cdb[2] = 0x40;
my_scsi_cdb[3] = 02; /* Give media catalog number. */
my_scsi_cdb[4] = 0; /* Not used */
my_scsi_cdb[5] = 0; /* Not used */
my_scsi_cdb[6] = 0; /* Not used */
my_scsi_cdb[7] = 0; /* Not used */
my_scsi_cdb[8] = 28;
my_scsi_cdb[9] = 0; /* Not used */
my_cmd.uscsi_flags = (USCSI_READ|USCSI_RQENABLE); /* We're going get data */
my_cmd.uscsi_timeout = 15; /* Allow 15 seconds for completion */
my_cmd.uscsi_cdb = my_scsi_cdb; /* We'll be using the array above for the CDB */
my_cmd.uscsi_bufaddr = buf; /* The block and page data is stored here */
my_cmd.uscsi_buflen = sizeof(buf);
my_cmd.uscsi_cdblen = 6; /* The CDB is 6 bytes long */
my_cmd.uscsi_rqlen = 24; /* The request sense buffer (only valid on a check condition) is 26 bytes long */
my_cmd.uscsi_rqbuf = my_rq_buf; /* Pointer to the request sense buffer */
rc = ioctl(_obj->gen.fd, USCSICMD, &my_cmd);
if(rc == 0) {
return strdup(&buf[9]);
}
return NULL;
#else
return NULL;
#endif
}
/*! /*!
Return the number of of the first track. Return the number of of the first track.
CDIO_INVALID_TRACK is returned on error. CDIO_INVALID_TRACK is returned on error.
@@ -495,6 +612,7 @@ _cdio_get_first_track_num(void *env)
return FIRST_TRACK_NUM; return FIRST_TRACK_NUM;
} }
/*! /*!
Return the number of tracks in the current medium. Return the number of tracks in the current medium.
*/ */
@@ -603,6 +721,7 @@ cdio_get_default_device_solaris(void)
{ {
return strdup(DEFAULT_CDIO_DEVICE); return strdup(DEFAULT_CDIO_DEVICE);
} }
#endif /* HAVE_SOLARIS_CDROM */ #endif /* HAVE_SOLARIS_CDROM */
/*! /*!
@@ -652,8 +771,9 @@ cdio_open_solaris (const char *source_name)
.get_arg = _cdio_get_arg, .get_arg = _cdio_get_arg,
.get_devices = cdio_get_devices_solaris, .get_devices = cdio_get_devices_solaris,
.get_default_device = cdio_get_default_device_solaris, .get_default_device = cdio_get_default_device_solaris,
.get_drive_cap = _cdio_get_drive_cap_solaris,
.get_first_track_num= _cdio_get_first_track_num, .get_first_track_num= _cdio_get_first_track_num,
.get_mcn = NULL, .get_mcn = _cdio_get_mcn_solaris,
.get_num_tracks = _cdio_get_num_tracks, .get_num_tracks = _cdio_get_num_tracks,
.get_track_format = _cdio_get_track_format, .get_track_format = _cdio_get_track_format,
.get_track_green = _cdio_get_track_green, .get_track_green = _cdio_get_track_green,

View File

@@ -1,5 +1,5 @@
/* /*
$Id: cdio_private.h,v 1.20 2004/04/22 03:24:38 rocky Exp $ $Id: cdio_private.h,v 1.21 2004/04/25 03:52:37 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -80,7 +80,7 @@ extern "C" {
Return the media catalog number MCN from the CD or NULL if 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. there is none or we don't have the ability to get it.
*/ */
char * (*get_mcn) (void *env); char * (*get_mcn) (const void *env);
/*! /*!
Return the number of of the first track. Return the number of of the first track.

View File

@@ -1,5 +1,5 @@
/* /*
$Id: image_common.h,v 1.2 2004/04/25 00:46:34 rocky Exp $ $Id: image_common.h,v 1.3 2004/04/25 03:52:37 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
@@ -28,9 +28,9 @@
string when done with it. string when done with it.
*/ */
static char * static char *
_cdio_image_get_mcn(void *env) _cdio_image_get_mcn(const void *env)
{ {
_img_private_t *_obj = env; const _img_private_t *_obj = env;
if (NULL == _obj->mcn) return NULL; if (NULL == _obj->mcn) return NULL;
return strdup(_obj->mcn); return strdup(_obj->mcn);

View File

@@ -1,5 +1,5 @@
/* /*
$Id: scsi_mmc.h,v 1.6 2004/04/24 19:18:52 rocky Exp $ $Id: scsi_mmc.h,v 1.7 2004/04/25 03:52:37 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -36,11 +36,12 @@
/*! The generic packet command opcodes for CD/DVD Logical Units. */ /*! The generic packet command opcodes for CD/DVD Logical Units. */
#define CDIO_MMC_MODE_SENSE_10 0x5a #define CDIO_MMC_MODE_SENSE 0x1a
#define CDIO_MMC_MODE_SENSE 0x1a #define CDIO_MMC_GPCMD_READ_10 0x28
#define CDIO_MMC_GPCMD_READ_CD 0xbe #define CDIO_MMC_GPCMD_READ_SUBCHANNEL 0x42
#define CDIO_MMC_GPCMD_READ_10 0x28 #define CDIO_MMC_MODE_SENSE_10 0x5a
#define CDIO_MMC_GPCMD_READ_12 0xa8 #define CDIO_MMC_GPCMD_READ_12 0xa8
#define CDIO_MMC_GPCMD_READ_CD 0xbe
#define CDIO_MMC_SET_READ_TYPE(rec, sector_type) \ #define CDIO_MMC_SET_READ_TYPE(rec, sector_type) \
rec[1] = (sector_type << 2) rec[1] = (sector_type << 2)

View File

@@ -1,5 +1,5 @@
/* /*
$Id: cd-drive.c,v 1.1 2004/04/25 00:46:34 rocky Exp $ $Id: cd-drive.c,v 1.2 2004/04/25 03:52:37 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
@@ -191,18 +191,21 @@ main(int argc, const char *argv[])
char *default_device; char *default_device;
cdio = cdio_open (NULL, DRIVER_UNKNOWN); cdio = cdio_open (NULL, DRIVER_UNKNOWN);
default_device = cdio_get_default_device(cdio);
printf("The driver selected is %s\n", cdio_get_driver_name(cdio)); if (NULL != cdio) {
default_device = cdio_get_default_device(cdio);
if (default_device) { printf("The driver selected is %s\n", cdio_get_driver_name(cdio));
printf("The default device for this driver is %s\n", default_device);
if (default_device) {
printf("The default device for this driver is %s\n", default_device);
}
free(default_device);
cdio_destroy(cdio);
cdio=NULL;
printf("\n");
} }
free(default_device);
cdio_destroy(cdio);
cdio=NULL;
printf("\n");
} }
/* Print out a drivers available */ /* Print out a drivers available */

View File

@@ -1,5 +1,5 @@
/* /*
$Id: util.c,v 1.5 2004/04/25 00:46:34 rocky Exp $ $Id: util.c,v 1.6 2004/04/25 03:52:37 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -94,7 +94,7 @@ print_drive_capabilities(cdio_drive_cap_t i_drive_cap)
printf("Error in getting drive properties\n"); printf("Error in getting drive properties\n");
} else { } else {
printf("Hardware : %s\n", printf("Hardware : %s\n",
i_drive_cap & CDIO_DRIVE_FILE ? "Disk Image" : "CD-ROM/DVD"); i_drive_cap & CDIO_DRIVE_FILE ? "Disk Image" : "CD-ROM or DVD");
printf("Can open tray : %s\n", printf("Can open tray : %s\n",
i_drive_cap & CDIO_DRIVE_OPEN_TRAY ? "Yes" : "No"); i_drive_cap & CDIO_DRIVE_OPEN_TRAY ? "Yes" : "No");
printf("Can close tray : %s\n\n", printf("Can close tray : %s\n\n",