From 77aeeba934416e5b5ebef83ca755802c861e3ab0 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Mon, 1 Sep 2014 16:13:19 +0000 Subject: [PATCH] New flag bit5 with burn_read_data() and burn_read_audio() --- cdrskin/cdrskin_timestamp.h | 2 +- libburn/libburn.h | 8 +++++- libburn/mmc.c | 35 +++++++++++++++++-------- libburn/read.c | 52 +++++++++++++++++++++++++------------ libburn/spc.c | 5 ++-- libburn/transport.h | 1 + 6 files changed, 71 insertions(+), 32 deletions(-) diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index 68e4467..c3c3d5c 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2014.08.31.121421" +#define Cdrskin_timestamP "2014.09.01.161217" diff --git a/libburn/libburn.h b/libburn/libburn.h index bc4c587..65165b2 100644 --- a/libburn/libburn.h +++ b/libburn/libburn.h @@ -3780,7 +3780,7 @@ typedef int (*burn_abort_handler_t)(void *handle, int signum, int flag); Depending on mode it may cancel all drive operations, wait for all drives to become idle, exit(1). It may also prepare function burn_drive_get_status() for waiting and performing exit(1). - If parameter handle may be NULL or a text that shall be used as prefix for + Parameter handle may be NULL or a text that shall be used as prefix for pacifier messages of burn_abort_pacifier(). Other than with an application provided handler, the prefix char array does not have to be kept existing until the eventual signal event. @@ -3935,6 +3935,9 @@ int burn_get_read_capacity(struct burn_drive *d, int *capacity, int flag); (Useful to try the last two blocks of a CD track which might be non-data because of TAO.) @since 1.2.6 + bit5= issue messages with severity DEBUG if they would + be suppressed by bit1. + @since 1.4.0 @return 1=sucessful , <=0 an error occured with bit3: -2= permission denied error @since 0.4.0 @@ -3979,6 +3982,9 @@ int burn_read_data(struct burn_drive *d, off_t byte_address, event message. Do not retry reading in this case. (Useful to try the last two blocks of a CD track which might be non-audio because of TAO.) + bit5= issue messages with severity DEBUG if they would + be suppressed by bit1. + @since 1.4.0 @return 1=sucessful , <=0 an error occured with bit3: -2= permission denied error @since 1.2.6 diff --git a/libburn/mmc.c b/libburn/mmc.c index d1f0029..06d407e 100644 --- a/libburn/mmc.c +++ b/libburn/mmc.c @@ -2079,16 +2079,19 @@ regard_as_blank:; if ((d->current_profile != 0 || d->status != BURN_DISC_UNREADY) && ! d->current_is_supported_profile) { - if (!d->silent_on_scsi_error) { + if (!(d->silent_on_scsi_error == 1 || + d->silent_on_scsi_error == 2)) { msg = calloc(1, 160); if (msg != NULL) { sprintf(msg, "Unsuitable media detected. Profile %4.4Xh %s", d->current_profile, d->current_profile_text); libdax_msgs_submit(libdax_messenger, - d->global_index, 0x0002011e, - LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, - msg, 0,0); + d->global_index, 0x0002011e, + d->silent_on_scsi_error == 3 ? + LIBDAX_MSGS_SEV_DEBUG : + LIBDAX_MSGS_SEV_SORRY, + LIBDAX_MSGS_PRIO_HIGH, msg, 0,0); free(msg); } } @@ -2466,14 +2469,16 @@ int mmc_eval_read_error(struct burn_drive *d, struct command *c, char *what, silent = (d->silent_on_scsi_error == 1); if (key == 5 && asc == 0x64 && ascq == 0x0) { d->had_particular_error |= 1; - silent = 1; + if (d->silent_on_scsi_error == 2) + silent = 1; } if(!silent) libdax_msgs_submit(libdax_messenger, d->global_index, 0x00020144, - LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, - msg, 0, 0); + d->silent_on_scsi_error == 3 ? + LIBDAX_MSGS_SEV_DEBUG : LIBDAX_MSGS_SEV_SORRY, + LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0); free(msg); } return BE_CANCELLED; @@ -2807,11 +2812,17 @@ int mmc_set_streaming(struct burn_drive *d, d->issue_command(d, c); if (c->error) { spc_decode_sense(c->sense, 0, &key, &asc, &ascq); - if (key != 0 && !d->silent_on_scsi_error) { + if (key != 0 && d->silent_on_scsi_error != 1 && + d->silent_on_scsi_error != 2) { sprintf(msg, "SCSI error on set_streaming(%d): ", w_speed); scsi_error_msg(d, c->sense, 14, msg + strlen(msg), &key, &asc, &ascq); + libdax_msgs_submit(libdax_messenger, d->global_index, + 0x00020124, + d->silent_on_scsi_error == 3 ? + LIBDAX_MSGS_SEV_DEBUG : LIBDAX_MSGS_SEV_SORRY, + LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0); } {ret = 0; goto ex;} } @@ -4701,14 +4712,16 @@ int mmc_read_10(struct burn_drive *d, int start,int amount, struct buffer *buf) silent = (d->silent_on_scsi_error == 1); if (key == 5 && asc == 0x64 && ascq == 0x0) { d->had_particular_error |= 1; - silent = 1; + if (d->silent_on_scsi_error == 2) + silent = 1; } if(!silent) libdax_msgs_submit(libdax_messenger, d->global_index, 0x00020144, - LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, - msg, 0, 0); + (d->silent_on_scsi_error == 3) ? + LIBDAX_MSGS_SEV_DEBUG : LIBDAX_MSGS_SEV_SORRY, + LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0); free(msg); } return BE_CANCELLED; diff --git a/libburn/read.c b/libburn/read.c index b7bb74b..2284ccf 100644 --- a/libburn/read.c +++ b/libburn/read.c @@ -310,6 +310,7 @@ static void flipq(unsigned char *sub) /** @param flag bit1= be silent on failure + bit5= report failure with severity DEBUG */ static int burn_stdio_seek(int fd, off_t byte_address, struct burn_drive *d, int flag) @@ -323,15 +324,18 @@ static int burn_stdio_seek(int fd, off_t byte_address, struct burn_drive *d, (double) byte_address); libdax_msgs_submit(libdax_messenger, d->global_index, 0x00020147, - LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, - msg, errno, 0); + (flag & 32) ? + LIBDAX_MSGS_SEV_DEBUG : LIBDAX_MSGS_SEV_SORRY, + LIBDAX_MSGS_PRIO_HIGH, msg, errno, 0); } return 0; } /* ts A70904 */ -/** @param flag bit0=be silent on data shortage */ +/** @param flag bit0= be silent on data shortage + bit5= report data shortage with severity DEBUG +*/ int burn_stdio_read(int fd, char *buf, int bufsize, struct burn_drive *d, int flag) { @@ -346,7 +350,9 @@ int burn_stdio_read(int fd, char *buf, int bufsize, struct burn_drive *d, if(todo > 0 && !(flag & 1)) { libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002014a, - LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, + (flag & 32) ? + LIBDAX_MSGS_SEV_DEBUG : LIBDAX_MSGS_SEV_SORRY, + LIBDAX_MSGS_PRIO_HIGH, "Cannot read desired amount of data", errno, 0); } if (count < 0) @@ -378,11 +384,13 @@ static int retry_mmc_read(struct burn_drive *d, int chunksize, int sose_mem, for (i = 0; todo > 0; i++) { if (flag & 2) d->silent_on_scsi_error = 1; + else if (flag & 32) + d->silent_on_scsi_error = 3; retry_at = start + i * retry_size; if (retry_size > todo) retry_size = todo; err = d->read_10(d, retry_at, retry_size, d->buffer); - if (flag & 2) + if (flag & (2 | 32)) d->silent_on_scsi_error = sose_mem; if (err == BE_CANCELLED) return 0; @@ -487,9 +495,9 @@ int burn_read_data(struct burn_drive *d, off_t byte_address, (int) (byte_address / 2048 + !!(byte_address % 2048)), d->media_read_capacity); libdax_msgs_submit(libdax_messenger, d->global_index, - 0x00020172, - LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, - msg, 0, 0); + 0x00020172, (flag & 32) ? + LIBDAX_MSGS_SEV_DEBUG : LIBDAX_MSGS_SEV_SORRY, + LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0); } {ret = 0; goto ex;} } @@ -523,18 +531,21 @@ int burn_read_data(struct burn_drive *d, off_t byte_address, LIBDAX_MSGS_PRIO_HIGH, "Failed to open device (a pseudo-drive) for reading", errno, 0); - } else if (errno!= ENOENT || !(flag & 2)) + } else if (errno != ENOENT || !(flag & 2)) libdax_msgs_submit(libdax_messenger, - d->global_index, 0x00020005, - LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, + d->global_index, 0x00020005, + (flag & 32) && errno == ENOENT ? + LIBDAX_MSGS_SEV_DEBUG : + LIBDAX_MSGS_SEV_SORRY, + LIBDAX_MSGS_PRIO_HIGH, "Failed to open device (a pseudo-drive) for reading", - errno, 0); + errno, 0); ret = 0; if (errno == EACCES && (flag & 8)) ret= -2; goto ex; } - ret = burn_stdio_seek(fd, byte_address, d, flag & 2); + ret = burn_stdio_seek(fd, byte_address, d, flag & (2 | 32)); if (ret <= 0) goto ex; } @@ -556,6 +567,8 @@ int burn_read_data(struct burn_drive *d, off_t byte_address, cpy_size = data_size - *data_count; if (flag & 2) d->silent_on_scsi_error = 1; + else if (flag & 32) + d->silent_on_scsi_error = 3; if (flag & 16) { d->had_particular_error &= ~1; if (!d->silent_on_scsi_error) @@ -565,12 +578,13 @@ int burn_read_data(struct burn_drive *d, off_t byte_address, err = d->read_10(d, start, chunksize, d->buffer); } else { ret = burn_stdio_read(fd, (char *) d->buffer->data, - cpy_size, d, !!(flag & 2)); + cpy_size, d, + (flag & 32) | !!(flag & 2)); err = 0; if (ret <= 0) err = BE_CANCELLED; } - if (flag & (2 | 16)) + if (flag & (2 | 16 | 32)) d->silent_on_scsi_error = sose_mem; if (err == BE_CANCELLED) { if ((flag & 16) && (d->had_particular_error & 1)) @@ -672,6 +686,8 @@ int burn_read_audio(struct burn_drive *d, int sector_no, cpy_size = chunksize * alignment; if (flag & 2) d->silent_on_scsi_error = 1; + else if (flag & 32) + d->silent_on_scsi_error = 3; if (flag & 16) { d->had_particular_error &= ~1; if (!d->silent_on_scsi_error) @@ -679,7 +695,7 @@ int burn_read_audio(struct burn_drive *d, int sector_no, } err = d->read_cd(d, start, chunksize, 1, 0x10, NULL, d->buffer, (flag & 8) >> 3); - if (flag & (2 | 16)) + if (flag & (2 | 16 | 32)) d->silent_on_scsi_error = sose_mem; if (err == BE_CANCELLED) { if ((flag & 16) && (d->had_particular_error & 1)) @@ -688,9 +704,11 @@ int burn_read_audio(struct burn_drive *d, int sector_no, for (i = 0; i < chunksize - 1; i++) { if (flag & 2) d->silent_on_scsi_error = 1; + else if (flag & 32) + d->silent_on_scsi_error = 3; err = d->read_cd(d, start + i, 1, 1, 0x10, NULL, d->buffer, (flag & 8) >> 3); - if (flag & 2) + if (flag & (2 | 32)) d->silent_on_scsi_error = sose_mem; if (err == BE_CANCELLED) break; diff --git a/libburn/spc.c b/libburn/spc.c index fc4d93f..1205a86 100644 --- a/libburn/spc.c +++ b/libburn/spc.c @@ -1583,7 +1583,7 @@ int scsi_notify_error(struct burn_drive *d, struct command *c, int key= -1, asc= -1, ascq= -1, ret; char *msg = NULL, *scsi_msg = NULL; - if (d->silent_on_scsi_error) + if (d->silent_on_scsi_error == 1 || d->silent_on_scsi_error == 2) {ret = 1; goto ex;} BURN_ALLOC_MEM(msg, char, 320); @@ -1608,7 +1608,8 @@ int scsi_notify_error(struct burn_drive *d, struct command *c, scsi_command_name((unsigned int) c->opcode[0], 0)); strcat(msg, scsi_msg); ret = libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002010f, - flag & 2 ? LIBDAX_MSGS_SEV_FAILURE : LIBDAX_MSGS_SEV_DEBUG, + (flag & 2) || d->silent_on_scsi_error == 3 ? + LIBDAX_MSGS_SEV_DEBUG : LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH, msg,0,0); ex:; BURN_FREE_MEM(msg); diff --git a/libburn/transport.h b/libburn/transport.h index a07fd7b..ec4579f 100644 --- a/libburn/transport.h +++ b/libburn/transport.h @@ -309,6 +309,7 @@ struct burn_drive 1= do not report errors 2= do not report errors which the libburn function indicates in member .had_particular_error + 3= report errors with severity DEBUG */ int silent_on_scsi_error;