Compare commits
21 Commits
Author | SHA1 | Date | |
---|---|---|---|
f61213abbf | |||
69dba03ef1 | |||
e031f94b40 | |||
db4b367c28 | |||
e86a7f9880 | |||
9c9b82ae61 | |||
d5cc482015 | |||
1f14074d59 | |||
d0c6889603 | |||
a088a85374 | |||
a3ac6c63aa | |||
af41742516 | |||
998fcdbefa | |||
ed811f45e6 | |||
240e6abff4 | |||
402f4c0b04 | |||
1b166f484d | |||
b945974dc7 | |||
cf214650c6 | |||
69ec9334d1 | |||
238fde4ef1 |
@ -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
|
||||
|
@ -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
|
||||
===============================================================================
|
||||
|
@ -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
14
README
@ -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.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
@ -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:
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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> </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> </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>
|
||||
|
||||
|
@ -1 +1 @@
|
||||
#define Cdrskin_timestamP "2011.03.10.080001"
|
||||
#define Cdrskin_timestamP "2011.04.08.180001"
|
||||
|
@ -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.
|
||||
|
@ -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."
|
||||
|
15
configure.ac
15
configure.ac
@ -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`
|
||||
|
||||
|
@ -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) {
|
||||
|
210
libburn/drive.c
210
libburn/drive.c
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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)) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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];
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user