From a86d1378ff7339dd5b0a74c9935a3563356cb312 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sat, 9 Mar 2024 19:31:19 +0100 Subject: [PATCH] New API calls isoburn_toc_disc_get_sectors_v2, isoburn_toc_session_get_sectors_v2, isoburn_toc_track_get_emul_v2 --- libisoburn/burn_wrap.c | 69 ++++++++++++++++++++++++++++++++----- libisoburn/libisoburn.h | 16 +++++++++ libisoburn/libisoburn.ver | 6 ++++ xorriso/xorriso_timestamp.h | 2 +- 4 files changed, 84 insertions(+), 9 deletions(-) diff --git a/libisoburn/burn_wrap.c b/libisoburn/burn_wrap.c index d7db5826..a71c6192 100644 --- a/libisoburn/burn_wrap.c +++ b/libisoburn/burn_wrap.c @@ -1746,10 +1746,11 @@ failure:; } -int isoburn_toc_disc_get_sectors(struct isoburn_toc_disc *disc) +off_t isoburn_toc_disc_get_sectors_v2(struct isoburn_toc_disc *disc) { struct isoburn_toc_entry *t; - int ret= 0, num_sessions, num_tracks, open_sessions= 0, session_idx= -1; + int num_sessions, num_tracks, open_sessions= 0, session_idx= -1; + off_t ret= 0; struct burn_session **sessions; struct burn_track **tracks; struct burn_toc_entry entry; @@ -1780,7 +1781,9 @@ int isoburn_toc_disc_get_sectors(struct isoburn_toc_disc *disc) } if(num_tracks > 0) { burn_track_get_entry(tracks[num_tracks - 1], &entry); - if(entry.extensions_valid & 1) + if(entry.extensions_valid & 8) + ret= entry.long_start_lba + entry.long_track_blocks; + else if(entry.extensions_valid & 1) ret= entry.start_lba + entry.track_blocks; } } @@ -1792,6 +1795,17 @@ int isoburn_toc_disc_get_sectors(struct isoburn_toc_disc *disc) } +int isoburn_toc_disc_get_sectors(struct isoburn_toc_disc *disc) +{ + off_t ret; + + ret= isoburn_toc_disc_get_sectors_v2(disc); + if(ret > 0x7fffffff) + return((int) 0x7fffffff); + return((int) ret); +} + + struct isoburn_toc_session **isoburn_toc_disc_get_sessions( struct isoburn_toc_disc *disc, int *num) { @@ -1806,10 +1820,11 @@ int isoburn_toc_disc_get_incmpl_sess(struct isoburn_toc_disc *disc) } -int isoburn_toc_session_get_sectors(struct isoburn_toc_session *s) +off_t isoburn_toc_session_get_sectors_v2(struct isoburn_toc_session *s) { struct isoburn_toc_entry *t; - int count= 0, i; + int i; + off_t count= 0; if(s==NULL) return(0); @@ -1820,11 +1835,22 @@ int isoburn_toc_session_get_sectors(struct isoburn_toc_session *s) t= t->next; } } else if(s->session!=NULL) - count= burn_session_get_sectors(s->session); + count= burn_session_get_sectors_v2(s->session); return(count); } +int isoburn_toc_session_get_sectors(struct isoburn_toc_session *s) +{ + off_t ret; + + ret= isoburn_toc_session_get_sectors_v2(s); + if(ret > 0x7fffffff) + return((int) 0x7fffffff); + return((int) ret); +} + + int isoburn_toc_entry_finish(struct burn_toc_entry *entry, int session_no, int track_no, int flag) { @@ -1896,8 +1922,9 @@ void isoburn_toc_track_get_entry(struct isoburn_toc_track *t, } -int isoburn_toc_track_get_emul(struct isoburn_toc_track *t, int *start_lba, - int *image_blocks, char volid[33], int flag) +int isoburn_toc_track_get_emul_v2(struct isoburn_toc_track *t, + off_t *start_lba, off_t *image_blocks, + char volid[33], int flag) { if(t->toc_entry == NULL) return(0); @@ -1911,6 +1938,32 @@ int isoburn_toc_track_get_emul(struct isoburn_toc_track *t, int *start_lba, } +int isoburn_toc_track_get_emul(struct isoburn_toc_track *t, int *start_lba, + int *image_blocks, char volid[33], int flag) +{ + int ret; + off_t long_lba, long_image_blocks; + + ret= isoburn_toc_track_get_emul_v2(t, &long_lba, &long_image_blocks, volid, + flag); + if(ret <= 0) + return(ret); + if(long_lba > 0x7fffffff) { + *start_lba= 0x7fffffff; + ret= 0; + } else { + *start_lba= long_lba; + } + if(long_image_blocks > 0x7fffffff) { + *image_blocks= 0x7fffffff; + ret= 0; + } else { + *image_blocks= long_image_blocks; + } + return(ret); +} + + void isoburn_toc_disc_free(struct isoburn_toc_disc *d) { if(d->disc!=NULL) diff --git a/libisoburn/libisoburn.h b/libisoburn/libisoburn.h index 3f0f2fe2..1e10a856 100644 --- a/libisoburn/libisoburn.h +++ b/libisoburn/libisoburn.h @@ -615,6 +615,11 @@ struct isoburn_toc_disc *isoburn_toc_drive_get_disc(struct burn_drive *d); */ int isoburn_toc_disc_get_sectors(struct isoburn_toc_disc *disc); +/** Like isoburn_toc_disc_get_sectors(), but with off_t return value. + @since 1.5.8 +*/ +off_t isoburn_toc_disc_get_sectors_v2(struct isoburn_toc_disc *disc); + /** Get the array of session handles and the number of complete sessions from the table of content. @@ -649,6 +654,11 @@ int isoburn_toc_disc_get_incmpl_sess(struct isoburn_toc_disc *disc); */ int isoburn_toc_session_get_sectors(struct isoburn_toc_session *s); +/** Like isoburn_toc_session_get_sectors(), but with off_t return value. + @since 1.5.8 +*/ +off_t isoburn_toc_session_get_sectors_v2(struct isoburn_toc_session *s); + /** Obtain a copy of the entry which describes the end of a particular session. Wrapper for: burn_session_get_leadout_entry() @@ -701,6 +711,12 @@ void isoburn_toc_track_get_entry(struct isoburn_toc_track *t, int isoburn_toc_track_get_emul(struct isoburn_toc_track *t, int *start_lba, int *image_blocks, char volid[33], int flag); +/** Like isoburn_toc_track_get_emul() but with off_t reply type. + @since 1.5.8 +*/ +int isoburn_toc_track_get_emul_v2(struct isoburn_toc_track *t, + off_t *start_lba, off_t *image_blocks, + char volid[33], int flag); /** Release the memory associated with a master handle of a medium. diff --git a/libisoburn/libisoburn.ver b/libisoburn/libisoburn.ver index 5f251474..da0b492a 100644 --- a/libisoburn/libisoburn.ver +++ b/libisoburn/libisoburn.ver @@ -363,3 +363,9 @@ Xorriso_stop_msg_watcher; local: *; }; +LIBISOBURN1_1.5.8 { +isoburn_toc_disc_get_sectors_v2; +isoburn_toc_session_get_sectors_v2; +isoburn_toc_track_get_emul_v2; +} LIBISOBURN1; + diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 272b8ca3..128e4817 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2024.03.09.180620" +#define Xorriso_timestamP "2024.03.09.183038"