Compare commits

..

21 Commits
1.0.4 ... 1.0.6

Author SHA1 Message Date
f61213abbf Documented changes and release timestamp 2011-04-08 18:45:32 +00:00
69dba03ef1 Updated cdrskin tarball generator 2011-04-08 18:44:18 +00:00
e031f94b40 Made number transition to 1.0.6 2011-04-08 18:33:16 +00:00
db4b367c28 Branching for libburn release 1.0.6 2011-04-08 17:53:45 +00:00
e86a7f9880 Better handling of read attempt on pseudo-drive without read-permission 2011-03-24 18:21:31 +00:00
9c9b82ae61 Avoiding appendable role 5 if not explicitely enabled 2011-03-22 08:59:43 +00:00
d5cc482015 Enabled blanking of drive with role 5 2011-03-21 09:22:04 +00:00
1f14074d59 Adjustments for drive role 5, random access write-only 2011-03-21 09:04:14 +00:00
d0c6889603 Corrected nwa computation for drive role 5 2011-03-21 09:02:58 +00:00
a088a85374 Silenced an error message with input that is not aligned to 2 kB 2011-03-19 22:21:35 +00:00
a3ac6c63aa Enabled BD formatting iby index on Pioneer BDR-205 which offers no Cert or QCert 2011-03-18 15:33:15 +00:00
af41742516 Provisory introduction of drive role 5, random access write-only 2011-03-18 09:33:54 +00:00
998fcdbefa Prepared cdrskin for drive role 5 2011-03-18 09:31:24 +00:00
ed811f45e6 Changed severity of "Read attempt on write-only drive" from FATAL to FAILURE 2011-03-13 19:26:30 +00:00
240e6abff4 Using burn_allow_drive_role_4() in cdrskin 2011-03-13 13:08:58 +00:00
402f4c0b04 New API call burn_allow_drive_role_4() 2011-03-13 13:07:46 +00:00
1b166f484d Burning DVD-R DAO with 2 kB size granularity rather than 32 kB 2011-03-12 09:35:04 +00:00
b945974dc7 Updated copyright year 2011-03-12 09:33:12 +00:00
cf214650c6 Documented changes and release timestamp 2011-03-10 13:44:40 +00:00
69ec9334d1 Updated cdrskin tarball generator 2011-03-10 13:43:32 +00:00
238fde4ef1 Made number transition to 1.0.5 2011-03-10 13:30:54 +00:00
24 changed files with 560 additions and 174 deletions

View File

@ -1,7 +1,7 @@
Derek Foreman <derek@signalmarketing.com> and Ben Jansens <xor@orodu.net>
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
Mario Danic <mario.danic@gmail.com>, Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006-2010 Mario Danic, Thomas Schmitt
Copyright (C) 2006-2011 Mario Danic, Thomas Schmitt
This program is free software; you can redistribute it and/or modify

View File

@ -1,6 +1,8 @@
SVN trunk (to become libburn-1.0.4.pl00.tar.gz)
libburn-1.0.6.pl00.tar.gz Sat Apr 9 2011
===============================================================================
- no novelties yet
* Burning DVD-R DAO with 2 kB size granularity rather than 32 kB
* New API call burn_allow_drive_role_4()
libburn-1.0.4.pl00.tar.gz Thu Mar 3 2011
===============================================================================

View File

@ -117,9 +117,9 @@ test_structest_CPPFLAGS = -Ilibburn
test_structest_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
test_structest_SOURCES = test/structest.c
## cdrskin construction site - ts A60816 - B10310
## cdrskin construction site - ts A60816 - B10409
cdrskin_cdrskin_CPPFLAGS = -Ilibburn
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_0_4
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_0_6
# cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
# ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking

14
README
View File

@ -11,7 +11,7 @@ Still containing parts of Libburn. By Derek Foreman <derek@signalmarketing.com>
and Ben Jansens <xor@orodu.net>
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
http://files.libburnia-project.org/releases/libburn-1.0.4.pl00.tar.gz
http://files.libburnia-project.org/releases/libburn-1.0.6.pl00.tar.gz
------------------------------------------------------------------------------
@ -19,10 +19,10 @@ Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
From tarball
Obtain libburn-1.0.4.pl00.tar.gz, take it to a directory of your choice and do:
Obtain libburn-1.0.6.pl00.tar.gz, take it to a directory of your choice and do:
tar xzf libburn-1.0.4.pl00.tar.gz
cd libburn-1.0.4
tar xzf libburn-1.0.6.pl00.tar.gz
cd libburn-1.0.6
./configure --prefix=/usr
make
@ -607,6 +607,12 @@ Project history as far as known to me:
Several bugs were fixed in the libraries and in the mkisofs emulation of
xorriso. This emulation xorrisofs has now an own man page and info document.
- Sat Apr 09 2011 release 1.0.6:
libburn refined its representation of emulated drives. The size alignment
of DVD DAO is now 2 kB rather than 32 kB. Libisofs produces Joliet names of
up to 103 characters. xorriso fixes two bugs and makes use of the library
improvements.
------------------------------------------------------------------------------

View File

@ -4,7 +4,7 @@
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
Integrated sub project of libburnia-project.org but also published via:
http://scdbackup.sourceforge.net/cdrskin_eng.html
http://scdbackup.sourceforge.net/cdrskin-1.0.4.pl00.tar.gz
http://scdbackup.sourceforge.net/cdrskin-1.0.6.pl00.tar.gz
Copyright (C) 2006-2011 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
Obtain cdrskin-1.0.4.pl00.tar.gz, take it to a directory of your choice and do:
Obtain cdrskin-1.0.6.pl00.tar.gz, take it to a directory of your choice and do:
tar xzf cdrskin-1.0.4.pl00.tar.gz
cd cdrskin-1.0.4
tar xzf cdrskin-1.0.6.pl00.tar.gz
cd cdrskin-1.0.6
Within that directory execute:

View File

@ -38,7 +38,7 @@ original="./libburn_svn_release.tgz"
# My changes are in $changes , mainly in $changes/cdrskin
changes="./libburn-release"
skin_release="1.0.4"
skin_release="1.0.6"
patch_level=".pl00"
skin_rev="$skin_release""$patch_level"

View File

@ -38,7 +38,7 @@ original="./libburn_svn.tgz"
# My changes are in $changes , mainly in $changes/cdrskin
changes="./libburn-develop"
skin_release="1.0.5"
skin_release="1.0.7"
patch_level=""
skin_rev="$skin_release""$patch_level"

View File

