|
Denis Leroy |
a324e2 |
Index: ChangeLog
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/ChangeLog (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/ChangeLog (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -1,3 +1,30 @@
|
|
Denis Leroy |
a324e2 |
+2007-09-30 Luis Medinas <metalgod@svn.gnome.org>
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+ * src/burn-medium.c: (brasero_medium_init_real):
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+ Revert broken merge.
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+2007-09-28 Rouquier Philippe <philippr@svn.gnome.org>
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+ Increased debugging output for SCSI
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+2007-09-25 Rouquier Philippe <philippr@svn.gnome.org>
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+ Backported changes from trunk as an attempt to fix some recurring scsi
|
|
Denis Leroy |
a324e2 |
+ errors
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+2007-09-25 Rouquier Philippe <philippr@svn.gnome.org>
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+ fix stupid mistake in scsi error handling
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+2007-09-24 Rouquier Philippe <bonfire-app@wanadoo.fr>
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+ fix 475442
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+2007-09-24 Rouquier Philippe <bonfire-app@wanadoo.fr>
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+ fix 465203
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
2007-08-25 Rouquier Philippe <bonfire-app@wanadoo.fr>
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
fixes for libisofs 0.2.5 and 0.2.8
|
|
Denis Leroy |
a324e2 |
Index: src/burn.c
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/src/burn.c (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/src/burn.c (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -943,7 +943,8 @@
|
|
Denis Leroy |
a324e2 |
GError **error)
|
|
Denis Leroy |
a324e2 |
{
|
|
Denis Leroy |
a324e2 |
gchar *failure;
|
|
Denis Leroy |
a324e2 |
- gint64 media_size;
|
|
Denis Leroy |
a324e2 |
+ gint64 img_sectors;
|
|
Denis Leroy |
a324e2 |
+ gint64 media_sectors;
|
|
Denis Leroy |
a324e2 |
BraseroBurnError berror;
|
|
Denis Leroy |
a324e2 |
BraseroMediumInfo media;
|
|
Denis Leroy |
a324e2 |
BraseroBurnResult result;
|
|
Denis Leroy |
a324e2 |
@@ -1045,7 +1046,7 @@
|
|
Denis Leroy |
a324e2 |
* one exception if we don't have enough space left on
|
|
Denis Leroy |
a324e2 |
* the disc.
|
|
Denis Leroy |
a324e2 |
* NOTE: if MERGE or APPEND flag is on then don't check
|
|
Denis Leroy |
a324e2 |
- */
|
|
Denis Leroy |
a324e2 |
+ * NOTE: it's safe to compare size in bytes here */
|
|
Denis Leroy |
a324e2 |
NCB_MEDIA_GET_FREE_SPACE (drive, &size, NULL);
|
|
Denis Leroy |
a324e2 |
if (!(flags & (BRASERO_BURN_FLAG_MERGE|BRASERO_BURN_FLAG_APPEND))
|
|
Denis Leroy |
a324e2 |
&& size > burn->priv->image_size
|
|
Denis Leroy |
a324e2 |
@@ -1106,17 +1107,36 @@
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- /* we check that the image will fit on the media */
|
|
Denis Leroy |
a324e2 |
+ /* we check that the image will fit on the media
|
|
Denis Leroy |
a324e2 |
+ * NOTE: we must use the sectors for comparison */
|
|
Denis Leroy |
a324e2 |
if (flags & (BRASERO_BURN_FLAG_MERGE|BRASERO_BURN_FLAG_APPEND))
|
|
Denis Leroy |
a324e2 |
- NCB_MEDIA_GET_FREE_SPACE (drive, &media_size, NULL);
|
|
Denis Leroy |
a324e2 |
+ NCB_MEDIA_GET_FREE_SPACE (drive, NULL, &media_sectors);
|
|
Denis Leroy |
a324e2 |
else
|
|
Denis Leroy |
a324e2 |
- NCB_MEDIA_GET_CAPACITY (drive, &media_size, NULL);
|
|
Denis Leroy |
a324e2 |
+ NCB_MEDIA_GET_CAPACITY (drive, NULL, &media_sectors);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ if (source->type == BRASERO_TRACK_SOURCE_DATA)
|
|
Denis Leroy |
a324e2 |
+ img_sectors = burn->priv->image_size / 2048;
|
|
Denis Leroy |
a324e2 |
+ else if (source->type == BRASERO_TRACK_SOURCE_AUDIO)
|
|
Denis Leroy |
a324e2 |
+ img_sectors = burn->priv->image_size / 2352;
|
|
Denis Leroy |
a324e2 |
+ else if (source->type == BRASERO_TRACK_SOURCE_IMAGE) {
|
|
Denis Leroy |
a324e2 |
+ if (source->format == BRASERO_IMAGE_FORMAT_CLONE)
|
|
Denis Leroy |
a324e2 |
+ img_sectors = burn->priv->image_size / 2448;
|
|
Denis Leroy |
a324e2 |
+ else if (source->format == BRASERO_IMAGE_FORMAT_CUE
|
|
Denis Leroy |
a324e2 |
+ || source->format == BRASERO_IMAGE_FORMAT_CDRDAO)
|
|
Denis Leroy |
a324e2 |
+ img_sectors = burn->priv->image_size / 2352;
|
|
Denis Leroy |
a324e2 |
+ else
|
|
Denis Leroy |
a324e2 |
+ img_sectors = burn->priv->image_size / 2048;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
+ else if (source->type == BRASERO_TRACK_SOURCE_DISC)
|
|
Denis Leroy |
a324e2 |
+ NCB_MEDIA_GET_DATA_SIZE (source->contents.drive.disc, NULL, &img_sectors);
|
|
Denis Leroy |
a324e2 |
+ else
|
|
Denis Leroy |
a324e2 |
+ img_sectors = 0;
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
/* NOTE: this is useful only for reloads since otherwise we still don't
|
|
Denis Leroy |
a324e2 |
* know what's the image size yet */
|
|
Denis Leroy |
a324e2 |
if (!(flags & BRASERO_BURN_FLAG_OVERBURN)
|
|
Denis Leroy |
a324e2 |
&& (flags & BRASERO_BURN_FLAG_CHECK_SIZE)
|
|
Denis Leroy |
a324e2 |
- && media_size < burn->priv->image_size) {
|
|
Denis Leroy |
a324e2 |
+ && media_sectors < img_sectors) {
|
|
Denis Leroy |
a324e2 |
/* This is a recoverable error so try to ask the user again */
|
|
Denis Leroy |
a324e2 |
result = BRASERO_BURN_NEED_RELOAD;
|
|
Denis Leroy |
a324e2 |
berror = BRASERO_BURN_ERROR_MEDIA_SPACE;
|
|
Denis Leroy |
a324e2 |
@@ -1497,6 +1517,7 @@
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
gnome_vfs_uri_unref (uri);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ /* it's safe here to check with sizes */
|
|
Denis Leroy |
a324e2 |
if (burn->priv->image_size > vol_size) {
|
|
Denis Leroy |
a324e2 |
g_set_error (error,
|
|
Denis Leroy |
a324e2 |
BRASERO_BURN_ERROR,
|
|
Denis Leroy |
a324e2 |
@@ -1824,6 +1845,7 @@
|
|
Denis Leroy |
a324e2 |
const gchar *output,
|
|
Denis Leroy |
a324e2 |
GError **error)
|
|
Denis Leroy |
a324e2 |
{
|
|
Denis Leroy |
a324e2 |
+ gint64 img_sectors;
|
|
Denis Leroy |
a324e2 |
GError *ret_error = NULL;
|
|
Denis Leroy |
a324e2 |
BraseroBurnResult result;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
@@ -1842,13 +1864,31 @@
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
if (NCB_DRIVE_GET_TYPE (drive) != NAUTILUS_BURN_DRIVE_TYPE_FILE) {
|
|
Denis Leroy |
a324e2 |
- gint64 media_size;
|
|
Denis Leroy |
a324e2 |
+ gint64 media_sectors;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- NCB_MEDIA_GET_CAPACITY (drive, &media_size, NULL);
|
|
Denis Leroy |
a324e2 |
+ NCB_MEDIA_GET_CAPACITY (drive, NULL, &media_sectors);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ if (source->type == BRASERO_TRACK_SOURCE_DATA)
|
|
Denis Leroy |
a324e2 |
+ img_sectors = burn->priv->image_size / 2048;
|
|
Denis Leroy |
a324e2 |
+ else if (source->type == BRASERO_TRACK_SOURCE_AUDIO)
|
|
Denis Leroy |
a324e2 |
+ img_sectors = burn->priv->image_size / 2352;
|
|
Denis Leroy |
a324e2 |
+ else if (source->type == BRASERO_TRACK_SOURCE_IMAGE) {
|
|
Denis Leroy |
a324e2 |
+ if (source->format == BRASERO_IMAGE_FORMAT_CLONE)
|
|
Denis Leroy |
a324e2 |
+ img_sectors = burn->priv->image_size / 2448;
|
|
Denis Leroy |
a324e2 |
+ else if (source->format == BRASERO_IMAGE_FORMAT_CUE
|
|
Denis Leroy |
a324e2 |
+ || source->format == BRASERO_IMAGE_FORMAT_CDRDAO)
|
|
Denis Leroy |
a324e2 |
+ img_sectors = burn->priv->image_size / 2352;
|
|
Denis Leroy |
a324e2 |
+ else
|
|
Denis Leroy |
a324e2 |
+ img_sectors = burn->priv->image_size / 2048;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
+ else if (source->type == BRASERO_TRACK_SOURCE_DISC)
|
|
Denis Leroy |
a324e2 |
+ NCB_MEDIA_GET_DATA_SIZE (source->contents.drive.disc, NULL, &img_sectors);
|
|
Denis Leroy |
a324e2 |
+ else
|
|
Denis Leroy |
a324e2 |
+ img_sectors = 0;
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
/* check that the image can fit on the media */
|
|
Denis Leroy |
a324e2 |
if (!(flags & BRASERO_BURN_FLAG_OVERBURN)
|
|
Denis Leroy |
a324e2 |
- && media_size < burn->priv->image_size) {
|
|
Denis Leroy |
a324e2 |
+ && media_sectors < img_sectors) {
|
|
Denis Leroy |
a324e2 |
/* This is a recoverable error so try to ask the user again */
|
|
Denis Leroy |
a324e2 |
result = brasero_burn_reload_dest_media (burn,
|
|
Denis Leroy |
a324e2 |
BRASERO_BURN_ERROR_MEDIA_SPACE,
|
|
Denis Leroy |
a324e2 |
Index: src/burn-medium.c
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/src/burn-medium.c (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/src/burn-medium.c (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -308,6 +308,8 @@
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
priv = BRASERO_MEDIUM_PRIVATE (self);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Retrieving capacity from atip");
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
result = brasero_mmc1_read_atip (fd,
|
|
Denis Leroy |
a324e2 |
&atip_data,
|
|
Denis Leroy |
a324e2 |
sizeof (atip_data),
|
|
Denis Leroy |
a324e2 |
@@ -336,6 +338,8 @@
|
|
Denis Leroy |
a324e2 |
BraseroScsiResult result;
|
|
Denis Leroy |
a324e2 |
gint size;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Retrieving format capacity");
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
priv = BRASERO_MEDIUM_PRIVATE (self);
|
|
Denis Leroy |
a324e2 |
result = brasero_mmc2_read_format_capacities (fd,
|
|
Denis Leroy |
a324e2 |
&hdr,
|
|
Denis Leroy |
a324e2 |
@@ -424,6 +428,8 @@
|
|
Denis Leroy |
a324e2 |
BraseroScsiWrtSpdDesc *desc;
|
|
Denis Leroy |
a324e2 |
BraseroScsiGetPerfData *wrt_perf = NULL;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Retrieving speed (Get Performance)");
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
/* NOTE: this only work if there is RT streaming feature with
|
|
Denis Leroy |
a324e2 |
* wspd bit set to 1. At least an MMC3 drive. */
|
|
Denis Leroy |
a324e2 |
priv = BRASERO_MEDIUM_PRIVATE (self);
|
|
Denis Leroy |
a324e2 |
@@ -471,7 +477,7 @@
|
|
Denis Leroy |
a324e2 |
* function but don't report any speed. So if our top speed is 0 then
|
|
Denis Leroy |
a324e2 |
* use the other way to get the speed. It was a Teac */
|
|
Denis Leroy |
a324e2 |
if (!priv->max_wrt)
|
|
Denis Leroy |
a324e2 |
- return BRASERO_BURN_RETRY;
|
|
Denis Leroy |
a324e2 |
+ return BRASERO_BURN_ERR;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
return BRASERO_BURN_OK;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
@@ -491,6 +497,8 @@
|
|
Denis Leroy |
a324e2 |
gint max_num;
|
|
Denis Leroy |
a324e2 |
int size = 0;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Retrieving speed (2A speeds)");
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
priv = BRASERO_MEDIUM_PRIVATE (self);
|
|
Denis Leroy |
a324e2 |
result = brasero_spc1_mode_sense_get_page (fd,
|
|
Denis Leroy |
a324e2 |
BRASERO_SPC_PAGE_STATUS,
|
|
Denis Leroy |
a324e2 |
@@ -506,6 +514,7 @@
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
page_2A = (BraseroScsiStatusPage *) &data->page;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ /* FIXME: the following is not necessarily true */
|
|
Denis Leroy |
a324e2 |
if (size < sizeof (BraseroScsiStatusPage)) {
|
|
Denis Leroy |
a324e2 |
g_free (data);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
@@ -554,6 +563,8 @@
|
|
Denis Leroy |
a324e2 |
BraseroScsiResult result;
|
|
Denis Leroy |
a324e2 |
int size = 0;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Retrieving speed (2A max)");
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
priv = BRASERO_MEDIUM_PRIVATE (self);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
result = brasero_spc1_mode_sense_get_page (fd,
|
|
Denis Leroy |
a324e2 |
@@ -590,11 +601,12 @@
|
|
Denis Leroy |
a324e2 |
BraseroScsiErrCode *code)
|
|
Denis Leroy |
a324e2 |
{
|
|
Denis Leroy |
a324e2 |
BraseroScsiGetConfigHdr *hdr = NULL;
|
|
Denis Leroy |
a324e2 |
- BraseroScsiRTStreamDesc *stream;
|
|
Denis Leroy |
a324e2 |
BraseroMediumPrivate *priv;
|
|
Denis Leroy |
a324e2 |
BraseroScsiResult result;
|
|
Denis Leroy |
a324e2 |
int size;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Retrieving media profile");
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
priv = BRASERO_MEDIUM_PRIVATE (self);
|
|
Denis Leroy |
a324e2 |
result = brasero_mmc2_get_configuration_feature (fd,
|
|
Denis Leroy |
a324e2 |
BRASERO_SCSI_FEAT_REAL_TIME_STREAM,
|
|
Denis Leroy |
a324e2 |
@@ -749,39 +761,35 @@
|
|
Denis Leroy |
a324e2 |
return BRASERO_BURN_NOT_SUPPORTED;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- BRASERO_BURN_LOG ("medium is %d", priv->info);
|
|
Denis Leroy |
a324e2 |
+ /* try all SCSI functions to get write/read speeds in order */
|
|
Denis Leroy |
a324e2 |
+ if (hdr->desc->add_len >= sizeof (BraseroScsiRTStreamDesc)) {
|
|
Denis Leroy |
a324e2 |
+ BraseroScsiRTStreamDesc *stream;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- /* see how we should get the speeds */
|
|
Denis Leroy |
a324e2 |
- if (hdr->desc->add_len != sizeof (BraseroScsiRTStreamDesc)) {
|
|
Denis Leroy |
a324e2 |
- g_free (hdr);
|
|
Denis Leroy |
a324e2 |
+ /* means it's at least an MMC3 drive */
|
|
Denis Leroy |
a324e2 |
+ stream = (BraseroScsiRTStreamDesc *) hdr->desc->data;
|
|
Denis Leroy |
a324e2 |
+ if (stream->wrt_spd) {
|
|
Denis Leroy |
a324e2 |
+ result = brasero_medium_get_speed_mmc3 (self, fd, code);
|
|
Denis Leroy |
a324e2 |
+ if (result == BRASERO_BURN_OK)
|
|
Denis Leroy |
a324e2 |
+ goto end;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- BRASERO_BURN_LOG ("wrong size for Stream descriptor");
|
|
Denis Leroy |
a324e2 |
- return BRASERO_BURN_ERR;
|
|
Denis Leroy |
a324e2 |
+ if (stream->mp2a) {
|
|
Denis Leroy |
a324e2 |
+ result = brasero_medium_get_page_2A_write_speed_desc (self, fd, code);
|
|
Denis Leroy |
a324e2 |
+ if (result == BRASERO_BURN_OK)
|
|
Denis Leroy |
a324e2 |
+ goto end;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- /* try all SCSI functions to get write/read speeds in order */
|
|
Denis Leroy |
a324e2 |
- stream = (BraseroScsiRTStreamDesc *) hdr->desc->data;
|
|
Denis Leroy |
a324e2 |
- if (stream->wrt_spd) {
|
|
Denis Leroy |
a324e2 |
- /* NOTE: the next function returns either OK or RETRY to make
|
|
Denis Leroy |
a324e2 |
- * sure we always go and get over an error. There are other ways
|
|
Denis Leroy |
a324e2 |
- * to get the information we want */
|
|
Denis Leroy |
a324e2 |
- result = brasero_medium_get_speed_mmc3 (self, fd, code);
|
|
Denis Leroy |
a324e2 |
- if (result != BRASERO_BURN_RETRY)
|
|
Denis Leroy |
a324e2 |
- goto end;
|
|
Denis Leroy |
a324e2 |
- }
|
|
Denis Leroy |
a324e2 |
+ /* fallback for speeds */
|
|
Denis Leroy |
a324e2 |
+ result = brasero_medium_get_page_2A_max_speed (self, fd, code);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- if (stream->mp2a)
|
|
Denis Leroy |
a324e2 |
- result = brasero_medium_get_page_2A_write_speed_desc (self, fd, code);
|
|
Denis Leroy |
a324e2 |
- else
|
|
Denis Leroy |
a324e2 |
- result = brasero_medium_get_page_2A_max_speed (self, fd, code);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
end:
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
g_free (hdr);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
if (result != BRASERO_BURN_OK)
|
|
Denis Leroy |
a324e2 |
- return BRASERO_BURN_ERR;
|
|
Denis Leroy |
a324e2 |
+ return result;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
return BRASERO_BURN_OK;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
@@ -797,6 +805,8 @@
|
|
Denis Leroy |
a324e2 |
int size;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
priv = BRASERO_MEDIUM_PRIVATE (self);
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Testing for Css encrypted media");
|
|
Denis Leroy |
a324e2 |
result = brasero_mmc2_get_configuration_feature (fd,
|
|
Denis Leroy |
a324e2 |
BRASERO_SCSI_FEAT_DVD_CSS,
|
|
Denis Leroy |
a324e2 |
&hdr,
|
|
Denis Leroy |
a324e2 |
@@ -809,14 +819,16 @@
|
|
Denis Leroy |
a324e2 |
return BRASERO_BURN_ERR;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- if (hdr->desc->add_len != sizeof (BraseroScsiDVDCssDesc)) {
|
|
Denis Leroy |
a324e2 |
+ if (hdr->desc->add_len < sizeof (BraseroScsiDVDCssDesc)) {
|
|
Denis Leroy |
a324e2 |
g_free (hdr);
|
|
Denis Leroy |
a324e2 |
- return BRASERO_BURN_ERR;
|
|
Denis Leroy |
a324e2 |
+ return BRASERO_BURN_OK;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
/* here we just need to see if this feature is current or not */
|
|
Denis Leroy |
a324e2 |
- if (hdr->desc->current)
|
|
Denis Leroy |
a324e2 |
+ if (hdr->desc->current) {
|
|
Denis Leroy |
a324e2 |
priv->info |= BRASERO_MEDIUM_PROTECTED;
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("media is Css protected");
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
g_free (hdr);
|
|
Denis Leroy |
a324e2 |
return BRASERO_BURN_OK;
|
|
Denis Leroy |
a324e2 |
@@ -877,13 +889,26 @@
|
|
Denis Leroy |
a324e2 |
BraseroScsiTrackInfo track_info;
|
|
Denis Leroy |
a324e2 |
BraseroMediumPrivate *priv;
|
|
Denis Leroy |
a324e2 |
BraseroScsiResult result;
|
|
Denis Leroy |
a324e2 |
+ int size;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Retrieving track information for %i", track_num);
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
priv = BRASERO_MEDIUM_PRIVATE (self);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ /* at this point we know the type of the disc that's why we set the
|
|
Denis Leroy |
a324e2 |
+ * size according to this type. That may help to avoid outrange address
|
|
Denis Leroy |
a324e2 |
+ * errors. */
|
|
Denis Leroy |
a324e2 |
+ if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DL|BRASERO_MEDIUM_WRITABLE))
|
|
Denis Leroy |
a324e2 |
+ size = 48;
|
|
Denis Leroy |
a324e2 |
+ else if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_PLUS|BRASERO_MEDIUM_WRITABLE))
|
|
Denis Leroy |
a324e2 |
+ size = 40;
|
|
Denis Leroy |
a324e2 |
+ else
|
|
Denis Leroy |
a324e2 |
+ size = 36;
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
result = brasero_mmc1_read_track_info (fd,
|
|
Denis Leroy |
a324e2 |
track_num,
|
|
Denis Leroy |
a324e2 |
&track_info,
|
|
Denis Leroy |
a324e2 |
- sizeof (BraseroScsiTrackInfo),
|
|
Denis Leroy |
a324e2 |
+ &size,
|
|
Denis Leroy |
a324e2 |
code);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
if (result != BRASERO_SCSI_OK) {
|
|
Denis Leroy |
a324e2 |
@@ -921,6 +946,8 @@
|
|
Denis Leroy |
a324e2 |
BraseroMediumPrivate *priv;
|
|
Denis Leroy |
a324e2 |
BraseroScsiFormattedTocData *toc = NULL;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Reading toc");
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
priv = BRASERO_MEDIUM_PRIVATE (self);
|
|
Denis Leroy |
a324e2 |
result = brasero_mmc1_read_toc_formatted (fd,
|
|
Denis Leroy |
a324e2 |
0,
|
|
Denis Leroy |
a324e2 |
@@ -937,6 +964,8 @@
|
|
Denis Leroy |
a324e2 |
num = (size - sizeof (BraseroScsiFormattedTocData)) /
|
|
Denis Leroy |
a324e2 |
sizeof (BraseroScsiTocDesc);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("%i track(s) found", num);
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
desc = toc->desc;
|
|
Denis Leroy |
a324e2 |
for (i = 0; i < num; i ++, desc ++) {
|
|
Denis Leroy |
a324e2 |
BraseroMediumTrack *track;
|
|
Denis Leroy |
a324e2 |
@@ -1056,6 +1085,8 @@
|
|
Denis Leroy |
a324e2 |
BraseroMediumPrivate *priv;
|
|
Denis Leroy |
a324e2 |
BraseroScsiDiscInfoStd *info = NULL;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Retrieving media status");
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
priv = BRASERO_MEDIUM_PRIVATE (self);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
result = brasero_mmc1_read_disc_information_std (fd,
|
|
Denis Leroy |
a324e2 |
@@ -1075,6 +1106,8 @@
|
|
Denis Leroy |
a324e2 |
if (info->status == BRASERO_SCSI_DISC_EMPTY) {
|
|
Denis Leroy |
a324e2 |
BraseroMediumTrack *track;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Empty media");
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
priv->info |= BRASERO_MEDIUM_BLANK;
|
|
Denis Leroy |
a324e2 |
priv->block_size = 2048;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
@@ -1086,8 +1119,12 @@
|
|
Denis Leroy |
a324e2 |
goto end;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- if (info->status == BRASERO_SCSI_DISC_INCOMPLETE)
|
|
Denis Leroy |
a324e2 |
+ if (info->status == BRASERO_SCSI_DISC_INCOMPLETE) {
|
|
Denis Leroy |
a324e2 |
priv->info |= BRASERO_MEDIUM_APPENDABLE;
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Appendable media");
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
+ else if (info->status == BRASERO_SCSI_DISC_FINALIZED)
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Closed media");
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
result = brasero_medium_get_sessions_info (self, fd, code);
|
|
Denis Leroy |
a324e2 |
if (result != BRASERO_BURN_OK)
|
|
Denis Leroy |
a324e2 |
@@ -1112,17 +1149,17 @@
|
|
Denis Leroy |
a324e2 |
if (result != BRASERO_BURN_OK)
|
|
Denis Leroy |
a324e2 |
return;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- if (priv->info & BRASERO_MEDIUM_DVD) {
|
|
Denis Leroy |
a324e2 |
- result = brasero_medium_get_css_feature (object, fd, &code);
|
|
Denis Leroy |
a324e2 |
- if (result != BRASERO_BURN_OK)
|
|
Denis Leroy |
a324e2 |
- return;
|
|
Denis Leroy |
a324e2 |
- }
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
result = brasero_medium_get_contents (object, fd, &code);
|
|
Denis Leroy |
a324e2 |
if (result != BRASERO_BURN_OK)
|
|
Denis Leroy |
a324e2 |
return;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ /* assume that css feature is only for DVD-ROM which might be wrong but some drives
|
|
Denis Leroy |
a324e2 |
+ * wrongly reports that css is enabled for some blank DVD+R */
|
|
Denis Leroy |
a324e2 |
+ if (BRASERO_MEDIUM_IS (priv->info, (BRASERO_MEDIUM_DVD/*|BRASERO_MEDIUM_ROM*/)))
|
|
Denis Leroy |
a324e2 |
+ brasero_medium_get_css_feature (object, fd, &code);
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
brasero_medium_get_capacity_by_type (object, fd, &code);
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("media is %i", priv->info);
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
static gboolean
|
|
Denis Leroy |
a324e2 |
Index: src/data-disc.c
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/src/data-disc.c (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/src/data-disc.c (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -8048,6 +8048,9 @@
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
if (disc->priv->is_loading) {
|
|
Denis Leroy |
a324e2 |
+ /* Translators: the following text is the reason why brasero
|
|
Denis Leroy |
a324e2 |
+ * failed to load a project: because it is already loading
|
|
Denis Leroy |
a324e2 |
+ * another project */
|
|
Denis Leroy |
a324e2 |
brasero_data_disc_import_session_error (disc, _("loading project"));
|
|
Denis Leroy |
a324e2 |
return;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
Index: src/scsi/scsi-read-track-information.c
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/src/scsi/scsi-read-track-information.c (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/src/scsi/scsi-read-track-information.c (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -26,6 +26,8 @@
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
#include <glib.h>
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+#include "burn-debug.h"
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
#include "scsi-error.h"
|
|
Denis Leroy |
a324e2 |
#include "scsi-utils.h"
|
|
Denis Leroy |
a324e2 |
#include "scsi-base.h"
|
|
Denis Leroy |
a324e2 |
@@ -85,115 +87,87 @@
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
#define BRASERO_SCSI_INCOMPLETE_TRACK 0xFF
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
-/**
|
|
Denis Leroy |
a324e2 |
- *
|
|
Denis Leroy |
a324e2 |
- * NOTE: if media is a CD and track_num = 0 then returns leadin
|
|
Denis Leroy |
a324e2 |
- * but since the other media don't have a leadin they error out.
|
|
Denis Leroy |
a324e2 |
- * if track_num = 255 returns last incomplete track.
|
|
Denis Leroy |
a324e2 |
- */
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
-BraseroScsiResult
|
|
Denis Leroy |
a324e2 |
-brasero_mmc1_read_track_info (int fd,
|
|
Denis Leroy |
a324e2 |
- int track_num,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiTrackInfo *track_info,
|
|
Denis Leroy |
a324e2 |
- int size,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiErrCode *error)
|
|
Denis Leroy |
a324e2 |
+static BraseroScsiResult
|
|
Denis Leroy |
a324e2 |
+brasero_read_track_info (BraseroRdTrackInfoCDB *cdb,
|
|
Denis Leroy |
a324e2 |
+ BraseroScsiTrackInfo *info,
|
|
Denis Leroy |
a324e2 |
+ int *size,
|
|
Denis Leroy |
a324e2 |
+ BraseroScsiErrCode *error)
|
|
Denis Leroy |
a324e2 |
{
|
|
Denis Leroy |
a324e2 |
- BraseroRdTrackInfoCDB *cdb;
|
|
Denis Leroy |
a324e2 |
+ BraseroScsiTrackInfo hdr;
|
|
Denis Leroy |
a324e2 |
BraseroScsiResult res;
|
|
Denis Leroy |
a324e2 |
+ int datasize;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- cdb = brasero_scsi_command_new (&info, fd);
|
|
Denis Leroy |
a324e2 |
- cdb->addr_num_type = BRASERO_FIELD_TRACK_NUM;
|
|
Denis Leroy |
a324e2 |
- BRASERO_SET_32 (cdb->blk_addr_trk_ses_num, track_num);
|
|
Denis Leroy |
a324e2 |
- BRASERO_SET_16 (cdb->alloc_len, size);
|
|
Denis Leroy |
a324e2 |
+ if (!info || !size) {
|
|
Denis Leroy |
a324e2 |
+ BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_BAD_ARGUMENT);
|
|
Denis Leroy |
a324e2 |
+ return BRASERO_SCSI_FAILURE;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- memset (track_info, 0, sizeof (BraseroScsiTrackInfo));
|
|
Denis Leroy |
a324e2 |
- res = brasero_scsi_command_issue_sync (cdb, track_info, size, error);
|
|
Denis Leroy |
a324e2 |
- brasero_scsi_command_free (cdb);
|
|
Denis Leroy |
a324e2 |
- return res;
|
|
Denis Leroy |
a324e2 |
-}
|
|
Denis Leroy |
a324e2 |
+ /* first ask the drive how long should the data be and then ... */
|
|
Denis Leroy |
a324e2 |
+ datasize = 4;
|
|
Denis Leroy |
a324e2 |
+ memset (&hdr, 0, sizeof (info));
|
|
Denis Leroy |
a324e2 |
+ BRASERO_SET_16 (cdb->alloc_len, datasize);
|
|
Denis Leroy |
a324e2 |
+ res = brasero_scsi_command_issue_sync (cdb, &hdr, datasize, error);
|
|
Denis Leroy |
a324e2 |
+ if (res)
|
|
Denis Leroy |
a324e2 |
+ return res;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
-BraseroScsiResult
|
|
Denis Leroy |
a324e2 |
-brasero_mmc1_read_track_info_for_block (int fd,
|
|
Denis Leroy |
a324e2 |
- int block,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiTrackInfo *track_info,
|
|
Denis Leroy |
a324e2 |
- int size,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiErrCode *error)
|
|
Denis Leroy |
a324e2 |
-{
|
|
Denis Leroy |
a324e2 |
- BraseroRdTrackInfoCDB *cdb;
|
|
Denis Leroy |
a324e2 |
- BraseroScsiResult res;
|
|
Denis Leroy |
a324e2 |
+ /* ... check the size in case of a buggy firmware ... */
|
|
Denis Leroy |
a324e2 |
+ if (BRASERO_GET_16 (hdr.len) + sizeof (hdr.len) >= datasize) {
|
|
Denis Leroy |
a324e2 |
+ datasize = BRASERO_GET_16 (hdr.len) + sizeof (hdr.len);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- cdb = brasero_scsi_command_new (&info, fd);
|
|
Denis Leroy |
a324e2 |
+ if (datasize > *size) {
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Oversized data received (%i) setting to %i", datasize, *size);
|
|
Denis Leroy |
a324e2 |
+ datasize = *size;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
+ else if (*size < datasize) {
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Oversized data required (%i) setting to %i", *size, datasize);
|
|
Denis Leroy |
a324e2 |
+ *size = datasize;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
+ else {
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Undersized data received (%i) setting to %i", datasize, *size);
|
|
Denis Leroy |
a324e2 |
+ datasize = *size;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- cdb->addr_num_type = BRASERO_FIELD_LBA;
|
|
Denis Leroy |
a324e2 |
- BRASERO_SET_32 (cdb->blk_addr_trk_ses_num, block);
|
|
Denis Leroy |
a324e2 |
- BRASERO_SET_16 (cdb->alloc_len, size);
|
|
Denis Leroy |
a324e2 |
+ /* ... and re-issue the command */
|
|
Denis Leroy |
a324e2 |
+ memset (info, 0, sizeof (BraseroScsiTrackInfo));
|
|
Denis Leroy |
a324e2 |
+ BRASERO_SET_16 (cdb->alloc_len, datasize);
|
|
Denis Leroy |
a324e2 |
+ res = brasero_scsi_command_issue_sync (cdb, info, datasize, error);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- memset (track_info, 0, sizeof (BraseroScsiTrackInfo));
|
|
Denis Leroy |
a324e2 |
- res = brasero_scsi_command_issue_sync (cdb, track_info, size, error);
|
|
Denis Leroy |
a324e2 |
- brasero_scsi_command_free (cdb);
|
|
Denis Leroy |
a324e2 |
- return res;
|
|
Denis Leroy |
a324e2 |
-}
|
|
Denis Leroy |
a324e2 |
+ if (!res) {
|
|
Denis Leroy |
a324e2 |
+ if (datasize != BRASERO_GET_16 (info->len) + sizeof (info->len))
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Sizes mismatch asked %i / received %i",
|
|
Denis Leroy |
a324e2 |
+ datasize,
|
|
Denis Leroy |
a324e2 |
+ BRASERO_GET_16 (info->len) + sizeof (info->len));
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
-BraseroScsiResult
|
|
Denis Leroy |
a324e2 |
-brasero_mmc1_read_session_first_track_info (int fd,
|
|
Denis Leroy |
a324e2 |
- int session,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiTrackInfo *track_info,
|
|
Denis Leroy |
a324e2 |
- int size,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiErrCode *error)
|
|
Denis Leroy |
a324e2 |
-{
|
|
Denis Leroy |
a324e2 |
- BraseroRdTrackInfoCDB *cdb;
|
|
Denis Leroy |
a324e2 |
- BraseroScsiResult res;
|
|
Denis Leroy |
a324e2 |
+ *size = MIN (datasize, BRASERO_GET_16 (info->len) + sizeof (info->len));
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- cdb = brasero_scsi_command_new (&info, fd);
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
- BRASERO_SET_32 (cdb->blk_addr_trk_ses_num, session);
|
|
Denis Leroy |
a324e2 |
- cdb->addr_num_type = BRASERO_FIELD_SESSION_NUM;
|
|
Denis Leroy |
a324e2 |
- BRASERO_SET_16 (cdb->alloc_len, size);
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
- memset (track_info, 0, sizeof (BraseroScsiTrackInfo));
|
|
Denis Leroy |
a324e2 |
- res = brasero_scsi_command_issue_sync (cdb, track_info, size, error);
|
|
Denis Leroy |
a324e2 |
- brasero_scsi_command_free (cdb);
|
|
Denis Leroy |
a324e2 |
return res;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+/**
|
|
Denis Leroy |
a324e2 |
+ *
|
|
Denis Leroy |
a324e2 |
+ * NOTE: if media is a CD and track_num = 0 then returns leadin
|
|
Denis Leroy |
a324e2 |
+ * but since the other media don't have a leadin they error out.
|
|
Denis Leroy |
a324e2 |
+ * if track_num = 255 returns last incomplete track.
|
|
Denis Leroy |
a324e2 |
+ */
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
BraseroScsiResult
|
|
Denis Leroy |
a324e2 |
-brasero_mmc1_read_first_open_session_track_info (int fd,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiTrackInfo *track_info,
|
|
Denis Leroy |
a324e2 |
- int size,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiErrCode *error)
|
|
Denis Leroy |
a324e2 |
+brasero_mmc1_read_track_info (int fd,
|
|
Denis Leroy |
a324e2 |
+ int track_num,
|
|
Denis Leroy |
a324e2 |
+ BraseroScsiTrackInfo *track_info,
|
|
Denis Leroy |
a324e2 |
+ int *size,
|
|
Denis Leroy |
a324e2 |
+ BraseroScsiErrCode *error)
|
|
Denis Leroy |
a324e2 |
{
|
|
Denis Leroy |
a324e2 |
BraseroRdTrackInfoCDB *cdb;
|
|
Denis Leroy |
a324e2 |
BraseroScsiResult res;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
cdb = brasero_scsi_command_new (&info, fd);
|
|
Denis Leroy |
a324e2 |
cdb->addr_num_type = BRASERO_FIELD_TRACK_NUM;
|
|
Denis Leroy |
a324e2 |
- BRASERO_SET_32 (cdb->blk_addr_trk_ses_num, BRASERO_SCSI_INCOMPLETE_TRACK);
|
|
Denis Leroy |
a324e2 |
- BRASERO_SET_16 (cdb->alloc_len, size);
|
|
Denis Leroy |
a324e2 |
+ BRASERO_SET_32 (cdb->blk_addr_trk_ses_num, track_num);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- memset (track_info, 0, sizeof (BraseroScsiTrackInfo));
|
|
Denis Leroy |
a324e2 |
- res = brasero_scsi_command_issue_sync (cdb, track_info, size, error);
|
|
Denis Leroy |
a324e2 |
+ res = brasero_read_track_info (cdb, track_info, size, error);
|
|
Denis Leroy |
a324e2 |
brasero_scsi_command_free (cdb);
|
|
Denis Leroy |
a324e2 |
- return res;
|
|
Denis Leroy |
a324e2 |
-}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
-BraseroScsiResult
|
|
Denis Leroy |
a324e2 |
-brasero_mmc5_read_first_open_session_track_info (int fd,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiTrackInfo *track_info,
|
|
Denis Leroy |
a324e2 |
- int size,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiErrCode *error)
|
|
Denis Leroy |
a324e2 |
-{
|
|
Denis Leroy |
a324e2 |
- BraseroRdTrackInfoCDB *cdb;
|
|
Denis Leroy |
a324e2 |
- BraseroScsiResult res;
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
- cdb = brasero_scsi_command_new (&info, fd);
|
|
Denis Leroy |
a324e2 |
- cdb->open = 1;
|
|
Denis Leroy |
a324e2 |
- cdb->addr_num_type = BRASERO_FIELD_TRACK_NUM;
|
|
Denis Leroy |
a324e2 |
- BRASERO_SET_32 (cdb->blk_addr_trk_ses_num, 1);
|
|
Denis Leroy |
a324e2 |
- BRASERO_SET_16 (cdb->alloc_len, size);
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
- memset (track_info, 0, sizeof (BraseroScsiTrackInfo));
|
|
Denis Leroy |
a324e2 |
- res = brasero_scsi_command_issue_sync (cdb, track_info, size, error);
|
|
Denis Leroy |
a324e2 |
- brasero_scsi_command_free (cdb);
|
|
Denis Leroy |
a324e2 |
return res;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
Index: src/scsi/scsi-read-track-information.h
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/src/scsi/scsi-read-track-information.h (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/src/scsi/scsi-read-track-information.h (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -29,10 +29,7 @@
|
|
Denis Leroy |
a324e2 |
#ifndef _SCSI_READ_TRACK_INFORMATION_H
|
|
Denis Leroy |
a324e2 |
#define _SCSI_READ_TRACK_INFORMATION_H
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
-#ifdef __cplusplus
|
|
Denis Leroy |
a324e2 |
-extern "C"
|
|
Denis Leroy |
a324e2 |
-{
|
|
Denis Leroy |
a324e2 |
-#endif
|
|
Denis Leroy |
a324e2 |
+G_BEGIN_DECLS
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
typedef enum {
|
|
Denis Leroy |
a324e2 |
BRASERO_SCSI_DATA_MODE_1 = 0x01,
|
|
Denis Leroy |
a324e2 |
@@ -135,9 +132,7 @@
|
|
Denis Leroy |
a324e2 |
#define BRASERO_SCSI_TRACK_NUM_PTR(track) (((track)->track_num_high << 8) + (track)->track_num_low)
|
|
Denis Leroy |
a324e2 |
#define BRASERO_SCSI_SESSION_NUM_PTR(track) (((track)->session_num_high << 8) + (track)->session_num_low)
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
-#ifdef __cplusplus
|
|
Denis Leroy |
a324e2 |
-}
|
|
Denis Leroy |
a324e2 |
-#endif
|
|
Denis Leroy |
a324e2 |
+G_END_DECLS
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
#endif /* _SCSI_READ_TRACK_INFORMATION_H */
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
Index: src/scsi/scsi-utils.h
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/src/scsi/scsi-utils.h (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/src/scsi/scsi-utils.h (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -55,7 +55,7 @@
|
|
Denis Leroy |
a324e2 |
strerror (errno)); \
|
|
Denis Leroy |
a324e2 |
} else { \
|
|
Denis Leroy |
a324e2 |
BRASERO_BURN_LOG ("SCSI command error: %s", \
|
|
Denis Leroy |
a324e2 |
- brasero_scsi_strerror (errno)); \
|
|
Denis Leroy |
a324e2 |
+ brasero_scsi_strerror (code)); \
|
|
Denis Leroy |
a324e2 |
} \
|
|
Denis Leroy |
a324e2 |
if (err) \
|
|
Denis Leroy |
a324e2 |
*(err) = code; \
|
|
Denis Leroy |
a324e2 |
Index: src/scsi/scsi-read-disc-info.c
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/src/scsi/scsi-read-disc-info.c (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/src/scsi/scsi-read-disc-info.c (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -30,6 +30,8 @@
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
#include <glib.h>
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+#include "burn-debug.h"
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
#include "scsi-error.h"
|
|
Denis Leroy |
a324e2 |
#include "scsi-utils.h"
|
|
Denis Leroy |
a324e2 |
#include "scsi-base.h"
|
|
Denis Leroy |
a324e2 |
@@ -93,6 +95,7 @@
|
|
Denis Leroy |
a324e2 |
BraseroRdDiscInfoCDB *cdb;
|
|
Denis Leroy |
a324e2 |
BraseroScsiResult res;
|
|
Denis Leroy |
a324e2 |
int request_size;
|
|
Denis Leroy |
a324e2 |
+ int buffer_size;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
if (!info_return || !size) {
|
|
Denis Leroy |
a324e2 |
BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_BAD_ARGUMENT);
|
|
Denis Leroy |
a324e2 |
@@ -122,16 +125,16 @@
|
|
Denis Leroy |
a324e2 |
goto end;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- if (request_size != BRASERO_GET_16 (buffer->len) + sizeof (buffer->len)) {
|
|
Denis Leroy |
a324e2 |
- BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_SIZE_MISMATCH);
|
|
Denis Leroy |
a324e2 |
+ buffer_size = BRASERO_GET_16 (buffer->len) +
|
|
Denis Leroy |
a324e2 |
+ sizeof (buffer->len);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- res = BRASERO_SCSI_FAILURE;
|
|
Denis Leroy |
a324e2 |
- g_free (buffer);
|
|
Denis Leroy |
a324e2 |
- goto end;
|
|
Denis Leroy |
a324e2 |
- }
|
|
Denis Leroy |
a324e2 |
+ if (request_size != buffer_size)
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Sizes mismatch asked %i / received %i",
|
|
Denis Leroy |
a324e2 |
+ request_size,
|
|
Denis Leroy |
a324e2 |
+ buffer_size);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
*info_return = buffer;
|
|
Denis Leroy |
a324e2 |
- *size = request_size;
|
|
Denis Leroy |
a324e2 |
+ *size = MIN (request_size, buffer_size);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
end:
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
Index: src/scsi/scsi-get-configuration.c
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/src/scsi/scsi-get-configuration.c (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/src/scsi/scsi-get-configuration.c (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -26,6 +26,8 @@
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
#include <glib.h>
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+#include "burn-debug.h"
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
#include "scsi-error.h"
|
|
Denis Leroy |
a324e2 |
#include "scsi-utils.h"
|
|
Denis Leroy |
a324e2 |
#include "scsi-base.h"
|
|
Denis Leroy |
a324e2 |
@@ -99,18 +101,29 @@
|
|
Denis Leroy |
a324e2 |
return BRASERO_SCSI_FAILURE;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ /* first issue the command once ... */
|
|
Denis Leroy |
a324e2 |
memset (&hdr, 0, sizeof (hdr));
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
BRASERO_SET_16 (cdb->alloc_len, sizeof (hdr));
|
|
Denis Leroy |
a324e2 |
res = brasero_scsi_command_issue_sync (cdb, &hdr, sizeof (hdr), error);
|
|
Denis Leroy |
a324e2 |
if (res)
|
|
Denis Leroy |
a324e2 |
return res;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- /* ... allocate a buffer and re-issue the command */
|
|
Denis Leroy |
a324e2 |
+ /* ... check the size returned ... */
|
|
Denis Leroy |
a324e2 |
request_size = BRASERO_GET_32 (hdr.len) +
|
|
Denis Leroy |
a324e2 |
G_STRUCT_OFFSET (BraseroScsiGetConfigHdr, len) +
|
|
Denis Leroy |
a324e2 |
sizeof (hdr.len);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ /* NOTE: if size is not valid use the maximum possible size */
|
|
Denis Leroy |
a324e2 |
+ if ((request_size - sizeof (hdr)) % 8) {
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Unaligned data (%i) setting to max (65530)", request_size);
|
|
Denis Leroy |
a324e2 |
+ request_size = 65530;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
+ else if (request_size <= sizeof (hdr)) {
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Undersized data (%i) setting to max (65530)", request_size);
|
|
Denis Leroy |
a324e2 |
+ request_size = 65530;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+ /* ... allocate a buffer and re-issue the command */
|
|
Denis Leroy |
a324e2 |
buffer = (BraseroScsiGetConfigHdr *) g_new0 (uchar, request_size);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
BRASERO_SET_16 (cdb->alloc_len, request_size);
|
|
Denis Leroy |
a324e2 |
@@ -125,16 +138,13 @@
|
|
Denis Leroy |
a324e2 |
G_STRUCT_OFFSET (BraseroScsiGetConfigHdr, len) +
|
|
Denis Leroy |
a324e2 |
sizeof (hdr.len);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- if (buffer_size != request_size) {
|
|
Denis Leroy |
a324e2 |
- g_free (buffer);
|
|
Denis Leroy |
a324e2 |
+ if (buffer_size != request_size)
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Sizes mismatch asked %i / received %i",
|
|
Denis Leroy |
a324e2 |
+ request_size,
|
|
Denis Leroy |
a324e2 |
+ buffer_size);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_SIZE_MISMATCH);
|
|
Denis Leroy |
a324e2 |
- return BRASERO_SCSI_FAILURE;
|
|
Denis Leroy |
a324e2 |
- }
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
*data = buffer;
|
|
Denis Leroy |
a324e2 |
- *size = request_size;
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
+ *size = MIN (buffer_size, request_size);
|
|
Denis Leroy |
a324e2 |
return BRASERO_SCSI_OK;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
@@ -148,34 +158,24 @@
|
|
Denis Leroy |
a324e2 |
BraseroGetConfigCDB *cdb;
|
|
Denis Leroy |
a324e2 |
BraseroScsiResult res;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ g_return_val_if_fail (data != NULL, BRASERO_SCSI_FAILURE);
|
|
Denis Leroy |
a324e2 |
+ g_return_val_if_fail (size != NULL, BRASERO_SCSI_FAILURE);
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
cdb = brasero_scsi_command_new (&info, fd);
|
|
Denis Leroy |
a324e2 |
BRASERO_SET_16 (cdb->feature_num, type);
|
|
Denis Leroy |
a324e2 |
cdb->returned_data = BRASERO_GET_CONFIG_RETURN_ONLY_FEATURE;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
res = brasero_get_configuration (cdb, data, size, error);
|
|
Denis Leroy |
a324e2 |
brasero_scsi_command_free (cdb);
|
|
Denis Leroy |
a324e2 |
- return res;
|
|
Denis Leroy |
a324e2 |
-}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
-BraseroScsiResult
|
|
Denis Leroy |
a324e2 |
-brasero_mmc2_get_configuration_all_features (int fd,
|
|
Denis Leroy |
a324e2 |
- int only_current,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiGetConfigHdr **data,
|
|
Denis Leroy |
a324e2 |
- int *size,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiErrCode *error)
|
|
Denis Leroy |
a324e2 |
-{
|
|
Denis Leroy |
a324e2 |
- BraseroGetConfigCDB *cdb;
|
|
Denis Leroy |
a324e2 |
- BraseroScsiResult res;
|
|
Denis Leroy |
a324e2 |
+ /* make sure the desc is the one we want */
|
|
Denis Leroy |
a324e2 |
+ if ((*data) && BRASERO_GET_16 ((*data)->desc->code) != type) {
|
|
Denis Leroy |
a324e2 |
+ BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_TYPE_MISMATCH);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- cdb = brasero_scsi_command_new (&info, fd);
|
|
Denis Leroy |
a324e2 |
- BRASERO_SET_16 (cdb->feature_num, BRASERO_SCSI_FEAT_PROFILES);
|
|
Denis Leroy |
a324e2 |
+ g_free (*data);
|
|
Denis Leroy |
a324e2 |
+ *size = 0;
|
|
Denis Leroy |
a324e2 |
+ return BRASERO_SCSI_FAILURE;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- if (only_current)
|
|
Denis Leroy |
a324e2 |
- cdb->returned_data = BRASERO_GET_CONFIG_RETURN_ALL_CURRENT;
|
|
Denis Leroy |
a324e2 |
- else
|
|
Denis Leroy |
a324e2 |
- cdb->returned_data = BRASERO_GET_CONFIG_RETURN_ALL_FEATURES;
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
- res = brasero_get_configuration (cdb, data, size, error);
|
|
Denis Leroy |
a324e2 |
- brasero_scsi_command_free (cdb);
|
|
Denis Leroy |
a324e2 |
return res;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
Index: src/scsi/scsi-get-configuration.h
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/src/scsi/scsi-get-configuration.h (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/src/scsi/scsi-get-configuration.h (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -177,7 +177,6 @@
|
|
Denis Leroy |
a324e2 |
uchar inq2 :1;
|
|
Denis Leroy |
a324e2 |
uchar reserved0 :6;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- uchar mmc4 [0];
|
|
Denis Leroy |
a324e2 |
uchar reserved1 [3];
|
|
Denis Leroy |
a324e2 |
};
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
Index: src/scsi/scsi-mmc1.h
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/src/scsi/scsi-mmc1.h (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/src/scsi/scsi-mmc1.h (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -52,16 +52,10 @@
|
|
Denis Leroy |
a324e2 |
BraseroScsiErrCode *error);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
BraseroScsiResult
|
|
Denis Leroy |
a324e2 |
-brasero_mmc1_read_first_open_session_track_info (int fd,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiTrackInfo *track_info,
|
|
Denis Leroy |
a324e2 |
- int size,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiErrCode *error);
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
-BraseroScsiResult
|
|
Denis Leroy |
a324e2 |
brasero_mmc1_read_track_info (int fd,
|
|
Denis Leroy |
a324e2 |
int track_num,
|
|
Denis Leroy |
a324e2 |
BraseroScsiTrackInfo *track_info,
|
|
Denis Leroy |
a324e2 |
- int size,
|
|
Denis Leroy |
a324e2 |
+ int *size,
|
|
Denis Leroy |
a324e2 |
BraseroScsiErrCode *error);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
G_END_DECLS
|
|
Denis Leroy |
a324e2 |
Index: src/scsi/scsi-get-performance.c
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/src/scsi/scsi-get-performance.c (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/src/scsi/scsi-get-performance.c (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -25,6 +25,8 @@
|
|
Denis Leroy |
a324e2 |
#include <fcntl.h>
|
|
Denis Leroy |
a324e2 |
#include <glib.h>
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+#include "burn-debug.h"
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
#include "scsi-error.h"
|
|
Denis Leroy |
a324e2 |
#include "scsi-utils.h"
|
|
Denis Leroy |
a324e2 |
#include "scsi-command.h"
|
|
Denis Leroy |
a324e2 |
@@ -112,22 +114,37 @@
|
|
Denis Leroy |
a324e2 |
return BRASERO_SCSI_FAILURE;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ /* Issue the command once to get the size ... */
|
|
Denis Leroy |
a324e2 |
memset (&hdr, 0, sizeof (hdr));
|
|
Denis Leroy |
a324e2 |
BRASERO_SET_16 (cdb->max_desc, 0);
|
|
Denis Leroy |
a324e2 |
res = brasero_scsi_command_issue_sync (cdb, &hdr, sizeof (hdr), error);
|
|
Denis Leroy |
a324e2 |
if (res)
|
|
Denis Leroy |
a324e2 |
return res;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- /* ... allocate a buffer and re-issue the command */
|
|
Denis Leroy |
a324e2 |
+ /* ... check the request size ... */
|
|
Denis Leroy |
a324e2 |
request_size = BRASERO_GET_32 (hdr.len) +
|
|
Denis Leroy |
a324e2 |
G_STRUCT_OFFSET (BraseroScsiGetPerfHdr, len) +
|
|
Denis Leroy |
a324e2 |
sizeof (hdr.len);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- desc_num = (request_size - sizeof (BraseroScsiGetPerfHdr)) / sizeof_descriptors;
|
|
Denis Leroy |
a324e2 |
- BRASERO_SET_16 (cdb->max_desc, desc_num);
|
|
Denis Leroy |
a324e2 |
+ if (request_size > 2048) {
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Oversized data (%i) setting to max (2048)", request_size);
|
|
Denis Leroy |
a324e2 |
+ request_size = 2048;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
+ else if ((request_size - sizeof (hdr)) % sizeof_descriptors) {
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Unaligned data (%i) setting to max (2048)", request_size);
|
|
Denis Leroy |
a324e2 |
+ request_size = 2048;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
+ else if (request_size < sizeof (hdr)) {
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Undersized data (%i) setting to max (2048)", request_size);
|
|
Denis Leroy |
a324e2 |
+ request_size = 2048;
|
|
Denis Leroy |
a324e2 |
+ }
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ desc_num = (request_size - sizeof (hdr)) / sizeof_descriptors;
|
|
Denis Leroy |
a324e2 |
+
|
|
Denis Leroy |
a324e2 |
+ /* ... allocate a buffer and re-issue the command */
|
|
Denis Leroy |
a324e2 |
buffer = (BraseroScsiGetPerfData *) g_new0 (uchar, request_size);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
+ BRASERO_SET_16 (cdb->max_desc, desc_num);
|
|
Denis Leroy |
a324e2 |
res = brasero_scsi_command_issue_sync (cdb, buffer, request_size, error);
|
|
Denis Leroy |
a324e2 |
if (res) {
|
|
Denis Leroy |
a324e2 |
g_free (buffer);
|
|
Denis Leroy |
a324e2 |
@@ -139,48 +156,18 @@
|
|
Denis Leroy |
a324e2 |
G_STRUCT_OFFSET (BraseroScsiGetPerfHdr, len) +
|
|
Denis Leroy |
a324e2 |
sizeof (buffer->hdr.len);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- if (buffer_size != request_size) {
|
|
Denis Leroy |
a324e2 |
- g_free (buffer);
|
|
Denis Leroy |
a324e2 |
+ if (request_size != buffer_size)
|
|
Denis Leroy |
a324e2 |
+ BRASERO_BURN_LOG ("Sizes mismatch asked %i / received %i",
|
|
Denis Leroy |
a324e2 |
+ request_size,
|
|
Denis Leroy |
a324e2 |
+ buffer_size);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
- BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_SIZE_MISMATCH);
|
|
Denis Leroy |
a324e2 |
- return BRASERO_SCSI_FAILURE;
|
|
Denis Leroy |
a324e2 |
- }
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
*data = buffer;
|
|
Denis Leroy |
a324e2 |
- *data_size = request_size;
|
|
Denis Leroy |
a324e2 |
+ *data_size = MIN (buffer_size, request_size);
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
return res;
|
|
Denis Leroy |
a324e2 |
}
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
/**
|
|
Denis Leroy |
a324e2 |
- * MMC2 command extension
|
|
Denis Leroy |
a324e2 |
- */
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
-BraseroScsiResult
|
|
Denis Leroy |
a324e2 |
-brasero_mmc2_get_performance_perf (int fd,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiPerfParam param,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiGetPerfData **data,
|
|
Denis Leroy |
a324e2 |
- int *size,
|
|
Denis Leroy |
a324e2 |
- BraseroScsiErrCode *error)
|
|
Denis Leroy |
a324e2 |
-{
|
|
Denis Leroy |
a324e2 |
- BraseroGetPerformanceCDB *cdb;
|
|
Denis Leroy |
a324e2 |
- BraseroScsiResult res;
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
- cdb = brasero_scsi_command_new (&info, fd);
|
|
Denis Leroy |
a324e2 |
- cdb->type = BRASERO_GET_PERFORMANCE_PERF_TYPE;
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
- if (param & BRASERO_SCSI_PERF_LIST)
|
|
Denis Leroy |
a324e2 |
- cdb->except= 0x01;
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
- if (param & BRASERO_SCSI_PERF_WRITE)
|
|
Denis Leroy |
a324e2 |
- cdb->write = 0x01;
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
- res = brasero_get_performance (cdb, sizeof (BraseroScsiPerfDesc), data, size, error);
|
|
Denis Leroy |
a324e2 |
- brasero_scsi_command_free (cdb);
|
|
Denis Leroy |
a324e2 |
- return res;
|
|
Denis Leroy |
a324e2 |
-}
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
-/**
|
|
Denis Leroy |
a324e2 |
* MMC3 command extension
|
|
Denis Leroy |
a324e2 |
*/
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
Index: src/scsi/scsi-get-performance.h
|
|
Denis Leroy |
a324e2 |
===================================================================
|
|
Denis Leroy |
a324e2 |
--- a/src/scsi/scsi-get-performance.h (revision 311)
|
|
Denis Leroy |
a324e2 |
+++ b/src/scsi/scsi-get-performance.h (working copy)
|
|
Denis Leroy |
a324e2 |
@@ -29,10 +29,7 @@
|
|
Denis Leroy |
a324e2 |
#ifndef _BURN_GET_PERFORMANCE_H
|
|
Denis Leroy |
a324e2 |
#define _BURN_GET_PERFORMANCE_H
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
-#ifdef __cplusplus
|
|
Denis Leroy |
a324e2 |
-extern "C"
|
|
Denis Leroy |
a324e2 |
-{
|
|
Denis Leroy |
a324e2 |
-#endif
|
|
Denis Leroy |
a324e2 |
+G_BEGIN_DECLS
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
@@ -88,15 +85,7 @@
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
#endif
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
-struct _BraseroScsiPerfDesc {
|
|
Denis Leroy |
a324e2 |
- uchar start_lba [4];
|
|
Denis Leroy |
a324e2 |
- uchar start_perf [4];
|
|
Denis Leroy |
a324e2 |
- uchar end_lba [4];
|
|
Denis Leroy |
a324e2 |
- uchar end_perf [4];
|
|
Denis Leroy |
a324e2 |
-};
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
typedef struct _BraseroScsiGetPerfHdr BraseroScsiGetPerfHdr;
|
|
Denis Leroy |
a324e2 |
-typedef struct _BraseroScsiPerfDesc BraseroScsiPerfDesc;
|
|
Denis Leroy |
a324e2 |
typedef struct _BraseroScsiWrtSpdDesc BraseroScsiWrtSpdDesc;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
struct _BraseroScsiGetPerfData {
|
|
Denis Leroy |
a324e2 |
@@ -105,16 +94,8 @@
|
|
Denis Leroy |
a324e2 |
};
|
|
Denis Leroy |
a324e2 |
typedef struct _BraseroScsiGetPerfData BraseroScsiGetPerfData;
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
-typedef enum {
|
|
Denis Leroy |
a324e2 |
- BRASERO_SCSI_PERF_READ = 0,
|
|
Denis Leroy |
a324e2 |
- BRASERO_SCSI_PERF_WRITE = 1,
|
|
Denis Leroy |
a324e2 |
- BRASERO_SCSI_PERF_LIST = 1 << 1,
|
|
Denis Leroy |
a324e2 |
-} BraseroScsiPerfParam;
|
|
Denis Leroy |
a324e2 |
+G_END_DECLS
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
-#ifdef __cplusplus
|
|
Denis Leroy |
a324e2 |
-}
|
|
Denis Leroy |
a324e2 |
-#endif
|
|
Denis Leroy |
a324e2 |
-
|
|
Denis Leroy |
a324e2 |
#endif /* _BURN_GET_PERFORMANCE_H */
|
|
Denis Leroy |
a324e2 |
|
|
Denis Leroy |
a324e2 |
|