Compare commits

...

15 Commits

Author SHA1 Message Date
Thomas Schmitt 6fb158b56d Bug fix: Possible wrong result on Linux when translating /dev/sr address to /dev/sg 2024-04-27 18:28:10 +02:00
Thomas Schmitt 51f43127ac Comitted file which was forgotten with commit f0d9795 2024-03-09 18:59:18 +01:00
Thomas Schmitt f84d038121 Removed remaining 31/32-bit bottlenecks from stdio writing 2024-03-03 21:14:17 +01:00
Thomas Schmitt e5a8d91e4d New API call burn_get_read_capacity_v2() 2024-03-03 16:24:13 +01:00
Thomas Schmitt f0d9795cd1 New API calls burn_disc_get_sectors_v2(), burn_session_get_sectors_v2(), burn_track_get_sectors_v2() 2024-03-03 11:52:15 +01:00
Thomas Schmitt 29bfd7e5e7 New API call burn_disc_track_lba_nwa_v2() 2024-03-02 14:12:22 +01:00
Thomas Schmitt d48bbb4b66 New struct burn_progress_v2 and API call burn_drive_get_status_v2() 2024-03-01 19:51:34 +01:00
Thomas Schmitt 17a020e9fc Augmented struct burn_toc_entry by new off_t block addresses and counters 2024-02-27 20:48:11 +01:00
Thomas Schmitt 069b4edecd Removed use of undefined data by a rarely occuring error message 2024-02-26 16:06:56 +01:00
Thomas Schmitt 84e8efeb0a Changed a byte size variable from int to off_t. Currently only used with CD DAO and thus not really necessary. 2024-02-26 15:58:36 +01:00
Thomas Schmitt ddebbf1b60 Bug fix: burn_offst_source_new() parameter "size" rolled over at 2 exp 31 2024-02-26 15:57:18 +01:00
Thomas Schmitt ca29b77091 Checking length of pseudo-drive address to prevent possible overflow 2023-09-12 15:21:17 +02:00
Thomas Schmitt 046f581baa Changed gpg key server recommendation to keyserver.ubuntu.com. Corrected repo instructions from SVN to git. 2023-06-20 19:56:33 +02:00
Thomas Schmitt c8ceb73b5f Updated change log 2023-06-07 20:40:00 +02:00
Thomas Schmitt f4a09e9536 Made number transition to 1.5.7 2023-06-07 20:36:56 +02:00
23 changed files with 555 additions and 183 deletions

View File

@ -1,3 +1,9 @@
git clone git@dev.lovelyhq.com:libburnia/libburn.git
(to become libburn-1.5.8 or higher)
===============================================================================
- no novelties yet -
libburn-1.5.6.tar.gz Wed Jun 07 2023 libburn-1.5.6.tar.gz Wed Jun 07 2023
=============================================================================== ===============================================================================
* Bug fix: Overburning with cdrskin option -force ended by a libburn error * Bug fix: Overburning with cdrskin option -force ended by a libburn error

View File

@ -116,7 +116,7 @@ test_poll_SOURCES = test/poll.c
## cdrskin construction site - ts A60816 - C30607 ## cdrskin construction site - ts A60816 - C30607
cdrskin_cdrskin_CPPFLAGS = -Ilibburn cdrskin_cdrskin_CPPFLAGS = -Ilibburn
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_5_6 cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_5_7
# cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS) # cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
# ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking # ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking

View File

@ -4,7 +4,7 @@
cdrskin. By Thomas Schmitt <scdbackup@gmx.net> cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
Integrated sub project of libburnia-project.org but also published via: Integrated sub project of libburnia-project.org but also published via:
http://scdbackup.sourceforge.net/cdrskin_eng.html http://scdbackup.sourceforge.net/cdrskin_eng.html
http://scdbackup.sourceforge.net/cdrskin-1.5.6.tar.gz http://scdbackup.sourceforge.net/cdrskin-1.5.7.tar.gz
Copyright (C) 2006-2023 Thomas Schmitt, provided under GPL version 2 or later. Copyright (C) 2006-2023 Thomas Schmitt, provided under GPL version 2 or later.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
@ -26,10 +26,10 @@ By using this software you agree to the disclaimer at the end of this text
Compilation, First Glimpse, Installation Compilation, First Glimpse, Installation
Obtain cdrskin-1.5.6.tar.gz, take it to a directory of your choice and do: Obtain cdrskin-1.5.7.tar.gz, take it to a directory of your choice and do:
tar xzf cdrskin-1.5.6.tar.gz tar xzf cdrskin-1.5.7.tar.gz
cd cdrskin-1.5.6 cd cdrskin-1.5.7
Within that directory execute: Within that directory execute:

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps .\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1) .\" other parameters are allowed: see man(7), man(1)
.TH CDRSKIN 1 "Version 1.5.6, Jun 07, 2023" .TH CDRSKIN 1 "Version 1.5.7, Jun 07, 2023"
.\" Please adjust this date whenever revising the manpage. .\" Please adjust this date whenever revising the manpage.
.\" .\"
.\" Some roff macros, for reference: .\" Some roff macros, for reference:

View File

@ -87,7 +87,7 @@ or
/** The official program version */ /** The official program version */
#ifndef Cdrskin_prog_versioN #ifndef Cdrskin_prog_versioN
#define Cdrskin_prog_versioN "1.5.6" #define Cdrskin_prog_versioN "1.5.7"
#endif #endif
/** The official libburn interface revision to use. /** The official libburn interface revision to use.
@ -4461,6 +4461,13 @@ int Cdrskin_driveno_to_btldev(struct CdrskiN *skin, int driveno,
loc= adr; loc= adr;
ret= burn_drive_get_drive_role(skin->drives[driveno].drive); ret= burn_drive_get_drive_role(skin->drives[driveno].drive);
if(ret!=1) { if(ret!=1) {
if(strlen(adr) > Cdrskin_adrleN - 7) {
fprintf(stderr,
"cdrskin : FAILURE : File path too long for \"stdio:\" prefix: %s\n",
adr);
sprintf(btldev, "stdio:"); /* Address of the null drive */
return(-1);
}
sprintf(btldev,"stdio:%s",adr); sprintf(btldev,"stdio:%s",adr);
{ret= 2; goto adr_translation;} {ret= 2; goto adr_translation;}
} }

View File

@ -210,7 +210,7 @@ Standalone ISO 9660 multi-session CD/DVD/BD tool
(detached GPG signature for verification by (detached GPG signature for verification by
<KBD>gpg --verify cdrskin-1.5.6.tar.gz.sig cdrskin-1.5.6.tar.gz</KBD> <KBD>gpg --verify cdrskin-1.5.6.tar.gz.sig cdrskin-1.5.6.tar.gz</KBD>
<BR> <BR>
after <KBD>gpg --keyserver keys.gnupg.net --recv-keys ABC0A854</KBD>). after <KBD>gpg --keyserver keyserver.ubuntu.com --recv-keys ABC0A854</KBD>).
</DD> </DD>
<DD> <DD>
The cdrskin tarballs are source code identical with libburn releases The cdrskin tarballs are source code identical with libburn releases
@ -302,9 +302,10 @@ Bug fixes towards cdrskin-1.5.6:
<DD><A HREF="cdrskin_help_devel">cdrskin-1.5.7 -help</A></DD> <DD><A HREF="cdrskin_help_devel">cdrskin-1.5.7 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.5.7)</A></DD> <DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.5.7)</A></DD>
<DD>&nbsp;</DD> <DD>&nbsp;</DD>
<DT>Maintainers of cdrskin unstable packages please use SVN of <DT>Maintainers of cdrskin unstable packages please use git of
<A HREF="http://libburnia-project.org"> libburnia-project.org</A></DT> <A HREF="http://libburnia-project.org"> libburnia-project.org</A></DT>
<DD>Download: <KBD><B>svn co http://svn.libburnia-project.org/libburn/trunk libburn</B> <DD>Download: <KBD>
<B>git clone https://dev.lovelyhq.com/libburnia/libburn.git</B>
</KBD></DD> </KBD></DD>
<DD>Build: <KBD><B>cd libburn ; ./bootstrap ; ./configure --prefix /usr ; make ; cdrskin/compile_cdrskin.sh</B> <DD>Build: <KBD><B>cd libburn ; ./bootstrap ; ./configure --prefix /usr ; make ; cdrskin/compile_cdrskin.sh</B>
</KBD></DD> </KBD></DD>

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2023.06.07.143001" #define Cdrskin_timestamP "2024.04.27.162735"

View File

@ -14230,7 +14230,7 @@ Updated cdrskin tarball generator
cdrskin/cdrskin_eng.html cdrskin/cdrskin_eng.html
Last minute correction in cdrskin web page Last minute correction in cdrskin web page
07 Jun 2023 [] 07 Jun 2023 [4628231]
ChangeLog ChangeLog
cdrskin/changelog.txt cdrskin/changelog.txt
Updated change log Updated change log
@ -14242,6 +14242,21 @@ Updated change log
* Bug fix: Overburning with cdrskin option -force ended by a libburn error * Bug fix: Overburning with cdrskin option -force ended by a libburn error
2023.06.07.183206 []
Makefile.am
configure.ac
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/cdrskin.1
cdrskin/README
cdrskin/cdrskin_timestamp.h
Made number transition to 1.5.7
07 Jun 2023 []
ChangeLog
cdrskin/changelog.txt
Updated change log
[] []
libburn/cleanup.c libburn/cleanup.c

View File