@ -88,7 +88,7 @@ or
/** The official program version */
#ifndef Cdrskin_prog_versioN
#define Cdrskin_prog_versioN "1.0.4"
#define Cdrskin_prog_versioN "1.0.6"
#endif
/** The official libburn interface revision to use.
@ -101,7 +101,7 @@ or
#define Cdrskin_libburn_minoR 0
#endif
#ifndef Cdrskin_libburn_micrO
#define Cdrskin_libburn_micrO 4
#define Cdrskin_libburn_micrO 6
#endif
@ -135,47 +135,43 @@ or
#endif /* Cdrskin_libburn_cvs_A60220_tS */
#ifdef Cdrskin_libburn_1_0_4
#define Cdrskin_libburn_versioN "1.0.4"
#ifdef Cdrskin_libburn_1_0_6
#define Cdrskin_libburn_versioN "1.0.6"
#define Cdrskin_libburn_from_pykix_svN 1
#endif /* Cdrskin_libburn_1_0_4 */
#endif /* Cdrskin_libburn_1_0_6 */
#ifdef Cdrskin_libburn_1_0_5
#define Cdrskin_libburn_versioN "1.0.5"
#ifdef Cdrskin_libburn_1_0_7
#define Cdrskin_libburn_versioN "1.0.7"
#define Cdrskin_libburn_from_pykix_svN 1
/* Place novelty switch macros here.
Move them down to Cdrskin_libburn_from_pykix_svN on version leap
*/
/* Do not stay in signal handler but only cancel and set Cdrskin_abort_leveL.
Make use of burn_is_aborting() to detect pending libburn aborts.
*/
#endif /* Cdrskin_libburn_1_0_5 */
#endif /* Cdrskin_libburn_1_0_7 */
#ifndef Cdrskin_libburn_versioN
#define Cdrskin_libburn_1_0_5
#define Cdrskin_libburn_versioN "1.0.5"
#define Cdrskin_libburn_1_0_7
#define Cdrskin_libburn_versioN "1.0.7"
#define Cdrskin_libburn_from_pykix_svN 1
#endif
#ifdef Cdrskin_libburn_1_0_4
#ifdef Cdrskin_libburn_1_0_6
#undef Cdrskin_libburn_majoR
#undef Cdrskin_libburn_minoR
#undef Cdrskin_libburn_micrO
#define Cdrskin_libburn_majoR 1
#define Cdrskin_libburn_minoR 0
#define Cdrskin_libburn_micrO 4
#define Cdrskin_libburn_micrO 6
#endif
#ifdef Cdrskin_libburn_1_0_5
#ifdef Cdrskin_libburn_1_0_7
#undef Cdrskin_libburn_majoR
#undef Cdrskin_libburn_minoR
#undef Cdrskin_libburn_micrO
#define Cdrskin_libburn_majoR 1
#define Cdrskin_libburn_minoR 0
#define Cdrskin_libburn_micrO 5
#define Cdrskin_libburn_micrO 7
#endif
@ -2221,6 +2217,7 @@ LIBBURN_MISCONFIGURATION_ = 0;
return(-1);
}
Cdrpreskin_set_severities(preskin,NULL,NULL,0);
burn_allow_drive_role_4(1);
return(1);
}
@ -4900,6 +4897,10 @@ int Cdrskin_checkdrive(struct CdrskiN *skin, char *profile_name, int flag)
printf("%s\n","Emulated (stdio-drive, 2k random read-write)");
else if(ret==3)
printf("%s\n","Emulated (stdio-drive, sequential write-only)");
else if(ret==4)
printf("%s\n","Emulated (stdio-drive, 2k random read-only)");
else if(ret == 5)
printf("%s\n","Emulated (stdio-drive, 2k random write-only)");
else if(ret!=1)
printf("%s\n","Emulated (stdio-drive)");
else

View File

@ -2,7 +2,7 @@
<HEAD>
<META NAME="description" CONTENT="cdrskin, a limited cdrecord compatibility wrapper for libburn">
<META NAME="keywords" CONTENT="cdrskin, libburn, libburnia, burn, CD, DVD, linux, recording, burning, CD-R, CD-RW, DVD-R, DVD-R DL, DVD-RW, DVD+RW, DVD+R, DVD+R DL, DVD-RAM, BD-RE, BD-R, cdrecord, compatible, scdbackup">
<META NAME="keywords" CONTENT="cdrskin, libburn, libburnia, burn, CD, DVD, BD, linux, recording, burning, CD-R, CD-RW, DVD-R, DVD-R DL, DVD-RW, DVD+RW, DVD+R, DVD+R DL, DVD-RAM, BD-RE, BD-R, cdrecord, compatible, scdbackup">
<META NAME="robots" CONTENT="follow">
<TITLE>cdrskin homepage english</TITLE>
</HEAD>
@ -65,7 +65,7 @@ connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
GPL software included:<BR>
</H2>
<DL>
<DT>libburn-1.0.4</DT>
<DT>libburn-1.0.6</DT>
<DD>(founded by Derek Foreman and Ben Jansens,
developed and maintained since August 2006 by
Thomas Schmitt from team of libburnia-project.org)
@ -200,7 +200,7 @@ Standalone ISO 9660 multi-session CD/DVD/BD tool
<P>
<DL>
<DT>Download as source code (see README):</DT>
<DD><A HREF="cdrskin-1.0.4.pl00.tar.gz">cdrskin-1.0.4.pl00.tar.gz</A>
<DD><A HREF="cdrskin-1.0.6.pl00.tar.gz">cdrskin-1.0.6.pl00.tar.gz</A>
(870 KB).
</DD>
<DD>
@ -250,18 +250,18 @@ cdrskin_0.4.2.pl00-x86-suse9_0-static.tar.gz</A>, (310 KB), -static compiled,
<HR>
<P>
Enhancements towards previous stable version cdrskin-1.0.2.pl00:
Enhancements towards previous stable version cdrskin-1.0.4.pl00:
<UL>
<LI>none</LI>
<LI>Burning DVD-R DAO with 2 kB size granularity rather than 32 kB</LI>
</LI>
<!--
<LI>none</LI>
-->
</UL>
Bug fixes towards cdrskin-1.0.2.pl00:
Bug fixes towards cdrskin-1.0.4.pl00:
<UL>
<LI>Read-only file descriptors were classified as write-only pseudo drives</LI>
<LI>none</LI>
<!--
<LI>none</LI>
-->
@ -271,8 +271,8 @@ Bug fixes towards cdrskin-1.0.2.pl00:
<P>
<DL>
<DT><H3>Development snapshot, version 1.0.5 :</H3></DT>
<DD>Enhancements towards current stable version 1.0.4.pl00:
<DT><H3>Development snapshot, version 1.0.7 :</H3></DT>
<DD>Enhancements towards current stable version 1.0.6.pl00:
<UL>
<LI>none yet</LI>
<!--
@ -282,7 +282,7 @@ Bug fixes towards cdrskin-1.0.2.pl00:
</UL>
</DD>
<DD>Bug fixes towards cdrskin-1.0.4.pl00:
<DD>Bug fixes towards cdrskin-1.0.6.pl00:
<UL>
<LI>none yet</LI>
<!--
@ -292,10 +292,10 @@ Bug fixes towards cdrskin-1.0.2.pl00:
</DD>
<DD>&nbsp;</DD>
<DD><A HREF="README_cdrskin_devel">README 1.0.5</A>
<DD><A HREF="cdrskin__help_devel">cdrskin-1.0.5 --help</A></DD>
<DD><A HREF="cdrskin_help_devel">cdrskin-1.0.5 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.0.5)</A></DD>
<DD><A HREF="README_cdrskin_devel">README 1.0.7</A>
<DD><A HREF="cdrskin__help_devel">cdrskin-1.0.7 --help</A></DD>
<DD><A HREF="cdrskin_help_devel">cdrskin-1.0.7 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.0.7)</A></DD>
<DD>&nbsp;</DD>
<DT>Maintainers of cdrskin unstable packages please use SVN of
<A HREF="http://libburnia-project.org"> libburnia-project.org</A></DT>
@ -315,7 +315,7 @@ admins with full system souvereignty.</DT>
<A HREF="README_cdrskin_devel">upcoming README</A> ):
</DD>
<DD>
<A HREF="cdrskin-1.0.5.tar.gz">cdrskin-1.0.5.tar.gz</A>
<A HREF="cdrskin-1.0.7.tar.gz">cdrskin-1.0.7.tar.gz</A>
(870 KB).
</DD>

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2011.03.10.080001"
#define Cdrskin_timestamP "2011.04.08.180001"

