diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index 3abb1fe..e6df708 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2024.03.03.152344" +#define Cdrskin_timestamP "2024.03.03.201314" diff --git a/libburn/mmc.c b/libburn/mmc.c index 13c739a..dc011fd 100644 --- a/libburn/mmc.c +++ b/libburn/mmc.c @@ -946,11 +946,11 @@ static int print_time(int flag) #endif /* Libburn_write_time_debuG */ -int mmc_write(struct burn_drive *d, int start, struct buffer *buf) +int mmc_write(struct burn_drive *d, off_t start_long, struct buffer *buf) { int cancelled; struct command *c; - int len, key, asc, ascq; + int len, key, asc, ascq, start; char *msg = NULL; #ifdef Libburn_write_time_debuG @@ -962,6 +962,16 @@ fprintf(stderr, "libburn_DEBUG: buffer sectors= %d bytes= %d\n", buf->sectors, buf->bytes); */ + if (start_long > (off_t) 0x7fffffff) { + libdax_msgs_submit(libdax_messenger, d->global_index, + 0x0002012d, + LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, + "Exceeding range of signed integer block addresses", + 0, 0); + d->cancel = 1; + return BE_CANCELLED; + } + start = start_long; c = &(d->casual_command); @@ -991,7 +1001,7 @@ fprintf(stderr, "libburn_DEBUG: buffer sectors= %d bytes= %d\n", sprintf(msg, "Exceeding range of permissible write addresses (%d >= %d)", start, d->media_lba_limit); - libdax_msgs_submit(libdax_messenger, d->global_index, + libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002012d, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0); diff --git a/libburn/mmc.h b/libburn/mmc.h index 0aa214f..328bb4f 100644 --- a/libburn/mmc.h +++ b/libburn/mmc.h @@ -27,7 +27,7 @@ void mmc_close_disc(struct burn_write_opts *o); void mmc_close(struct burn_drive *, int session, int track); void mmc_get_event(struct burn_drive *); -int mmc_write(struct burn_drive *, int start, struct buffer *buf); +int mmc_write(struct burn_drive *, off_t start, struct buffer *buf); void mmc_write_12(struct burn_drive *d, int start, struct buffer *buf); void mmc_sync_cache(struct burn_drive *); void mmc_load(struct burn_drive *); diff --git a/libburn/transport.h b/libburn/transport.h index 88947ad..b9beca1 100644 --- a/libburn/transport.h +++ b/libburn/transport.h @@ -335,7 +335,7 @@ struct burn_drive int stdio_fd; - int nwa; /* next writeable address */ + off_t nwa; /* next writeable address */ int alba; /* absolute lba */ int rlba; /* relative lba in section */ int start_lba; @@ -467,7 +467,7 @@ struct burn_drive /* ts A61021 */ void (*read_atip) (struct burn_drive *); - int (*write) (struct burn_drive *, int, struct buffer *); + int (*write) (struct burn_drive *, off_t, struct buffer *); void (*read_toc) (struct burn_drive *); void (*lock) (struct burn_drive *); void (*unlock) (struct burn_drive *); diff --git a/libburn/write.c b/libburn/write.c index a210154..b1cfae6 100644 --- a/libburn/write.c +++ b/libburn/write.c @@ -1027,7 +1027,7 @@ static int burn_write_leadin_cdtext(struct burn_write_opts *o, } #endif /* Libburn_debug_cd_texT */ - err = d->write(d, write_lba, buf); + err = d->write(d, (off_t) write_lba, buf); if (err == BE_CANCELLED) { ret = 0; goto ex; } write_lba += sectors; @@ -1074,10 +1074,10 @@ ex:; } -/* ts A61218 : outsourced from burn_write_track() */ +/* ts A61218 / C40303 : outsourced from burn_write_track() */ int burn_disc_init_track_status(struct burn_write_opts *o, struct burn_session *s, struct burn_track *t, - int tnum, int sectors) + int tnum, off_t sectors) { struct burn_drive *d = o->drive; @@ -1179,8 +1179,8 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s, /* <<< */ sprintf(msg, - "TAO pre-track %2.2d : get_nwa(%d)=%d, d=%d , demand=%.f , cap=%.f\n", - tnum+1, nwa, ret, d->nwa, + "TAO pre-track %2.2d : get_nwa(%d)=%d, d=%.f , demand=%.f , cap=%.f\n", + tnum+1, nwa, ret, (double) d->nwa, (double) burn_track_get_sectors_2(t, 1) * 2048.0, (double) d->media_capacity_remaining); libdax_msgs_submit(libdax_messenger, d->global_index, @@ -1209,7 +1209,7 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s, { ret = 0; goto ex; } open_ended = burn_track_is_open_ended(t); - burn_disc_init_track_status(o, s, t, tnum, sectors); + burn_disc_init_track_status(o, s, t, tnum, (off_t) sectors); /* ts A61030 : this cannot happen. tnum is always < s->tracks */ if (tnum == s->tracks) @@ -1570,8 +1570,8 @@ int burn_disc_open_track_dvd_minus_r(struct burn_write_opts *o, d->send_write_parameters(d, NULL, -1, o); ret = d->get_nwa(d, -1, &lba, &nwa); sprintf(msg, - "DVD pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d", - tnum+1, nwa, ret, d->nwa); + "DVD pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %.f", + tnum+1, nwa, ret, (double) d->nwa); libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg,0,0); if (nwa > d->nwa) @@ -1632,8 +1632,8 @@ int burn_disc_open_track_dvd_plus_r(struct burn_write_opts *o, BURN_ALLOC_MEM(msg, char, 160); ret = d->get_nwa(d, -1, &lba, &nwa); sprintf(msg, - "DVD+R pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d", - tnum+1, nwa, ret, d->nwa); + "DVD+R pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %.f", + tnum+1, nwa, ret, (double) d->nwa); libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg,0,0); if (nwa > d->nwa) @@ -1936,7 +1936,7 @@ int burn_dvd_write_track(struct burn_write_opts *o, /* (offset padding is done within sector_data()) */ - burn_disc_init_track_status(o, s, t, tnum, sectors); + burn_disc_init_track_status(o, s, t, tnum, (off_t) sectors); for (i = 0; open_ended || i < sectors; i++) { /* From time to time inquire drive buffer */ @@ -2233,7 +2233,8 @@ int burn_disc_setup_dvd_minus_rw(struct burn_write_opts *o, if (o->start_byte >= 0) { d->nwa = o->start_byte / 32768; /* align to 32 kB */ - sprintf(msg, "Write start address is %d * 32768", d->nwa); + sprintf(msg, "Write start address is %.f * 32768", + (double) d->nwa); libdax_msgs_submit(libdax_messenger, d->global_index, 0x00020127, LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH, @@ -2335,8 +2336,8 @@ int burn_dvd_write_sync(struct burn_write_opts *o, d->nwa = 0; if (o->start_byte >= 0) { d->nwa = o->start_byte / 2048; - sprintf(msg, "Write start address is %d * 2048", - d->nwa); + sprintf(msg, "Write start address is %.f * 2048", + (double) d->nwa); libdax_msgs_submit(libdax_messenger, d->global_index, 0x00020127, LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH, @@ -2658,7 +2659,7 @@ ex:; /* ts A70910 : to be used as burn_drive.write(), emulating mmc_write() */ -int burn_stdio_mmc_write(struct burn_drive *d, int start, struct buffer *buf) +int burn_stdio_mmc_write(struct burn_drive *d, off_t start, struct buffer *buf) { int ret; off_t start_byte; @@ -2701,7 +2702,7 @@ int burn_stdio_mmc_write(struct burn_drive *d, int start, struct buffer *buf) /* ts A70910 : to be used as burn_drive.write(), emulating mmc_write() with simulated writing. */ -int burn_stdio_mmc_dummy_write(struct burn_drive *d, int start, +int burn_stdio_mmc_dummy_write(struct burn_drive *d, off_t start, struct buffer *buf) { if (d->cancel) @@ -2846,11 +2847,7 @@ int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s, sectors = burn_track_get_sectors_2_v2(t, 1); if (sectors < 0) {ret = 0; goto ex;} - - /* >>> (int) cast will be removed when burn_disc_init_track_status() - >>> gets off_t sectors */; - burn_disc_init_track_status(o, s, t, tnum, (int) sectors); - + burn_disc_init_track_status(o, s, t, tnum, sectors); open_ended = burn_track_is_open_ended(t); t->end_on_premature_eoi = (o->write_type == BURN_WRITE_TAO);