@ -1,4 +1,4 @@
AC_INIT([libburn], [1.5.6], [http://libburnia-project.org]) AC_INIT([libburn], [1.5.7], [http://libburnia-project.org])
AC_PREREQ([2.50]) AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h]) dnl AC_CONFIG_HEADER([config.h])
@ -139,7 +139,7 @@ dnl
dnl As said: Only copies. Original in libburn/libburn.h : burn_header_version_* dnl As said: Only copies. Original in libburn/libburn.h : burn_header_version_*
BURN_MAJOR_VERSION=1 BURN_MAJOR_VERSION=1
BURN_MINOR_VERSION=5 BURN_MINOR_VERSION=5
BURN_MICRO_VERSION=6 BURN_MICRO_VERSION=7
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
AC_SUBST(BURN_MAJOR_VERSION) AC_SUBST(BURN_MAJOR_VERSION)
@ -150,14 +150,14 @@ AC_SUBST(BURN_VERSION)
dnl Libtool versioning dnl Libtool versioning
LT_RELEASE=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION LT_RELEASE=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
dnl dnl
dnl This is the release version libburn-1.5.6 dnl ### This is the release version libburn-1.5.6
dnl ### This is the development version after above release version dnl This is the development version after above release version
dnl LT_CURRENT++, LT_AGE++ has not yet happened. dnl ### LT_CURRENT++, LT_AGE++ has not yet happened.
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile. dnl LT_CURRENT++, LT_AGE++ has happened meanwhile.
dnl dnl
dnl SONAME = 113 - 109 = 4 . Linux library name = libburn.so.4.109.0 dnl SONAME = 114 - 110 = 4 . Linux library name = libburn.so.4.110.0
LT_CURRENT=113 LT_CURRENT=114
LT_AGE=109 LT_AGE=110
LT_REVISION=0 LT_REVISION=0
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE` LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2017 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -279,7 +279,7 @@ static void *scan_worker_func(struct w_list *w)
} }
static void reset_progress(struct burn_drive *d, int sessions, int tracks, static void reset_progress(struct burn_drive *d, int sessions, int tracks,
int indices, int sectors, int flag) int indices, off_t sectors, int flag)
{ {
/* reset the progress indicator */ /* reset the progress indicator */
d->progress.session = 0; d->progress.session = 0;
@ -412,7 +412,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
return; return;
} }
reset_progress(drive, 1, 1, 1, 0x10000, 0); reset_progress(drive, 1, 1, 1, (off_t) 0x10000, 0);
/* A70103 : will be set to 0 by burn_disc_erase_sync() */ /* A70103 : will be set to 0 by burn_disc_erase_sync() */
drive->cancel = 1; drive->cancel = 1;
@ -494,7 +494,7 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag)
int ok = 0, ret; int ok = 0, ret;
char msg[40]; char msg[40];
reset_progress(drive, 1, 1, 1, 0x10000, 0); reset_progress(drive, 1, 1, 1, (off_t) 0x10000, 0);
if ((SCAN_GOING()) || find_worker(drive) != NULL) { if ((SCAN_GOING()) || find_worker(drive) != NULL) {
libdax_msgs_submit(libdax_messenger, drive->global_index, libdax_msgs_submit(libdax_messenger, drive->global_index,
@ -652,7 +652,7 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
} }
reset_progress(d, disc->sessions, disc->session[0]->tracks, reset_progress(d, disc->sessions, disc->session[0]->tracks,
disc->session[0]->track[0]->indices, 0, 0); disc->session[0]->track[0]->indices, (off_t) 0, 0);
/* For the next lines any return indicates failure */ /* For the next lines any return indicates failure */
d->cancel = 1; d->cancel = 1;

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2021 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -1136,12 +1136,13 @@ int burn_disc_erasable(struct burn_drive *d)
{ {
return d->erasable; return d->erasable;
} }
enum burn_drive_status burn_drive_get_status(struct burn_drive *d,
struct burn_progress *p)
void burn_drive_get_status_sig_handling(void)
{ {
/* --- Part of asynchronous signal handling --- */ /* --- Part of asynchronous signal handling --- */
/* This frequently used call may be used to react on messages from /* The frequently used call burn_drive_get_status*() may be used
the libburn built-in signal handler. to react on messages from the libburn built-in signal handler.
*/ */
/* ts B00225 : /* ts B00225 :
@ -1165,11 +1166,61 @@ enum burn_drive_status burn_drive_get_status(struct burn_drive *d,
} }
/* --- End of asynchronous signal handling --- */ /* --- End of asynchronous signal handling --- */
}
enum burn_drive_status burn_drive_get_status(struct burn_drive *d,
struct burn_progress *p)
{
burn_drive_get_status_sig_handling();
if (p != NULL) { if (p != NULL) {
memcpy(p, &(d->progress), sizeof(struct burn_progress));
/* TODO: add mutex */ /* TODO: add mutex */
p->sessions = d->progress.sessions;
p->session = d->progress.session;
p->tracks = d->progress.tracks;
p->track = d->progress.track;
p->indices = d->progress.indices;
p->index = d->progress.index;
if(d->progress.start_sector < 0x80000000)
p->start_sector = d->progress.start_sector;
else
p->start_sector = 0x7fffffff;
if(d->progress.sectors < 0x80000000)
p->sectors = d->progress.sectors;
else
p->sectors = 0x7fffffff;
if(d->progress.sector < 0x80000000)
p->sector = d->progress.sector;
else
p->sector = 0x7fffffff;
if(d->progress.buffer_capacity < 0x100000000)
p->buffer_capacity = d->progress.buffer_capacity;
else
p->buffer_capacity = 0xffffffff;
if(d->progress.buffer_available < 0x100000000)
p->buffer_available = d->progress.buffer_available;
else
p->buffer_available = 0xffffffff;
p->buffered_bytes = d->progress.buffered_bytes;
if(d->progress.buffer_min_fill < 0x100000000)
p->buffer_min_fill = d->progress.buffer_min_fill;
else
p->buffer_min_fill = 0xffffffff;
}
return d->busy;
}
enum burn_drive_status burn_drive_get_status_v2(struct burn_drive *d,
struct burn_progress_v2 *p)
{
burn_drive_get_status_sig_handling();
if (p != NULL) {
/* TODO: add mutex */
memcpy(p, &(d->progress), sizeof(struct burn_progress_v2));
} }
return d->busy; return d->busy;
} }
@ -2275,12 +2326,12 @@ int burn_drive_find_scsi_equiv(char *path, char adr[])
burn_drive_adr_debug_msg(msg, NULL); burn_drive_adr_debug_msg(msg, NULL);
return 0; return 0;
} }
sprintf(msg, "burn_drive_find_scsi_equiv( %s ) : (%d),%d,%d,%d,%d", sprintf(msg, "burn_drive_find_scsi_equiv( %s ) : %d,%d,%d,%d,%d",
path, bus_no, host_no, channel_no, target_no, lun_no); path, bus_no, host_no, channel_no, target_no, lun_no);
burn_drive_adr_debug_msg(msg, NULL); burn_drive_adr_debug_msg(msg, NULL);
ret= burn_drive_convert_scsi_adr(-1, host_no, channel_no, target_no, ret= burn_drive_convert_scsi_adr(bus_no, host_no, channel_no,
lun_no, adr); target_no, lun_no, adr);
return ret; return ret;
} }
@ -2642,10 +2693,10 @@ int burn_disc_read_atip(struct burn_drive *d)
} }
/* ts A61110 : new API function */ /* ts A61110 : new API function */
int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o, int burn_disc_track_lba_nwa_v2(struct burn_drive *d, struct burn_write_opts *o,
int trackno, int *lba, int *nwa) int trackno, off_t *lba, off_t *nwa)
{ {
int ret; int ret, int_lba, int_nwa;
if (burn_drive_is_released(d)) { if (burn_drive_is_released(d)) {
libdax_msgs_submit(libdax_messenger, libdax_msgs_submit(libdax_messenger,
@ -2673,11 +2724,38 @@ int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
return 0; return 0;
if (o != NULL) if (o != NULL)
d->send_write_parameters(d, NULL, -1, o); d->send_write_parameters(d, NULL, -1, o);
ret = d->get_nwa(d, trackno, lba, nwa); ret = d->get_nwa(d, trackno, &int_lba, &int_nwa);
if (ret <= 0)
return ret;
*lba = int_lba;
*nwa = int_nwa;
return ret; return ret;
} }
/* ts A61110 / C40302 : API */
int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
int trackno, int *lba, int *nwa)
{
int ret;
off_t off_lba, off_nwa;
ret = burn_disc_track_lba_nwa_v2(d, o, trackno, &off_lba, &off_nwa);
if (ret <= 0)
return ret;
if (off_lba > 0x7fffffff)
*lba = 0x7fffffff;
else
*lba = off_lba;
if (off_nwa > 0x7fffffff) {
*nwa = 0x7fffffff;
return 0;
} else {
*nwa = off_nwa;
}
return 1;
}
/* ts A70131 : new API function */ /* ts A70131 : new API function */
int burn_disc_get_msc1(struct burn_drive *d, int *start) int burn_disc_get_msc1(struct burn_drive *d, int *start)
{ {
@ -3416,15 +3494,32 @@ int burn_drive_set_media_capacity_remaining(struct burn_drive *d, off_t value)
return 1; return 1;
} }
/* ts C40303 : API */
int burn_get_read_capacity_v2(struct burn_drive *d, off_t *capacity, int flag)
{
*capacity = d->media_read_capacity +
(d->media_read_capacity != 0x7fffffffffffffff);
return (d->media_read_capacity != 0x7fffffffffffffff);
}
/* ts A81215 : API */ /* ts A81215 : API */
int burn_get_read_capacity(struct burn_drive *d, int *capacity, int flag) int burn_get_read_capacity(struct burn_drive *d, int *capacity, int flag)
{ {
*capacity = d->media_read_capacity + int ret;
(d->media_read_capacity != 0x7fffffff); off_t cap;
return (d->media_read_capacity != 0x7fffffff);
}
ret= burn_get_read_capacity_v2(d, &cap, flag);
if (cap < -0x7fffffff) {
*capacity = -0x7fffffff;
ret = 0;
} else if (cap > 0x7fffffff) {
*capacity = 0x7fffffff;
ret = 0;
} else {
*capacity = cap;
}
return ret;
}
/* ts A90903 : API */ /* ts A90903 : API */
int burn_disc_get_media_id(struct burn_drive *d, int burn_disc_get_media_id(struct burn_drive *d,

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2021 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -172,9 +172,10 @@ int burn_drive_grab_stdio(struct burn_drive *d, int flag);
/* ts C10213 */ /* ts C10213 */
/* The size of limitless or oversized devices as pseudo drives */ /* The size of limitless or oversized devices as pseudo drives */
/* Do not change this value because of its meaning to /* Do not lightheartedly change this value because of its meaning to
burn_drive.media_read_capacity in libburn/transport.h burn_drive.media_read_capacity in libburn/transport.h
64 TiB = 2 exp 46 = 2 exp 35 blocks
*/ */
#define BURN_DRIVE_MAX_BYTES ((off_t) (0x7ffffff0) * (off_t) 2048) #define BURN_DRIVE_MAX_BYTES ((off_t) (0x800000000) * (off_t) 2048)
#endif /* __DRIVE */ #endif /* __DRIVE */

View File

@ -88,7 +88,7 @@ struct burn_source_offst {
int size_adjustable; int size_adjustable;
/* for set_size/get_size */ /* for set_size/get_size */
int nominal_size; off_t nominal_size;
/* To help offst_free() */ /* To help offst_free() */
struct burn_source *next; struct burn_source *next;

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2023 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
This is the official API definition of libburn. This is the official API definition of libburn.
@ -9,6 +9,8 @@
*/ */
/* Important: If you add a public API function then add its name to file /* Important: If you add a public API function then add its name to file
libburn/libburn.ver libburn/libburn.ver
in the node LIBBURN4_Major.Minor.Micro with the numbers of
the next release version, citing the previous node.
*/ */
@ -376,6 +378,9 @@ struct burn_toc_entry
@since 0.5.2 : DVD extensions are made valid for CD too @since 0.5.2 : DVD extensions are made valid for CD too
bit1= LRA extension is valid @since 0.7.2 bit1= LRA extension is valid @since 0.7.2
bit2= Track status bits extension is valid @since 1.2.8 bit2= Track status bits extension is valid @since 1.2.8
bit3= Long block address is valid:
long_start_lba, long_track_blocks, long_last_rec_adr
@since 1.5.8
*/ */
unsigned char extensions_valid; unsigned char extensions_valid;
@ -386,8 +391,10 @@ struct burn_toc_entry
unsigned char session_msb; unsigned char session_msb;
unsigned char point_msb; unsigned char point_msb;
/* pmin, psec, and pframe may be too small if DVD extension is valid */ /* pmin, psec, and pframe may be too small if DVD extension is valid */
/* -1 means that only long_start_lba is valid */
int start_lba; int start_lba;
/* min, sec, and frame may be too small if DVD extension is valid */ /* min, sec, and frame may be too small if DVD extension is valid */
/* -1 means that only long_track_blocks is valid */
int track_blocks; int track_blocks;
/* ts A90909 : LRA extension. extensions_valid:bit1 */ /* ts A90909 : LRA extension. extensions_valid:bit1 */
@ -396,6 +403,7 @@ struct burn_toc_entry
DVD-R DL when LJRS = 00b, DVD-RW, HD DVD-R, and BD-R. DVD-R DL when LJRS = 00b, DVD-RW, HD DVD-R, and BD-R.
This would mean profiles: 0x11, 0x15, 0x13, 0x14, 0x51, 0x41, 0x42 This would mean profiles: 0x11, 0x15, 0x13, 0x14, 0x51, 0x41, 0x42
*/ */
/* -1 means that only long_last_rec_adr is valid */
int last_recorded_address; int last_recorded_address;
/* ts B30112 : Track status bits extension. extensions_valid:bit2 */ /* ts B30112 : Track status bits extension. extensions_valid:bit2 */
@ -415,6 +423,12 @@ struct burn_toc_entry
*/ */
int track_status_bits; int track_status_bits;
/* ts C40221 : Long block address extension. extensions_valid:bit3 */
/* @since 1.5.8 */
off_t long_start_lba;
off_t long_track_blocks;
off_t long_last_rec_adr;
}; };
@ -666,7 +680,8 @@ struct burn_drive_info
/** Operation progress report. All values are 0 based indices. /** Operation progress report. All values are 0 based indices.
* */ Handed out by burn_drive_get_status().
**/
struct burn_progress { struct burn_progress {
/** The total number of sessions */ /** The total number of sessions */
int sessions; int sessions;
@ -708,6 +723,52 @@ struct burn_progress {
}; };
/** Operation progress report with long block numbers.
All values are 0 based indices.
Handed out by burn_drive_get_status_v2().
@since 1.5.8
**/
struct burn_progress_v2 {
/** Revision of the struct format.
0= Elements up to .buffer_min_fill */
int revision;
/** The total number of sessions */
int sessions;
/** Current session.*/
int session;
/** The total number of tracks */
int tracks;
/** Current track. */
int track;
/** The total number of indices */
int indices;
/** Current index. */
int index;
/** The starting logical block address */
off_t start_sector;
/** On write: The number of sectors.
On blank: 0x10000 as upper limit for relative progress steps */
off_t sectors;
/** On write: The current sector being processed.
On blank: Relative progress steps 0 to 0x10000 */
off_t sector;
/** The capacity of the drive buffer */
off_t buffer_capacity;
/** The free space in the drive buffer (might be slightly outdated) */
off_t buffer_available;
/** The number of bytes sent to the drive buffer */
off_t buffered_bytes;
/** The minimum number of bytes stored in buffer during write.
(Caution: Before surely one buffer size of bytes was processed,
this value is 0x7fffffffffffffff.)
*/
off_t buffer_min_fill;
};
/* ts A61226 */ /* ts A61226 */
/* @since 0.3.0 */ /* @since 0.3.0 */
/** Description of a speed capability as reported by the drive in conjunction /** Description of a speed capability as reported by the drive in conjunction
@ -1481,6 +1542,13 @@ int burn_disc_get_phys_format_info(struct burn_drive *d, int *disk_category,
int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o, int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
int trackno, int *lba, int *nwa); int trackno, int *lba, int *nwa);
/* ts C40302 */
/** Like burn_disc_track_lba_nwa(), but with off_t results.
@since 1.5.8
*/
int burn_disc_track_lba_nwa_v2(struct burn_drive *d, struct burn_write_opts *o,
int trackno, off_t *lba, off_t *nwa);
/* ts B10525 */ /* ts B10525 */
/** Tells whether a previous attempt to determine the Next Writeable Address /** Tells whether a previous attempt to determine the Next Writeable Address
of the upcoming track reveiled that the READ TRACK INFORMATION Damage Bit of the upcoming track reveiled that the READ TRACK INFORMATION Damage Bit
@ -1653,6 +1721,15 @@ int burn_disc_erasable(struct burn_drive *d);
enum burn_drive_status burn_drive_get_status(struct burn_drive *drive, enum burn_drive_status burn_drive_get_status(struct burn_drive *drive,
struct burn_progress *p); struct burn_progress *p);
/** Returns the progress with long block numbers and the status of the drive.
@param drive The drive to query busy state for.
@param p Returns the progress of the operation, NULL if you don't care
@return the current status of the drive. See also burn_drive_status.
@since 1.5.8
*/
enum burn_drive_status burn_drive_get_status_v2(struct burn_drive *drive,
struct burn_progress_v2 *p);
/** Creates a write_opts struct for burning to the specified drive. /** Creates a write_opts struct for burning to the specified drive.
The returned object must later be freed with burn_write_opts_free(). The returned object must later be freed with burn_write_opts_free().
@param drive The drive to write with @param drive The drive to write with
@ -2986,6 +3063,11 @@ int burn_track_set_size(struct burn_track *t, off_t size);
*/ */
int burn_track_get_sectors(struct burn_track *); int burn_track_get_sectors(struct burn_track *);
/* ts C40302 */
/** Like burn_track_get_sectors(), but with return type off_t.
@since 1.5.8
*/
off_t burn_track_get_sectors_v2(struct burn_track *);
/* ts A61101 */ /* ts A61101 */
/** Tells how many source bytes have been read and how many data bytes have /** Tells how many source bytes have been read and how many data bytes have
@ -3779,8 +3861,19 @@ struct burn_session **burn_disc_get_sessions(struct burn_disc *d,
int burn_disc_get_incomplete_sessions(struct burn_disc *d); int burn_disc_get_incomplete_sessions(struct burn_disc *d);
/** Tells how many sectors a disc will have, or already has.
This is the sum of all burn_session_get_sectors() results of the disc.
The result is NOT RELIABLE with tracks of undefined length
*/
int burn_disc_get_sectors(struct burn_disc *d); int burn_disc_get_sectors(struct burn_disc *d);
/* ts C40302 */
/** Like burn_disc_get_sectors(), but with return type off_t.
@since 1.5.8
*/
off_t burn_disc_get_sectors_v2(struct burn_disc *d);
/** Gets an array of all the tracks for a session /** Gets an array of all the tracks for a session
THIS IS NO LONGER VALID AFTER YOU ADD OR REMOVE A TRACK THIS IS NO LONGER VALID AFTER YOU ADD OR REMOVE A TRACK
@param s session to get track array for @param s session to get track array for
@ -3790,8 +3883,19 @@ int burn_disc_get_sectors(struct burn_disc *d);
struct burn_track **burn_session_get_tracks(struct burn_session *s, struct burn_track **burn_session_get_tracks(struct burn_session *s,
int *num); int *num);
/** Tells how many sectors a session will have, or already has on disc.
This is the sum of all burn_track_get_sectors() results of the session.
The result is NOT RELIABLE with tracks of undefined length
*/
int burn_session_get_sectors(struct burn_session *s); int burn_session_get_sectors(struct burn_session *s);
/* ts C40302 */
/** Like burn_session_get_sectors(), but with return type off_t.
@since 1.5.8
*/
off_t burn_session_get_sectors_v2(struct burn_session *s);
/** Gets the mode of a track /** Gets the mode of a track
@param track the track to query @param track the track to query
@return the track's mode @return the track's mode
@ -3834,7 +3938,7 @@ void burn_version(int *major, int *minor, int *micro);
*/ */
#define burn_header_version_major 1 #define burn_header_version_major 1
#define burn_header_version_minor 5 #define burn_header_version_minor 5
#define burn_header_version_micro 6 #define burn_header_version_micro 7
/** Note: /** Note:
Above version numbers are also recorded in configure.ac because libtool Above version numbers are also recorded in configure.ac because libtool
wants them as parameters at build time. wants them as parameters at build time.
@ -4147,6 +4251,12 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
*/ */
int burn_get_read_capacity(struct burn_drive *d, int *capacity, int flag); int burn_get_read_capacity(struct burn_drive *d, int *capacity, int flag);
/* ts C40303 */
/** Like burn_get_read_capacity(), but with off_t result.
@since 1.5.8
*/
int burn_get_read_capacity_v2(struct burn_drive *d, off_t *capacity, int flag);
/* ts A70812 */ /* ts A70812 */
/** Read data in random access mode. /** Read data in random access mode.

View File

@ -213,3 +213,13 @@ libdax_audioxtr_new;
libdax_audioxtr_read; libdax_audioxtr_read;
local: *; local: *;
}; };
LIBBURN4_1.5.8 {
burn_disc_get_sectors_v2;
burn_disc_track_lba_nwa_v2;
burn_drive_get_status_v2;
burn_get_read_capacity_v2;
burn_session_get_sectors_v2;
burn_track_get_sectors_v2;
} LIBBURN4;

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2016 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -300,6 +300,14 @@ int mmc_four_char_to_int(unsigned char *data)
} }
/* ts C40226 */
unsigned int mmc_four_char_to_uint(unsigned char *data)
{
return (((unsigned int) data[0]) << 24) | (data[1] << 16) |
(data[2] << 8) | data[3];
}
/* ts A70201 */ /* ts A70201 */
int mmc_int_to_four_char(unsigned char *data, int num) int mmc_int_to_four_char(unsigned char *data, int num)
{ {
@ -311,6 +319,17 @@ int mmc_int_to_four_char(unsigned char *data, int num)
} }
/* ts C40226 */
int mmc_uint_to_four_char(unsigned char *data, unsigned int num)
{
data[0] = (num >> 24) & 0xff;
data[1] = (num >> 16) & 0xff;
data[2] = (num >> 8) & 0xff;
data[3] = num & 0xff;
return 1;
}
static int mmc_start_for_bit0 = 0; static int mmc_start_for_bit0 = 0;
/* @param flag bit0= the calling function should need no START UNIT. /* @param flag bit0= the calling function should need no START UNIT.
@ -747,7 +766,8 @@ ex:;
*/ */
static int mmc_wait_for_buffer_free(struct burn_drive *d, struct buffer *buf) static int mmc_wait_for_buffer_free(struct burn_drive *d, struct buffer *buf)
{ {
int usec= 0, need, reported_3s = 0, first_wait = 1; int usec= 0, reported_3s = 0, first_wait = 1;
off_t need;
struct timeval t0,tnow; struct timeval t0,tnow;
double max_fac, min_fac, waiting; double max_fac, min_fac, waiting;
@ -926,11 +946,11 @@ static int print_time(int flag)
#endif /* Libburn_write_time_debuG */ #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; int cancelled;
struct command *c; struct command *c;
int len, key, asc, ascq; int len, key, asc, ascq, start;
char *msg = NULL; char *msg = NULL;
#ifdef Libburn_write_time_debuG #ifdef Libburn_write_time_debuG
@ -942,6 +962,16 @@ fprintf(stderr, "libburn_DEBUG: buffer sectors= %d bytes= %d\n",
buf->sectors, buf->bytes); 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); c = &(d->casual_command);
@ -971,19 +1001,10 @@ fprintf(stderr, "libburn_DEBUG: buffer sectors= %d bytes= %d\n",
sprintf(msg, sprintf(msg,
"Exceeding range of permissible write addresses (%d >= %d)", "Exceeding range of permissible write addresses (%d >= %d)",
start, d->media_lba_limit); start, d->media_lba_limit);
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002012d, 0x0002012d,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
strcpy(msg, "CDB= ");
if (spc_human_readable_cmd(c, msg + strlen(msg),
320 - strlen(msg), 1) > 0) {
libdax_msgs_submit(libdax_messenger,
d->global_index, 0x0002012d,
LIBDAX_MSGS_SEV_FATAL,
LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
}
free(msg); free(msg);
} }
d->cancel = 1; /* No need for mutexing because atomic */ d->cancel = 1; /* No need for mutexing because atomic */
@ -1055,7 +1076,7 @@ fprintf(stderr, "libburn_DEBUG: buffer sectors= %d bytes= %d\n",
*/ */
if (d->current_profile == 0x14 && d->write_opts != NULL && if (d->current_profile == 0x14 && d->write_opts != NULL &&
(d->progress.buffer_capacity == 0 || (d->progress.buffer_capacity == 0 ||
start < (int) d->progress.buffer_capacity / 2048) && start < (off_t) d->progress.buffer_capacity / 2048) &&
key == 5 && asc == 0x64 && ascq == 0) { key == 5 && asc == 0x64 && ascq == 0) {
if (d->write_opts->write_type == BURN_WRITE_TAO) { if (d->write_opts->write_type == BURN_WRITE_TAO) {
d->was_feat21h_failure = 1 + (start == 0); d->was_feat21h_failure = 1 + (start == 0);
@ -1096,10 +1117,11 @@ int mmc_fake_toc_entry(struct burn_toc_entry *entry, int session_number,
unsigned char *size_data, unsigned char *start_data, unsigned char *size_data, unsigned char *start_data,
unsigned char *last_adr_data) unsigned char *last_adr_data)
{ {
int min, sec, frames, num; int min, sec, frames;
unsigned int num;
/* mark DVD extensions and Track Info extension as valid */ /* mark extensions as valid: DVD, Track Info, Long block address */
entry->extensions_valid |= (1 | 2); entry->extensions_valid |= (1 | 2 | 8);
/* defaults are as of mmc5r03.pdf 6.26.3.2.4 Fabricated TOC */ /* defaults are as of mmc5r03.pdf 6.26.3.2.4 Fabricated TOC */
entry->session = session_number & 0xff; entry->session = session_number & 0xff;
@ -1109,9 +1131,16 @@ int mmc_fake_toc_entry(struct burn_toc_entry *entry, int session_number,
entry->tno = 0; entry->tno = 0;
entry->point = track_number & 0xff; entry->point = track_number & 0xff;
entry->point_msb = (track_number >> 8) & 0xff; entry->point_msb = (track_number >> 8) & 0xff;
num = mmc_four_char_to_int(size_data); num = mmc_four_char_to_uint(size_data);
entry->track_blocks = num; if (num < 0x80000000) {
burn_lba_to_msf(num, &min, &sec, &frames); entry->track_blocks = num;
burn_lba_to_msf(num, &min, &sec, &frames);
} else {
entry->track_blocks = -1;
min = 477218; /* ~=LBA 0x7fffffff */
sec = frames = 0;
}
entry->long_track_blocks = num;
if (min > 255) { if (min > 255) {
min = 255; min = 255;
sec = 255; sec = 255;
@ -1121,9 +1150,16 @@ int mmc_fake_toc_entry(struct burn_toc_entry *entry, int session_number,
entry->sec = sec; entry->sec = sec;
entry->frame = frames; entry->frame = frames;
entry->zero = 0; entry->zero = 0;
num = mmc_four_char_to_int(start_data); num = mmc_four_char_to_uint(start_data);
entry->start_lba = num; if (num < 0x80000000) {
burn_lba_to_msf(num, &min, &sec, &frames); entry->start_lba = num;
burn_lba_to_msf(num, &min, &sec, &frames);
} else {
entry->start_lba = -1;
min = 477218;
sec = frames = 0;
}
entry->long_start_lba = num;
if (min > 255) { if (min > 255) {
min = 255; min = 255;
sec = 255; sec = 255;
@ -1132,7 +1168,13 @@ int mmc_fake_toc_entry(struct burn_toc_entry *entry, int session_number,
entry->pmin = min; entry->pmin = min;
entry->psec = sec; entry->psec = sec;
entry->pframe = frames; entry->pframe = frames;
entry->last_recorded_address = mmc_four_char_to_int(last_adr_data); num = mmc_four_char_to_uint(last_adr_data);
if (num < 0x80000000) {
entry->last_recorded_address = num;
} else {
entry->last_recorded_address = -1;
}
entry->long_last_rec_adr = num;
return 1; return 1;
} }
@ -1146,7 +1188,7 @@ static int mmc_read_toc_fmt0_al(struct burn_drive *d, int *alloc_len)
struct buffer *buf = NULL; struct buffer *buf = NULL;
struct command *c = NULL; struct command *c = NULL;
int dlen, i, old_alloc_len, session_number, prev_session = -1, ret; int dlen, i, old_alloc_len, session_number, prev_session = -1, ret;
int lba, size; unsigned int lba, size;
unsigned char *tdata, size_data[4], start_data[4], end_data[4]; unsigned char *tdata, size_data[4], start_data[4], end_data[4];
if (*alloc_len < 4) if (*alloc_len < 4)
@ -1225,11 +1267,11 @@ err_ex:;
if (session_number != prev_session && prev_session > 0) { if (session_number != prev_session && prev_session > 0) {
/* leadout entry previous session */ /* leadout entry previous session */
entry = &(d->toc_entry[(i - 1) + prev_session]); entry = &(d->toc_entry[(i - 1) + prev_session]);
lba = mmc_four_char_to_int(start_data) + lba = mmc_four_char_to_uint(start_data) +
mmc_four_char_to_int(size_data); mmc_four_char_to_uint(size_data);
mmc_int_to_four_char(start_data, lba); mmc_uint_to_four_char(start_data, lba);
mmc_int_to_four_char(size_data, 0); mmc_uint_to_four_char(size_data, 0);
mmc_int_to_four_char(end_data, lba - 1); mmc_uint_to_four_char(end_data, lba - 1);
mmc_fake_toc_entry(entry, prev_session, 0xA2, mmc_fake_toc_entry(entry, prev_session, 0xA2,
size_data, start_data, end_data); size_data, start_data, end_data);
entry->min= entry->sec= entry->frame= 0; entry->min= entry->sec= entry->frame= 0;
@ -1254,11 +1296,11 @@ err_ex:;
memcpy(start_data, tdata + 4, 4); memcpy(start_data, tdata + 4, 4);
/* size_data are estimated from next track start */ /* size_data are estimated from next track start */
memcpy(size_data, tdata + 8 + 4, 4); memcpy(size_data, tdata + 8 + 4, 4);
mmc_int_to_four_char(end_data, mmc_uint_to_four_char(end_data,
mmc_four_char_to_int(size_data) - 1); mmc_four_char_to_uint(size_data) - 1);
size = mmc_four_char_to_int(size_data) - size = mmc_four_char_to_uint(size_data) -
mmc_four_char_to_int(start_data); mmc_four_char_to_uint(start_data);
mmc_int_to_four_char(size_data, size); mmc_uint_to_four_char(size_data, size);
mmc_fake_toc_entry(entry, session_number, i + 1, mmc_fake_toc_entry(entry, session_number, i + 1,
size_data, start_data, end_data); size_data, start_data, end_data);
if (prev_session != session_number) if (prev_session != session_number)
@ -1271,9 +1313,9 @@ err_ex:;
tdata = c->page->data + 4 + d->last_track_no * 8; tdata = c->page->data + 4 + d->last_track_no * 8;
entry = &(d->toc_entry[(d->last_track_no - 1) + prev_session]); entry = &(d->toc_entry[(d->last_track_no - 1) + prev_session]);
memcpy(start_data, tdata + 4, 4); memcpy(start_data, tdata + 4, 4);
mmc_int_to_four_char(size_data, 0); mmc_uint_to_four_char(size_data, 0);
mmc_int_to_four_char(end_data, mmc_uint_to_four_char(end_data,
mmc_four_char_to_int(start_data) - 1); mmc_four_char_to_uint(start_data) - 1);
mmc_fake_toc_entry(entry, prev_session, 0xA2, mmc_fake_toc_entry(entry, prev_session, 0xA2,
size_data, start_data, end_data); size_data, start_data, end_data);
entry->min= entry->sec= entry->frame= 0; entry->min= entry->sec= entry->frame= 0;
@ -1310,7 +1352,8 @@ int mmc_fake_toc(struct burn_drive *d)
struct burn_session *session; struct burn_session *session;
struct burn_toc_entry *entry; struct burn_toc_entry *entry;
struct buffer *buf = NULL; struct buffer *buf = NULL;
int i, session_number, prev_session = -1, ret, lba, alloc_len = 34; int i, session_number, prev_session = -1, ret, alloc_len = 34;
unsigned int lba;
unsigned char *tdata, size_data[4], start_data[4], end_data[4]; unsigned char *tdata, size_data[4], start_data[4], end_data[4];
char *msg = NULL; char *msg = NULL;
@ -1415,11 +1458,11 @@ int mmc_fake_toc(struct burn_drive *d)
if (session_number != prev_session && prev_session > 0) { if (session_number != prev_session && prev_session > 0) {
/* leadout entry previous session */ /* leadout entry previous session */
entry = &(d->toc_entry[(i - 1) + prev_session]); entry = &(d->toc_entry[(i - 1) + prev_session]);
lba = mmc_four_char_to_int(start_data) + lba = mmc_four_char_to_uint(start_data) +
mmc_four_char_to_int(size_data); mmc_four_char_to_uint(size_data);
mmc_int_to_four_char(start_data, lba); mmc_uint_to_four_char(start_data, lba);
mmc_int_to_four_char(size_data, 0); mmc_uint_to_four_char(size_data, 0);
mmc_int_to_four_char(end_data, lba - 1); mmc_uint_to_four_char(end_data, lba - 1);
mmc_fake_toc_entry(entry, prev_session, 0xA2, mmc_fake_toc_entry(entry, prev_session, 0xA2,
size_data, start_data, end_data); size_data, start_data, end_data);
entry->min= entry->sec= entry->frame= 0; entry->min= entry->sec= entry->frame= 0;
@ -1440,7 +1483,7 @@ int mmc_fake_toc(struct burn_drive *d)
if (i == d->last_track_no - 1) { if (i == d->last_track_no - 1) {
/* ts A70212 : Last track field Free Blocks */ /* ts A70212 : Last track field Free Blocks */
burn_drive_set_media_capacity_remaining(d, burn_drive_set_media_capacity_remaining(d,
((off_t) mmc_four_char_to_int(tdata + 16)) * ((off_t) mmc_four_char_to_uint(tdata + 16)) *
((off_t) 2048)); ((off_t) 2048));
d->media_lba_limit = 0; d->media_lba_limit = 0;
} }
@ -1486,11 +1529,11 @@ int mmc_fake_toc(struct burn_drive *d)
if (prev_session > 0 && prev_session <= d->disc->sessions) { if (prev_session > 0 && prev_session <= d->disc->sessions) {
/* leadout entry of last session of closed disc */ /* leadout entry of last session of closed disc */
entry = &(d->toc_entry[(d->last_track_no - 1) + prev_session]); entry = &(d->toc_entry[(d->last_track_no - 1) + prev_session]);
lba = mmc_four_char_to_int(start_data) + lba = mmc_four_char_to_uint(start_data) +
mmc_four_char_to_int(size_data); mmc_four_char_to_uint(size_data);
mmc_int_to_four_char(start_data, lba); mmc_uint_to_four_char(start_data, lba);
mmc_int_to_four_char(size_data, 0); mmc_uint_to_four_char(size_data, 0);
mmc_int_to_four_char(end_data, lba - 1); mmc_uint_to_four_char(end_data, lba - 1);
mmc_fake_toc_entry(entry, prev_session, 0xA2, mmc_fake_toc_entry(entry, prev_session, 0xA2,
size_data, start_data, end_data); size_data, start_data, end_data);
entry->min= entry->sec= entry->frame= 0; entry->min= entry->sec= entry->frame= 0;
@ -1741,8 +1784,8 @@ static int mmc_read_toc_al(struct burn_drive *d, int *alloc_len)
TOC format 2 always reports 2 blocks more than are readable. TOC format 2 always reports 2 blocks more than are readable.
So here it is possible to check and mark as trusted. So here it is possible to check and mark as trusted.
*/ */
if (highest_leadout > 0 && d->media_read_capacity != 0x7fffffff && if (highest_leadout > 0 && d->media_read_capacity != 0x7fffffffffffffff
!d->mr_capacity_trusted) { && !d->mr_capacity_trusted) {
if (highest_leadout - 3 == d->media_read_capacity) { if (highest_leadout - 3 == d->media_read_capacity) {
d->mr_capacity_trusted = 1; d->mr_capacity_trusted = 1;
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
@ -1783,12 +1826,12 @@ void mmc_read_toc(struct burn_drive *d)
} }
/* ts A70131 : This tries to get the start of the last complete session */ /* ts C40226 : long address reply version of mmc_read_multi_session_c1 */
/* man mkisofs , option -C : /* man mkisofs , option -C :
The first number is the sector number of the first sector in The first number is the sector number of the first sector in
the last session of the disk that should be appended to. the last session of the disk that should be appended to.
*/ */
int mmc_read_multi_session_c1(struct burn_drive *d, int *trackno, int *start) int mmc_read_msc1_long(struct burn_drive *d, int *trackno, off_t *start)
{ {
struct buffer *buf = NULL; struct buffer *buf = NULL;
struct command *c = NULL; struct command *c = NULL;
@ -1821,7 +1864,11 @@ int mmc_read_multi_session_c1(struct burn_drive *d, int *trackno, int *start)
continue; continue;
burn_track_get_entry(tracks[0], &toc_entry); burn_track_get_entry(tracks[0], &toc_entry);
if (toc_entry.extensions_valid & 1) { /* DVD extension valid */ if (toc_entry.extensions_valid & 1) { /* DVD extension valid */
*start = toc_entry.start_lba; if (toc_entry.extensions_valid & 8) { /* Long adr */
*start = toc_entry.long_start_lba;
} else {
*start = toc_entry.start_lba;
}
*trackno = (toc_entry.point_msb << 8)| toc_entry.point; *trackno = (toc_entry.point_msb << 8)| toc_entry.point;
} else { } else {
*start = burn_msf_to_lba(toc_entry.pmin, *start = burn_msf_to_lba(toc_entry.pmin,
@ -1856,7 +1903,7 @@ inquire_drive:;
tdata = c->page->data + 4; tdata = c->page->data + 4;
*trackno = tdata[2]; *trackno = tdata[2];
*start = mmc_four_char_to_int(tdata + 4); *start = mmc_four_char_to_uint(tdata + 4);
ret = 1; ret = 1;
ex:; ex:;
BURN_FREE_MEM(buf); BURN_FREE_MEM(buf);
@ -1865,6 +1912,24 @@ ex:;
} }
/* ts A70131 : This tries to get the start of the last complete session */
int mmc_read_multi_session_c1(struct burn_drive *d, int *trackno, int *start)
{
int ret;
off_t num;
ret = mmc_read_msc1_long(d, trackno, &num);
if (ret <= 0)
return ret;
if(num >= 0x80000000) {
*start = 0x7fffffff;
return 0;
}
*start = num;
return 1;
}
/* ts A61201 */ /* ts A61201 */
char *mmc_obtain_profile_name(int profile_number) char *mmc_obtain_profile_name(int profile_number)
{ {
@ -1960,7 +2025,7 @@ static int mmc_read_disc_info_al(struct burn_drive *d, int *alloc_len)
d->media_lba_limit = 0; d->media_lba_limit = 0;
/* ts A81210 */ /* ts A81210 */
d->media_read_capacity = 0x7fffffff; d->media_read_capacity = 0x7fffffffffffffff;
d->mr_capacity_trusted = -1; d->mr_capacity_trusted = -1;
/* ts A61202 */ /* ts A61202 */
@ -3652,7 +3717,7 @@ int mmc_read_buffer_capacity(struct burn_drive *d)
d->pessimistic_buffer_free = d->progress.buffer_available; d->pessimistic_buffer_free = d->progress.buffer_available;
d->pbf_altered = 0; d->pbf_altered = 0;
if (d->progress.buffered_bytes >= d->progress.buffer_capacity){ if (d->progress.buffered_bytes >= d->progress.buffer_capacity){
double fill; off_t fill;
fill = d->progress.buffer_capacity fill = d->progress.buffer_capacity
- d->progress.buffer_available; - d->progress.buffer_available;
@ -4912,7 +4977,7 @@ int mmc_read_capacity(struct burn_drive *d)
BURN_ALLOC_MEM(buf, struct buffer, 1); BURN_ALLOC_MEM(buf, struct buffer, 1);
BURN_ALLOC_MEM(c, struct command, 1); BURN_ALLOC_MEM(c, struct command, 1);
d->media_read_capacity = 0x7fffffff; d->media_read_capacity = 0x7fffffffffffffff;
d->mr_capacity_trusted = -1; d->mr_capacity_trusted = -1;
mmc_start_if_needed(d, 1); mmc_start_if_needed(d, 1);
if (mmc_function_spy(d, "mmc_read_capacity") <= 0) if (mmc_function_spy(d, "mmc_read_capacity") <= 0)
@ -4926,11 +4991,7 @@ int mmc_read_capacity(struct burn_drive *d)
c->page->sectors = 0; c->page->sectors = 0;
c->dir = FROM_DRIVE; c->dir = FROM_DRIVE;
d->issue_command(d, c); d->issue_command(d, c);
d->media_read_capacity = mmc_four_char_to_int(c->page->data); d->media_read_capacity = mmc_four_char_to_uint(c->page->data);
if (d->media_read_capacity < 0) {
d->media_read_capacity = 0x7fffffff;
{ret = 0; goto ex;}
}
if (d->current_profile >= 0x08 && d->current_profile <= 0x0A) if (d->current_profile >= 0x08 && d->current_profile <= 0x0A)
d->mr_capacity_trusted = 0; d->mr_capacity_trusted = 0;
else else
@ -5450,7 +5511,7 @@ int mmc_setup_drive(struct burn_drive *d)
d->last_track_no = 1; d->last_track_no = 1;
d->media_capacity_remaining = 0; d->media_capacity_remaining = 0;
d->media_lba_limit = 0; d->media_lba_limit = 0;
d->media_read_capacity = 0x7fffffff; d->media_read_capacity = 0x7fffffffffffffff;
d->mr_capacity_trusted = 0; d->mr_capacity_trusted = 0;
d->pessimistic_buffer_free = 0; d->pessimistic_buffer_free = 0;
d->pbf_altered = 0; d->pbf_altered = 0;

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -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_close(struct burn_drive *, int session, int track);
void mmc_get_event(struct burn_drive *); 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_write_12(struct burn_drive *d, int start, struct buffer *buf);
void mmc_sync_cache(struct burn_drive *); void mmc_sync_cache(struct burn_drive *);
void mmc_load(struct burn_drive *); void mmc_load(struct burn_drive *);
@ -78,6 +78,8 @@ int mmc_compose_mode_page_5(struct burn_drive *d,
/* ts A70201 */ /* ts A70201 */
int mmc_four_char_to_int(unsigned char *data); int mmc_four_char_to_int(unsigned char *data);
/* ts C40226 */
unsigned int mmc_four_char_to_uint(unsigned char *data);
/* ts A70201 : /* ts A70201 :
Common track info fetcher for mmc_get_nwa() and mmc_fake_toc() Common track info fetcher for mmc_get_nwa() and mmc_fake_toc()

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -492,13 +492,13 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
msg, 0, 0); msg, 0, 0);
{ret = 0; goto ex;} {ret = 0; goto ex;}
} }
if (d->media_read_capacity != 0x7fffffff && byte_address >= if (d->media_read_capacity != 0x7fffffffffffffff &&
((off_t) d->media_read_capacity + (off_t) 1) * (off_t) 2048) { byte_address >= (d->media_read_capacity + 1) * (off_t) 2048) {
if (!(flag & 2)) { if (!(flag & 2)) {
sprintf(msg, sprintf(msg,
"Read start address %ds larger than number of readable blocks %d", "Read start address %.fs larger than number of readable blocks %.f",
(int) (byte_address / 2048 + !!(byte_address % 2048)), (double) (byte_address / 2048 + !!(byte_address % 2048)),
d->media_read_capacity + 1); (double) (d->media_read_capacity + 1));
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020172, (flag & 32) ? 0x00020172, (flag & 32) ?
LIBDAX_MSGS_SEV_DEBUG : LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_SEV_DEBUG : LIBDAX_MSGS_SEV_SORRY,

View File

@ -193,7 +193,7 @@ static void get_bytes(struct burn_track *track, int count, unsigned char *data)
off_t missing, inp_block_size, track_blocks; off_t missing, inp_block_size, track_blocks;
inp_block_size = burn_sector_length(track->mode); inp_block_size = burn_sector_length(track->mode);
track_blocks = burn_track_get_sectors_2(track, 1); track_blocks = burn_track_get_sectors_2_v2(track, 1);
if (track_blocks < 0) if (track_blocks < 0)
track_blocks = 0; track_blocks = 0;
missing = track_blocks * inp_block_size - track->sourcecount; missing = track_blocks * inp_block_size - track->sourcecount;

View File

@ -34,6 +34,7 @@
#include "util.h" #include "util.h"
#include "transport.h" #include "transport.h"
#include "mmc.h" #include "mmc.h"
#include "drive.h"
#include "libdax_msgs.h" #include "libdax_msgs.h"
extern struct libdax_msgs *libdax_messenger; extern struct libdax_msgs *libdax_messenger;
@ -319,8 +320,8 @@ void burn_structure_print_track(struct burn_track *t)
{ {
char msg[80]; char msg[80];
sprintf(msg, " track size %d sectors", sprintf(msg, " track size %.f sectors",
burn_track_get_sectors(t)); (double) burn_track_get_sectors_v2(t));
libdax_msgs_submit(libdax_messenger, -1, 0x00000002, libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
@ -506,14 +507,14 @@ int burn_track_set_postgap_size(struct burn_track *t, int size, int flag)
return 1; return 1;
} }
/* ts B20119: outsourced from burn_track_get_sectors() /* ts B20119 / C40302: outsourced from burn_track_get_sectors()
@param flag bit0= do not add post-gap @param flag bit0= do not add post-gap
*/ */
int burn_track_get_sectors_2(struct burn_track *t, int flag) off_t burn_track_get_sectors_2_v2(struct burn_track *t, int flag)
{ {
/* ts A70125 : was int */ /* ts A70125 : was int */
off_t size = 0; off_t size = 0, sectors;
int sectors, seclen; int seclen;
seclen = burn_sector_length(t->mode); seclen = burn_sector_length(t->mode);
@ -529,14 +530,22 @@ int burn_track_get_sectors_2(struct burn_track *t, int flag)
} else if(t->entry != NULL) { } else if(t->entry != NULL) {
/* ts A80808 : all burn_toc_entry of track starts should now /* ts A80808 : all burn_toc_entry of track starts should now
have (extensions_valid & 1), even those from CD. have (extensions_valid & 1), even those from CD.
ts C40302 : Now there should be long_track_blocks.
*/ */
if (t->entry->extensions_valid & 1) if (t->entry->extensions_valid & 8) {
size = t->entry->long_track_blocks * (off_t) 2048;
} else if (t->entry->extensions_valid & 1) {
size = ((off_t) t->entry->track_blocks) * (off_t) 2048; size = ((off_t) t->entry->track_blocks) * (off_t) 2048;
}
} }
if (size > ((off_t) 0x7ffffff0) * (off_t) 2048) { if (size > BURN_DRIVE_MAX_BYTES) {
char msg[80];
sprintf(msg, "Track size exceeds limit of %.f bytes",
(double) (BURN_DRIVE_MAX_BYTES));
libdax_msgs_submit(libdax_messenger, -1, 0x000201ae, libdax_msgs_submit(libdax_messenger, -1, 0x000201ae,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Track size exceeds 4 TiB - 32 KiB", 0, 0); msg, 0, 0);
return -1; return -1;
} }
sectors = size / seclen; sectors = size / seclen;
@ -545,14 +554,34 @@ int burn_track_get_sectors_2(struct burn_track *t, int flag)
return sectors; return sectors;
} }
int burn_track_get_sectors_2(struct burn_track *t, int flag)
{
/* ts A70125 : was int */
off_t sectors = 0;
sectors = burn_track_get_sectors_2_v2(t, flag);
if (sectors > (off_t) 0x7ffffff0) {
libdax_msgs_submit(libdax_messenger, -1, 0x000201ae,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Track size exceeds 4 TiB - 32 KiB", 0, 0);
return -1;
}
return (int) sectors;
}
int burn_track_get_sectors(struct burn_track *t) int burn_track_get_sectors(struct burn_track *t)
{ {
return burn_track_get_sectors_2(t, 0); return burn_track_get_sectors_2(t, 0);
} }
/* ts C40302 : API */
off_t burn_track_get_sectors_v2(struct burn_track *t)
{
return burn_track_get_sectors_2_v2(t, 0);
}
/* ts A70125 */ /* ts A70125 */
int burn_track_set_sectors(struct burn_track *t, int sectors) int burn_track_set_sectors(struct burn_track *t, off_t sectors)
{ {
off_t size, seclen; off_t size, seclen;
int ret; int ret;
@ -595,26 +624,29 @@ int burn_track_set_fillup(struct burn_track *t, int fill_up_media)
*/ */
int burn_track_apply_fillup(struct burn_track *t, off_t max_size, int flag) int burn_track_apply_fillup(struct burn_track *t, off_t max_size, int flag)
{ {
int max_sectors, ret = 2, track_sectors; int ret = 2;
off_t max_sectors, track_sectors;
char msg[80]; char msg[80];
if (t->fill_up_media <= 0) if (t->fill_up_media <= 0)
return 2; return 2;
if (max_size > (off_t) 0x7ffffff0 * (off_t) 2048) { if (max_size > BURN_DRIVE_MAX_BYTES) {
sprintf(msg, "Track size exceeds limit of %.f bytes",
(double) (BURN_DRIVE_MAX_BYTES));
libdax_msgs_submit(libdax_messenger, -1, 0x000201ae, libdax_msgs_submit(libdax_messenger, -1, 0x000201ae,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Track size exceeds 4 TiB - 32 KiB", 0, 0); msg, 0, 0);
return 0; return 0;
} }
max_sectors = max_size / 2048; max_sectors = max_size / 2048;
track_sectors = burn_track_get_sectors(t); track_sectors = burn_track_get_sectors_v2(t);
if (track_sectors < 0) if (track_sectors < 0)
return 0; return 0;
if (track_sectors < max_sectors || (flag & 1)) { if (track_sectors < max_sectors || (flag & 1)) {
sprintf(msg, "Setting total track size to %ds (payload %ds)\n", sprintf(msg,
max_sectors & 0x7fffffff, "Setting total track size to %.fs (payload %.fs)\n",
(int) ((t->source->get_size(t->source) / 2048) (double) max_sectors,
& 0x7fffffff)); (double) (t->source->get_size(t->source) / 2048));
libdax_msgs_submit(libdax_messenger, -1, 0x00000002, libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
msg, 0, 0); msg, 0, 0);
@ -668,7 +700,7 @@ int burn_track_is_data_done(struct burn_track *t)
int burn_track_get_shortage(struct burn_track *t) int burn_track_get_shortage(struct burn_track *t)
{ {
int size; off_t size;
int seclen; int seclen;
seclen = burn_sector_length(t->mode); seclen = burn_sector_length(t->mode);
@ -691,6 +723,20 @@ int burn_session_get_sectors(struct burn_session *s)
return sectors; return sectors;
} }
/* ts C40302: API */
off_t burn_session_get_sectors_v2(struct burn_session *s)
{
int i;
off_t sectors = 0, track_sectors;
for (i = 0; i < s->tracks; i++) {
track_sectors = burn_track_get_sectors_v2(s->track[i]);
if (track_sectors < 0)
track_sectors = 0;
sectors += track_sectors;
}
return sectors;
}
int burn_disc_get_sectors(struct burn_disc *d) int burn_disc_get_sectors(struct burn_disc *d)
{ {
@ -701,6 +747,17 @@ int burn_disc_get_sectors(struct burn_disc *d)
return sectors; return sectors;
} }
/* ts C40302: API */
off_t burn_disc_get_sectors_v2(struct burn_disc *d)
{
int i;
off_t sectors = 0;
for (i = 0; i < d->sessions; i++)
sectors += burn_session_get_sectors_v2(d->session[i]);
return sectors;
}
void burn_track_get_entry(struct burn_track *t, struct burn_toc_entry *entry) void burn_track_get_entry(struct burn_track *t, struct burn_toc_entry *entry)
{ {
if (t->entry == NULL) if (t->entry == NULL)
@ -768,7 +825,7 @@ int burn_session_get_hidefirst(struct burn_session *session)
} }
/* ts A80808 : Enhance CD toc to DVD toc */ /* ts A80808,C40226 : Enhance CD toc to DVD toc with Long block addresses */
int burn_disc_cd_toc_extensions(struct burn_drive *drive, int flag) int burn_disc_cd_toc_extensions(struct burn_drive *drive, int flag)
{ {
int sidx= 0, tidx= 0, ret, track_offset, alloc_len = 34; int sidx= 0, tidx= 0, ret, track_offset, alloc_len = 34;
@ -836,6 +893,7 @@ int burn_disc_cd_toc_extensions(struct burn_drive *drive, int flag)
entry->point_msb = 0; entry->point_msb = 0;
entry->start_lba = burn_msf_to_lba(entry->pmin, entry->start_lba = burn_msf_to_lba(entry->pmin,
entry->psec, entry->pframe); entry->psec, entry->pframe);
entry->long_start_lba = entry->start_lba;
if (tidx > 0) { if (tidx > 0) {
prev_entry->track_blocks = prev_entry->track_blocks =
entry->start_lba entry->start_lba
@ -855,13 +913,16 @@ int burn_disc_cd_toc_extensions(struct burn_drive *drive, int flag)
ret < prev_entry->track_blocks - 2)) ret < prev_entry->track_blocks - 2))
prev_entry->track_blocks = ret; prev_entry->track_blocks = ret;
} }
prev_entry->extensions_valid |= 1; prev_entry->long_track_blocks =
prev_entry->track_blocks;
prev_entry->extensions_valid |= 1 | 8;
} }
if (tidx == d->session[sidx]->tracks) { if (tidx == d->session[sidx]->tracks) {
entry->session_msb = 0; entry->session_msb = 0;
entry->point_msb = 0; entry->point_msb = 0;
entry->track_blocks = 0; entry->track_blocks = 0;
entry->extensions_valid |= 1; entry->long_track_blocks = entry->track_blocks;
entry->extensions_valid |= 1 | 8;
} }
prev_entry = entry; prev_entry = entry;
} }

View File

@ -160,7 +160,7 @@ int burn_track_is_open_ended(struct burn_track *t);
int burn_track_is_data_done(struct burn_track *t); int burn_track_is_data_done(struct burn_track *t);
/* ts A70125 : sets overall sectors of a track: offset+payload+padding */ /* ts A70125 : sets overall sectors of a track: offset+payload+padding */
int burn_track_set_sectors(struct burn_track *t, int sectors); int burn_track_set_sectors(struct burn_track *t, off_t sectors);
/* ts A70218 : sets the payload size alone */ /* ts A70218 : sets the payload size alone */
int burn_track_set_size(struct burn_track *t, off_t size); int burn_track_set_size(struct burn_track *t, off_t size);
@ -185,6 +185,7 @@ void burn_cdtext_free(struct burn_cdtext **cdtext);
/* @param flag bit0= do not add post-gap /* @param flag bit0= do not add post-gap
*/ */
int burn_track_get_sectors_2(struct burn_track *t, int flag); int burn_track_get_sectors_2(struct burn_track *t, int flag);
off_t burn_track_get_sectors_2_v2(struct burn_track *t, int flag);
#endif /* BURN__STRUCTURE_H */ #endif /* BURN__STRUCTURE_H */

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2020 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -335,7 +335,7 @@ struct burn_drive
int stdio_fd; int stdio_fd;
int nwa; /* next writeable address */ off_t nwa; /* next writeable address */
int alba; /* absolute lba */ int alba; /* absolute lba */
int rlba; /* relative lba in section */ int rlba; /* relative lba in section */
int start_lba; int start_lba;
@ -371,21 +371,21 @@ struct burn_drive
/* ts A70215 : if > 0 : first lba on media that is too high for write*/ /* ts A70215 : if > 0 : first lba on media that is too high for write*/
int media_lba_limit; int media_lba_limit;
/* ts A81210 : Upper limit of readable data size, /* ts A81210 / C40303 : Upper limit of readable data size,
0x7fffffff = unknown 0x7fffffffffffffff = unknown
0x7ffffff0 = BURN_DRIVE_MAX_BYTES / 2048 BURN_DRIVE_MAX_BYTES / 2048 = possibly truncated
possibly truncated to prevent 32 bit or unknown stdio size
overflow, or unknown stdio size
*/ */
int media_read_capacity; off_t media_read_capacity;
/* ts B60305 : Whether READ CAPACITY of CD is credible: /* ts B60305 : Whether READ CAPACITY of CD is credible:
-1= no READ CAPACITY yet , 0= untrusted READ CAPACITY -1= no READ CAPACITY yet , 0= untrusted READ CAPACITY
1= READ CAPACITY confirmed or corrected by other commands 1= READ CAPACITY confirmed or corrected by other commands
*/ */
int mr_capacity_trusted; int mr_capacity_trusted;
/* ts B10314 : Next Writeable Address for drive_role == 5 */ /* ts B10314 / C40302 : Next Writeable Address for drive_role == 5 */
int role_5_nwa; off_t role_5_nwa;
/* ts B60730 */ /* ts B60730 */
int do_no_immed; int do_no_immed;
@ -394,7 +394,7 @@ struct burn_drive
struct burn_disc *disc; /* disc structure */ struct burn_disc *disc; /* disc structure */
int block_types[4]; int block_types[4];
struct buffer *buffer; struct buffer *buffer;
struct burn_progress progress; struct burn_progress_v2 progress;
/* To be used by mmc.c, sbc.c, spc.c for SCSI commands where the struct /* To be used by mmc.c, sbc.c, spc.c for SCSI commands where the struct
content surely does not have to persist while another command gets content surely does not have to persist while another command gets
@ -467,7 +467,7 @@ struct burn_drive
/* ts A61021 */ /* ts A61021 */
void (*read_atip) (struct burn_drive *); 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 (*read_toc) (struct burn_drive *);
void (*lock) (struct burn_drive *); void (*lock) (struct burn_drive *);
void (*unlock) (struct burn_drive *); void (*unlock) (struct burn_drive *);

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2021 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -636,7 +636,7 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
track_length = 300; track_length = 300;
if (!tar[i]->pad) if (!tar[i]->pad)
tar[i]->pad = 1; tar[i]->pad = 1;
burn_track_set_sectors(tar[i], track_length); burn_track_set_sectors(tar[i], (off_t) track_length);
} }
type_to_form(tar[i]->mode, &ctladr, &form); type_to_form(tar[i]->mode, &ctladr, &form);
@ -1027,7 +1027,7 @@ static int burn_write_leadin_cdtext(struct burn_write_opts *o,
} }
#endif /* Libburn_debug_cd_texT */ #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) if (err == BE_CANCELLED)
{ ret = 0; goto ex; } { ret = 0; goto ex; }
write_lba += sectors; 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, int burn_disc_init_track_status(struct burn_write_opts *o,
struct burn_session *s, struct burn_track *t, struct burn_session *s, struct burn_track *t,
int tnum, int sectors) int tnum, off_t sectors)
{ {
struct burn_drive *d = o->drive; 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, sprintf(msg,
"TAO pre-track %2.2d : get_nwa(%d)=%d, d=%d , demand=%.f , cap=%.f\n", "TAO pre-track %2.2d : get_nwa(%d)=%d, d=%.f , demand=%.f , cap=%.f\n",
tnum+1, nwa, ret, d->nwa, tnum+1, nwa, ret, (double) d->nwa,
(double) burn_track_get_sectors_2(t, 1) * 2048.0, (double) burn_track_get_sectors_2(t, 1) * 2048.0,
(double) d->media_capacity_remaining); (double) d->media_capacity_remaining);
libdax_msgs_submit(libdax_messenger, d->global_index, 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; } { ret = 0; goto ex; }
open_ended = burn_track_is_open_ended(t); 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 */ /* ts A61030 : this cannot happen. tnum is always < s->tracks */
if (tnum == s->tracks) if (tnum == s->tracks)
@ -1358,7 +1358,7 @@ int burn_disc_init_write_status(struct burn_write_opts *o,
d->progress.buffer_capacity = 0; d->progress.buffer_capacity = 0;
d->progress.buffer_available = 0; d->progress.buffer_available = 0;
d->progress.buffered_bytes = 0; d->progress.buffered_bytes = 0;
d->progress.buffer_min_fill = 0xffffffff; d->progress.buffer_min_fill = 0x7fffffffffffffff;
/* ts A70711 */ /* ts A70711 */
d->pessimistic_buffer_free = 0; d->pessimistic_buffer_free = 0;
@ -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); d->send_write_parameters(d, NULL, -1, o);
ret = d->get_nwa(d, -1, &lba, &nwa); ret = d->get_nwa(d, -1, &lba, &nwa);
sprintf(msg, sprintf(msg,
"DVD pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d", "DVD pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %.f",
tnum+1, nwa, ret, d->nwa); tnum+1, nwa, ret, (double) d->nwa);
libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002, libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg,0,0); LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg,0,0);
if (nwa > d->nwa) 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); BURN_ALLOC_MEM(msg, char, 160);
ret = d->get_nwa(d, -1, &lba, &nwa); ret = d->get_nwa(d, -1, &lba, &nwa);
sprintf(msg, sprintf(msg,
"DVD+R pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d", "DVD+R pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %.f",
tnum+1, nwa, ret, d->nwa); tnum+1, nwa, ret, (double) d->nwa);
libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002, libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg,0,0); LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg,0,0);
if (nwa > d->nwa) if (nwa > d->nwa)
@ -1897,7 +1897,7 @@ int burn_dvd_write_track(struct burn_write_opts *o,
struct buffer *out = d->buffer; struct buffer *out = d->buffer;
int sectors; int sectors;
int i, open_ended = 0, ret= 0, is_flushed = 0, track_open = 0; int i, open_ended = 0, ret= 0, is_flushed = 0, track_open = 0;
int first_buf_cap = 0, further_cap = 0, buf_cap_step = 1024; off_t first_buf_cap = 0, further_cap = 0, buf_cap_step = 1024;
/* ts A70213 : eventually expand size of track to max */ /* ts A70213 : eventually expand size of track to max */
burn_track_apply_fillup(t, d->media_capacity_remaining, 0); burn_track_apply_fillup(t, d->media_capacity_remaining, 0);
@ -1936,7 +1936,7 @@ int burn_dvd_write_track(struct burn_write_opts *o,
/* (offset padding is done within sector_data()) */ /* (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++) { for (i = 0; open_ended || i < sectors; i++) {
/* From time to time inquire drive buffer */ /* 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) { if (o->start_byte >= 0) {
d->nwa = o->start_byte / 32768; /* align to 32 kB */ 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, libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020127, 0x00020127,
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH, 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; d->nwa = 0;
if (o->start_byte >= 0) { if (o->start_byte >= 0) {
d->nwa = o->start_byte / 2048; d->nwa = o->start_byte / 2048;
sprintf(msg, "Write start address is %d * 2048", sprintf(msg, "Write start address is %.f * 2048",
d->nwa); (double) d->nwa);
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020127, 0x00020127,
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH, 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() */ /* 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; int ret;
off_t start_byte; 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(), /* ts A70910 : to be used as burn_drive.write(),
emulating mmc_write() with simulated writing. */ 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) struct buffer *buf)
{ {
if (d->cancel) if (d->cancel)
@ -2832,17 +2833,18 @@ int burn_nominal_slowdown(int kb_per_second, int max_corr,
int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s, int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s,
int tnum, int flag) int tnum, int flag)
{ {
int open_ended, bufsize = 16 * 2048, ret, sectors; int open_ended, bufsize = 16 * 2048, ret;
struct burn_track *t = s->track[tnum]; struct burn_track *t = s->track[tnum];
struct burn_drive *d = o->drive; struct burn_drive *d = o->drive;
char *buf = NULL; char *buf = NULL;
int i, prev_sync_sector = 0, us_corr = 0, max_corr = 250000; int us_corr = 0, max_corr = 250000;
off_t prev_sync_sector = 0, sectors, i;
struct buffer *out = d->buffer; struct buffer *out = d->buffer;
struct timeval prev_time; struct timeval prev_time;
BURN_ALLOC_MEM(buf, char, bufsize); BURN_ALLOC_MEM(buf, char, bufsize);
sectors = burn_track_get_sectors_2(t, 1); sectors = burn_track_get_sectors_2_v2(t, 1);
if (sectors < 0) if (sectors < 0)
{ret = 0; goto ex;} {ret = 0; goto ex;}
burn_disc_init_track_status(o, s, t, tnum, sectors); burn_disc_init_track_status(o, s, t, tnum, sectors);