View File

@ -9240,7 +9240,7 @@ Made number transition to 1.0.4
+ cdrskin/add_ts_changes_to_libburn_1_0_5
Updated cdrskin tarball generator
[]
10 Mar 2011 [3653]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
@ -9248,8 +9248,149 @@ Documented changes and release timestamp
------------------------------ release - cdrskin-1.0.4.pl00 - 2011.03.10.080001
* Bug fix: Read-only file descriptors were classified as write-only pseudo drives
------------------------------------ cycle - cdrskin-1.0.5 -
------------------------------------ cycle - cdrskin-1.0.5 -
2011.03.10.132603 [3657]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 1.0.5
10 Mar 2011 [3659]
- cdrskin/add_ts_changes_to_libburn_1_0_2
- cdrskin/add_ts_changes_to_libburn_1_0_3
+ cdrskin/add_ts_changes_to_libburn_1_0_4
+ cdrskin/add_ts_changes_to_libburn_1_0_5
Updated cdrskin tarball generator
10 Mar 2011 [3660]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
10 Mar 2011 [3658]
svn move -m libburn release 1.0.4 is ready
http://svn.libburnia-project.org/libburn/branches/1.0.4
http://svn.libburnia-project.org/libburn/tags/1.0.4
------------------------------------ cycle - cdrskin-1.0.5 - 2011.03.10.132603
12 Mar 2011 [3664]
COPYRIGHT
Updated copyright year
2011.03.12.093520 [3665]
libburn/write.c
libburn/mmc.c
Burning DVD-R DAO with 2 kB size granularity rather than 32 kB
2011.03.13.130746 [3666]
libburn/libburn.h
libburn/init.c
libburn/drive.c
libburn/async.c
libburn/write.c
libburn/libdax_msgs.h
libburn/libburn.ver
New API call burn_allow_drive_role_4()
2011.03.13.130850 [3667]
cdrskin/cdrskin.c
Using burn_allow_drive_role_4() in cdrskin
2011.03.13.192627 [3671]
libburn/read.c
libburn/libdax_msgs.h
Changed severity of "Read attempt on write-only drive" from FATAL to FAILURE
2011.03.18.093128 [3672]
cdrskin/cdrskin.c
Prepared cdrskin for drive role 5
2011.03.18.093410 [3673]
libburn/transport.h
libburn/drive.c
libburn/async.c
libburn/write.c
libburn/read.c
libburn/libdax_msgs.h
Provisory introduction of drive role 5, random access write-only
2011.03.18.153326 [3674]
libburn/async.c
libburn/mmc.c
Enabled BD formatting by index on Pioneer BDR-205 which offers no Cert or QCert
2011.03.19.222152 [3675]
libburn/sector.c
Silenced an error message with input that is not aligned to 2 kB
2011.03.21.090313 [3676]
libburn/drive.c
Corrected nwa computation for drive role 5
2011.03.21.090430 [3677]
libburn/write.c
Adjustments for drive role 5, random access write-only
2011.03.21.092220 [3678]
libburn/async.c
Enabled blanking of drive with role 5
2011.03.22.085956 [3685]
libburn/libburn.h
libburn/init.c
libburn/drive.c
Avoiding appendable role 5 if not explicitely enabled
2011.03.24.182148 [3687]
libburn/libburn.h
libburn/read.c
libburn/libdax_msgs.h
Better handling of read attempt on pseudo-drive without read-permission
8 Apr 2011 [3712]
svn copy -m Branching for libburn release 1.0.6
http://svn.libburnia-project.org/libburn/trunk
http://svn.libburnia-project.org/libburn/branches/1.0.6
2011.04.08.180001 [3713]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 1.0.6
08 Apr 2011 [3714]
- cdrskin/add_ts_changes_to_libburn_1_0_4
- cdrskin/add_ts_changes_to_libburn_1_0_5
+ cdrskin/add_ts_changes_to_libburn_1_0_6
+ cdrskin/add_ts_changes_to_libburn_1_0_7
Updated cdrskin tarball generator
[]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
------------------------------ release - cdrskin-1.0.6.pl00 - 2011.04.08.180001
* Burning DVD-R DAO with 2 kB size granularity rather than 32 kB
* New API call burn_allow_drive_role_4()
------------------------------------ cycle - cdrskin-1.0.7 -
------------------------------------ cycle - cdrskin-1.0.7 -
@ -9262,10 +9403,8 @@ Important: When adding a public API function then add its name to file
TODO
===============================================================================
Introduce drive role 4= stdio-drive, random access, read-only
Let DVD-R DAO allocate exact track sizes (not divisible by 16 blocks)
Throw out old burn_print() calls
Expose BD type from bytes 8+4 to 10+4 out of READ BD STRUCTURE form 0.

View File

