osx.c: try to eliminate invalid free of an uninitialized structure. untabify various drivers and get this more in-sync with gnu_linux.c driver.

This commit is contained in:
R. Bernstein
2012-04-28 23:38:11 -04:00
parent f8ab393842
commit 37cca69f1d
7 changed files with 454 additions and 431 deletions

View File

@@ -128,7 +128,7 @@ typedef struct {
} _img_private_t;
static track_format_t get_track_format_aix(void *p_user_data,
track_t i_track);
track_t i_track);
static access_mode_t
str_to_access_mode_aix(const char *psz_access_mode)
@@ -141,7 +141,7 @@ str_to_access_mode_aix(const char *psz_access_mode)
return _AM_CTRL_SCSI;
else {
cdio_warn ("unknown access type: %s. Default SCSI used.",
psz_access_mode);
psz_access_mode);
return default_access_mode;
}
}
@@ -160,7 +160,7 @@ init_aix (_img_private_t *p_env)
}
p_env->gen.fd = openx (p_env->gen.source_name, O_RDONLY, NULL,
SC_DIAGNOSTIC);
SC_DIAGNOSTIC);
/*p_env->gen.fd = openx (p_env->gen.source_name, O_RDONLY, NULL,
IDE_SINGLE);*/
@@ -185,11 +185,11 @@ init_aix (_img_private_t *p_env)
p_user_data internal CD structure.
i_timeout_ms time in milliseconds we will wait for the command
to complete.
i_cdb Size of p_cdb
p_cdb CDB bytes.
e_direction direction the transfer is to go.
i_buf Size of buffer
p_buf Buffer for data, both sending and receiving
i_cdb Size of p_cdb
p_cdb CDB bytes.
e_direction direction the transfer is to go.
i_buf Size of buffer
p_buf Buffer for data, both sending and receiving
*/
static driver_return_code_t
run_mmc_cmd_aix( void *p_user_data, unsigned int i_timeout_ms,
@@ -205,9 +205,9 @@ run_mmc_cmd_aix( void *p_user_data, unsigned int i_timeout_ms,
memcpy(cgc.scsi_cdb, p_cdb, sizeof(mmc_cdb_t));
#ifdef AIX_DISABLE_ASYNC
/* This enables synchronous negotiation mode. Some CD-ROM drives
* don't handle this well.
*/
/* This enables synchronous negotiation mode. Some CD-ROM drives
* don't handle this well.
*/
cgc.flags = 0;
#else
cgc.flags = SC_ASYNC;
@@ -238,7 +238,7 @@ run_mmc_cmd_aix( void *p_user_data, unsigned int i_timeout_ms,
static driver_return_code_t
_read_audio_sectors_aix (void *p_user_data, void *data, lsn_t lsn,
unsigned int nblocks)
unsigned int nblocks)
{
char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
@@ -262,7 +262,7 @@ _read_audio_sectors_aix (void *p_user_data, void *data, lsn_t lsn,
if (env->gen.ioctls_debugged < 75
|| (env->gen.ioctls_debugged < (30 * 75)
&& env->gen.ioctls_debugged % 75 == 0)
&& env->gen.ioctls_debugged % 75 == 0)
|| env->gen.ioctls_debugged % (30 * 75) == 0)
cdio_debug ("reading %d", lsn);
@@ -273,8 +273,8 @@ _read_audio_sectors_aix (void *p_user_data, void *data, lsn_t lsn,
cdda.cdda_data = (caddr_t) data;
if (ioctl (env->gen.fd, CDROMCDDA, &cdda) == -1) {
perror ("ioctl(..,CDROMCDDA,..)");
return 1;
/* exit (EXIT_FAILURE); */
return 1;
/* exit (EXIT_FAILURE); */
}
#endif
memcpy (data, buf, CDIO_CD_FRAMESIZE_RAW);
@@ -288,7 +288,7 @@ _read_audio_sectors_aix (void *p_user_data, void *data, lsn_t lsn,
*/
static driver_return_code_t
_read_mode1_sector_aix (void *env, void *data, lsn_t lsn,
bool b_form2)
bool b_form2)
{
#if FIXED
@@ -305,7 +305,7 @@ _read_mode1_sector_aix (void *env, void *data, lsn_t lsn,
*/
static driver_return_code_t
_read_mode1_sectors_aix (void *p_user_data, void *p_data, lsn_t lsn,
bool b_form2, unsigned int nblocks)
bool b_form2, unsigned int nblocks)
{
_img_private_t *p_env = p_user_data;
unsigned int i;
@@ -314,8 +314,8 @@ _read_mode1_sectors_aix (void *p_user_data, void *p_data, lsn_t lsn,
for (i = 0; i < nblocks; i++) {
if ( (retval = _read_mode1_sector_aix (p_env,
((char *)p_data) + (blocksize * i),
lsn + i, b_form2)) )
((char *)p_data) + (blocksize * i),
lsn + i, b_form2)) )
return retval;
}
return 0;
@@ -327,7 +327,7 @@ _read_mode1_sectors_aix (void *p_user_data, void *p_data, lsn_t lsn,
*/
static driver_return_code_t
_read_mode2_sector_aix (void *p_user_data, void *p_data, lsn_t lsn,
bool b_form2)
bool b_form2)
{
char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
int offset = 0;
@@ -351,10 +351,10 @@ _read_mode2_sector_aix (void *p_user_data, void *p_data, lsn_t lsn,
if (p_env->gen.ioctls_debugged < 75
|| (p_env->gen.ioctls_debugged < (30 * 75)
&& p_env->gen.ioctls_debugged % 75 == 0)
&& p_env->gen.ioctls_debugged % 75 == 0)
|| p_env->gen.ioctls_debugged % (30 * 75) == 0)
cdio_debug ("reading %2.2d:%2.2d:%2.2d",
msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0);
msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0);
p_env->gen.ioctls_debugged++;
@@ -389,7 +389,7 @@ _read_mode2_sector_aix (void *p_user_data, void *p_data, lsn_t lsn,
*/
static driver_return_code_t
_read_mode2_sectors_aix (void *p_user_data, void *data, lsn_t lsn,
bool b_form2, unsigned int nblocks)
bool b_form2, unsigned int nblocks)
{
_img_private_t *env = p_user_data;
unsigned int i;
@@ -398,8 +398,8 @@ _read_mode2_sectors_aix (void *p_user_data, void *data, lsn_t lsn,
for (i = 0; i < nblocks; i++) {
if ( (retval = _read_mode2_sector_aix (env,
((char *)data) + (blocksize * i),
lsn + i, b_form2)) )
((char *)data) + (blocksize * i),
lsn + i, b_form2)) )
return retval;
}
return 0;
@@ -462,7 +462,7 @@ _set_arg_aix (void *p_user_data, const char key[], const char value[])
/*
* aixioc_send
Issue ioctl command.
Issue ioctl command.
Args:
p_env - environment
@@ -477,14 +477,14 @@ _set_arg_aix (void *p_user_data, const char key[], const char value[])
static bool
aixioc_send(_img_private_t *p_env, int cmd, void *arg, bool b_print_err)
{
struct cd_audio_cmd *ac;
struct cd_audio_cmd *ac;
if (p_env->gen.fd < 0)
return false;
if (cmd == DKAUDIO) {
ac = (struct cd_audio_cmd *) arg;
ac->status = 0; /* Nuke status for audio cmds */
ac->status = 0; /* Nuke status for audio cmds */
}
if (ioctl(p_env->gen.fd, cmd, arg) < 0) {
@@ -505,7 +505,7 @@ static bool
read_toc_ioctl_aix (void *p_user_data)
{
_img_private_t *p_env = p_user_data;
struct cd_audio_cmd cmdbuf;
struct cd_audio_cmd cmdbuf;
int i;
cmdbuf.msf_flag = false;
@@ -515,7 +515,7 @@ read_toc_ioctl_aix (void *p_user_data)
p_env->gen.i_first_track = cmdbuf.indexing.track_index.first_track;
p_env->gen.i_tracks = ( cmdbuf.indexing.track_index.last_track
- p_env->gen.i_first_track ) + 1;
- p_env->gen.i_first_track ) + 1;
/* Do it again to get the last MSF data */
cmdbuf.msf_flag = true;
@@ -534,9 +534,9 @@ read_toc_ioctl_aix (void *p_user_data)
p_env->tocent[ i_track ].start_lsn =
cdio_msf3_to_lba(
cmdbuf.indexing.track_msf.mins,
cmdbuf.indexing.track_msf.secs,
cmdbuf.indexing.track_msf.frames );
cmdbuf.indexing.track_msf.mins,
cmdbuf.indexing.track_msf.secs,
cmdbuf.indexing.track_msf.frames );
}
return true;
@@ -570,9 +570,9 @@ read_toc_aix (void *p_user_data)
CDIO_MMC_SET_READ_LENGTH16(cdb.field, sizeof(cdrom_toc_full));
i_status = run_scsi_cmd_aix (p_env, 1000*60*3,
mmc_get_cmd_len(cdb.field[0]),
&cdb, MMC_DATA_READ,
sizeof(cdrom_toc_full), &cdrom_toc_full);
mmc_get_cmd_len(cdb.field[0]),
&cdb, MMC_DATA_READ,
sizeof(cdrom_toc_full), &cdrom_toc_full);
if ( 0 != i_status ) {
cdio_debug ("SCSI MMC READ_TOC failed\n");
@@ -592,40 +592,40 @@ read_toc_aix (void *p_user_data)
if ( 0xA1 == cdrom_toc_full.TrackData[i].POINT ) {
/* Last track number */
p_env->gen.i_tracks =
cdrom_toc_full.TrackData[i].PMIN - p_env->gen.i_first_track + 1;
cdrom_toc_full.TrackData[i].PMIN - p_env->gen.i_first_track + 1;
i_seen_flag|=0x02;
}
if ( 0xA2 == cdrom_toc_full.TrackData[i].POINT ) {
/* Start position of the lead out */
p_env->tocent[ p_env->gen.i_tracks ].start_lsn =
cdio_msf3_to_lba(
cdrom_toc_full.TrackData[i].PMIN,
cdrom_toc_full.TrackData[i].PSEC,
cdrom_toc_full.TrackData[i].PFRAME );
cdio_msf3_to_lba(
cdrom_toc_full.TrackData[i].PMIN,
cdrom_toc_full.TrackData[i].PSEC,
cdrom_toc_full.TrackData[i].PFRAME );
p_env->tocent[ p_env->gen.i_tracks ].Control
= cdrom_toc_full.TrackData[i].Control;
= cdrom_toc_full.TrackData[i].Control;
p_env->tocent[ p_env->gen.i_tracks ].Format = i_track_format;
i_seen_flag|=0x04;
}
if (cdrom_toc_full.TrackData[i].POINT > 0
&& cdrom_toc_full.TrackData[i].POINT <= p_env->gen.i_tracks) {
&& cdrom_toc_full.TrackData[i].POINT <= p_env->gen.i_tracks) {
p_env->tocent[ cdrom_toc_full.TrackData[i].POINT - 1 ].start_lsn =
cdio_msf3_to_lba(
cdrom_toc_full.TrackData[i].PMIN,
cdrom_toc_full.TrackData[i].PSEC,
cdrom_toc_full.TrackData[i].PFRAME );
cdio_msf3_to_lba(
cdrom_toc_full.TrackData[i].PMIN,
cdrom_toc_full.TrackData[i].PSEC,
cdrom_toc_full.TrackData[i].PFRAME );
p_env->tocent[ cdrom_toc_full.TrackData[i].POINT - 1 ].Control =
cdrom_toc_full.TrackData[i].Control;
cdrom_toc_full.TrackData[i].Control;
p_env->tocent[ cdrom_toc_full.TrackData[i].POINT - 1 ].Format =
i_track_format;
i_track_format;
cdio_debug("p_sectors: %i, %lu", i,
(unsigned long int) (p_env->tocent[i].start_lsn));
(unsigned long int) (p_env->tocent[i].start_lsn));
if (cdrom_toc_full.TrackData[i].POINT == p_env->gen.i_tracks)
i_seen_flag|=0x08;
i_seen_flag|=0x08;
}
if ( 0x0F == i_seen_flag ) break;
@@ -732,7 +732,7 @@ get_discmode_aix (void *p_user_data)
if((ret = ioctl(p_env->gen.fd, DK_CD_MODE, &media)) != 0) {
cdio_warn ("DK_CD_MODE failed: %s", strerror(errno));
return CDIO_DISC_MODE_NO_INFO;
return CDIO_DISC_MODE_NO_INFO;
}
switch(media.cd_mode_form) {
case CD_DA:
@@ -973,14 +973,17 @@ cdio_open_am_aix (const char *psz_orig_source, const char *access_mode)
_data = calloc (1, sizeof (_img_private_t));
_data->access_mode = _AM_CTRL_SCSI;
_data->gen.b_cdtext_error = false;
_data->gen.init = false;
_data->gen.fd = -1;
_data->gen.toc_init = false;
_data->gen.fd = -1;
_data->gen.b_cdtext_error = false;
if (NULL == psz_orig_source) {
psz_source = cdio_get_default_device_aix();
if (NULL == psz_source) return NULL;
if (NULL == psz_source) {
free(_data);
return NULL;
}
_set_arg_aix(_data, "source", psz_source);
free(psz_source);
} else {
@@ -996,14 +999,15 @@ cdio_open_am_aix (const char *psz_orig_source, const char *access_mode)
}
ret = cdio_new ( (void *) _data, &_funcs );
ret->driver_id = DRIVER_AIX;
if (ret == NULL) return NULL;
ret->driver_id = DRIVER_AIX;
if (init_aix(_data))
return ret;
else {
cdio_generic_free (_data);
free(ret);
return NULL;
}

View File

@@ -100,9 +100,9 @@ static lsn_t get_disc_last_lsn_bsdi (void *p_user_data);
*/
static driver_return_code_t
run_mmc_cmd_bsdi(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, /*in/out*/ void *p_buf )
unsigned int i_cdb, const mmc_cdb_t *p_cdb,
cdio_mmc_direction_t e_direction,
unsigned int i_buf, /*in/out*/ void *p_buf )
{
const _img_private_t *p_env = p_user_data;
int i_status, i_asc;
@@ -132,12 +132,12 @@ run_mmc_cmd_bsdi(void *p_user_data, unsigned int i_timeout_ms,
int i;
cp = suc.suc_sus.sus_sense;
fprintf(stderr,"i_status = %x cdb =",
i_status);
i_status);
for (i = 0; i < cdblen; i++)
fprintf(stderr, " %x", cgc->cdb[i]);
fprintf(stderr, " %x", cgc->cdb[i]);
fprintf(stderr, "\nsense =");
for (i = 0; i < 16; i++)
fprintf(stderr, " %x", cp[i]);
fprintf(stderr, " %x", cp[i]);
fprintf(stderr, "\n");
}
#endif
@@ -426,7 +426,7 @@ audio_stop_bsdi (void *p_user_data)
*/
static driver_return_code_t
_read_audio_sectors_bsdi (void *user_data, void *data, lsn_t lsn,
uint32_t i_blocks)
uint32_t i_blocks)
{
char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
struct cdrom_msf *msf = (struct cdrom_msf *) &buf;
@@ -447,10 +447,10 @@ _read_audio_sectors_bsdi (void *user_data, void *data, lsn_t lsn,
if (p_env->gen.ioctls_debugged < 75
|| (p_env->gen.ioctls_debugged < (30 * 75)
&& p_env->gen.ioctls_debugged % 75 == 0)
&& p_env->gen.ioctls_debugged % 75 == 0)
|| p_env->gen.ioctls_debugged % (30 * 75) == 0)
cdio_debug ("reading %2.2d:%2.2d:%2.2d",
msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0);
msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0);
p_env->gen.ioctls_debugged++;
@@ -463,13 +463,13 @@ _read_audio_sectors_bsdi (void *user_data, void *data, lsn_t lsn,
case _AM_IOCTL: {
unsigned int i;
for (i=0; i < i_blocks; i++) {
if (ioctl (p_env->gen.fd, CDROMREADRAW, &buf) == -1) {
perror ("ioctl()");
return 1;
/* exit (EXIT_FAILURE); */
}
memcpy (((char *)data) + (CDIO_CD_FRAMESIZE_RAW * i), buf,
CDIO_CD_FRAMESIZE_RAW);
if (ioctl (p_env->gen.fd, CDROMREADRAW, &buf) == -1) {
perror ("ioctl()");
return 1;
/* exit (EXIT_FAILURE); */
}
memcpy (((char *)data) + (CDIO_CD_FRAMESIZE_RAW * i), buf,
CDIO_CD_FRAMESIZE_RAW);
}
break;
}
@@ -484,7 +484,7 @@ _read_audio_sectors_bsdi (void *user_data, void *data, lsn_t lsn,
*/
static driver_return_code_t
_read_mode1_sector_bsdi (void *user_data, void *data, lsn_t lsn,
bool b_form2)
bool b_form2)
{
#if FIXED
@@ -502,7 +502,7 @@ _read_mode1_sector_bsdi (void *user_data, void *data, lsn_t lsn,
*/
static driver_return_code_t
_read_mode1_sectors_bsdi (void *p_user_data, void *p_data, lsn_t lsn,
bool b_form2, uint32_t i_blocks)
bool b_form2, uint32_t i_blocks)
{
_img_private_t *p_env = p_user_data;
unsigned int i;
@@ -511,8 +511,8 @@ _read_mode1_sectors_bsdi (void *p_user_data, void *p_data, lsn_t lsn,
for (i = 0; i < i_blocks; i++) {
if ( (retval = _read_mode1_sector_bsdi (p_env,
((char *)p_data) + (blocksize * i),
lsn + i, b_form2)) )
((char *)p_data) + (blocksize * i),
lsn + i, b_form2)) )
return retval;
}
return DRIVER_OP_SUCCESS;
@@ -524,7 +524,7 @@ _read_mode1_sectors_bsdi (void *p_user_data, void *p_data, lsn_t lsn,
*/
static driver_return_code_t
_read_mode2_sector_bsdi (void *p_user_data, void *p_data, lsn_t lsn,
bool b_form2)
bool b_form2)
{
char buf[M2RAW_SECTOR_SIZE] = { 0, };
struct cdrom_msf *msf = (struct cdrom_msf *) &buf;
@@ -545,10 +545,10 @@ _read_mode2_sector_bsdi (void *p_user_data, void *p_data, lsn_t lsn,
if (p_env->gen.ioctls_debugged < 75
|| (p_env->gen.ioctls_debugged < (30 * 75)
&& p_env->gen.ioctls_debugged % 75 == 0)
&& p_env->gen.ioctls_debugged % 75 == 0)
|| p_env->gen.ioctls_debugged % (30 * 75) == 0)
cdio_debug ("reading %2.2d:%2.2d:%2.2d",
msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0);
msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0);
p_env->gen.ioctls_debugged++;
@@ -561,11 +561,11 @@ _read_mode2_sector_bsdi (void *p_user_data, void *p_data, lsn_t lsn,
case _AM_IOCTL:
if (ioctl (p_env->gen.fd, CDROMREADMODE2, &buf) == -1)
{
perror ("ioctl()");
return 1;
/* exit (EXIT_FAILURE); */
}
{
perror ("ioctl()");
return 1;
/* exit (EXIT_FAILURE); */
}
break;
}
@@ -584,7 +584,7 @@ _read_mode2_sector_bsdi (void *p_user_data, void *p_data, lsn_t lsn,
*/
static driver_return_code_t
_read_mode2_sectors_bsdi (void *user_data, void *data, lsn_t lsn,
bool b_form2, uint32_t i_blocks)
bool b_form2, uint32_t i_blocks)
{
_img_private_t *p_env = user_data;
unsigned int i;
@@ -593,9 +593,9 @@ _read_mode2_sectors_bsdi (void *user_data, void *data, lsn_t lsn,
/* For each frame, pick out the data part we need */
for (i = 0; i < i_blocks; i++) {
int retval = _read_mode2_sector_bsdi(p_env,
((char *)data) +
(i_blocksize * i),
lsn + i, b_form2);
((char *)data) +
(i_blocksize * i),
lsn + i, b_form2);
if (retval) return retval;
}
return DRIVER_OP_SUCCESS;
@@ -642,9 +642,9 @@ _set_arg_bsdi (void *user_data, const char key[], const char value[])
else if (!strcmp (key, "access-mode"))
{
if (!strcmp(value, "IOCTL"))
p_env->access_mode = _AM_IOCTL;
p_env->access_mode = _AM_IOCTL;
else
cdio_warn ("unknown access type: %s. ignored.", value);
cdio_warn ("unknown access type: %s. ignored.", value);
}
else return DRIVER_OP_ERROR;
return DRIVER_OP_SUCCESS;
@@ -690,7 +690,7 @@ read_toc_bsdi (void *p_user_data)
struct cdrom_msf0 *msf= &p_env->tocent[i-1].cdte_addr.msf;
fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n",
i, msf->minute, msf->second, msf->frame);
i, msf->minute, msf->second, msf->frame);
****/
}
@@ -700,9 +700,9 @@ read_toc_bsdi (void *p_user_data)
p_env->tocent[p_env->gen.i_tracks].cdte_format = CDROM_MSF;
if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY,
&p_env->tocent[p_env->gen.i_tracks]) == -1 ) {
&p_env->tocent[p_env->gen.i_tracks]) == -1 ) {
cdio_warn("%s: %s\n",
"error in ioctl CDROMREADTOCENTRY for lead-out",
"error in ioctl CDROMREADTOCENTRY for lead-out",
strerror(errno));
return false;
}
@@ -711,7 +711,7 @@ read_toc_bsdi (void *p_user_data)
struct cdrom_msf0 *msf= &p_env->tocent[p_env->gen.i_tracks].cdte_addr.msf;
fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n",
i, msf->minute, msf->second, msf->frame);
i, msf->minute, msf->second, msf->frame);
*/
p_env->gen.toc_init = true;
@@ -917,7 +917,7 @@ cdio_get_devices_bsdi (void)
while ( (fs = getfsent()) )
{
if (strncmp(fs->fs_spec, "/dev/sr", 7))
cdio_add_device_list(&drives, fs->fs_spec, &num_drives);
cdio_add_device_list(&drives, fs->fs_spec, &num_drives);
}
#endif
@@ -956,7 +956,7 @@ cdio_open_am_bsdi (const char *psz_source_name, const char *psz_access_mode)
{
if (psz_access_mode != NULL)
cdio_warn ("there is only one access mode for bsdi. Arg %s ignored",
psz_access_mode);
psz_access_mode);
return cdio_open_bsdi(psz_source_name);
}
@@ -1023,15 +1023,20 @@ cdio_open_bsdi (const char *psz_orig_source)
};
_data = calloc (1, sizeof (_img_private_t));
_data->access_mode = _AM_IOCTL;
_data->gen.b_cdtext_error = false;
_data->gen.init = false;
_data->gen.fd = -1;
_data->gen.toc_init = false;
_data->gen.fd = -1;
_data->gen.b_cdtext_error = false;
if (NULL == psz_orig_source) {
psz_source=cdio_get_default_device_bsdi();
if (NULL == psz_source) return NULL;
if (NULL == psz_source) {
free(_data);
return NULL;
}
_set_arg_bsdi(_data, "source", psz_source);
free(psz_source);
} else {
@@ -1056,6 +1061,7 @@ cdio_open_bsdi (const char *psz_orig_source)
return ret;
else {
cdio_generic_free (_data);
free(ret);
return NULL;
}

View File

@@ -78,288 +78,288 @@
#include <sys/scsiio.h>
#define TOTAL_TRACKS (_obj->tochdr.ending_track \
- _obj->tochdr.starting_track + 1)
- _obj->tochdr.starting_track + 1)
#define FIRST_TRACK_NUM (_obj->tochdr.starting_track)
typedef struct {
generic_img_private_t gen;
generic_img_private_t gen;
bool toc_valid;
struct ioc_toc_header tochdr;
struct cd_toc_entry tocent[100];
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 */
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 )
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;
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;
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;
}
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;
return 0;
}
static int
read_audio_sectors_netbsd(void *user_data, void *data, lsn_t lsn,
unsigned int nblocks)
unsigned int nblocks)
{
scsireq_t req;
_img_private_t *_obj = user_data;
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;
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;
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;
}
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;
return 0;
}
static int
read_mode2_sector_netbsd(void *user_data, void *data, lsn_t lsn,
bool mode2_form2)
bool mode2_form2)
{
scsireq_t req;
_img_private_t *_obj = user_data;
char buf[M2RAW_SECTOR_SIZE] = { 0, };
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;
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;
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 (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);
if (mode2_form2)
memcpy(data, buf, M2RAW_SECTOR_SIZE);
else
memcpy(data, buf + CDIO_CD_SUBHEADER_SIZE, CDIO_CD_FRAMESIZE);
return 0;
return 0;
}
static int
read_mode2_sectors_netbsd(void *user_data, void *data, lsn_t lsn,
bool mode2_form2, unsigned int nblocks)
bool mode2_form2, unsigned int nblocks)
{
int i, res;
char *buf = data;
int i, res;
char *buf = data;
for (i = 0; i < nblocks; i++) {
res = read_mode2_sector_netbsd(user_data, buf, lsn, mode2_form2);
if (res)
return res;
for (i = 0; i < nblocks; i++) {
res = read_mode2_sector_netbsd(user_data, buf, lsn, mode2_form2);
if (res)
return res;
buf += (mode2_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE);
lsn++;
}
buf += (mode2_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE);
lsn++;
}
return 0;
return 0;
}
static int
set_arg_netbsd(void *user_data, const char key[], const char value[])
{
_img_private_t *_obj = user_data;
_img_private_t *_obj = user_data;
if (!strcmp(key, "source")) {
if (!value)
return -2;
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;
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;
return 0;
}
static bool
_cdio_read_toc(_img_private_t *_obj)
{
int res;
struct ioc_read_toc_entry req;
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;
}
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;
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;
}
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;
_obj->toc_valid = 1;
return true;
}
static bool
read_toc_netbsd (void *p_user_data)
{
return _cdio_read_toc(p_user_data);
return _cdio_read_toc(p_user_data);
}
static int
_cdio_read_discinfo(_img_private_t *_obj)
{
scsireq_t req;
scsireq_t req;
#define FULLTOCBUF (4 + 1000*11)
unsigned char buf[FULLTOCBUF] = { 0, };
int i, j;
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;
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;
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 (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");
}
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];
}
}
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;
_obj->sessionformat_valid = true;
return 0;
}
static int
eject_media_netbsd(void *user_data) {
_img_private_t *_obj = user_data;
int fd, res, ret = 0;
_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;
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;
}
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;
}
close(fd);
return ret;
close(fd);
return ret;
}
/*!
@@ -368,47 +368,47 @@ eject_media_netbsd(void *user_data) {
static const char *
get_arg_netbsd(void *user_data, const char key[])
{
_img_private_t *_obj = user_data;
_img_private_t *_obj = user_data;
if (!strcmp(key, "source")) {
return _obj->gen.source_name;
} else if (!strcmp(key, "access-mode")) {
return "READ_CD";
if (!strcmp(key, "source")) {
return _obj->gen.source_name;
} else if (!strcmp(key, "access-mode")) {
return "READ_CD";
} else if (!strcmp (key, "mmc-supported?")) {
return "true" ;
}
}
return NULL;
return NULL;
}
static track_t
get_first_track_num_netbsd(void *user_data)
{
_img_private_t *_obj = user_data;
int res;
_img_private_t *_obj = user_data;
int res;
if (!_obj->toc_valid) {
res = _cdio_read_toc(_obj);
if (!res)
return CDIO_INVALID_TRACK;
}
if (!_obj->toc_valid) {
res = _cdio_read_toc(_obj);
if (!res)
return CDIO_INVALID_TRACK;
}
return FIRST_TRACK_NUM;
return FIRST_TRACK_NUM;
}
static track_t
get_num_tracks_netbsd(void *user_data)
{
_img_private_t *_obj = user_data;
int res;
_img_private_t *_obj = user_data;
int res;
if (!_obj->toc_valid) {
res = _cdio_read_toc(_obj);
if (!res)
return CDIO_INVALID_TRACK;
}
if (!_obj->toc_valid) {
res = _cdio_read_toc(_obj);
if (!res)
return CDIO_INVALID_TRACK;
}
return TOTAL_TRACKS;
return TOTAL_TRACKS;
}
/*!
@@ -417,33 +417,33 @@ get_num_tracks_netbsd(void *user_data)
static track_format_t
get_track_format_netbsd(void *user_data, track_t track_num)
{
_img_private_t *_obj = user_data;
int res;
_img_private_t *_obj = user_data;
int res;
if (!_obj->toc_valid) {
res = _cdio_read_toc(_obj);
if (!res)
return CDIO_INVALID_TRACK;
}
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 (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->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;
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;
}
/*!
@@ -458,8 +458,8 @@ static bool
get_track_green_netbsd(void *user_data, track_t track_num)
{
return (get_track_format_netbsd(user_data, track_num)
== TRACK_FORMAT_XA);
return (get_track_format_netbsd(user_data, track_num)
== TRACK_FORMAT_XA);
}
/*!
@@ -474,29 +474,29 @@ get_track_green_netbsd(void *user_data, track_t track_num)
static bool
get_track_msf_netbsd(void *user_data, track_t track_num, msf_t *msf)
{
_img_private_t *_obj = user_data;
int res;
_img_private_t *_obj = user_data;
int res;
if (!msf)
return false;
if (!msf)
return false;
if (!_obj->toc_valid) {
res = _cdio_read_toc(_obj);
if (!res)
return CDIO_INVALID_TRACK;
}
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 == CDIO_CDROM_LEADOUT_TRACK)
track_num = TOTAL_TRACKS + 1;
if (track_num > TOTAL_TRACKS + 1 || track_num == 0)
return false;
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);
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;
return true;
}
/*!
@@ -510,11 +510,11 @@ get_track_msf_netbsd(void *user_data, track_t track_num, msf_t *msf)
static lsn_t
get_disc_last_lsn_netbsd(void *user_data)
{
msf_t msf;
msf_t msf;
get_track_msf_netbsd(user_data, CDIO_CDROM_LEADOUT_TRACK, &msf);
get_track_msf_netbsd(user_data, CDIO_CDROM_LEADOUT_TRACK, &msf);
return (((msf.m * 60) + msf.s) * CDIO_CD_FRAMES_PER_SEC + msf.f);
return (((msf.m * 60) + msf.s) * CDIO_CD_FRAMES_PER_SEC + msf.f);
}
#endif /* HAVE_NETBSD_CDROM */
@@ -601,35 +601,40 @@ CdIo_t *
cdio_open_netbsd(const char *source_name)
{
#ifdef HAVE_NETBSD_CDROM
CdIo_t *ret;
_img_private_t *_data;
CdIo_t *ret;
_img_private_t *_data;
_data = calloc(1, sizeof(_img_private_t));
_data->gen.b_cdtext_error = false;
_data->gen.init = false;
_data->gen.fd = -1;
_data->toc_valid = false;
_data->sessionformat_valid = false;
_data = calloc(1, sizeof(_img_private_t));
set_arg_netbsd(_data, "source",
(source_name ? source_name : DEFAULT_CDIO_DEVICE));
_data->gen.init = false;
_data->toc_valid = false;
_data->sessionformat_valid = false;
_data->gen.fd = -1;
_data->gen.b_cdtext_error = false;
if (source_name && !cdio_is_device_generic(source_name))
return (NULL);
set_arg_netbsd(_data, "source",
(source_name ? source_name : DEFAULT_CDIO_DEVICE));
ret = cdio_new(&_data->gen, &_funcs);
if (!ret)
return NULL;
if (source_name && !cdio_is_device_generic(source_name))
return (NULL);
ret = cdio_new(&_data->gen, &_funcs);
if (ret == NULL) return NULL;
ret->driver_id = DRIVER_NETBSD;
if (cdio_generic_init(_data, O_RDONLY)) {
return ret;
} else {
cdio_generic_free(_data);
free(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 */
#endif /* HAVE_NETBSD_CDROM */
}
/*!

View File

@@ -1520,6 +1520,7 @@ cdio_open_os2 (const char *psz_orig_source)
return ret;
else {
free_os2 (_data);
free(ret);
return NULL;
}
#else

View File

@@ -178,7 +178,7 @@ GetRegistryEntryProperties ( io_service_t service )
CFMutableDictionaryRef dict = 0;
err = IORegistryEntryCreateCFProperties (service, &dict,
kCFAllocatorDefault, 0);
kCFAllocatorDefault, 0);
if ( err != kIOReturnSuccess )
cdio_warn( "IORegistryEntryCreateCFProperties: 0x%08x", err );
@@ -295,7 +295,7 @@ init_osx(_img_private_t *p_env) {
ret = IOServiceGetMatchingServices( kIOMasterPortDefault,
IOBSDNameMatching(kIOMasterPortDefault,
0, psz_devname),
0, psz_devname),
&iterator );
/* Get service iterator for the device. */
@@ -1400,20 +1400,20 @@ static void media_eject_callback(DADiskRef disk, DADissenterRef dissenter, void
if ( dissenter )
{
CFStringRef status = DADissenterGetStatusString(dissenter);
if (status)
{
size_t cstr_size = CFStringGetLength(status);
char *cstr = malloc(cstr_size);
if ( CFStringGetCString( status,
cstr, cstr_size,
kCFStringEncodingASCII ) )
CFRelease( status );
CFStringRef status = DADissenterGetStatusString(dissenter);
if (status)
{
size_t cstr_size = CFStringGetLength(status);
char *cstr = malloc(cstr_size);
if ( CFStringGetCString( status,
cstr, cstr_size,
kCFStringEncodingASCII ) )
CFRelease( status );
cdio_warn("%s", cstr);
cdio_warn("%s", cstr);
free(cstr);
}
free(cstr);
}
}
dacontext->result = (dissenter ? DRIVER_OP_ERROR : DRIVER_OP_SUCCESS);
@@ -1477,27 +1477,27 @@ _eject_media_osx (void *user_data) {
if ((disk = DADiskCreateFromBSDName(kCFAllocatorDefault, dacontext.session, psz_drive)) != NULL)
{
if ((description = DADiskCopyDescription(disk)) != NULL)
{
/* Does the device need to be unmounted first? */
DASessionScheduleWithRunLoop(dacontext.session, dacontext.runloop, kCFRunLoopDefaultMode);
CFRunLoopAddSource(dacontext.runloop, dacontext.cancel, kCFRunLoopDefaultMode);
{
/* Does the device need to be unmounted first? */
DASessionScheduleWithRunLoop(dacontext.session, dacontext.runloop, kCFRunLoopDefaultMode);
CFRunLoopAddSource(dacontext.runloop, dacontext.cancel, kCFRunLoopDefaultMode);
if (CFDictionaryGetValueIfPresent(description, kDADiskDescriptionVolumePathKey, NULL))
{
DADiskUnmount(disk, kDADiskUnmountOptionDefault, media_unmount_callback, &dacontext);
if (CFDictionaryGetValueIfPresent(description, kDADiskDescriptionVolumePathKey, NULL))
{
DADiskUnmount(disk, kDADiskUnmountOptionDefault, media_unmount_callback, &dacontext);
}
else
{
DADiskEject(disk, kDADiskEjectOptionDefault, media_eject_callback, &dacontext);
dacontext.result = dacontext.result == DRIVER_OP_UNINIT ? DRIVER_OP_SUCCESS : dacontext.result;
else
{
DADiskEject(disk, kDADiskEjectOptionDefault, media_eject_callback, &dacontext);
dacontext.result = dacontext.result == DRIVER_OP_UNINIT ? DRIVER_OP_SUCCESS : dacontext.result;
}
if (!dacontext.completed)
{
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 30.0, TRUE); /* timeout after 30 seconds */
if (!dacontext.completed)
{
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 30.0, TRUE); /* timeout after 30 seconds */
}
CFRunLoopRemoveSource(dacontext.runloop, dacontext.cancel, kCFRunLoopDefaultMode);
DASessionUnscheduleFromRunLoop(dacontext.session, dacontext.runloop, kCFRunLoopDefaultMode);
CFRelease(description);
CFRunLoopRemoveSource(dacontext.runloop, dacontext.cancel, kCFRunLoopDefaultMode);
DASessionUnscheduleFromRunLoop(dacontext.session, dacontext.runloop, kCFRunLoopDefaultMode);
CFRelease(description);
}
CFRelease(disk);
}
@@ -1944,13 +1944,15 @@ cdio_open_osx (const char *psz_orig_source)
_data->gen.init = false;
_data->gen.fd = -1;
_data->gen.toc_init = false;
_data->gen.b_cdtext_error = false;
if (NULL == psz_orig_source) {
psz_source=cdio_get_default_device_osx();
if (NULL == psz_source) {
cdio_generic_free(_data);
return NULL;
free(_data);
return NULL;
}
_set_arg_osx(_data, "source", psz_source);
free(psz_source);
} else {
@@ -1961,21 +1963,21 @@ cdio_open_osx (const char *psz_orig_source)
#if 0
cdio_info ("source %s is a not a device", psz_orig_source);
#endif
cdio_generic_free(_data);
free(_data);
return NULL;
}
}
ret = cdio_new ((void *)_data, &_funcs);
if (ret == NULL) {
cdio_generic_free(_data);
return NULL;
}
if (ret == NULL) return NULL;
ret->driver_id = DRIVER_OSX;
if (cdio_generic_init(_data, O_RDONLY | O_NONBLOCK) && init_osx(_data))
return ret;
else {
cdio_generic_free (_data);
free(ret);
return NULL;
}

View File

@@ -1420,7 +1420,11 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode)
if (NULL == psz_orig_source) {
psz_source = cdio_get_default_device_solaris();
if (NULL == psz_source) return NULL;
if (NULL == psz_source) {
free(_data);
return NULL;
}
_set_arg_solaris(_data, "source", psz_source);
free(psz_source);
} else {
@@ -1445,6 +1449,7 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode)
return ret;
else {
cdio_generic_free (_data);
free(ret);
return NULL;
}

View File

@@ -86,6 +86,6 @@ EXTRA_DIST = cd-drive.help2man cd-info.help2man cd-read.help2man \
if MAINTAINER_MODE
$(man_MANS): %.1: %$(EXEEXT) %.help2man
-$(HELP2MAN) --opt-include=$(srcdir)/$(<:.exe=).help2man --no-info ./$< | @SED@ -re 's/[lL][tT]-//' >$@
-$(HELP2MAN) --opt-include=$(srcdir)/$(<:.exe=).help2man --no-info ./$< | @SED@ @SED_EXTENDED_RE_FLAG@ -e 's/[lL][tT]-//' >$@
endif
MAINTAINERCLEANFILES = $(man_MANS) *.rej *.orig