On ioctl's, a negative number is considered an unspecified error while

a positive number is not. Replace tabs in lines with blanks.
This commit is contained in:
R. Bernstein
2009-12-24 06:28:27 -05:00
parent 6cb64d1a08
commit f031f69f69
2 changed files with 187 additions and 184 deletions

View File

@@ -105,8 +105,8 @@ typedef struct {
} _img_private_t; } _img_private_t;
/* Some ioctl() errno values which occur when the tray is empty */ /* Some ioctl() errno values which occur when the tray is empty */
#define ERRNO_TRAYEMPTY(errno) \ #define ERRNO_TRAYEMPTY(errno) \
((errno == EIO) || (errno == ENOENT) || (errno == EINVAL)) ((errno == EIO) || (errno == ENOENT) || (errno == EINVAL))
/**** prototypes for static functions ****/ /**** prototypes for static functions ****/
static bool is_cdrom_linux(const char *drive, char *mnttype); static bool is_cdrom_linux(const char *drive, char *mnttype);
@@ -137,7 +137,7 @@ str_to_access_mode_linux(const char *psz_access_mode)
return _AM_MMC_RDWR; return _AM_MMC_RDWR;
else { else {
cdio_warn ("unknown access type: %s. Default IOCTL used.", cdio_warn ("unknown access type: %s. Default IOCTL used.",
psz_access_mode); psz_access_mode);
return default_access_mode; return default_access_mode;
} }
} }
@@ -160,13 +160,13 @@ check_mounts_linux(const char *mtab)
i_mnt_type = strlen(mntent->mnt_type) + 1; i_mnt_type = strlen(mntent->mnt_type) + 1;
mnt_type = calloc(1, i_mnt_type); mnt_type = calloc(1, i_mnt_type);
if (mnt_type == NULL) if (mnt_type == NULL)
continue; /* maybe you'll get lucky next time. */ continue; /* maybe you'll get lucky next time. */
i_mnt_dev = strlen(mntent->mnt_fsname) + 1; i_mnt_dev = strlen(mntent->mnt_fsname) + 1;
mnt_dev = calloc(1, i_mnt_dev); mnt_dev = calloc(1, i_mnt_dev);
if (mnt_dev == NULL) { if (mnt_dev == NULL) {
free(mnt_type); free(mnt_type);
continue; continue;
} }
strncpy(mnt_type, mntent->mnt_type, i_mnt_type); strncpy(mnt_type, mntent->mnt_type, i_mnt_type);
@@ -174,35 +174,35 @@ check_mounts_linux(const char *mtab)
/* Handle "supermount" filesystem mounts */ /* Handle "supermount" filesystem mounts */
if ( strcmp(mnt_type, "supermount") == 0 ) { if ( strcmp(mnt_type, "supermount") == 0 ) {
tmp = strstr(mntent->mnt_opts, "fs="); tmp = strstr(mntent->mnt_opts, "fs=");
if ( tmp ) { if ( tmp ) {
free(mnt_type); free(mnt_type);
mnt_type = strdup(tmp + strlen("fs=")); mnt_type = strdup(tmp + strlen("fs="));
if ( mnt_type ) { if ( mnt_type ) {
tmp = strchr(mnt_type, ','); tmp = strchr(mnt_type, ',');
if ( tmp ) { if ( tmp ) {
*tmp = '\0'; *tmp = '\0';
} }
} }
} }
tmp = strstr(mntent->mnt_opts, "dev="); tmp = strstr(mntent->mnt_opts, "dev=");
if ( tmp ) { if ( tmp ) {
free(mnt_dev); free(mnt_dev);
mnt_dev = strdup(tmp + strlen("dev=")); mnt_dev = strdup(tmp + strlen("dev="));
if ( mnt_dev ) { if ( mnt_dev ) {
tmp = strchr(mnt_dev, ','); tmp = strchr(mnt_dev, ',');
if ( tmp ) { if ( tmp ) {
*tmp = '\0'; *tmp = '\0';
} }
} }
} }
} }
if ( strcmp(mnt_type, "iso9660") == 0 ) { if ( strcmp(mnt_type, "iso9660") == 0 ) {
if (is_cdrom_linux(mnt_dev, mnt_type) > 0) { if (is_cdrom_linux(mnt_dev, mnt_type) > 0) {
free(mnt_type); free(mnt_type);
endmntent(mntfp); endmntent(mntfp);
return mnt_dev; return mnt_dev;
} }
} }
free(mnt_dev); free(mnt_dev);
free(mnt_type); free(mnt_type);
@@ -397,9 +397,9 @@ get_arg_linux (void *env, const char key[])
*/ */
static void static void
get_drive_cap_linux (const void *p_user_data, get_drive_cap_linux (const void *p_user_data,
/*out*/ cdio_drive_read_cap_t *p_read_cap, /*out*/ cdio_drive_read_cap_t *p_read_cap,
/*out*/ cdio_drive_write_cap_t *p_write_cap, /*out*/ cdio_drive_write_cap_t *p_write_cap,
/*out*/ cdio_drive_misc_cap_t *p_misc_cap) /*out*/ cdio_drive_misc_cap_t *p_misc_cap)
{ {
const _img_private_t *p_env = p_user_data; const _img_private_t *p_env = p_user_data;
int32_t i_drivetype; int32_t i_drivetype;
@@ -821,7 +821,7 @@ get_discmode_linux (void *p_user_data)
return CDIO_DISC_MODE_CD_DA; return CDIO_DISC_MODE_CD_DA;
case CDS_DATA_1: case CDS_DATA_1:
case CDS_DATA_2: /* Actually, recent GNU/Linux kernels don't return case CDS_DATA_2: /* Actually, recent GNU/Linux kernels don't return
CDS_DATA_2, but just in case. */ CDS_DATA_2, but just in case. */
return CDIO_DISC_MODE_CD_DATA; return CDIO_DISC_MODE_CD_DATA;
case CDS_MIXED: case CDS_MIXED:
return CDIO_DISC_MODE_CD_MIXED; return CDIO_DISC_MODE_CD_MIXED;
@@ -871,7 +871,7 @@ is_cdrom_linux(const char *drive, char *mnttype)
*/ */
static driver_return_code_t static driver_return_code_t
read_audio_sectors_linux (void *p_user_data, void *p_buf, lsn_t i_lsn, read_audio_sectors_linux (void *p_user_data, void *p_buf, lsn_t i_lsn,
uint32_t i_blocks) uint32_t i_blocks)
{ {
_img_private_t *p_env = p_user_data; _img_private_t *p_env = p_user_data;
return mmc_read_sectors( p_env->gen.cdio, p_buf, i_lsn, return mmc_read_sectors( p_env->gen.cdio, p_buf, i_lsn,
@@ -883,7 +883,7 @@ read_audio_sectors_linux (void *p_user_data, void *p_buf, lsn_t i_lsn,
*/ */
static driver_return_code_t static driver_return_code_t
_read_mode2_sectors_mmc (_img_private_t *p_env, void *p_buf, lba_t lba, _read_mode2_sectors_mmc (_img_private_t *p_env, void *p_buf, lba_t lba,
uint32_t i_blocks, bool b_read_10) uint32_t i_blocks, bool b_read_10)
{ {
mmc_cdb_t cdb = {{0, }}; mmc_cdb_t cdb = {{0, }};
@@ -905,8 +905,8 @@ _read_mode2_sectors_mmc (_img_private_t *p_env, void *p_buf, lba_t lba,
M2RAW_SECTOR_SIZE * i_blocks, M2RAW_SECTOR_SIZE * i_blocks,
p_buf))) p_buf)))
{ {
mmc_set_blocksize (p_env->gen.cdio, CDIO_CD_FRAMESIZE); mmc_set_blocksize (p_env->gen.cdio, CDIO_CD_FRAMESIZE);
return retval; return retval;
} }
/* Restore blocksize. */ /* Restore blocksize. */
@@ -929,7 +929,7 @@ _read_mode2_sectors_mmc (_img_private_t *p_env, void *p_buf, lba_t lba,
static driver_return_code_t static driver_return_code_t
_read_mode2_sectors (_img_private_t *p_env, void *p_buf, lba_t lba, _read_mode2_sectors (_img_private_t *p_env, void *p_buf, lba_t lba,
uint32_t i_blocks, bool b_read_10) uint32_t i_blocks, bool b_read_10)
{ {
unsigned int l = 0; unsigned int l = 0;
int retval = 0; int retval = 0;
@@ -940,10 +940,10 @@ _read_mode2_sectors (_img_private_t *p_env, void *p_buf, lba_t lba,
void *p_buf2 = ((char *)p_buf ) + (l * M2RAW_SECTOR_SIZE); void *p_buf2 = ((char *)p_buf ) + (l * M2RAW_SECTOR_SIZE);
retval |= _read_mode2_sectors_mmc (p_env, p_buf2, lba + l, retval |= _read_mode2_sectors_mmc (p_env, p_buf2, lba + l,
i_blocks2, b_read_10); i_blocks2, b_read_10);
if (retval) if (retval)
break; break;
i_blocks -= i_blocks2; i_blocks -= i_blocks2;
l += i_blocks2; l += i_blocks2;
@@ -958,7 +958,7 @@ _read_mode2_sectors (_img_private_t *p_env, void *p_buf, lba_t lba,
*/ */
static driver_return_code_t static driver_return_code_t
_read_mode1_sector_linux (void *p_user_data, void *p_data, lsn_t lsn, _read_mode1_sector_linux (void *p_user_data, void *p_data, lsn_t lsn,
bool b_form2) bool b_form2)
{ {
#if 0 #if 0
@@ -983,38 +983,38 @@ _read_mode1_sector_linux (void *p_user_data, void *p_data, lsn_t lsn,
case _AM_IOCTL: case _AM_IOCTL:
if (ioctl (p_env->gen.fd, CDROMREADMODE1, &buf) == -1) if (ioctl (p_env->gen.fd, CDROMREADMODE1, &buf) == -1)
{ {
perror ("ioctl()"); perror ("ioctl()");
return 1; return 1;
/* exit (EXIT_FAILURE); */ /* exit (EXIT_FAILURE); */
} }
break; break;
case _AM_READ_CD: case _AM_READ_CD:
case _AM_READ_10: case _AM_READ_10:
if (_read_mode2_sectors (p_env, buf, lsn, 1, if (_read_mode2_sectors (p_env, buf, lsn, 1,
(p_env->access_mode == _AM_READ_10))) (p_env->access_mode == _AM_READ_10)))
{ {
perror ("ioctl()"); perror ("ioctl()");
if (p_env->access_mode == _AM_READ_CD) if (p_env->access_mode == _AM_READ_CD)
{ {
cdio_info ("READ_CD failed; switching to READ_10 mode..."); cdio_info ("READ_CD failed; switching to READ_10 mode...");
p_env->access_mode = _AM_READ_10; p_env->access_mode = _AM_READ_10;
goto retry; goto retry;
} }
else else
{ {
cdio_info ("READ_10 failed; switching to ioctl(CDROMREADMODE2) mode..."); cdio_info ("READ_10 failed; switching to ioctl(CDROMREADMODE2) mode...");
p_env->access_mode = _AM_IOCTL; p_env->access_mode = _AM_IOCTL;
goto retry; goto retry;
} }
return 1; return 1;
} }
break; break;
} }
memcpy (p_data, buf + CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE, memcpy (p_data, buf + CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE,
b_form2 ? M2RAW_SECTOR_SIZE: CDIO_CD_FRAMESIZE); b_form2 ? M2RAW_SECTOR_SIZE: CDIO_CD_FRAMESIZE);
#else #else
return cdio_generic_read_form1_sector(p_user_data, p_data, lsn); return cdio_generic_read_form1_sector(p_user_data, p_data, lsn);
@@ -1029,7 +1029,7 @@ _read_mode1_sector_linux (void *p_user_data, void *p_data, lsn_t lsn,
*/ */
static driver_return_code_t static driver_return_code_t
_read_mode1_sectors_linux (void *p_user_data, void *p_data, lsn_t lsn, _read_mode1_sectors_linux (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; _img_private_t *p_env = p_user_data;
unsigned int i; unsigned int i;
@@ -1038,8 +1038,8 @@ _read_mode1_sectors_linux (void *p_user_data, void *p_data, lsn_t lsn,
for (i = 0; i < i_blocks; i++) { for (i = 0; i < i_blocks; i++) {
if ( (retval = _read_mode1_sector_linux (p_env, if ( (retval = _read_mode1_sector_linux (p_env,
((char *)p_data) + (blocksize*i), ((char *)p_data) + (blocksize*i),
lsn + i, b_form2)) ) lsn + i, b_form2)) )
return retval; return retval;
} }
return DRIVER_OP_SUCCESS; return DRIVER_OP_SUCCESS;
@@ -1051,7 +1051,7 @@ _read_mode1_sectors_linux (void *p_user_data, void *p_data, lsn_t lsn,
*/ */
static driver_return_code_t static driver_return_code_t
_read_mode2_sector_linux (void *p_user_data, void *p_data, lsn_t lsn, _read_mode2_sector_linux (void *p_user_data, void *p_data, lsn_t lsn,
bool b_form2) bool b_form2)
{ {
char buf[M2RAW_SECTOR_SIZE] = { 0, }; char buf[M2RAW_SECTOR_SIZE] = { 0, };
struct cdrom_msf *msf = (struct cdrom_msf *) &buf; struct cdrom_msf *msf = (struct cdrom_msf *) &buf;
@@ -1075,33 +1075,33 @@ _read_mode2_sector_linux (void *p_user_data, void *p_data, lsn_t lsn,
case _AM_IOCTL: case _AM_IOCTL:
case _AM_MMC_RDWR: case _AM_MMC_RDWR:
if (ioctl (p_env->gen.fd, CDROMREADMODE2, &buf) == -1) if (ioctl (p_env->gen.fd, CDROMREADMODE2, &buf) == -1)
{ {
perror ("ioctl()"); perror ("ioctl()");
return 1; return 1;
/* exit (EXIT_FAILURE); */ /* exit (EXIT_FAILURE); */
} }
break; break;
case _AM_READ_CD: case _AM_READ_CD:
case _AM_READ_10: case _AM_READ_10:
if (_read_mode2_sectors (p_env, buf, lsn, 1, if (_read_mode2_sectors (p_env, buf, lsn, 1,
(p_env->access_mode == _AM_READ_10))) (p_env->access_mode == _AM_READ_10)))
{ {
perror ("ioctl()"); perror ("ioctl()");
if (p_env->access_mode == _AM_READ_CD) if (p_env->access_mode == _AM_READ_CD)
{ {
cdio_info ("READ_CD failed; switching to READ_10 mode..."); cdio_info ("READ_CD failed; switching to READ_10 mode...");
p_env->access_mode = _AM_READ_10; p_env->access_mode = _AM_READ_10;
goto retry; goto retry;
} }
else else
{ {
cdio_info ("READ_10 failed; switching to ioctl(CDROMREADMODE2) mode..."); cdio_info ("READ_10 failed; switching to ioctl(CDROMREADMODE2) mode...");
p_env->access_mode = _AM_IOCTL; p_env->access_mode = _AM_IOCTL;
goto retry; goto retry;
} }
return 1; return 1;
} }
break; break;
} }
@@ -1120,7 +1120,7 @@ _read_mode2_sector_linux (void *p_user_data, void *p_data, lsn_t lsn,
*/ */
static driver_return_code_t static driver_return_code_t
_read_mode2_sectors_linux (void *p_user_data, void *data, lsn_t lsn, _read_mode2_sectors_linux (void *p_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 = p_user_data; _img_private_t *p_env = p_user_data;
unsigned int i; unsigned int i;
@@ -1130,8 +1130,8 @@ _read_mode2_sectors_linux (void *p_user_data, void *data, lsn_t lsn,
for (i = 0; i < i_blocks; i++) { for (i = 0; i < i_blocks; i++) {
int retval; int retval;
if ( (retval = _read_mode2_sector_linux (p_env, if ( (retval = _read_mode2_sector_linux (p_env,
((char *)data) + (i_blocksize*i), ((char *)data) + (i_blocksize*i),
lsn + i, b_form2)) ) lsn + i, b_form2)) )
return retval; return retval;
} }
return DRIVER_OP_SUCCESS; return DRIVER_OP_SUCCESS;
@@ -1177,7 +1177,7 @@ read_toc_linux (void *p_user_data)
struct cdrom_msf0 *msf= &env->tocent[i-1].cdte_addr.msf; struct cdrom_msf0 *msf= &env->tocent[i-1].cdte_addr.msf;
fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n", 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);
****/ ****/
} }
@@ -1187,9 +1187,9 @@ read_toc_linux (void *p_user_data)
p_env->tocent[p_env->gen.i_tracks].cdte_format = CDROM_MSF; p_env->tocent[p_env->gen.i_tracks].cdte_format = CDROM_MSF;
if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY, 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", cdio_warn("%s: %s\n",
"error in ioctl CDROMREADTOCENTRY for lead-out", "error in ioctl CDROMREADTOCENTRY for lead-out",
strerror(errno)); strerror(errno));
return false; return false;
} }
@@ -1198,7 +1198,7 @@ read_toc_linux (void *p_user_data)
struct cdrom_msf0 *msf= &env->tocent[p_env->gen.i_tracks].cdte_addr.msf; struct cdrom_msf0 *msf= &env->tocent[p_env->gen.i_tracks].cdte_addr.msf;
fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n", 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; p_env->gen.toc_init = true;
@@ -1208,14 +1208,14 @@ read_toc_linux (void *p_user_data)
/*! /*!
Run a SCSI MMC command. Run a SCSI MMC command.
cdio CD structure set by cdio_open(). cdio CD structure set by cdio_open().
i_timeout time in milliseconds we will wait for the command i_timeout time in milliseconds we will wait for the command
to complete. If this value is -1, use the default to complete. If this value is -1, use the default
time-out value. time-out value.
p_buf Buffer for data, both sending and receiving p_buf Buffer for data, both sending and receiving
i_buf Size of buffer i_buf Size of buffer
e_direction direction the transfer is to go. e_direction direction the transfer is to go.
cdb CDB bytes. All values that are needed should be set on cdb CDB bytes. All values that are needed should be set on
input. We'll figure out what the right CDB length should be. input. We'll figure out what the right CDB length should be.
We return true if command completed successfully and false if not. We return true if command completed successfully and false if not.
@@ -1259,11 +1259,12 @@ run_mmc_cmd_linux( void *p_user_data,
return DRIVER_OP_ERROR; return DRIVER_OP_ERROR;
break; break;
} }
} } else if (i_rc < -1)
return DRIVER_OP_ERROR; return DRIVER_OP_ERROR;
else
/*Not sure if this the best thing, but we'll use anyway. */
return DRIVER_OP_SUCCESS;
} }
/*Not sure if this the best thing, but we'll use anyway. */
return DRIVER_OP_SUCCESS;
} }
/*! /*!
@@ -1413,7 +1414,7 @@ cdio_get_devices_linux (void)
if (snprintf(drive, sizeof(drive), checklist2[i].format, j) < 0) if (snprintf(drive, sizeof(drive), checklist2[i].format, j) < 0)
continue; continue;
if ( (is_cdrom_linux(drive, NULL)) > 0 ) { if ( (is_cdrom_linux(drive, NULL)) > 0 ) {
cdio_add_device_list(&drives, drive, &num_drives); cdio_add_device_list(&drives, drive, &num_drives);
} }
} }
} }
@@ -1463,7 +1464,7 @@ cdio_get_default_device_linux(void)
if (snprintf(drive, sizeof(drive), checklist2[i].format, j) < 0) if (snprintf(drive, sizeof(drive), checklist2[i].format, j) < 0)
continue; continue;
if ( is_cdrom_linux(drive, NULL) > 0 ) { if ( is_cdrom_linux(drive, NULL) > 0 ) {
return(strdup(drive)); return(strdup(drive));
} }
} }
} }
@@ -1490,13 +1491,13 @@ close_tray_linux (const char *psz_device)
switch(status) { switch(status) {
case CDS_TRAY_OPEN: case CDS_TRAY_OPEN:
goto try_anyway; goto try_anyway;
break; break;
case CDS_DISC_OK: case CDS_DISC_OK:
cdio_info ("Tray already closed."); cdio_info ("Tray already closed.");
i_rc = DRIVER_OP_SUCCESS; i_rc = DRIVER_OP_SUCCESS;
break; break;
default: default:
cdio_info ("Unknown CD-ROM status (%d), trying anyway", status); cdio_info ("Unknown CD-ROM status (%d), trying anyway", status);
goto try_anyway; goto try_anyway;
} }
} else { } else {

View File

@@ -96,7 +96,7 @@ typedef struct {
} _img_private_t; } _img_private_t;
static track_format_t get_track_format_solaris(void *p_user_data, static track_format_t get_track_format_solaris(void *p_user_data,
track_t i_track); track_t i_track);
static access_mode_t static access_mode_t
str_to_access_mode_solaris(const char *psz_access_mode) str_to_access_mode_solaris(const char *psz_access_mode)
@@ -111,7 +111,7 @@ str_to_access_mode_solaris(const char *psz_access_mode)
return _AM_SUN_CTRL_SCSI; return _AM_SUN_CTRL_SCSI;
else { else {
cdio_warn ("unknown access type: %s. Default SCSI used.", cdio_warn ("unknown access type: %s. Default SCSI used.",
psz_access_mode); psz_access_mode);
return default_access_mode; return default_access_mode;
} }
} }
@@ -137,7 +137,7 @@ audio_pause_solaris (void *p_user_data)
*/ */
static driver_return_code_t static driver_return_code_t
audio_play_msf_solaris (void *p_user_data, msf_t *p_start_msf, audio_play_msf_solaris (void *p_user_data, msf_t *p_start_msf,
msf_t *p_end_msf) msf_t *p_end_msf)
{ {
const _img_private_t *p_env = p_user_data; const _img_private_t *p_env = p_user_data;
@@ -161,7 +161,7 @@ audio_play_msf_solaris (void *p_user_data, msf_t *p_start_msf,
*/ */
static driver_return_code_t static driver_return_code_t
audio_play_track_index_solaris (void *p_user_data, audio_play_track_index_solaris (void *p_user_data,
cdio_track_index_t *p_track_index) cdio_track_index_t *p_track_index)
{ {
const _img_private_t *p_env = p_user_data; const _img_private_t *p_env = p_user_data;
@@ -176,7 +176,7 @@ audio_play_track_index_solaris (void *p_user_data,
*/ */
static driver_return_code_t static driver_return_code_t
audio_read_subchannel_solaris (void *p_user_data, audio_read_subchannel_solaris (void *p_user_data,
cdio_subchannel_t *p_subchannel) cdio_subchannel_t *p_subchannel)
{ {
const _img_private_t *p_env = p_user_data; const _img_private_t *p_env = p_user_data;
struct cdrom_subchnl subchannel; struct cdrom_subchnl subchannel;
@@ -231,7 +231,7 @@ audio_resume_solaris (void *p_user_data)
*/ */
static driver_return_code_t static driver_return_code_t
audio_set_volume_solaris (void *p_user_data, audio_set_volume_solaris (void *p_user_data,
cdio_audio_volume_t *p_volume) { cdio_audio_volume_t *p_volume) {
const _img_private_t *p_env = p_user_data; const _img_private_t *p_env = p_user_data;
return ioctl(p_env->gen.fd, CDROMVOLCTRL, p_volume); return ioctl(p_env->gen.fd, CDROMVOLCTRL, p_volume);
@@ -270,17 +270,17 @@ init_solaris (_img_private_t *p_env)
p_user_data internal CD structure. p_user_data internal CD structure.
i_timeout_ms time in milliseconds we will wait for the command i_timeout_ms time in milliseconds we will wait for the command
to complete. to complete.
i_cdb Size of p_cdb i_cdb Size of p_cdb
p_cdb CDB bytes. p_cdb CDB bytes.
e_direction direction the transfer is to go. e_direction direction the transfer is to go.
i_buf Size of buffer i_buf Size of buffer
p_buf Buffer for data, both sending and receiving p_buf Buffer for data, both sending and receiving
*/ */
static driver_return_code_t static driver_return_code_t
run_mmc_cmd_solaris( void *p_user_data, unsigned int i_timeout_ms, run_mmc_cmd_solaris( void *p_user_data, unsigned int i_timeout_ms,
unsigned int i_cdb, const mmc_cdb_t *p_cdb, unsigned int i_cdb, const mmc_cdb_t *p_cdb,
cdio_mmc_direction_t e_direction, cdio_mmc_direction_t e_direction,
unsigned int i_buf, /*in/out*/ void *p_buf ) unsigned int i_buf, /*in/out*/ void *p_buf )
{ {
const _img_private_t *p_env = p_user_data; const _img_private_t *p_env = p_user_data;
struct uscsi_cmd cgc; struct uscsi_cmd cgc;
@@ -316,10 +316,12 @@ run_mmc_cmd_solaris( void *p_user_data, unsigned int i_timeout_ms,
return DRIVER_OP_ERROR; return DRIVER_OP_ERROR;
break; break;
} }
return DRIVER_OP_ERROR;
} }
/*Not sure if this the best thing, but we'll use anyway. */ else if (i_rc < -1)
return DRIVER_OP_SUCCESS; return DRIVER_OP_ERROR;
else
/*Not sure if this the best thing, but we'll use anyway. */
return DRIVER_OP_SUCCESS;
} }
/*! /*!
@@ -332,7 +334,7 @@ run_mmc_cmd_solaris( void *p_user_data, unsigned int i_timeout_ms,
static int static int
_read_audio_sectors_solaris (void *p_user_data, void *data, lsn_t i_lsn, _read_audio_sectors_solaris (void *p_user_data, void *data, lsn_t i_lsn,
unsigned int i_blocks) unsigned int i_blocks)
{ {
struct cdrom_msf solaris_msf; struct cdrom_msf solaris_msf;
msf_t _msf; msf_t _msf;
@@ -353,7 +355,7 @@ _read_audio_sectors_solaris (void *p_user_data, void *data, lsn_t i_lsn,
if (p_env->gen.ioctls_debugged < 75 if (p_env->gen.ioctls_debugged < 75
|| (p_env->gen.ioctls_debugged < (30 * 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) || p_env->gen.ioctls_debugged % (30 * 75) == 0)
cdio_debug ("reading %d", i_lsn); cdio_debug ("reading %d", i_lsn);
@@ -361,7 +363,7 @@ _read_audio_sectors_solaris (void *p_user_data, void *data, lsn_t i_lsn,
if (i_blocks > 60) { if (i_blocks > 60) {
cdio_warn("%s:\n", cdio_warn("%s:\n",
"we can't handle reading more than 60 blocks. Reset to 60"); "we can't handle reading more than 60 blocks. Reset to 60");
} }
cdda.cdda_addr = i_lsn; cdda.cdda_addr = i_lsn;
@@ -384,7 +386,7 @@ _read_audio_sectors_solaris (void *p_user_data, void *data, lsn_t i_lsn,
*/ */
static driver_return_code_t static driver_return_code_t
_read_mode1_sector_solaris (void *p_env, void *data, lsn_t i_lsn, _read_mode1_sector_solaris (void *p_env, void *data, lsn_t i_lsn,
bool b_form2) bool b_form2)
{ {
#if FIXED #if FIXED
@@ -400,7 +402,7 @@ _read_mode1_sector_solaris (void *p_env, void *data, lsn_t i_lsn,
*/ */
static driver_return_code_t static driver_return_code_t
_read_mode1_sectors_solaris (void *p_user_data, void *p_data, lsn_t i_lsn, _read_mode1_sectors_solaris (void *p_user_data, void *p_data, lsn_t i_lsn,
bool b_form2, unsigned int i_blocks) bool b_form2, unsigned int i_blocks)
{ {
_img_private_t *p_env = p_user_data; _img_private_t *p_env = p_user_data;
unsigned int i; unsigned int i;
@@ -409,8 +411,8 @@ _read_mode1_sectors_solaris (void *p_user_data, void *p_data, lsn_t i_lsn,
for (i = 0; i < i_blocks; i++) { for (i = 0; i < i_blocks; i++) {
if ( (retval = _read_mode1_sector_solaris (p_env, if ( (retval = _read_mode1_sector_solaris (p_env,
((char *)p_data) + (blocksize * i), ((char *)p_data) + (blocksize * i),
i_lsn + i, b_form2)) ) i_lsn + i, b_form2)) )
return retval; return retval;
} }
return DRIVER_OP_SUCCESS; return DRIVER_OP_SUCCESS;
@@ -421,7 +423,7 @@ _read_mode1_sectors_solaris (void *p_user_data, void *p_data, lsn_t i_lsn,
*/ */
static driver_return_code_t static driver_return_code_t
_read_mode2_sector_solaris (void *p_user_data, void *p_data, lsn_t i_lsn, _read_mode2_sector_solaris (void *p_user_data, void *p_data, lsn_t i_lsn,
bool b_form2) bool b_form2)
{ {
char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
struct cdrom_msf solaris_msf; struct cdrom_msf solaris_msf;
@@ -444,11 +446,11 @@ _read_mode2_sector_solaris (void *p_user_data, void *p_data, lsn_t i_lsn,
if (p_env->gen.ioctls_debugged < 75 if (p_env->gen.ioctls_debugged < 75
|| (p_env->gen.ioctls_debugged < (30 * 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) || p_env->gen.ioctls_debugged % (30 * 75) == 0)
cdio_debug ("reading %2.2d:%2.2d:%2.2d", cdio_debug ("reading %2.2d:%2.2d:%2.2d",
solaris_msf.cdmsf_min0, solaris_msf.cdmsf_sec0, solaris_msf.cdmsf_min0, solaris_msf.cdmsf_sec0,
solaris_msf.cdmsf_frame0); solaris_msf.cdmsf_frame0);
p_env->gen.ioctls_debugged++; p_env->gen.ioctls_debugged++;
@@ -480,7 +482,7 @@ _read_mode2_sector_solaris (void *p_user_data, void *p_data, lsn_t i_lsn,
*/ */
static driver_return_code_t static driver_return_code_t
_read_mode2_sectors_solaris (void *p_user_data, void *data, lsn_t i_lsn, _read_mode2_sectors_solaris (void *p_user_data, void *data, lsn_t i_lsn,
bool b_form2, unsigned int i_blocks) bool b_form2, unsigned int i_blocks)
{ {
_img_private_t *p_env = p_user_data; _img_private_t *p_env = p_user_data;
unsigned int i; unsigned int i;
@@ -489,8 +491,8 @@ _read_mode2_sectors_solaris (void *p_user_data, void *data, lsn_t i_lsn,
for (i = 0; i < i_blocks; i++) { for (i = 0; i < i_blocks; i++) {
if ( (retval = _read_mode2_sector_solaris (p_env, if ( (retval = _read_mode2_sector_solaris (p_env,
((char *)data) + (blocksize * i), ((char *)data) + (blocksize * i),
i_lsn + i, b_form2)) ) i_lsn + i, b_form2)) )
return retval; return retval;
} }
return 0; return 0;
@@ -593,9 +595,9 @@ read_toc_solaris (void *p_user_data)
p_env->tocent[p_env->tochdr.cdth_trk1].cdte_format = CDIO_CDROM_MSF; p_env->tocent[p_env->tochdr.cdth_trk1].cdte_format = CDIO_CDROM_MSF;
if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY, if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY,
&p_env->tocent[p_env->tochdr.cdth_trk1]) == -1 ) { &p_env->tocent[p_env->tochdr.cdth_trk1]) == -1 ) {
cdio_warn("%s: %s\n", cdio_warn("%s: %s\n",
"error in ioctl CDROMREADTOCENTRY for lead-out", "error in ioctl CDROMREADTOCENTRY for lead-out",
strerror(errno)); strerror(errno));
return false; return false;
} }
@@ -689,7 +691,7 @@ cdio_get_default_device_solaris(void)
strcmp(volume_action, "insert") == 0) { strcmp(volume_action, "insert") == 0) {
device = calloc(1, strlen(volume_device) device = calloc(1, strlen(volume_device)
+ strlen(volume_name) + 2); + strlen(volume_name) + 2);
if (device == NULL) if (device == NULL)
return strdup(DEFAULT_CDIO_DEVICE); return strdup(DEFAULT_CDIO_DEVICE);
sprintf(device, "%s/%s", volume_device, volume_name); sprintf(device, "%s/%s", volume_device, volume_name);
@@ -724,7 +726,7 @@ get_discmode_solaris (void *p_user_data)
/* Get the media info */ /* Get the media info */
if((ret = ioctl(p_env->gen.fd, DKIOCGMEDIAINFO, &media)) != 0) { if((ret = ioctl(p_env->gen.fd, DKIOCGMEDIAINFO, &media)) != 0) {
cdio_warn ("DKIOCGMEDIAINFO failed: %s\n", strerror(errno)); cdio_warn ("DKIOCGMEDIAINFO failed: %s\n", strerror(errno));
return CDIO_DISC_MODE_NO_INFO; return CDIO_DISC_MODE_NO_INFO;
} }
switch(media.dki_media_type) { switch(media.dki_media_type) {
case DK_CDROM: case DK_CDROM:
@@ -732,13 +734,13 @@ get_discmode_solaris (void *p_user_data)
case DK_CDRW: case DK_CDRW:
/* Do cdrom detection */ /* Do cdrom detection */
break; break;
case DK_DVDROM: return CDIO_DISC_MODE_DVD_ROM; case DK_DVDROM: return CDIO_DISC_MODE_DVD_ROM;
case DK_DVDR: discmode = CDIO_DISC_MODE_DVD_R; case DK_DVDR: discmode = CDIO_DISC_MODE_DVD_R;
break; break;
case DK_DVDRAM: discmode = CDIO_DISC_MODE_DVD_RAM; case DK_DVDRAM: discmode = CDIO_DISC_MODE_DVD_RAM;
break; break;
case DK_DVDRW: case DK_DVDRW:
case DK_DVDRW+1: discmode = CDIO_DISC_MODE_DVD_RW; case DK_DVDRW+1: discmode = CDIO_DISC_MODE_DVD_RW;
break; break;
default: /* no valid match */ default: /* no valid match */
return CDIO_DISC_MODE_NO_INFO; return CDIO_DISC_MODE_NO_INFO;
@@ -777,44 +779,44 @@ get_discmode_solaris (void *p_user_data)
switch(track_fmt) { switch(track_fmt) {
case TRACK_FORMAT_AUDIO: case TRACK_FORMAT_AUDIO:
switch(discmode) { switch(discmode) {
case CDIO_DISC_MODE_NO_INFO: case CDIO_DISC_MODE_NO_INFO:
discmode = CDIO_DISC_MODE_CD_DA; discmode = CDIO_DISC_MODE_CD_DA;
break; break;
case CDIO_DISC_MODE_CD_DA: case CDIO_DISC_MODE_CD_DA:
case CDIO_DISC_MODE_CD_MIXED: case CDIO_DISC_MODE_CD_MIXED:
case CDIO_DISC_MODE_ERROR: case CDIO_DISC_MODE_ERROR:
/* No change*/ /* No change*/
break; break;
default: default:
discmode = CDIO_DISC_MODE_CD_MIXED; discmode = CDIO_DISC_MODE_CD_MIXED;
} }
break; break;
case TRACK_FORMAT_XA: case TRACK_FORMAT_XA:
switch(discmode) { switch(discmode) {
case CDIO_DISC_MODE_NO_INFO: case CDIO_DISC_MODE_NO_INFO:
discmode = CDIO_DISC_MODE_CD_XA; discmode = CDIO_DISC_MODE_CD_XA;
break; break;
case CDIO_DISC_MODE_CD_XA: case CDIO_DISC_MODE_CD_XA:
case CDIO_DISC_MODE_CD_MIXED: case CDIO_DISC_MODE_CD_MIXED:
case CDIO_DISC_MODE_ERROR: case CDIO_DISC_MODE_ERROR:
/* No change*/ /* No change*/
break; break;
default: default:
discmode = CDIO_DISC_MODE_CD_MIXED; discmode = CDIO_DISC_MODE_CD_MIXED;
} }
break; break;
case TRACK_FORMAT_DATA: case TRACK_FORMAT_DATA:
switch(discmode) { switch(discmode) {
case CDIO_DISC_MODE_NO_INFO: case CDIO_DISC_MODE_NO_INFO:
discmode = CDIO_DISC_MODE_CD_DATA; discmode = CDIO_DISC_MODE_CD_DATA;
break; break;
case CDIO_DISC_MODE_CD_DATA: case CDIO_DISC_MODE_CD_DATA:
case CDIO_DISC_MODE_CD_MIXED: case CDIO_DISC_MODE_CD_MIXED:
case CDIO_DISC_MODE_ERROR: case CDIO_DISC_MODE_ERROR:
/* No change*/ /* No change*/
break; break;
default: default:
discmode = CDIO_DISC_MODE_CD_MIXED; discmode = CDIO_DISC_MODE_CD_MIXED;
} }
break; break;
case TRACK_FORMAT_ERROR: case TRACK_FORMAT_ERROR:
@@ -833,7 +835,7 @@ get_discmode_solaris (void *p_user_data)
*/ */
static driver_return_code_t static driver_return_code_t
get_last_session_solaris (void *p_user_data, get_last_session_solaris (void *p_user_data,
/*out*/ lsn_t *i_last_session_lsn) /*out*/ lsn_t *i_last_session_lsn)
{ {
const _img_private_t *p_env = p_user_data; const _img_private_t *p_env = p_user_data;
int i_rc; int i_rc;
@@ -1040,7 +1042,7 @@ cdio_get_devices_solaris (void)
sprintf(volpath, "%s/s0", globbuf.gl_pathv[i]); sprintf(volpath, "%s/s0", globbuf.gl_pathv[i]);
if(stat(volpath, &st) == 0) if(stat(volpath, &st) == 0)
cdio_add_device_list(&drives, volpath, &i_files); cdio_add_device_list(&drives, volpath, &i_files);
}else }else
cdio_add_device_list(&drives, globbuf.gl_pathv[i], &i_files); cdio_add_device_list(&drives, globbuf.gl_pathv[i], &i_files);
} }
globfree(&globbuf); globfree(&globbuf);