@ -8,7 +8,7 @@ debug_opts="-O2"
def_opts=
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
fifo_opts=""
libvers="-DCdrskin_libburn_1_0_4"
libvers="-DCdrskin_libburn_1_0_6"
# To be used if Makefile.am uses libburn_libburn_la_CFLAGS
# burn="libburn/libburn_libburn_la-"
@ -47,15 +47,15 @@ do
libdax_audioxtr_o=
libdax_msgs_o="$burn"message.o
cleanup_src_or_obj="-DCleanup_has_no_libburn_os_H cdrskin/cleanup.c"
elif test "$i" = "-libburn_1_0_4"
elif test "$i" = "-libburn_1_0_6"
then
libvers="-DCdrskin_libburn_1_0_4"
libvers="-DCdrskin_libburn_1_0_6"
libdax_audioxtr_o="$burn"libdax_audioxtr.o
libdax_msgs_o="$burn"libdax_msgs.o
cleanup_src_or_obj="$burn"cleanup.o
elif test "$i" = "-libburn_svn"
then
libvers="-DCdrskin_libburn_1_0_5"
libvers="-DCdrskin_libburn_1_0_7"
libdax_audioxtr_o="$burn"libdax_audioxtr.o
libdax_msgs_o="$burn"libdax_msgs.o
cleanup_src_or_obj="$burn"cleanup.o
@ -109,7 +109,7 @@ do
echo "Options:"
echo " -compile_cdrfifo compile program cdrskin/cdrfifo."
echo " -compile_dewav compile program test/dewav without libburn."
echo " -libburn_1.0.4 set macro to match libburn-1.0.4"
echo " -libburn_1_0_6 set macro to match libburn-1.0.6"
echo " -libburn_svn set macro to match current libburn-SVN."
echo " -dvd_obs_64k 64 KB default size for DVD/BD writing."
echo " -use_libcdio link with -lcdio because libburn uses it."

View File

