Get MCN now works.

Retrieving CD TEXT no longer causes core dump. (It still doesn't give
useful info back though.)

Code cleanups.
This commit is contained in:
rocky
2004-07-15 11:55:45 +00:00
parent c77831ff51
commit d78dfc43ac

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_sunos.c,v 1.46 2004/07/15 04:03:52 rocky Exp $ $Id: _cdio_sunos.c,v 1.47 2004/07/15 11:55:45 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>
@@ -38,7 +38,7 @@
#ifdef HAVE_SOLARIS_CDROM #ifdef HAVE_SOLARIS_CDROM
static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.46 2004/07/15 04:03:52 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.47 2004/07/15 11:55:45 rocky Exp $";
#ifdef HAVE_GLOB_H #ifdef HAVE_GLOB_H
#include <glob.h> #include <glob.h>
@@ -406,7 +406,6 @@ _cdio_read_toc (_img_private_t *env)
return true; return true;
} }
#define set_cdtext_field(FIELD) \ #define set_cdtext_field(FIELD) \
if( i_track == 0 ) \ if( i_track == 0 ) \
env->cdtext.field[FIELD] = strdup(buffer); \ env->cdtext.field[FIELD] = strdup(buffer); \
@@ -429,26 +428,25 @@ _get_cdtext_solaris (void *user_data)
_img_private_t *env = user_data; _img_private_t *env = user_data;
int status; int status;
char wdata[5000]; char wdata[5000] = { 0, };
struct uscsi_cmd my_cmd; struct uscsi_cmd my_cmd;
unsigned char my_scsi_cdb[10]; unsigned char my_rq_buf[26] = { 0, };
unsigned char my_rq_buf[26];
memset(&my_scsi_cdb, 0, sizeof(my_scsi_cdb)); /* Sizes for commands are set by the SCSI opcode. *
memset(&my_rq_buf, 0, sizeof(my_rq_buf)); The size for READ TOC is 10. */
memset (&wdata, 0, sizeof (wdata)); unsigned char scsi_cdb[10] = {0, };
CDIO_MMC_SET_COMMAND(my_scsi_cdb, CDIO_MMC_GPCMD_READ_TOC); CDIO_MMC_SET_COMMAND(scsi_cdb, CDIO_MMC_GPCMD_READ_TOC);
my_scsi_cdb[1] = 0x02; /* MSF mode */ scsi_cdb[1] = 0x02; /* MSF mode */
my_scsi_cdb[2] = 0x05; /* CD text */ scsi_cdb[2] = 0x05; /* CD text */
CDIO_MMC_SET_READ_LENGTH( my_scsi_cdb, sizeof(wdata) ); CDIO_MMC_SET_READ_LENGTH( scsi_cdb, sizeof(wdata) );
my_cmd.uscsi_flags = (USCSI_READ|USCSI_RQENABLE); /* We're going get data */ 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_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_cdb = scsi_cdb; /* We'll be using the array above for the CDB */
my_cmd.uscsi_bufaddr = wdata; my_cmd.uscsi_bufaddr = wdata;
my_cmd.uscsi_buflen = sizeof(wdata); my_cmd.uscsi_buflen = sizeof(wdata);
my_cmd.uscsi_cdblen = 10; my_cmd.uscsi_cdblen = sizeof(scsi_cdb);
my_cmd.uscsi_rqlen = 24; /* The request sense buffer (only valid on a check condition) is 26 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 */ my_cmd.uscsi_rqbuf = my_rq_buf; /* Pointer to the request sense buffer */
@@ -461,15 +459,13 @@ _get_cdtext_solaris (void *user_data)
CDText_data_t *pdata; CDText_data_t *pdata;
int i; int i;
int j; int j;
char buffer[256]; char buffer[256] = { 0, };
int idx; int idx;
int i_track; int i_track;
printf("READ CDTEXT!\n");
memset( buffer, 0x00, sizeof(buffer) );
idx = 0; idx = 0;
pdata = (CDText_data_t *) (wdata[4]); pdata = (CDText_data_t *) (&wdata[4]);
for( i=0; i < CDIO_CDTEXT_MAX_PACK_DATA; i++ ) { for( i=0; i < CDIO_CDTEXT_MAX_PACK_DATA; i++ ) {
if( pdata->seq != i ) if( pdata->seq != i )
break; break;
@@ -625,29 +621,29 @@ cdio_get_default_device_solaris(void)
static cdio_drive_cap_t static cdio_drive_cap_t
_cdio_get_drive_cap_solaris (const void *user_data) _cdio_get_drive_cap_solaris (const void *user_data)
{ {
const _img_private_t *env = user_data;
int status;
struct uscsi_cmd my_cmd; struct uscsi_cmd my_cmd;
int32_t i_drivetype = 0; int32_t i_drivetype = 0;
uint8_t buf[192] = { 0, }; uint8_t buf[192] = { 0, };
unsigned char my_rq_buf[26]; unsigned char my_rq_buf[26] = {0, };
unsigned char my_scsi_cdb[6];
const _img_private_t *env = user_data; /* Sizes for commands are set by the SCSI opcode. *
int status; The size for MODE SENSE 10. */
unsigned char scsi_cdb[10] = {0, };
memset(&my_scsi_cdb, 0, sizeof(my_scsi_cdb)); CDIO_MMC_SET_COMMAND(scsi_cdb, CDIO_MMC_GPCMD_MODE_SENSE_10);
memset(&my_rq_buf, 0, sizeof(my_rq_buf)); scsi_cdb[1] = 0x0;
scsi_cdb[2] = CDIO_MMC_ALL_PAGES;
CDIO_MMC_SET_COMMAND(my_scsi_cdb, CDIO_MMC_GPCMD_MODE_SENSE_10); scsi_cdb[7] = 0x01;
my_scsi_cdb[1] = 0x0; scsi_cdb[8] = 0x00;
my_scsi_cdb[2] = CDIO_MMC_ALL_PAGES;
my_scsi_cdb[7] = 0x01;
my_scsi_cdb[8] = 0x00;
my_cmd.uscsi_flags = (USCSI_READ|USCSI_RQENABLE); /* We're going get data */ 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_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_cdb = 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_bufaddr = buf; /* The block and page data is stored here */
my_cmd.uscsi_buflen = sizeof(buf); my_cmd.uscsi_buflen = sizeof(buf);
my_cmd.uscsi_cdblen = 12; my_cmd.uscsi_cdblen = sizeof(scsi_cdb);
my_cmd.uscsi_rqlen = 24; /* The request sense buffer (only valid on a check condition) is 26 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 */ my_cmd.uscsi_rqbuf = my_rq_buf; /* Pointer to the request sense buffer */
@@ -696,34 +692,34 @@ _cdio_get_drive_cap_solaris (const void *user_data)
static char * static char *
_cdio_get_mcn_solaris (const void *user_data) _cdio_get_mcn_solaris (const void *user_data)
{ {
#if 0 #if 1
const _img_private_t *env = user_data;
struct uscsi_cmd my_cmd; struct uscsi_cmd my_cmd;
char buf[192] = { 0, }; char buf[192] = { 0, };
unsigned char my_rq_buf[32]; unsigned char my_rq_buf[32] = {0, };
unsigned char my_scsi_cdb[6];
const _img_private_t *env = user_data;
int rc; int rc;
/* Sizes for commands are set by the SCSI opcode. *
The size for READ SUBCHANNEL is 10. */
unsigned char scsi_cdb[10] = {0, };
memset(&my_scsi_cdb, 0, sizeof(my_scsi_cdb)); CDIO_MMC_SET_COMMAND(scsi_cdb, CDIO_MMC_GPCMD_READ_SUBCHANNEL);
memset(&my_rq_buf, 0, sizeof(my_rq_buf)); scsi_cdb[1] = 0x0;
scsi_cdb[2] = 0x40;
CDIO_MMC_SET_COMMAND(my_scsi_cdb, CDIO_MMC_GPCMD_READ_SUBCHANNEL); scsi_cdb[3] = 02; /* Give media catalog number. */
my_scsi_cdb[1] = 0x0; scsi_cdb[4] = 0; /* Not used */
my_scsi_cdb[2] = 0x40; scsi_cdb[5] = 0; /* Not used */
my_scsi_cdb[3] = 02; /* Give media catalog number. */ scsi_cdb[6] = 0; /* Not used */
my_scsi_cdb[4] = 0; /* Not used */ scsi_cdb[7] = 0; /* Not used */
my_scsi_cdb[5] = 0; /* Not used */ scsi_cdb[8] = 28;
my_scsi_cdb[6] = 0; /* Not used */ scsi_cdb[9] = 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_flags = (USCSI_READ|USCSI_RQENABLE); /* We're going get data */
my_cmd.uscsi_timeout = 15; /* Allow 15 seconds for completion */ 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_cdb = 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_bufaddr = buf; /* The block and page data is stored here */
my_cmd.uscsi_buflen = sizeof(buf); my_cmd.uscsi_buflen = sizeof(buf);
my_cmd.uscsi_cdblen = 6; /* The CDB is 6 bytes long */ my_cmd.uscsi_cdblen = sizeof(scsi_cdb);
my_cmd.uscsi_rqlen = 24; /* The request sense buffer (only valid on a check condition) is 26 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 */ my_cmd.uscsi_rqbuf = my_rq_buf; /* Pointer to the request sense buffer */