BraseroScsiResult brasero_scsi_command_issue_sync (gpointer command, gpointer buffer, int size, BraseroScsiErrCode *error) { scsireq_t req; BraseroScsiResult res; BraseroScsiCmd *cmd; cmd = command; brasero_sg_command_setup (&req, cmd, buffer, size); res = ioctl (cmd->handle->fd, SCIOCCOMMAND, &req); if (res == -1) { BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_ERRNO); return BRASERO_SCSI_FAILURE; } if (req.retsts == SCCMD_OK) return BRASERO_SCSI_OK; if (req.retsts == SCCMD_SENSE) return brasero_sense_data_process (req.sense, error); return BRASERO_SCSI_FAILURE; }
BraseroScsiResult brasero_scsi_command_issue_sync (gpointer command, gpointer buffer, int size, BraseroScsiErrCode *error) { uchar sense_buffer [BRASERO_SENSE_DATA_SIZE]; struct sg_io_hdr transport; BraseroScsiResult res; BraseroScsiCmd *cmd; g_return_val_if_fail (command != NULL, BRASERO_SCSI_FAILURE); cmd = command; brasero_sg_command_setup (&transport, sense_buffer, cmd, buffer, size); /* NOTE on SG_IO: only for TEST UNIT READY, REQUEST/MODE SENSE, INQUIRY, * READ CAPACITY, READ BUFFER, READ and LOG SENSE are allowed with it */ res = ioctl (cmd->handle->fd, SG_IO, &transport); if (res) { BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_ERRNO); return BRASERO_SCSI_FAILURE; } if ((transport.info & SG_INFO_OK_MASK) == SG_INFO_OK) return BRASERO_SCSI_OK; if ((transport.masked_status & CHECK_CONDITION) && transport.sb_len_wr) return brasero_sense_data_process (sense_buffer, error); return BRASERO_SCSI_FAILURE; }