@ -1,4 +1,4 @@
AC_INIT([libburn], [1.0.4], [http://libburnia-project.org])
AC_INIT([libburn], [1.0.6], [http://libburnia-project.org])
AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h])
@ -9,7 +9,7 @@ LIBBURNIA_SET_FLAGS
AM_INIT_AUTOMAKE([subdir-objects])
dnl Notes by ts A71207 - B10310 :
dnl Notes by ts A71207 - B10409 :
dnl
dnl Regrettably the meaning of the various version types was misunderstood
dnl before version 0.4.1.
@ -89,6 +89,7 @@ dnl 0.9.0 = libburn.so.4.55.0
dnl 1.0.0 = libburn.so.4.57.0
dnl 1.0.2 = libburn.so.4.59.0
dnl 1.0.4 = libburn.so.4.61.0
dnl 1.0.6 = libburn.so.4.63.0
dnl
dnl So LT_CURRENT, LT_REVISION and LT_AGE get set directly here.
dnl SONAME of the emerging library is LT_CURRENT - LT_AGE.
@ -114,7 +115,7 @@ dnl
dnl As said: Only copies. Original in libburn/libburn.h : burn_header_version_*
BURN_MAJOR_VERSION=1
BURN_MINOR_VERSION=0
BURN_MICRO_VERSION=4
BURN_MICRO_VERSION=6
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
AC_SUBST(BURN_MAJOR_VERSION)
@ -125,14 +126,14 @@ AC_SUBST(BURN_VERSION)
dnl Libtool versioning
LT_RELEASE=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
dnl
dnl This is the release version libburn-1.0.4
dnl This is the release version libburn-1.0.6
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 happened meanwhile.
dnl
dnl SONAME = 65 - 61 = 4 . Linux library name = libburn.so.4.61.0
LT_CURRENT=65
LT_AGE=61
dnl SONAME = 67 - 63 = 4 . Linux library name = libburn.so.4.63.0
LT_CURRENT=67
LT_AGE=63
LT_REVISION=0
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`

View File

@ -383,7 +383,9 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
/* ts A70909 : the willingness to burn any BURN_DISC_FULL media is
inappropriate. One would rather need a -force option
Note: keep this in sync with mmc_read_disc_info() */
if ((drive->current_profile != 0x0a &&
/* ts B10321 : Allowed role 5 to be blanked */
if ((drive->drive_role == 1 &&
drive->current_profile != 0x0a &&
drive->current_profile != 0x13 &&
drive->current_profile != 0x14 &&
drive->status != BURN_DISC_FULL)
@ -392,7 +394,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
drive->status != BURN_DISC_APPENDABLE &&
drive->status != BURN_DISC_BLANK)
||
(drive->drive_role != 1)
(drive->drive_role != 1 && drive->drive_role != 5)
) {
libdax_msgs_submit(libdax_messenger, drive->global_index,
0x00020130,
@ -517,42 +519,6 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag)
return;
}
if ((flag & 6) != 6 || (flag & 128)) {
if ((flag & 64) && !(drive->current_feat23h_byte4 & 2)) {
if (drive->current_feat23h_byte4 & 1) {
libdax_msgs_submit(libdax_messenger,
drive->global_index, 0x00020165,
LIBDAX_MSGS_SEV_WARNING,
LIBDAX_MSGS_PRIO_HIGH,
"Drive does not support fast formatting",
0, 0);
flag &= ~64;
} else {
no_non_default_bd_re:;
libdax_msgs_submit(libdax_messenger,
drive->global_index, 0x00020167,
LIBDAX_MSGS_SEV_SORRY,
LIBDAX_MSGS_PRIO_HIGH,
"Drive does not support non-default formatting",
0, 0);
drive->cancel = 1;
return;
}
}
if ((!(flag & 64)) && !(drive->current_feat23h_byte4 & 1)){
if (drive->current_feat23h_byte4 & 2) {
libdax_msgs_submit(libdax_messenger,
drive->global_index, 0x00020166,
LIBDAX_MSGS_SEV_WARNING,
LIBDAX_MSGS_PRIO_HIGH,
"Drive does not support full formatting",
0, 0);
flag |= 64;
} else
goto no_non_default_bd_re;
}
}
}
if (!ok) {
@ -659,6 +625,14 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
"Drive is a virtual placeholder (null-drive)", 0, 0);
return;
}
if (d->drive_role == 4) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020181,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Pseudo-drive is a read-only file. Cannot write.",
0, 0);
return;
}
/* ts A61007 : obsolete Assert in spc_select_write_params() */
if (d->drive_role == 1 && d->mdata->valid <= 0) {

View File

@ -60,6 +60,10 @@ static int drivetop = -1;
/* ts A80410 : in init.c */
extern int burn_support_untested_profiles;
/* ts B10312 : in init.c */
extern int burn_drive_role_4_allowed;
/* ts A61021 : the unspecific part of sg.c:enumerate_common()
*/
int burn_setup_drive(struct burn_drive *d, char *fname)
@ -74,6 +78,7 @@ int burn_setup_drive(struct burn_drive *d, char *fname)
d->status = BURN_DISC_UNREADY;
d->do_stream_recording = 0;
d->stream_recording_start= 0;
d->role_5_nwa = 0;
return 1;
}
@ -308,8 +313,9 @@ int burn_drive_inquire_media(struct burn_drive *d)
int burn_drive_grab(struct burn_drive *d, int le)
{
int errcode;
/* ts A61125 - A61202 */
int ret, sose;
/* ts A61125 - B10314 */
int ret, sose, stat_ret = -1;
struct stat stbuf;
if (!d->released) {
burn_print(1, "can't grab - already grabbed\n");
@ -317,9 +323,24 @@ int burn_drive_grab(struct burn_drive *d, int le)
}
if(d->drive_role != 1) {
d->released = 0;
d->current_profile = 0xffff;
if (d->devname[0])
stat_ret = stat(d->devname, &stbuf);
if(d->drive_role == 2 || d->drive_role == 3) {
d->status = BURN_DISC_BLANK;
d->current_profile = 0xffff;
} else if(d->drive_role == 4) {
if (d->media_read_capacity > 0)
d->status = BURN_DISC_FULL;
else
d->status = BURN_DISC_EMPTY;
} else if(d->drive_role == 5) {
if (stat_ret != -1 && S_ISREG(stbuf.st_mode) &&
stbuf.st_size > 0) {
d->status = BURN_DISC_APPENDABLE;
d->role_5_nwa = stbuf.st_size / 2048 +
!!(stbuf.st_size % 2048);
} else
d->status = BURN_DISC_BLANK;
} else {
d->status = BURN_DISC_EMPTY;
d->current_profile = 0;
@ -616,13 +637,29 @@ void burn_wait_all(void)
void burn_disc_erase_sync(struct burn_drive *d, int fast)
{
/* ts A60924 : libburn/message.c gets obsoleted
burn_message_clear_queue();
*/
int ret;
burn_print(1, "erasing drive %s %s\n", d->idata->vendor,
d->idata->product);
if (d->drive_role == 5) { /* Random access write-only drive */
ret = truncate(d->devname, (off_t) 0);
if (ret == -1) {
libdax_msgs_submit(libdax_messenger, -1,
0x00020182,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Cannot truncate disk file for pseudo blanking",
0, 0);
return;
}
d->role_5_nwa = 0;
d->cancel = 0;
d->status = BURN_DISC_BLANK;
d->busy = BURN_DRIVE_IDLE;
d->progress.sector = 0x10000;
return;
}
d->cancel = 0;
#ifdef Libburn_reset_progress_asynC
@ -1361,6 +1398,7 @@ int burn_drive__fd_from_special_adr(char *adr)
}
/* @param flag bit0= accept read-only files and return 2 in this case
bit1= accept write-only files and return 3 in this case
*/
static int burn_drive__is_rdwr(char *fname, int *stat_ret,
struct stat *stbuf_ret,
@ -1386,6 +1424,7 @@ static int burn_drive__is_rdwr(char *fname, int *stat_ret,
read_size = (off_t) 0x7ffffff0 * (off_t) 2048;
}
}
if (is_rdwr && fd >= 0) {
getfl_ret = fcntl(fd, F_GETFL);
@ -1400,6 +1439,9 @@ fprintf(stderr, "LIBBURN_DEBUG: burn_drive__is_rdwr: getfl_ret = %lX , O_RDWR =
if ((flag & 1) && getfl_ret != -1 &&
(getfl_ret & mask) == O_RDONLY)
is_rdwr = 2;
if ((flag & 2) && getfl_ret != -1 &&
(getfl_ret & mask) == O_WRONLY)
is_rdwr = 3;
}
if (stat_ret != NULL)
*stat_ret = st_ret;
@ -1411,22 +1453,52 @@ fprintf(stderr, "LIBBURN_DEBUG: burn_drive__is_rdwr: getfl_ret = %lX , O_RDWR =
}
static int burn_role_by_access(char *fname, int flag)
{
/* We normally need _LARGEFILE64_SOURCE defined by the build system.
Nevertheless the system might use large address integers by default.
*/
#ifndef O_LARGEFILE
#define O_LARGEFILE 0
#endif
int fd;
fd = open(fname, O_RDWR | O_LARGEFILE);
if (fd != -1) {
close(fd);
return 2;
}
fd = open(fname, O_RDONLY | O_LARGEFILE);
if (fd != -1) {
close(fd);
return 4;
}
fd = open(fname, O_WRONLY | O_LARGEFILE);
if (fd != -1) {
close(fd);
return 5;
}
if (flag & 1)
return 0;
return 2;
}
/* ts A70903 : Implements adquiration of pseudo drives */
int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
{
int ret = -1, role = 0;
int is_rdwr = 0, stat_ret;
int ret = -1, role = 0, fd;
int is_rdwr = 0, stat_ret = -1;
/* divided by 512 it needs to fit into a signed long integer */
off_t size = ((off_t) (512 * 1024 * 1024 - 1) * (off_t) 2048);
off_t read_size = -1;
struct burn_drive *d= NULL, *regd_d;
struct stat stbuf;
static int allow_role_3 = 1;
if (fname[0] != 0) {
fd = burn_drive__fd_from_special_adr(fname);
is_rdwr = burn_drive__is_rdwr(fname, &stat_ret, &stbuf,
&read_size, 1);
&read_size, 1 | 2);
if (stat_ret == -1 || is_rdwr) {
ret = burn_os_stdio_capacity(fname, &size);
if (ret == -1) {
@ -1445,22 +1517,21 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
return 0;
}
if (fname[0] != 0) {
/* >>> as soon as new role 4 is introduced:
if (is_rdwr == 2) role = 4; else
*/
role = 2;
if (is_rdwr == 2 &&
(burn_drive_role_4_allowed & 1))
role = 4;
else if (is_rdwr == 3 &&
(burn_drive_role_4_allowed & 1))
role = 5;
else
role = 2;
if (stat_ret != -1 && role == 2 && fd == -1 &&
(burn_drive_role_4_allowed & 3) == 3)
role = burn_role_by_access(fname,
!!(burn_drive_role_4_allowed & 4));
} else
role = 0;
} else {
if(S_ISDIR(stbuf.st_mode) || !allow_role_3) {
libdax_msgs_submit(libdax_messenger, -1,
0x00020149,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"Unsuitable filetype for pseudo-drive", 0, 0);
return 0;
}
role = 3;
}
}
@ -1481,22 +1552,39 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
}
free((char *) d); /* all sub pointers have been copied to *regd_d */
d = regd_d;
if (d->drive_role == 2 || d->drive_role == 3) {
d->status = BURN_DISC_BLANK;
if (d->drive_role >= 2 && d->drive_role <= 5) {
if (d->drive_role == 4) {
if (read_size > 0)
d->status = BURN_DISC_FULL;
else
d->status = BURN_DISC_EMPTY;
d->block_types[BURN_WRITE_TAO] = 0;
d->block_types[BURN_WRITE_SAO] = 0;
} else {
if (d->drive_role == 5 && stat_ret != -1 &&
S_ISREG(stbuf.st_mode) && stbuf.st_size > 0 &&
(burn_drive_role_4_allowed & 8)) {
d->status = BURN_DISC_APPENDABLE;
d->block_types[BURN_WRITE_SAO] = 0;
d->role_5_nwa = stbuf.st_size / 2048 +
!!(stbuf.st_size % 2048);
} else {
d->status = BURN_DISC_BLANK;
d->block_types[BURN_WRITE_SAO] =
BURN_BLOCK_SAO;
d->role_5_nwa = 0;
}
d->block_types[BURN_WRITE_TAO] = BURN_BLOCK_MODE1;
}
d->current_profile = 0xffff; /* MMC for non-compliant drive */
strcpy(d->current_profile_text,"stdio file");
d->current_is_cd_profile = 0;
d->current_is_supported_profile = 1;
d->block_types[BURN_WRITE_TAO] = BURN_BLOCK_MODE1;
d->block_types[BURN_WRITE_SAO] = BURN_BLOCK_SAO;
if (read_size >= 0)
/* despite its name : last valid address, not size */
d->media_read_capacity =
read_size / 2048 - !(read_size % 2048);
burn_drive_set_media_capacity_remaining(d, size);
/* >>> ? open file for a test ? (>>> beware of "-" = stdin) */;
} else
d->current_profile = 0; /* Drives return this if empty */
@ -1515,6 +1603,14 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
strcpy((*drive_infos)[0].vendor,"YOYODYNE");
strcpy((*drive_infos)[0].product,"BLACKHOLE");
strcpy((*drive_infos)[0].revision,"FX02");
} else if (d->drive_role == 4) {
strcpy((*drive_infos)[0].vendor,"YOYODYNE");
strcpy((*drive_infos)[0].product,"WARP DRIVE");
strcpy((*drive_infos)[0].revision,"FX03");
} else if (d->drive_role == 5) {
strcpy((*drive_infos)[0].vendor,"YOYODYNE");
strcpy((*drive_infos)[0].product,"WARP DRIVE");
strcpy((*drive_infos)[0].revision,"FX04");
} else {
strcpy((*drive_infos)[0].vendor,"FERENGI");
strcpy((*drive_infos)[0].product,"VAPORWARE");
@ -2146,6 +2242,11 @@ int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
return -1;
}
*lba = *nwa = 0;
if (d->drive_role == 5 && trackno == 0 &&
d->status == BURN_DISC_APPENDABLE) {
*lba = *nwa = d->role_5_nwa;
return 1;
}
if (d->drive_role != 1)
return 0;
if (o != NULL)
@ -2448,7 +2549,7 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
o->current_is_cd_profile = d->current_is_cd_profile;
o->might_simulate = 0;
if (d->drive_role == 0)
if (d->drive_role == 0 || d->drive_role == 4)
return 0;
if (d->drive_role == 2) {
/* stdio file drive : random access read-write */
@ -2456,12 +2557,39 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
size = d->media_capacity_remaining;
burn_os_stdio_capacity(d->devname, &size);
burn_drive_set_media_capacity_remaining(d, size);
/* >>> This looks wrong ! */
/* >>> should add file size */
o->start_range_high = size;
o->start_alignment = 2048; /* imposting a drive, not a file */
o->might_do_sao = 4;
o->might_do_tao = 2;
o->advised_write_mode = BURN_WRITE_TAO;
o->might_simulate = 1;
} else if (d->drive_role == 5) {
/* stdio file drive : random access write-only */
o->start_adr = 1;
size = d->media_capacity_remaining;
burn_os_stdio_capacity(d->devname, &size);
burn_drive_set_media_capacity_remaining(d, size);
/* >>> start_range_low = file size rounded to 2048 */;
/* >>> This looks wrong ! */
/* >>> should add file size */
o->start_range_high = size;
o->start_alignment = 2048; /* imposting a drive, not a file */
if (s == BURN_DISC_APPENDABLE) {
if (wt == BURN_WRITE_SAO || wt == BURN_WRITE_RAW)
return 0;
o->might_do_sao = 0;
} else
o->might_do_sao = 4;
o->might_do_tao = 2;
o->advised_write_mode = BURN_WRITE_TAO;
o->might_simulate = 1;
} else if (d->drive_role != 1) {
/* stdio file drive : sequential access write-only */
o->might_do_sao = 4;
@ -2710,16 +2838,20 @@ int burn_drive_equals_adr(struct burn_drive *d1, char *adr2_in, int role2)
fd = burn_drive__fd_from_special_adr(adr2);
if (fd != -1)
exact_role_matters = 1;
ret = burn_drive__is_rdwr(adr2, NULL, NULL, NULL, 1);
/* >>> as soon as new role 4 is introduced:
if (ret == 2) role2 = 4; else
*/
if (ret == 1)
ret = burn_drive__is_rdwr(adr2, NULL, NULL, NULL,
1 | 2);
if (ret == 2 && (burn_drive_role_4_allowed & 1))
role2 = 4;
else if (ret == 3 && (burn_drive_role_4_allowed & 1))
role2 = 5;
else if (ret > 0)
role2 = 2;
else
role2 = 3;
if (fd == -1 &&
role2 == 2 && (burn_drive_role_4_allowed & 3) == 3)
role2 = burn_role_by_access(adr2,
!!(burn_drive_role_4_allowed & 4));
}
}

View File

@ -105,6 +105,14 @@ int burn_support_untested_profiles = 0;
*/
int burn_sg_log_scsi = 0;
/* ts B10312 :
Whether to map random-access readonly files to drive role 4.
Else it is role 2 overwriteable drive
*/
int burn_drive_role_4_allowed = 0;
/* ts A60925 : ticket 74 */
/** Create the messenger object for libburn. */
int burn_msgs_initialize(void)
@ -565,3 +573,10 @@ void burn_set_scsi_logging(int flag)
{
burn_sg_log_scsi = flag & 7;
}
/* ts B10312 API */
void burn_allow_drive_role_4(int allowed)
{
burn_drive_role_4_allowed = (allowed & 0xf);
}

View File

@ -1448,6 +1448,8 @@ void burn_read_opts_free(struct burn_read_opts *opts);
cancellable, as control of the operation is passed wholly to the drive and
there is no way to interrupt it safely.
@param drive The drive with which to erase a disc.
Only drive roles 1 (MMC) and 5 (stdio random write-only)
support erasing.
@param fast Nonzero to do a fast erase, where only the disc's headers are
erased; zero to erase the entire disc.
With DVD-RW, fast blanking yields media capable only of DAO.
@ -2692,7 +2694,7 @@ void burn_version(int *major, int *minor, int *micro);
*/
#define burn_header_version_major 1
#define burn_header_version_minor 0
#define burn_header_version_micro 4
#define burn_header_version_micro 6
/** Note:
Above version numbers are also recorded in configure.ac because libtool
wants them as parameters at build time.
@ -2996,15 +2998,20 @@ int burn_get_read_capacity(struct burn_drive *d, int *capacity, int flag);
bit0= - reserved -
bit1= do not submit error message if read error
bit2= on error do not try to read a second time
with single block steps. @since 0.5.2
with single block steps.
@since 0.5.2
bit3= return -2 on permission denied error rather than
issueing a warning message.
@since 1.0.6
@return 1=sucessful , <=0 an error occured
with bit3: -2= permission denied error
@since 0.4.0
*/
int burn_read_data(struct burn_drive *d, off_t byte_address,
char data[], off_t data_size, off_t *data_count, int flag);
/* A70904 */
/* ts A70904 */
/** Inquire whether the drive object is a real MMC drive or a pseudo-drive
created by a stdio: address.
@param d The drive to inquire
@ -3012,11 +3019,47 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
1= real MMC drive
2= stdio-drive, random access, read-write
3= stdio-drive, sequential, write-only
4= stdio-drive, random access, read-only
(only if enabled by burn_allow_drive_role_4())
@since 0.4.0
*/
int burn_drive_get_drive_role(struct burn_drive *d);
/* ts B10312 */
/** Allow drive role 4 "random access read-only"
and drive role 5 "random access write-only".
By default a random access file assumes drive role 2 "read-write"
regardless whether it is actually readable or writeable.
If enabled, random-access file objects which recognizably allow no
writing will be classified as role 4 and those which allow no reading
will get role 5.
Candidates are drive addresses of the form stdio:/dev/fd/# , where # is
the integer number of an open file descriptor. If this descriptor was
opened read-only resp. write-only, then it gets role 4 resp. role 5.
Other paths may get tested by an attempt to open them for read-write
(role 2) resp. read-only (role 4) resp. write-only (role 5). See bit1.
@param allowed Bitfield for control purposes:
bit0= Enable roles 4 and 5 for drives which get
aquired after this call
bit1= with bit0:
Test whether the file can be opened for
read-write resp. read-only resp. write-only.
Classify as roles 2 resp. 4 resp. 5.
bit2= with bit0 and bit1:
Classify files which cannot be opened at all
as role 0 : useless dummy.
Else classify as role 2.
bit3= Classify non-empty role 5 drives as
BURN_DISC_APPENDABLE with Next Writeable Address
after the end of the file. It is nevertheless
possible to change this address by call
burn_write_opts_set_start_byte().
@since 1.0.6
*/
void burn_allow_drive_role_4(int allowed);
/* ts A70923 */
/** Find out whether a given address string would lead to the given drive
object. This should be done in advance for track source addresses

View File

@ -2,6 +2,7 @@ LIBBURN4 {
global:
burn_abort;
burn_abort_pacifier;
burn_allow_drive_role_4;
burn_allow_untested_profiles;
burn_disc_add_session;
burn_disc_available_space;

View File

@ -519,7 +519,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
0x0002014d (SORRY,HIGH) = Asynchromous SCSI error
0x0002014f (SORRY,HIGH) = Timeout with asynchromous SCSI command
0x00020150 (DEBUG,LOW) = Reporting asynchronous waiting time
0x00020151 (FATAL,HIGH) = Read attempt on write-only drive
0x00020151 (FAILURE,HIGH) = Read attempt on write-only drive
0x00020152 (FATAL,HIGH) = Cannot start fifo thread
0x00020153 (SORRY,HIGH) = Read error on fifo input
0x00020154 (NOTE,HIGH) = Forwarded input error ends output
@ -566,6 +566,9 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
0x0002017e (FAILURE,HIGH) = Failed to close track, session, or disc
0x0002017f (FAILURE,HIGH) = Failed to synchronize drive cache
0x00020180 (FAILURE,HIGH) = Premature end of input encountered
0x00020181 (FAILURE,HIGH) = Pseudo-drive is a read-only file. Cannot write.
0x00020182 (FAILURE,HIGH) = Cannot truncate disk file for pseudo blanking
0x00020183 (WARNING,HIGH) = Failed to open device (a pseudo-drive) for reading
libdax_audioxtr:
0x00020200 (SORRY,HIGH) = Cannot open audio source file

View File

@ -347,9 +347,10 @@ int mmc_reserve_track(struct burn_drive *d, off_t size)
memcpy(c.opcode, MMC_RESERVE_TRACK, sizeof(MMC_RESERVE_TRACK));
*/
c.retry = 1;
/* Round to 32 KiB and divide by 2048
(by nice binary rounding trick learned from dvd+rw-tools) */
lba = ((size + (off_t) 0x7fff) >> 11) & ~0xf;
lba = size / 2048;
if (size % 2048)
lba++;
mmc_int_to_four_char(c.opcode+5, lba);
sprintf(msg, "reserving track of %d blocks", lba);
@ -3113,12 +3114,23 @@ selected_not_suitable:;
c.page->data[9 + i] =
( d->format_descriptors[index].tdp >>
(16 - 8 * i)) & 0xff;
if (format_type == 0x30 || format_type == 0x31 ||
format_type == 0x32) {
if (flag & 64)
format_sub_type = 3; /* Quick certification */
if (format_type == 0x30 || format_type == 0x31) {
format_sub_type = 0;
if (flag & 64) {
if (d->current_feat23h_byte4 & 2)
/* Quick certification */
format_sub_type = 3;
} else {
if (d->current_feat23h_byte4 & 1)
/* Full certification */
format_sub_type = 2;
}
} else if (format_type == 0x32 ||
(format_type == 0x00 && d->current_profile == 0x41)) {
if (flag & (1 << 16))
format_sub_type = 0; /* SRM + POW */
else
format_sub_type = 2; /* Full certification */
format_sub_type = 1; /* SRM (- POW) */
}
if (d->current_profile == 0x12 && format_type !=0x01 &&
(flag & 64)) {

View File

@ -373,7 +373,7 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
} else if (d->drive_role == 3) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020151,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Read attempt on write-only drive", 0, 0);
return 0;
}
@ -423,22 +423,35 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
d->stdio_fd = fd =
open(d->devname, O_RDONLY | O_LARGEFILE);
if (fd == -1) {
if (errno != ENOENT || !(flag & 2))
if (errno == EACCES && (flag & 2)) {
if (!(flag & 8))
libdax_msgs_submit(libdax_messenger,
d->global_index, 0x00020183,
LIBDAX_MSGS_SEV_WARNING,
LIBDAX_MSGS_PRIO_HIGH,
"Failed to open device (a pseudo-drive) for reading",
errno, 0);
} else if (errno!= ENOENT || !(flag & 2))
libdax_msgs_submit(libdax_messenger,
d->global_index,
0x00020005,
d->global_index, 0x00020005,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"Failed to open device (a pseudo-drive) for reading",
errno, 0);
ret = 0; goto ex;
ret = 0;
if (errno == EACCES && (flag & 8))
ret= -2;
goto ex;
}
if (lseek(fd, byte_address, SEEK_SET) == -1) {
if (!(flag & 2))
if (!(flag & 2)) {
sprintf(msg, "Cannot address start byte %.f",
(double) byte_address);
libdax_msgs_submit(libdax_messenger,
d->global_index,
0x00020147,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"Cannot address start byte", errno, 0);
msg, errno, 0);
}
ret = 0; goto ex;
}
}

View File

@ -182,7 +182,8 @@ static void get_bytes(struct burn_track *track, int count, unsigned char *data)
/* ts A61031 - B10103 */
if (shortage >= count)
track->track_data_done = 1;
if (track->end_on_premature_eoi && !track->open_ended) {
if (track->end_on_premature_eoi && shortage >= count &&
!track->open_ended) {
char msg[80];
/* Memorize that premature end of input happened */
sprintf(msg,

View File

@ -134,6 +134,8 @@ struct burn_drive
1=MMC drive ,
2=stdio random read-write
3=stdio sequential write-only
4=stdio random read-only
5=stdio random write-only
*/
int drive_role;
@ -285,6 +287,9 @@ struct burn_drive
0x7fffffff = unknown */
int media_read_capacity;
/* ts B10314 : Next Writeable Adress for drive_role == 5 */
int role_5_nwa;
int toc_temp;
struct burn_disc *disc; /* disc structure */
int block_types[4];

View File

@ -1005,9 +1005,12 @@ int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc,
reason_pt= reasons;
reasons[0] = 0;
if (d->drive_role == 0) {
sprintf(reasons,
"DRIVE: is a virtual placeholder (null-drive)");
if (d->drive_role == 0 || d->drive_role == 4) {
if (d->drive_role == 0)
sprintf(reasons,
"DRIVE: is a virtual placeholder (null-drive)");
else
sprintf(reasons, "DRIVE: read-only pseudo drive");
no_media = 1;
goto ex;
}
@ -1024,7 +1027,7 @@ int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc,
reason_pt= reasons + strlen(reasons);
if (d->status == BURN_DISC_UNSUITABLE)
goto unsuitable_profile;
if (d->drive_role == 2 ||
if (d->drive_role == 2 || d->drive_role == 5 ||
d->current_profile == 0x1a || d->current_profile == 0x12 ||
d->current_profile == 0x43) {
/* DVD+RW , DVD-RAM , BD-RE, emulated drive on stdio file */
@ -1119,11 +1122,13 @@ int burn_disc_open_track_dvd_minus_r(struct burn_write_opts *o,
#endif
if (o->write_type == BURN_WRITE_SAO) { /* DAO */
/* Round track size up to write chunk size and reserve track */
size = ((off_t) burn_track_get_sectors(s->track[tnum]))
* (off_t) 2048;
if (size % o->obs)
/* Eventually round track size up to write chunk */
if (o->obs_pad && (size % o->obs))
size += (off_t) (o->obs - (size % o->obs));
ret = d->reserve_track(d, size);
if (ret <= 0) {
sprintf(msg, "Cannot reserve track of %.f bytes",
@ -1164,6 +1169,10 @@ int burn_disc_open_track_dvd_plus_r(struct burn_write_opts *o,
/* Round track size up to write chunk size and reserve track */
size = ((off_t) burn_track_get_sectors(s->track[tnum]))
* (off_t) 2048;
/* o->obs should be 32k or 64k already. But 32k alignment
was once performed in d->reserve_track() */
if (o->obs % 32768)
o->obs += 32768 - (o->obs % 32768);
if (size % o->obs)
size += (off_t) (o->obs - (size % o->obs));
ret = d->reserve_track(d, size);
@ -1892,6 +1901,8 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
msg, 0, 0);
burn_track_set_size(t, default_size);
}
/* Whether to fill-up last 32k buffer of track. */
o->obs_pad = (o->write_type != BURN_WRITE_SAO);
ret = burn_disc_setup_dvd_minus_r(o, disc);
if (ret <= 0) {
sprintf(msg,
@ -1902,8 +1913,6 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
msg, 0, 0);
goto early_failure;
}
/* ??? padding needed ??? cowardly doing it for now */
o->obs_pad = 1; /* fill-up track's last 32k buffer */
} else if (d->current_profile == 0x1b || d->current_profile == 0x2b ||
d->current_profile == 0x41) {
@ -2036,6 +2045,16 @@ int burn_stdio_open_write(struct burn_drive *d, off_t start_byte,
char msg[160];
off_t lseek_res;
if(d->drive_role == 4) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020181,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Pseudo-drive is a read-only file. Cannot write.",
0, 0);
return 0;
}
if (d->drive_role == 5 || d->drive_role == 3)
mode = O_WRONLY | O_CREAT | O_LARGEFILE;
if (d->devname[0] == 0) /* null drives should not come here */
return -1;
fd = burn_drive__fd_from_special_adr(d->devname);
@ -2054,7 +2073,7 @@ int burn_stdio_open_write(struct burn_drive *d, off_t start_byte,
}
if (start_byte < 0)
start_byte = 0;
if (d->drive_role == 2) {
if (d->drive_role == 2 || d->drive_role == 5) {
lseek_res = lseek(fd, start_byte, SEEK_SET);
if (lseek_res == -1) {
sprintf(msg, "Cannot address start byte %.f",
@ -2333,6 +2352,9 @@ int burn_stdio_write_sync(struct burn_write_opts *o,
/* open target file */
if (d->stdio_fd >= 0)
close(d->stdio_fd);
if (d->drive_role == 5 && d->status == BURN_DISC_APPENDABLE &&
o->start_byte < 0)
o->start_byte = d->role_5_nwa * 2048;
d->stdio_fd = burn_stdio_open_write(d, o->start_byte, 2048, 0);
if (d->stdio_fd == -1)
{ret = 0; goto ex;}
@ -2415,6 +2437,14 @@ calloc() seems not to have the desired effect. valgrind warns:
d->rlba = -150;
d->toc_temp = 9;
if(d->drive_role == 4) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020181,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Pseudo-drive is a read-only file. Cannot write.",
0, 0);
goto fail_wo_sync;
}
/* ts A70904 */
if (d->drive_role != 1) {
ret = burn_stdio_write_sync(o, disc);
@ -2638,8 +2668,16 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
"Drive is a virtual placeholder (null-drive)", 0, 0);
return 0;
}
if(d->drive_role == 4) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020181,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Pseudo-drive is a read-only file. Cannot write.",
0, 0);
return 0;
}
if(d->drive_role == 2)
if(d->drive_role == 2 || d->drive_role == 5)
alignment = 2 * 1024;
if (d->current_profile == 0x12) /* DVD-RAM */
alignment = 2 * 1024;