Compare commits

...

49 Commits

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
69e95016fb Bug fix: Read-only file descriptors were classified as write-only pseudo drives 2011-03-01 14:46:17 +00:00
a8e54b86d7 Corrected a flaw found by George Danchev with cpp 2011-02-24 19:17:06 +00:00
9f5e967bdf Registered new error code 2011-02-23 19:57:10 +00:00
fcaf3e9d9a Documented changes and release timestamp 2011-02-23 19:40:22 +00:00
b59429c568 Updated cdrskin tarball generator 2011-02-23 19:39:30 +00:00
1f72fe107d Made number transition to 1.0.3 2011-02-23 19:38:44 +00:00
043d9a82d8 DEBUG message with burn_drive_cancel, FAILURE with premature end-of-input 2011-02-18 16:55:42 +00:00
952c9b0432 Reacted on compiler warnings about uninitialized variables 2011-02-14 08:59:42 +00:00
4f5075d7a9 Forced role 3 on drives which stem from open file descriptors without O_RDWR 2011-02-09 11:43:10 +00:00
2b07bd0632 Using usleep() instead of nanosleep() which is not available on Solaris 9 2011-01-18 16:28:57 +00:00
0a714850d7 Documented changes and release timestamp 2011-01-16 15:21:23 +00:00
3caf176aeb Updated cdrskin tarball generator 2011-01-16 15:19:21 +00:00
43f7e7d063 Made number transition to 1.0.1 2011-01-16 15:11:34 +00:00
447a68d691 Updated change log and web page 2011-01-09 14:09:14 +00:00
0a3b34d9c1 Refusing to burn if foreseeable size exceeds media capacity 2011-01-09 13:59:19 +00:00
0b25a4d258 Allowed stdio tracks of known size to end in TAO mode on premature EOF 2011-01-03 19:51:30 +00:00
3b5aeb0f81 Allowed umask to create stdio-drive files with rw-permissions for all 2010-12-28 07:19:29 +00:00
5ec4a7419e Updated API introduction 2010-12-23 15:19:17 +00:00
bf7e4c8027 Prepending ./configure generated options to CFLAGS rather than appending them 2010-12-13 08:00:00 +00:00
682078575f Documented changes and release timestamp 2010-12-08 14:04:58 +00:00
43f3d4b70f Updated cdrskin tarball generator 2010-12-08 14:03:33 +00:00
523b59984b Made number transition to 0.9.1 2010-12-08 13:55:24 +00:00
dcf79a188a Removed outdated development macros 2010-11-16 13:12:35 +00:00
84d6cac5c1 Regression fix: SCSI reply data logging was disabled in rev 3368, 0.8.6 2010-10-29 17:45:13 +00:00
261f05eb45 Issueing error messages if cache syncing or closing fails 2010-10-29 16:41:16 +00:00
9334b3190d Documented changes and release timestamp 2010-10-20 13:38:44 +00:00
9b0772fe9c Updated cdrskin tarball generator 2010-10-20 13:37:17 +00:00
20c0ae24a8 Made number transition to 0.8.9 2010-10-20 13:36:14 +00:00
34 changed files with 1329 additions and 741 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,9 +1,33 @@
SVN trunk (to become libburn-0.8.8.pl00.tar.gz)
libburn-1.0.6.pl00.tar.gz Sat Apr 9 2011
===============================================================================
* 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
===============================================================================
* Bug fix: Read-only file descriptors were classified as write-only pseudo
drives
libburn-1.0.2.pl00.tar.gz Wed Feb 23 2011
===============================================================================
* Removed compilation obstacles on Solaris 9.
* Improved recognition of non-seekable stdio pseudo-drives.
libburn-1.0.0.pl00.tar.gz Sun Jan 16 2011
===============================================================================
* Allowed umask to create stdio-drive files with rw-permissions for all
* cdrskin now refuses to burn if the foreseeable size exceeds media capacity
libburn-0.9.0.pl00.tar.gz Wed Dec 08 2010
===============================================================================
* Regression fix: SCSI reply data logging was disabled in release 0.8.6
libburn-0.8.8.pl00.tar.gz Wed Oct 20 2010
===============================================================================
* New API call burn_offst_source_new()
* New API call burn_disc_get_bd_spare_info()
libburn-0.8.6.pl00.tar.gz Fri Sep 17 2010
===============================================================================
* Lifted test reservation on DVD-R DL media.

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 - B00917
## cdrskin construction site - ts A60816 - B10409
cdrskin_cdrskin_CPPFLAGS = -Ilibburn
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_8_7
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

65
README
View File

@ -6,12 +6,12 @@ This all is under GPL.
------------------------------------------------------------------------------
libburn-project.org
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006-2010 Mario Danic, Thomas Schmitt
Copyright (C) 2006-2011 Mario Danic, Thomas Schmitt
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-0.8.6.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-0.8.6.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-0.8.6.pl00.tar.gz
cd libburn-0.8.6
tar xzf libburn-1.0.6.pl00.tar.gz
cd libburn-1.0.6
./configure --prefix=/usr
make
@ -559,6 +559,61 @@ Project history as far as known to me:
- Fri Sep 17 2010 libburn-0.8.6 lifts the test reservation on DVD-R DL media.
- Sat Sep 18 2010 Release 0.6.2.pl00 of libisoburn introduces a partition
with non-zero offset for ISO 9660 images on USB sticks, improves mkisofs
emulation, and fixes a regression which existed since version 0.4.2.
- Wed Oct 20 2010 libburn-0.8.8 can report the used amount of BD spare blocks.
- Sat Oct 23 2010 Version 0.6.38 of libisofs can use libjte to produce jigdo
files along with the ISO image. Further filesystem images may be appended
as MBR partitions 1 to 4. The capability was added to produce boot blocks
for computers with MIPS CPU.
- Tue Oct 26 2010 Release 0.6.4.pl00 of libisoburn and xorriso makes use of
the new libisofs capabilities.
- Wed Dec 08 2010 libburn-0.9.0 fixes a regression with SCSI command logging.
- Fri Dec 10 2010 Version 0.6.40 of libisofs makes the prediction of the
emerging image size less expensive and is able to make images bootable
for SUN SPARC systems.
- Sun Dec 12 2010 Release 0.6.6.pl00 of libisoburn and xorriso can read ISO
images which were copied to a different start address than they were prepared
for.
- Mon Jan 17 2011 we go for release 1.0.0. This does not indicate a
technological overhaul but shall emphasize the maturity of the software.
libisofs-1.0.0 fixes a bug about the length of ECMA-119 directory names and
is ready to allow untranslated ECMA-119 names (violating the specs).
libburn-1.0.0.pl00 allows umask to create stdio-drive files with
rw-permissions for all. cdrskin now refuses to burn if the foreseeable size
exceeds media capacity
libisoburn-1.0.0.pl00 allows to create an ISO 9660:1999 directory tree,
improved the emulation fidelity of command -as mkisofs, lowered the default
abort threshold for xorriso batch mode, and increased that threshold for
xorriso dialog mode.
- Wed Feb 23 2011 release 1.0.2:
libisofs fixes several bugs and introduces the capability to copy files
inside the ISO filesystem.
libburn removed a compilation obstacle on Solaris 9 and improved recognition
of stdio pseudo-drives.
libisoburn and xorriso fix bugs and make use of the new libisofs capability.
xorriso improves its mkisofs emulation.
- Thu Mar 10 2011 release 1.0.4:
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.
------------------------------------------------------------------------------
This program is free software; you can redistribute it and/or modify

View File

@ -4,9 +4,9 @@
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-0.8.7.tar.gz
http://scdbackup.sourceforge.net/cdrskin-1.0.6.pl00.tar.gz
Copyright (C) 2006-2010 Thomas Schmitt, provided under GPL version 2 or later.
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-0.8.7.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-0.8.7.tar.gz
cd cdrskin-0.8.7
tar xzf cdrskin-1.0.6.pl00.tar.gz
cd cdrskin-1.0.6
Within that directory execute:
@ -310,10 +310,11 @@ Add-on session (equivalent to growisofs -M):
cdrskin dev=/dev/sr0 --grow_overwriteable_iso ... -
DVD-RW and DVD-R
DVD-RW , DVD-R , DVD-R DL
DVD-RW are usable if formatted to state "Restricted Overwrite" or if in state
"Sequential Recording". DVD-R are always in sequential state.
"Sequential Recording". DVD-R are always in sequential state. DVD-R DL are
always sequential and incapable of multi-session.
"Sequential" is the state of unused media and of media previously blanked
or written by cdrecord. dvd+rw-format -blank can also achieve this state.

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="0.8.6"
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="0.8.7"
skin_release="1.0.7"
patch_level=""
skin_rev="$skin_release""$patch_level"

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
.TH CDRSKIN 1 "Aug 21, 2010"
.TH CDRSKIN 1 "Jan 09, 2011"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
@ -554,6 +554,9 @@ which appear to be in the desired blank or format state already.
This option enables a burn run with option -dummy even if libburn believes
that drive and media will not simulate the write mode but will write for real.
.br
It enables a burn run where cdrskin expects to exceed the available media
capacity.
.br
.B Caution:
Use this only when in urgent need.
.TP

View File

@ -1,6 +1,6 @@
/*
cdrskin.c , Copyright 2006-2010 Thomas Schmitt <scdbackup@gmx.net>
cdrskin.c , Copyright 2006-2011 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
A cdrecord compatible command line interface for libburn.
@ -88,20 +88,20 @@ or
/** The official program version */
#ifndef Cdrskin_prog_versioN
#define Cdrskin_prog_versioN "0.8.7"
#define Cdrskin_prog_versioN "1.0.6"
#endif
/** The official libburn interface revision to use.
(May get changed further below)
*/
#ifndef Cdrskin_libburn_majoR
#define Cdrskin_libburn_majoR 0
#define Cdrskin_libburn_majoR 1
#endif
#ifndef Cdrskin_libburn_minoR
#define Cdrskin_libburn_minoR 8
#define Cdrskin_libburn_minoR 0
#endif
#ifndef Cdrskin_libburn_micrO
#define Cdrskin_libburn_micrO 7
#define Cdrskin_libburn_micrO 6
#endif
@ -135,46 +135,42 @@ or
#endif /* Cdrskin_libburn_cvs_A60220_tS */
#ifdef Cdrskin_libburn_0_8_6
#define Cdrskin_libburn_versioN "0.8.6"
#ifdef Cdrskin_libburn_1_0_6
#define Cdrskin_libburn_versioN "1.0.6"
#define Cdrskin_libburn_from_pykix_svN 1
#endif /* Cdrskin_libburn_0_8_6 */
#endif /* Cdrskin_libburn_1_0_6 */
#ifdef Cdrskin_libburn_0_8_7
#define Cdrskin_libburn_versioN "0.8.7"
#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_0_8_7 */
#endif /* Cdrskin_libburn_1_0_7 */
#ifndef Cdrskin_libburn_versioN
#define Cdrskin_libburn_0_8_6
#define Cdrskin_libburn_versioN "0.8.6"
#define Cdrskin_libburn_1_0_7
#define Cdrskin_libburn_versioN "1.0.7"
#define Cdrskin_libburn_from_pykix_svN 1
#endif
#ifdef Cdrskin_libburn_0_8_6
#ifdef Cdrskin_libburn_1_0_6
#undef Cdrskin_libburn_majoR
#undef Cdrskin_libburn_minoR
#undef Cdrskin_libburn_micrO
#define Cdrskin_libburn_majoR 0
#define Cdrskin_libburn_minoR 8
#define Cdrskin_libburn_majoR 1
#define Cdrskin_libburn_minoR 0
#define Cdrskin_libburn_micrO 6
#endif
#ifdef Cdrskin_libburn_0_8_7
#ifdef Cdrskin_libburn_1_0_7
#undef Cdrskin_libburn_majoR
#undef Cdrskin_libburn_minoR
#undef Cdrskin_libburn_micrO
#define Cdrskin_libburn_majoR 0
#define Cdrskin_libburn_minoR 8
#define Cdrskin_libburn_majoR 1
#define Cdrskin_libburn_minoR 0
#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);
}
@ -3171,7 +3168,7 @@ set_severities:;
int major, minor, micro;
printf(
"Cdrecord 2.01-Emulation Copyright (C) 2006-2010, see libburnia-project.org\n");
"Cdrecord 2.01-Emulation Copyright (C) 2006-2011, see libburnia-project.org\n");
if(o->fallback_program[0]) {
char *hargv[2];
@ -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
@ -7081,6 +7082,10 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
double put_counter, get_counter, empty_counter, full_counter;
int total_min_fill, fifo_percent;
#endif
#ifdef Cdrskin_libburn_has_get_spacE
off_t free_space;
char msg[80];
#endif
if(skin->tell_media_space)
doing= "estimating";
@ -7324,17 +7329,12 @@ burn_failed:;
/* write capacity estimation and return without actual burning */
#ifdef Cdrskin_libburn_has_get_spacE
{
off_t free_space;
char msg[80];
free_space= burn_disc_available_space(drive,o);
sprintf(msg,"%d\n",(int) (free_space/(off_t) 2048));
if(skin->preskin->result_fd>=0) {
write(skin->preskin->result_fd,msg,strlen(msg));
} else
printf("%s",msg);
}
free_space= burn_disc_available_space(drive,o);
sprintf(msg,"%d\n",(int) (free_space/(off_t) 2048));
if(skin->preskin->result_fd>=0) {
write(skin->preskin->result_fd,msg,strlen(msg));
} else
printf("%s",msg);
#endif /* Cdrskin_libburn_has_get_spacE */
if(skin->track_counter>0)
@ -7344,6 +7344,23 @@ burn_failed:;
{ret= 1; goto ex;}
}
#ifdef Cdrskin_libburn_has_get_spacE
if(skin->fixed_size > 0 && !skin->force_is_set) {
free_space= burn_disc_available_space(drive,o);
if(skin->fixed_size > free_space && free_space > 0) {
fprintf(stderr,
"cdrskin: FATAL : predicted session size %lus does not fit on media (%lus)\n",
(unsigned long) ((skin->fixed_size + 2047.0) / 2048.0),
(unsigned long) ((free_space + 2047) / 2048));
ClN(fprintf(stderr,
"cdrskin: HINT : This test may be disabled by option -force\n");)
{ret= 0; goto ex;}
}
}
#endif /* Cdrskin_libburn_has_get_spacE */
Cdrskin_adjust_speed(skin,0);
#ifndef Cdrskin_extra_leaN

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-0.8.6</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,8 +200,8 @@ Standalone ISO 9660 multi-session CD/DVD/BD tool
<P>
<DL>
<DT>Download as source code (see README):</DT>
<DD><A HREF="cdrskin-0.8.6.pl00.tar.gz">cdrskin-0.8.6.pl00.tar.gz</A>
(850 KB).
<DD><A HREF="cdrskin-1.0.6.pl00.tar.gz">cdrskin-1.0.6.pl00.tar.gz</A>
(870 KB).
</DD>
<DD>
The cdrskin tarballs are source code identical with libburn releases
@ -250,17 +250,16 @@ cdrskin_0.4.2.pl00-x86-suse9_0-static.tar.gz</A>, (310 KB), -static compiled,
<HR>
<P>
Enhancements towards previous stable version cdrskin-0.8.4.pl00:
Enhancements towards previous stable version cdrskin-1.0.4.pl00:
<UL>
<LI>
Lifted test reservation on DVD-R DL media.
<LI>Burning DVD-R DAO with 2 kB size granularity rather than 32 kB</LI>
</LI>
<!--
<LI>none</LI>
-->
</UL>
Bug fixes towards cdrskin-0.8.4.pl00:
Bug fixes towards cdrskin-1.0.4.pl00:
<UL>
<LI>none</LI>
<!--
@ -272,8 +271,8 @@ Bug fixes towards cdrskin-0.8.4.pl00:
<P>
<DL>
<DT><H3>Development snapshot, version 0.8.7 :</H3></DT>
<DD>Enhancements towards current stable version 0.8.6.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>
<!--
@ -283,7 +282,7 @@ Bug fixes towards cdrskin-0.8.4.pl00:
</UL>
</DD>
<DD>Bug fixes towards cdrskin-0.8.6.pl00:
<DD>Bug fixes towards cdrskin-1.0.6.pl00:
<UL>
<LI>none yet</LI>
<!--
@ -293,10 +292,10 @@ Bug fixes towards cdrskin-0.8.4.pl00:
</DD>
<DD>&nbsp;</DD>
<DD><A HREF="README_cdrskin_devel">README 0.8.7</A>
<DD><A HREF="cdrskin__help_devel">cdrskin_0.8.7 --help</A></DD>
<DD><A HREF="cdrskin_help_devel">cdrskin_0.8.7 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 0.8.7)</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>
@ -316,8 +315,8 @@ admins with full system souvereignty.</DT>
<A HREF="README_cdrskin_devel">upcoming README</A> ):
</DD>
<DD>
<A HREF="cdrskin-0.8.7.tar.gz">cdrskin-0.8.7.tar.gz</A>
(850 KB).
<A HREF="cdrskin-1.0.7.tar.gz">cdrskin-1.0.7.tar.gz</A>
(870 KB).
</DD>
<!-- This is not offered any more since spring 2008

View File

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

View File

@ -8768,7 +8768,7 @@ ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
------------------------------ release - cdrskin-0.8.4.pl00 - 2010.06.30.100001
------------------------------ release - cdrskin-0.8.6.pl00 - 2010.09.16.113001
* Lifted test reservation on DVD-R DL media.
* Hiding all non-API symbols from the linker by use of --version-script
@ -8792,22 +8792,625 @@ Made number transition to 0.8.7
+ cdrskin/add_ts_changes_to_libburn_0_8_7
Updated cdrskin tarball generator
17 Sep 2010 []
17 Sep 2010 [3379]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
17 Sep 2010 [3381]
svn move -m libburn release 0.8.6 is ready
http://svn.libburnia-project.org/libburn/branches/ZeroEightSix
http://svn.libburnia-project.org/libburn/tags/ZeroEightSix
------------------------------------ cycle - cdrskin-0.8.7 -
------------------------------------ cycle - cdrskin-0.8.7 -
------------------------------------ cycle - cdrskin-0.8.7 - 2010.09.17.082926
2010.09.22.105426 [3395]
acinclude.m4
configure.ac
Makefile.am
README
On Linux: Run ldconfig during make install,if not --disable-ldconfig-at-install
2010.09.22.175054 [3397]
libburn/libburn.h
libburn/libburn.ver
libburn/libdax_msgs.h
libburn/file.h
libburn/file.c
libburn/source.h
libburn/source.c
New API call burn_offst_source_new()
2010.09.22.180921 [3398]
Makefile.am
+ test/offst_source.c
Temporarily added test program for burn_offst_source_new()
22 Sep 2010 [3399]
test/offst_source.c
Better default input file for test/offst_source.c
2010.09.24.090631 [3401]
libburn/libburn.h
libburn/drive.c
libburn/mmc.h
libburn/mmc.c
ChangeLog
New API call burn_disc_get_bd_spare_info()
2010.09.24.090731 [3402]
cdrskin/cdrskin.c
Displaying eventual BD spare area information with -minfo
2010.09.24.091902 [3403]
cdrskin/cdrskin.c
Displaying eventual BD spare area information with --list_formats
2010.09.24.092535 [3404]
libburn/libburn.ver
Making new API call available in dynamic library
2010.09.24.100255 [3405]
cdrskin/cdrskin.c
Polished appearance of BD spare info with --list_formats
------------------------------------ cycle - cdrskin-0.8.7 - 2010.09.24.100255
* New API call burn_offst_source_new()
* New API call burn_disc_get_bd_spare_info()
2010.09.28.101043 [3408]
libburn/mmc.c
Avoiding to inquire spare area of unsuitable media
2010.10.15.191717 [3445]
libburn/write.c
libburn/libdax_msgs.h
Issue warning after writing a BD-R with more than 300 sessions
2010.10.19.165908 [3450]
libburn/async.c
libburn/write.c
libburn/libdax_msgs.h
Issueing messages with all cases of burn canceling
20 Oct 2010 [3453]
svn copy -m Branching for libburn release 0.8.8
http://svn.libburnia-project.org/libburn/trunk
http://svn.libburnia-project.org/libburn/branches/ZeroEightEight
2010.10.20.120001 [3454]
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 0.8.8
20 Oct 2010 [3455]
- cdrskin/add_ts_changes_to_libburn_0_8_6
- cdrskin/add_ts_changes_to_libburn_0_8_7
+ cdrskin/add_ts_changes_to_libburn_0_8_8
+ cdrskin/add_ts_changes_to_libburn_0_8_9
Updated cdrskin tarball generator
20 Oct 2010 [3456]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
------------------------------ release - cdrskin-0.8.8.pl00 - 2010.10.20.120001
* New API call burn_offst_source_new()
* New API call burn_disc_get_bd_spare_info()
2010.10.20.125207 [3457]
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 0.8.9
20 Oct 2010 [3458]
- cdrskin/add_ts_changes_to_libburn_0_8_6
- cdrskin/add_ts_changes_to_libburn_0_8_7
+ cdrskin/add_ts_changes_to_libburn_0_8_8
+ cdrskin/add_ts_changes_to_libburn_0_8_9
Updated cdrskin tarball generator
20 Oct 2010 [3459]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
20 Oct 2010
svn move -m libburn release 0.8.8 is ready
http://svn.libburnia-project.org/libburn/branches/ZeroEightEight
http://svn.libburnia-project.org/libburn/tags/ZeroEightEight
------------------------------------ cycle - cdrskin-0.8.9 - 2010.10.20.134102
2010.10.29.164059 [3474]
libburn/mmc.c
libburn/libdax_msgs.h
Issueing error messages if cache syncing or closing fails
2010.10.29.174455 [3476]
libburn/spc.c
Regression fix: SCSI reply data logging was disabled in rev 3368, 0.8.6
2010.11.16.131221 [3483]
libburn/sg-linux.c
libburn/sg-freebsd.c
libburn/sg-libcdio.c
libburn/sg-solaris.c
Removed outdated development macros
08 Dec 2010 [3502]
svn copy -m Branching for libburn release 0.9.0
http://svn.libburnia-project.org/libburn/trunk
http://svn.libburnia-project.org/libburn/branches/ZeroNineZero
2010.12.08.133001 [3503]
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 0.9.0
08 Dec 2010 [3504]
- cdrskin/add_ts_changes_to_libburn_0_8_8
- cdrskin/add_ts_changes_to_lisburn_0_8_9
+ cdrskin/add_ts_changes_to_libburn_0_9_0
+ cdrskin/add_ts_changes_to_libburn_0_9_1
Updated cdrskin tarball generator
08 Dec 2010 [3505]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
------------------------------ release - cdrskin-0.9.0.pl00 - 2010.12.08.133001
Regression fix: SCSI reply data logging was disabled in release 0.8.6
2010.12.08.131934 [3506]
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 0.9.1
08 Dec 2010 [3507]
- cdrskin/add_ts_changes_to_libburn_0_8_8
- cdrskin/add_ts_changes_to_lisburn_0_8_9
+ cdrskin/add_ts_changes_to_libburn_0_9_0
+ cdrskin/add_ts_changes_to_libburn_0_9_1
Updated cdrskin tarball generator
08 Dec 2010 [3508]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
08 Dec 2010 [3509]
svn move -m libburn release 0.9.0 is ready
http://svn.libburnia-project.org/libburn/branches/ZeroNineZero
http://svn.libburnia-project.org/libburn/tags/ZeroNineZero
------------------------------------ cycle - cdrskin-0.9.1 - 2010.12.08.154833
2010.12.13.075956 [3522]
configure.ac
Prepending ./configure generated options to CFLAGS rather than appending them
23 Dec 2010 [3528]
doc/comments
Updated API introduction
2010.12.28.071904 [3537]
libburn/write.c
Allowed umask to create stdio-drive files with rw-permissions for all
2011.01.03.195125 [3542]
libburn/write.c
libburn/sector.c
libburn/structure.h
libburn/structure.c
Allowed stdio tracks of known size to end in TAO mode on premature EOF
2011.01.09.135915 [3546]
cdrskin/cdrskin.c
cdrskin/cdrskin.1
Refusing to burn if foreseeable size exceeds media capacity
------------------------------------ cycle - cdrskin-0.9.1 - 2011.01.09.140240
* Allowed umask to create stdio-drive files with rw-permissions for all
* cdrskin now refuses to burn if the foreseeable size exceeds media capacity
09 Jan 2011 [3547]
cdrskin/cdrskin_eng.html
ChangeLog
Updated change log and web page
16 Jan 2011 [3548]
svn copy -m "Branching for libburn release 1.0.0" \
http://svn.libburnia-project.org/libburn/trunk \
http://svn.libburnia-project.org/libburn/1.0.0"
2011.01.16.123001 [3549] [3550]
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.0
16 Jan 2011 [3551]
- cdrskin/add_ts_changes_to_libburn_0_9_0
- cdrskin/add_ts_changes_to_libburn_0_9_1
+ cdrskin/add_ts_changes_to_libburn_1_0_0
+ cdrskin/add_ts_changes_to_libburn_1_0_1
Updated cdrskin tarball generator
16 Jan 2011 [3552]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
------------------------------ release - cdrskin-1.0.0.pl00 - 2011.01.16.123001
* Allowed umask to create stdio-drive files with rw-permissions for all
* cdrskin now refuses to burn if the foreseeable size exceeds media capacity
2011.01.16.140456 [3553]
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.1
16 Jan 2011 [3554]
- cdrskin/add_ts_changes_to_libburn_0_9_0
- cdrskin/add_ts_changes_to_libburn_0_9_1
+ cdrskin/add_ts_changes_to_libburn_1_0_0
+ cdrskin/add_ts_changes_to_libburn_1_0_1
Updated cdrskin tarball generator
16 Jan 2011 [3555]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
16 Jan 2011 [3556]
svn move -m "libburn release 1.0.0 is ready" \
http://svn.libburnia-project.org/libburn/branches/1.0.0 \
http://svn.libburnia-project.org/libburn/tags/1.0.0
------------------------------------ cycle - cdrskin-1.0.1 - 2011.01.16.152923
2011.01.18.162859 [3570]
libburn/file.c
Using usleep() instead of nanosleep() which is not available on Solaris 9
2011.02.09.114311 [3586]
libburn/write.c
libburn/drive.c
Forced role 3 on drives which stem from open file descriptors without O_RDWR
2011.02.14.085951 [3589]
libburn/drive.c
Reacted on compiler warnings about uninitialized variables
2011.02.18.165542 [3592]
libburn/drive.c
libburn/sector.c
DEBUG message with burn_drive_cancel, FAILURE with premature end-of-input
23 Feb 2011 [3604]
svn copy -m Branching for libburn release 1.0.2
http://svn.libburnia-project.org/libburn/trunk
http://svn.libburnia-project.org/libburn/branches/1.0.2
2011.02.23.130001 [3605]
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.2
23 Feb 2011 [3606]
- cdrskin/add_ts_changes_to_libburn_1_0_0
- cdrskin/add_ts_changes_to_libburn_1_0_1
+ cdrskin/add_ts_changes_to_libburn_1_0_2
+ cdrskin/add_ts_changes_to_libburn_1_0_3
Updated cdrskin tarball generator
23 Feb 2011 [3607]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
------------------------------ release - cdrskin-1.0.2.pl00 - 2011.02.23.130001
* Removed compilation obstacles on Solaris 9.
* Improved recognition of non-seekable stdio pseudo-drives.
2011.02.23.193502 [3611]
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.3
23 Feb 2011 [3612]
- cdrskin/add_ts_changes_to_libburn_1_0_0
- cdrskin/add_ts_changes_to_libburn_1_0_1
+ cdrskin/add_ts_changes_to_libburn_1_0_2
+ cdrskin/add_ts_changes_to_libburn_1_0_3
Updated cdrskin tarball generator
23 Feb 2011 [3613]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
------------------------------------ cycle - cdrskin-1.0.3 - 2011.02.23.193502
23 Feb 2011 [3614]
svn move -m libburn release 1.0.2 is ready
http://svn.libburnia-project.org/libburn/branches/1.0.2
http://svn.libburnia-project.org/libburn/tags/1.0.2
2011.02.23.195650 [3615]
libburn/libdax_msgs.h
Registered new error code
2011.02.24.191718 [3619]
libburn/async.c
Corrected a flaw found by George Danchev with cpp
2011.03.01.144625 [3625]
libburn/drive.c
Bug fix: Read-only file descriptors were classified as write-only pseudo drives
svn copy -m Branching for libburn release 1.0.4
http://svn.libburnia-project.org/libburn/trunk
http://svn.libburnia-project.org/libburn/branches/1.0.4
2011.03.10.080001 [3651]
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.4
10 Mar 2011 [3652]
- 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 [3653]
ChangeLog
cdrskin/changelog.txt
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
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 -
**********************************************************************
Important: When adding a public API function then add its name to file
libburn/libburn.ver
**********************************************************************
===============================================================================
TODO
===============================================================================
Better motivation of burn_set_signal_handling() in libburn.h.
Throw out old burn_print() calls
Expose BD type from bytes 8+4 to 10+4 out of READ BD STRUCTURE form 0.
Better motivation of burn_set_signal_handling() in libburn.h.
-------------------------------- Solaris -----------------------------------
@ -8830,11 +9433,6 @@ pntadm -A 10.0.0.24 -f MANUAL -i 010008544255E7 -m 10.0.0.0 -y 10.0.0.0
--------------------------------- bugs -------------------------------------
- recognise sense data format 0x72 rather than 0x70
Key=[1], ASC=[2], ASCQ=[3]
(check libcdio too)
- handle HD DVD profiles 0x50 "HD DVD-ROM", 0x51 "HD DVD-R", 0x52 "HD DVD-RAM"
as readable.

View File

@ -1,14 +1,14 @@
#!/bin/sh
# compile_cdrskin.sh
# Copyright 2005 - 2010 Thomas Schmitt, scdbackup@gmx.net, GPL
# Copyright 2005 - 2011 Thomas Schmitt, scdbackup@gmx.net, GPL
# to be executed within ./libburn-* resp ./cdrskin-*
debug_opts="-O2"
def_opts=
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
fifo_opts=""
libvers="-DCdrskin_libburn_0_8_7"
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_0_8_6"
elif test "$i" = "-libburn_1_0_6"
then
libvers="-DCdrskin_libburn_0_8_6"
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_0_8_7"
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_0_8_6 set macro to match libburn-0.8.6"
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], [0.8.7], [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 - B00630 :
dnl Notes by ts A71207 - B10409 :
dnl
dnl Regrettably the meaning of the various version types was misunderstood
dnl before version 0.4.1.
@ -84,6 +84,12 @@ dnl 0.8.0 = libburn.so.4.45.0
dnl 0.8.2 = libburn.so.4.47.0
dnl 0.8.4 = libburn.so.4.49.0
dnl 0.8.6 = libburn.so.4.51.0
dnl 0.8.8 = libburn.so.4.53.0
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.
@ -107,9 +113,9 @@ dnl
dnl If BURN_*_VERSION changes, be sure to change AC_INIT above to match.
dnl
dnl As said: Only copies. Original in libburn/libburn.h : burn_header_version_*
BURN_MAJOR_VERSION=0
BURN_MINOR_VERSION=8
BURN_MICRO_VERSION=7
BURN_MAJOR_VERSION=1
BURN_MINOR_VERSION=0
BURN_MICRO_VERSION=6
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
AC_SUBST(BURN_MAJOR_VERSION)
@ -120,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-0.8.6
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 = 55 - 51 = 4 . Linux library name = libburn.so.4.51.0
LT_CURRENT=55
LT_AGE=51
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`
@ -185,7 +191,7 @@ AC_CHECK_HEADER(sys/statvfs.h, X=, STATVFS_DEF=)
AC_CHECK_FUNC([statvfs], X=, STATVFS_DEF=)
dnl If this would be done more specifically in Makefile.am
dnl via libburn_libburn_la_CFLAGS then undesired .o file names would emerge
CFLAGS="$CFLAGS $STATVFS_DEF"
CFLAGS="$STATVFS_DEF $CFLAGS"
dnl ts A91122
AC_ARG_ENABLE(track-src-odirect,
@ -200,7 +206,7 @@ else
fi
dnl Avoid the need for libburn_libburn_la_CFLAGS in Makefile.am (ugly .o names)
dnl ### AC_SUBST(LIBBURN_O_DIRECT_DEF)
CFLAGS="$CFLAGS $LIBBURN_O_DIRECT_DEF"
CFLAGS="$LIBBURN_O_DIRECT_DEF $CFLAGS"
dnl ts A91116
AC_ARG_ENABLE(dvd-obs-64k,
@ -213,7 +219,7 @@ else
LIBBURN_DVD_OBS_64K=
echo "disabled write size default 64 KB on DVD and BD"
fi
CFLAGS="$CFLAGS $LIBBURN_DVD_OBS_64K"
CFLAGS="$LIBBURN_DVD_OBS_64K $CFLAGS"
dnl ts A91218
AC_ARG_ENABLE(libcdio,
@ -236,7 +242,7 @@ then
fi
else
echo "enabled EXPERIMENTAL use of libcdio as system adapter"
CFLAGS="$CFLAGS $LIBCDIO_DEF"
CFLAGS="$LIBCDIO_DEF $CFLAGS"
LIBCDIO_REQUIRED=0.83
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
@ -284,15 +290,15 @@ AC_ARG_ENABLE(debug,
, enable_debug=yes)
if test x$enable_debug != xyes; then
if test x$GCC = xyes; then
CFLAGS="$CFLAGS -O3"
CFLAGS="$CFLAGS -fexpensive-optimizations"
CFLAGS="-O3 $CFLAGS"
CFLAGS="-fexpensive-optimizations $CFLAGS"
fi
CFLAGS="$CFLAGS -DNDEBUG"
CFLAGS="-DNDEBUG $CFLAGS"
else
if test x$GCC = xyes; then
CFLAGS="$CFLAGS -g -pedantic -Wall"
CFLAGS="-g -pedantic -Wall $CFLAGS"
fi
CFLAGS="$CFLAGS -DDEBUG"
CFLAGS="-DDEBUG $CFLAGS"
fi
dnl Determine target directory for libburn-*.pc

View File

@ -8,14 +8,13 @@
Libburnia is an open-source project for reading, mastering and writing
optical discs. This page is about its capability to handle optical media.
For now this means CD-R, CD-RW, DVD-RAM, DVD+RW, DVD+R, DVD+R/DL, DVD-RW,
DVD-R, BD-R, BD-RE.
DVD-R, DVD-R/DL, BD-R, BD-RE.
Not supported yet are DVD-R/DL. Testers wanted.
Our scope is currently Linux 2.4 and 2.6, or FreeBSD . For ports to other
systems we would need : login on a development machine resp. a live OS on CD
or DVD, advise from a system person about the equivalent of Linux sg or FreeBSD
CAM, volunteers for testing of realistic use cases.
Our scope is currently Linux 2.4 and 2.6, or FreeBSD, or Solaris . For ports
to other systems we would need : login on a development machine resp.
an OS ithat is installable on an AMD 64-bit PC, advise from a system person
about the equivalent of Linux sg or FreeBSD CAM, volunteers for testing of
realistic use cases.
libburn is the library by which preformatted data get onto optical media.
Its code is independent of cdrecord. Its DVD capabilities are learned from

View File

@ -355,7 +355,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
/* a ssert(!find_worker(drive)); */
if((drive == NULL)) {
libdax_msgs_submit(libdax_messenger, drive->global_index,
libdax_msgs_submit(libdax_messenger, -1,
0x00020104,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"NULL pointer caught in burn_disc_erase", 0, 0);
@ -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

@ -24,6 +24,7 @@
#include <ctype.h>
#include <pthread.h>
#include <errno.h>
#include <fcntl.h>
#include "libburn.h"
#include "init.h"
#include "drive.h"
@ -59,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)
@ -73,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;
}
@ -307,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");
@ -316,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;
@ -615,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
@ -869,6 +907,11 @@ void burn_drive_cancel(struct burn_drive *d)
/* ts B00225 : these mutexes are unnecessary because "= 1" is atomar.
pthread_mutex_lock(&d->access_lock);
*/
if (!d->cancel) {
libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
"burn_drive_cancel() was called", 0, 0);
}
d->cancel = 1;
/*
pthread_mutex_unlock(&d->access_lock);
@ -1354,40 +1397,109 @@ int burn_drive__fd_from_special_adr(char *adr)
return fd;
}
/* @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,
off_t *read_size_ret, int flag)
{
int fd, is_rdwr = 1, ret, getfl_ret, st_ret, mask;
struct stat stbuf;
off_t read_size = 0;
memset(&stbuf, 0, sizeof(stbuf));
fd = burn_drive__fd_from_special_adr(fname);
if (fd >= 0)
st_ret = fstat(fd, &stbuf);
else
st_ret = stat(fname, &stbuf);
if (st_ret != -1) {
is_rdwr = burn_os_is_2k_seekrw(fname, 0);
if (S_ISREG(stbuf.st_mode))
read_size = stbuf.st_size;
else if (is_rdwr) {
ret = burn_os_stdio_capacity(fname, &read_size);
if (ret <= 0)
read_size = (off_t) 0x7ffffff0 * (off_t) 2048;
}
}
if (is_rdwr && fd >= 0) {
getfl_ret = fcntl(fd, F_GETFL);
/*
fprintf(stderr, "LIBBURN_DEBUG: burn_drive__is_rdwr: getfl_ret = %lX , O_RDWR = %lX , & = %lX , O_RDONLY = %lX\n", (unsigned long) getfl_ret, (unsigned long) O_RDWR, (unsigned long) (getfl_ret & O_RDWR), (unsigned long) O_RDONLY);
*/
mask = O_RDWR | O_WRONLY | O_RDONLY;
if (getfl_ret == -1 || (getfl_ret & mask) != O_RDWR)
is_rdwr = 0;
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;
if (stbuf_ret != NULL)
memcpy(stbuf_ret, &stbuf, sizeof(stbuf));
if (read_size_ret != NULL)
*read_size_ret = read_size;
return is_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, fd = -1, role = 0;
int is_block_dev = 0;
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) {
memset(&stbuf, 0, sizeof(stbuf));
fd = burn_drive__fd_from_special_adr(fname);
if (fd >= 0)
ret = fstat(fd, &stbuf);
else
ret = stat(fname, &stbuf);
if (ret != -1) {
is_block_dev = burn_os_is_2k_seekrw(fname, 0);
if (S_ISREG(stbuf.st_mode))
read_size = stbuf.st_size;
else if (is_block_dev) {
ret = burn_os_stdio_capacity(fname,
&read_size);
if (ret <= 0)
read_size = (off_t) 0x7ffffff0 *
(off_t) 2048;
}
}
if (ret == -1 || is_block_dev || S_ISREG(stbuf.st_mode)) {
is_rdwr = burn_drive__is_rdwr(fname, &stat_ret, &stbuf,
&read_size, 1 | 2);
if (stat_ret == -1 || is_rdwr) {
ret = burn_os_stdio_capacity(fname, &size);
if (ret == -1) {
libdax_msgs_submit(libdax_messenger, -1,
@ -1404,18 +1516,22 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
errno, 0);
return 0;
}
if (fname[0] != 0)
role = 2;
else
if (fname[0] != 0) {
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;
}
}
@ -1436,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 */
@ -1470,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");
@ -2101,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)
@ -2403,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 */
@ -2411,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;
@ -2643,26 +2816,58 @@ int burn_drive_equals_adr(struct burn_drive *d1, char *adr2_in, int role2)
char adr1[BURN_DRIVE_ADR_LEN], *adr2 = adr2_in;
char conv_adr1[BURN_DRIVE_ADR_LEN], conv_adr2[BURN_DRIVE_ADR_LEN];
char *npt1, *dpt1, *npt2, *dpt2;
int role1, stat_ret1, stat_ret2, conv_ret2;
int role1, stat_ret1, stat_ret2, conv_ret2, exact_role_matters = 0, fd;
int ret;
role1 = burn_drive_get_drive_role(d1);
burn_drive_d_get_adr(d1, adr1);
stat_ret1 = stat(adr1, &stbuf1);
/* If one of the candidate paths depicts an open file descriptor then
its read-write capability decides about its role and the difference
between roles 2 and 3 does matter.
*/
fd = burn_drive__fd_from_special_adr(d1->devname);
if (fd != -1)
exact_role_matters = 1;
if (strncmp(adr2, "stdio:", 6) == 0) {
adr2+= 6;
role2 = (!!adr2[0]) * 2;
if (adr2[0] == 0) {
role2 = 0;
} else {
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 | 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));
}
}
if (strlen(adr2) >= BURN_DRIVE_ADR_LEN)
return -1;
stat_ret2 = stat(adr2, &stbuf2);
conv_ret2 = burn_drive_convert_fs_adr(adr2, conv_adr2);
/* roles 2 and 3 have the same name space and object interpretation */
if (role1 == 3)
role1 = 2;
if (role2 == 3)
role2 = 2;
if (!exact_role_matters) {
/* roles >= 2 have the same name space and object
interpretation */
if (role1 >= 2)
role1 = 2;
if (role2 >= 2)
role2 = 2;
}
if (strcmp(adr1, adr2) == 0 && role1 == role2)
return(1); /* equal role and address */
@ -2680,6 +2885,8 @@ int burn_drive_equals_adr(struct burn_drive *d1, char *adr2_in, int role2)
else if (role1 != 1 && role2 != 1) {
/* pseudo-drive meets file object */
if (role1 != role2)
return 0;
if (stat_ret1 == -1 || stat_ret2 == -1) {
if (stat_ret1 != -1 || stat_ret2 != -1)
return 0; /* one adress existing, one not */

View File

@ -211,9 +211,10 @@ struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size)
static int fifo_sleep(int flag)
{
static struct timespec sleeptime = { 0, 50000000}; /* 50 ms */
static unsigned long sleeptime = 50000; /* 50 ms */
return nanosleep(&sleeptime, NULL);
usleep(sleeptime);
return 0;
}

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

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This is the official API definition of libburn.
@ -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.
@ -2690,9 +2692,9 @@ void burn_version(int *major, int *minor, int *micro);
}
*/
#define burn_header_version_major 0
#define burn_header_version_minor 8
#define burn_header_version_micro 7
#define burn_header_version_major 1
#define burn_header_version_minor 0
#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
@ -563,6 +563,12 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
0x0002017b (WARNING,HIGH) = Sequential BD-R media likely to soon fail writing
0x0002017c (FAILURE,HIGH) = No valid write type selected
0x0002017d (FATAL,HIGH) = Invalid file descriptor with stdio pseudo-drive
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);
@ -521,6 +522,8 @@ void mmc_close_session(struct burn_write_opts *o)
void mmc_close(struct burn_drive *d, int session, int track)
{
struct command c;
char msg[256];
int key, asc, ascq;
if (mmc_function_spy(d, "mmc_close") <= 0)
return;
@ -544,6 +547,16 @@ void mmc_close(struct burn_drive *d, int session, int track)
/* ts A70918 : Immed : wait for drive to complete command */
if (c.error) {
sprintf(msg, "Failed to close %s (%d)",
session > 1 ? "disc" : session > 0 ? "session" : "track",
((session & 3) << 1) | !!track);
sprintf(msg + strlen(msg), ". SCSI error : ");
scsi_error_msg(d, c.sense, 14, msg + strlen(msg),
&key, &asc, &ascq);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002017e,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
d->cancel = 1;
return;
}
@ -2898,6 +2911,8 @@ int mmc_read_format_capacities(struct burn_drive *d, int top_wanted)
void mmc_sync_cache(struct burn_drive *d)
{
struct command c;
char msg[256];
int key, asc, ascq;
if (mmc_function_spy(d, "mmc_sync_cache") <= 0)
return;
@ -2933,6 +2948,14 @@ void mmc_sync_cache(struct burn_drive *d)
/* ts A70918 */
if (c.error) {
sprintf(msg, "Failed to synchronize drive cache");
sprintf(msg + strlen(msg), ". SCSI error : ");
scsi_error_msg(d, c.sense, 14, msg + strlen(msg),
&key, &asc, &ascq);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002017f,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
d->cancel = 1;
return;
}
@ -3091,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

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -179,10 +179,22 @@ static void get_bytes(struct burn_track *track, int count, unsigned char *data)
if (!shortage)
goto ex;
/* ts A61031 */
/* ts A61031 - B10103 */
if (shortage >= count)
track->track_data_done = 1;
if (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,
"Premature end of input encountered. Missing: %d bytes",
shortage);
libdax_msgs_submit(libdax_messenger, -1, 0x00020180,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
msg, 0,0);
track->end_on_premature_eoi = 2;
}
if (track->open_ended || track->end_on_premature_eoi)
goto ex;
/* If we're still short, and there's a "next" pointer, we pull from that.
@ -688,7 +700,7 @@ int sector_data(struct burn_write_opts *o, struct burn_track *t, int psub)
return 0;
/* ts A61031 */
if (t->open_ended && t->track_data_done) {
if ((t->open_ended || t->end_on_premature_eoi) && t->track_data_done) {
unget_sector(o, t->mode);
return 2;
}

View File

@ -766,8 +766,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
static FILE *fp = NULL;
time_t start_time;
#define Libburn_use_scsi_eval_cmd_outcomE yes
snprintf(buf, sizeof (buf),
"sg_issue_command d->cam=%p d->released=%d",
(void*)d->cam, d->released);
@ -961,67 +959,19 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
no_retry = 1;
}
#ifdef Libburn_use_scsi_eval_cmd_outcomE
/* >>> Need own duration time measurement.
Then remove bit1 from flag.
*/
done = scsi_eval_cmd_outcome(d, c, fp, c->sense,
sense_len, 0, start_time,
timeout_ms, i,
2 | !!ignore_error);
#else /* Libburn_use_scsi_eval_cmd_outcomE */
if (no_retry || ignore_error || !c->retry) {
c->error = 1;
{ret = 1; goto ex;}
}
switch (scsi_error(d, c->sense, 0)) {
case RETRY:
done = 0;
if (burn_sg_log_scsi & 3) {
/* >>> Need own duration time
measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense,
sense_len > 0 ? sense_len : 18,
0, 1 | 2);
scsi_log_cmd(c,fp,0);
}
break;
case FAIL:
done = 1;
c->error = 1;
break;
case GO_ON:
if (burn_sg_log_scsi & 3)
/* >>> Need own duration time
measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense,
sense_len > 0 ? sense_len : 18,
0, 1 | 2);
{ret = 1; goto ex;}
}
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
} else {
done = 1;
}
} while (!done);
ret = 1;
ex:;
#ifndef Libburn_use_scsi_eval_cmd_outcomE
if (c->error)
scsi_notify_error(d, c, c->sense, 18, 0);
if (burn_sg_log_scsi & 3)
/* >>> Need own duration time measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, sense_len > 0 ? sense_len : 18,
0, (c->error != 0) | 2);
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
cam_freeccb(ccb);
return ret;
}

View File

@ -586,9 +586,6 @@ int sg_release(struct burn_drive *d)
}
#define Libburn_use_scsi_eval_cmd_outcomE yes
/** Sends a SCSI command to the drive, receives reply and evaluates wether
the command succeeded or shall be retried or finally failed.
Returned SCSI errors shall not lead to a return value indicating failure.
@ -611,10 +608,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
CdIo_t *p_cdio;
unsigned char *sense_pt = NULL;
#ifndef Libburn_use_scsi_eval_cmd_outcomE
int usleep_time;
#endif
c->error = 0;
if (d->p_cdio == NULL) {
return 0;
@ -695,68 +688,13 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
}
}
if (i_status != 0 || (key || asc || ascq)) {
#ifdef Libburn_use_scsi_eval_cmd_outcomE
done = scsi_eval_cmd_outcome(d, c, fp, c->sense, 18,
0, start_time, timeout_ms, i, 2);
#else /* Libburn_use_scsi_eval_cmd_outcomE */
if (no_retry || !c->retry) {
c->error = 1;
goto ex;
}
switch (scsi_error(d, c->sense, 18)) {
case RETRY:
if (burn_sg_log_scsi & 3) {
/* >>> Need own duration time
measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 18, 0,
1 | 2);
scsi_log_cmd(c,fp,0);
}
break;
case FAIL:
c->error = 1;
goto ex;
case GO_ON:
if (burn_sg_log_scsi & 3)
/* >>> Need own duration time
measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 18, 0,
1 | 2);
goto ex;
}
/*
Calming down retries and breaking up endless cycle
*/
usleep_time = Libburn_sg_libcdio_retry_usleeP +
i * Libburn_sg_libcdio_retry_incR;
if (time(NULL) + usleep_time / 1000000 - start_time >
timeout_ms / 1000 + 1) {
c->error = 1;
goto ex;
}
usleep(usleep_time);
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
} else
done = 1;
} /* end of retry-loop */
#ifndef Libburn_use_scsi_eval_cmd_outcomE
ex:;
if (c->error)
scsi_notify_error(d, c, c->sense, 18, 0);
if (burn_sg_log_scsi & 3)
/* >>> Need own duration time measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 18, 0, (c->error != 0) | 2);
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
return 1;
}

View File

@ -731,10 +731,6 @@ failed:;
}
#define Libburn_drive_new_deaL 1
#ifdef Libburn_drive_new_deaL
/* ts A80731 */
static int is_ata_drive(char *fname)
{
@ -900,23 +896,12 @@ static int is_scsi_drive(char *fname, int *bus_no, int *host_no,
return 1;
}
#endif /* Libburn_drive_new_deaL */
/** Speciality of GNU/Linux: detect non-SCSI ATAPI (EIDE) which will from
then on used used via generic SCSI as is done with (emulated) SCSI drives */
static void ata_enumerate(void)
{
#ifdef Libburn_drive_new_deaL
int ret;
#else
struct hd_driveid tm;
int fd;
#endif
int i;
char fname[10];
@ -938,57 +923,11 @@ static void ata_enumerate(void)
fprintf(stderr, "not in whitelist\n");
continue;
}
#ifdef Libburn_drive_new_deaL
ret = is_ata_drive(fname);
if (ret < 0)
break;
if (ret == 0)
continue;
#else /* Libburn_drive_new_deaL */
fd = sg_open_drive_fd(fname, 1);
if (fd == -1) {
if (linux_ata_enumerate_verbous)
fprintf(stderr,"open failed, errno=%d '%s'\n",
errno, strerror(errno));
continue;
}
/* found a drive */
ioctl(fd, HDIO_GET_IDENTITY, &tm);
/* not atapi */
if (!(tm.config & 0x8000) || (tm.config & 0x4000)) {
if (linux_ata_enumerate_verbous)
fprintf(stderr, "not marked as ATAPI\n");
sg_close_drive_fd(fname, -1, &fd, 0);
continue;
}
/* if SG_IO fails on an atapi device, we should stop trying to
use hd* devices */
if (sgio_test(fd) == -1) {
if (linux_ata_enumerate_verbous)
fprintf(stderr,
"FATAL: sgio_test() failed: errno=%d '%s'\n",
errno, strerror(errno));
sg_close_drive_fd(fname, -1, &fd, 0);
return;
}
if (sg_close_drive_fd(fname, -1, &fd, 1) <= 0) {
if (linux_ata_enumerate_verbous)
fprintf(stderr,
"cannot close properly, errno=%d '%s'\n",
errno, strerror(errno));
continue;
}
#endif /* Libburn_drive_new_deaL */
if (linux_ata_enumerate_verbous)
fprintf(stderr, "accepting as drive without SCSI address\n");
enumerate_common(fname, -1, -1, -1, -1, -1);
@ -999,15 +938,6 @@ static void ata_enumerate(void)
/** Detects (probably emulated) SCSI drives */
static void sg_enumerate(void)
{
#ifdef Libburn_drive_new_deaL
#else
struct sg_scsi_id sid;
int fd, sibling_fds[BURN_OS_SG_MAX_SIBLINGS], sibling_count= 0;
char sibling_fnames[BURN_OS_SG_MAX_SIBLINGS][BURN_OS_SG_MAX_NAMELEN];
int sid_ret = 0;
#endif
int i, ret;
int bus_no= -1, host_no= -1, channel_no= -1, target_no= -1, lun_no= -1;
char fname[17];
@ -1037,9 +967,6 @@ static void sg_enumerate(void)
continue;
}
#ifdef Libburn_drive_new_deaL
ret = is_scsi_drive(fname, &bus_no, &host_no, &channel_no,
&target_no, &lun_no);
if (ret < 0)
@ -1052,132 +979,10 @@ static void sg_enumerate(void)
enumerate_common(fname, bus_no, host_no, channel_no,
target_no, lun_no);
#else /* Libburn_drive_new_deaL */
/* ts A60927 */
fd = sg_open_drive_fd(fname, 1);
if (fd == -1) {
if (linux_sg_enumerate_debug)
fprintf(stderr, "open failed, errno=%d '%s'\n",
errno, strerror(errno));
continue;
}
/* found a drive */
sid_ret = ioctl(fd, SG_GET_SCSI_ID, &sid);
if (sid_ret == -1) {
sid.scsi_id = -1; /* mark SCSI address as invalid */
if(linux_sg_enumerate_debug)
fprintf(stderr,
"ioctl(SG_GET_SCSI_ID) failed, errno=%d '%s' , ",
errno, strerror(errno));
if (sgio_test(fd) == -1) {
if (linux_sg_enumerate_debug)
fprintf(stderr,
"FATAL: sgio_test() failed: errno=%d '%s'",
errno, strerror(errno));
sg_close_drive_fd(fname, -1, &fd, 0);
continue;
}
#ifdef CDROM_DRIVE_STATUS
/* ts A61211 : not widening old acceptance range */
if (strcmp(linux_sg_device_family,"/dev/sg%d") != 0) {
/* http://developer.osdl.org/dev/robustmutexes/
src/fusyn.hg/Documentation/ioctl/cdrom.txt */
sid_ret = ioctl(fd, CDROM_DRIVE_STATUS, 0);
if(linux_sg_enumerate_debug)
fprintf(stderr,
"ioctl(CDROM_DRIVE_STATUS) = %d , ",
sid_ret);
if (sid_ret != -1 && sid_ret != CDS_NO_INFO)
sid.scsi_type = TYPE_ROM;
else
sid_ret = -1;
}
#endif /* CDROM_DRIVE_STATUS */
}
#ifdef SCSI_IOCTL_GET_BUS_NUMBER
/* Hearsay A61005 */
if (ioctl(fd, SCSI_IOCTL_GET_BUS_NUMBER, &bus_no) == -1)
bus_no = -1;
#endif
if (sg_close_drive_fd(fname, -1, &fd,
sid.scsi_type == TYPE_ROM ) <= 0) {
if (linux_sg_enumerate_debug)
fprintf(stderr,
"cannot close properly, errno=%d '%s'\n",
errno, strerror(errno));
continue;
}
if ( (sid_ret == -1 || sid.scsi_type != TYPE_ROM)
&& !linux_sg_accept_any_type) {
if (linux_sg_enumerate_debug)
fprintf(stderr, "sid.scsi_type = %d (!= TYPE_ROM)\n",
sid.scsi_type);
continue;
}
if (sid_ret == -1 || sid.scsi_id < 0) {
/* ts A61211 : employ a more general ioctl */
ret = sg_obtain_scsi_adr(fname, &bus_no, &host_no,
&channel_no, &target_no, &lun_no);
if (ret>0) {
sid.host_no = host_no;
sid.channel = channel_no;
sid.scsi_id = target_no;
sid.lun = lun_no;
} else {
if (linux_sg_enumerate_debug)
fprintf(stderr,
"sg_obtain_scsi_adr() failed\n");
continue;
}
}
/* ts A60927 : trying to do locking with growisofs */
if(burn_sg_open_o_excl>1) {
ret = sg_open_scsi_siblings(
fname, -1, sibling_fds, sibling_fnames,
&sibling_count,
sid.host_no, sid.channel,
sid.scsi_id, sid.lun);
if (ret<=0) {
if (linux_sg_enumerate_debug)
fprintf(stderr, "cannot lock siblings\n");
sg_handle_busy_device(fname, 0);
continue;
}
/* the final occupation will be done in sg_grab() */
sg_release_siblings(sibling_fds, sibling_fnames,
&sibling_count);
}
#ifdef SCSI_IOCTL_GET_BUS_NUMBER
if(bus_no == -1)
bus_no = 1000 * (sid.host_no + 1) + sid.channel;
#else
bus_no = sid.host_no;
#endif
if (linux_sg_enumerate_debug)
fprintf(stderr, "accepting as SCSI %d,%d,%d,%d bus=%d\n",
sid.host_no, sid.channel, sid.scsi_id, sid.lun,
bus_no);
enumerate_common(fname, bus_no, sid.host_no, sid.channel,
sid.scsi_id, sid.lun);
#endif /* Libburn_drive_new_deaL */
}
}
#ifdef Libburn_drive_new_deaL
/* ts A80805 : eventually produce the other official name of a device file */
static int fname_other_name(char *fname, char other_name[80], int flag)
@ -1377,8 +1182,6 @@ static int add_proc_info_drives(int flag)
return 1 + count;
}
#endif /* Libburn_drive_new_deaL */
/* ts A61115 */
/* ----------------------------------------------------------------------- */
@ -1605,27 +1408,18 @@ return_1_pre_proc:;
/* ts A61115: replacing call to sg-implementation internals from drive.c */
int scsi_enumerate_drives(void)
{
#ifdef Libburn_drive_new_deaL
int ret;
#endif
#ifdef Libburn_drive_new_deaL
/* Direct examination of eventually single whitelisted name */
ret = single_enumerate(0);
if (ret < 0)
return -1;
if (ret > 0)
return 1;
#endif /* Libburn_drive_new_deaL */
sg_enumerate();
ata_enumerate();
#ifdef Libburn_drive_new_deaL
add_proc_info_drives(0);
#endif /* Libburn_drive_new_deaL */
return 1;
}
@ -1789,11 +1583,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
/* ts A61030 */
static FILE *fp= NULL;
#define Libburn_use_scsi_eval_cmd_outcomE yes
#ifndef Libburn_use_scsi_eval_cmd_outcomE
int usleep_time;
#endif
/* <<< ts A60821
debug: for tracing calls which might use open drive fds */
@ -1897,96 +1686,12 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
c->error = 1;
return -1;
}
#ifdef NIX
/* <<< */
if(0){
static int erst= 1;
static unsigned char b00_sense[22]= {
0x72, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E,
0x09, 0x0C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
if (erst > 0) {
s.sb_len_wr= 22;
memcpy(s.sbp, b00_sense, s.sb_len_wr);
erst--;
}
}
/* <<< */
#endif /* NIX */
#ifdef Libburn_use_scsi_eval_cmd_outcomE
done = scsi_eval_cmd_outcome(d, c, fp, s.sbp, s.sb_len_wr,
s.duration, start_time, s.timeout, i, 0);
#else /* Libburn_use_scsi_eval_cmd_outcomE */
if (s.sb_len_wr) {
if (!c->retry) {
c->error = 1;
/* A61106: rather than : return 1 */
goto ex;
}
switch (scsi_error(d, s.sbp, s.sb_len_wr)) {
case RETRY:
done = 0;
if (burn_sg_log_scsi & 3) {
scsi_log_err(c, fp, s.sbp, s.sb_len_wr,
s.duration, 1);
scsi_log_cmd(c,fp,0);
}
break;
case FAIL:
done = 1;
c->error = 1;
break;
case GO_ON:
if (burn_sg_log_scsi & 3)
scsi_log_err(c, fp, s.sbp, s.sb_len_wr,
s.duration, 1);
goto ex;
}
/* ts A90921 :
Calming down retries and breaking up endless cycle
*/
usleep_time = Libburn_sg_linux_retry_usleeP +
i * Libburn_sg_linux_retry_incR;
if (time(NULL) + usleep_time / 1000000 - start_time >
s.timeout / 1000 + 1) {
c->error = 1;
goto ex;
}
usleep(usleep_time);
} else {
done = 1;
}
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
}
/* ts A61106 */
#ifdef Libburn_use_scsi_eval_cmd_outcomE
if (s.host_status != Libburn_sg_host_oK ||
(s.driver_status != Libburn_sg_driver_oK && !c->error)) {
#else /* Libburn_use_scsi_eval_cmd_outcomE */
ex:;
if (c->error) {
scsi_notify_error(d, c, s.sbp, s.sb_len_wr, 0);
} else if (s.host_status != Libburn_sg_host_oK ||
s.driver_status != Libburn_sg_driver_oK) {
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
char msg[161];
sprintf(msg,
@ -2001,13 +1706,6 @@ ex:;
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
}
#ifndef Libburn_use_scsi_eval_cmd_outcomE
if (burn_sg_log_scsi & 3)
scsi_log_err(c, fp, s.sbp, s.sb_len_wr,
s.duration, c->error != 0);
#endif
return 1;
}

View File

@ -571,11 +571,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
char msg[80];
static FILE *fp = NULL;
#define Libburn_use_scsi_eval_cmd_outcomE yes
#ifndef Libburn_use_scsi_eval_cmd_outcomE
int usleep_time, no_retry = 0;
#endif
c->error = 0;
memset(c->sense, 0, sizeof(c->sense));
if (d->fd == -1)
@ -644,8 +639,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
return -1;
}
#ifdef Libburn_use_scsi_eval_cmd_outcomE
/* >>> Should replace "18" by realistic sense length.
What's about following older remark ?
@ -659,70 +652,8 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
} else
done = 1;
#else /* Libburn_use_scsi_eval_cmd_outcomE */
/* >>> valid sense: cgc.uscsi_rqlen - cgc.uscsi_rqresid */;
spc_decode_sense(c->sense, 0, &key, &asc, &ascq);
if (key || asc || ascq) {
if (no_retry || !c->retry) {
c->error = 1;
goto ex;
}
switch (scsi_error(d, c->sense, 18)) {
case RETRY:
if (burn_sg_log_scsi & 3) {
/* >>> Need own duration time
measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 18, 0,
1 | 2);
scsi_log_cmd(c,fp,0);
}
break;
case FAIL:
c->error = 1;
goto ex;
case GO_ON:
if (burn_sg_log_scsi & 3)
/* >>> Need own duration time
measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 18, 0,
1 | 2);
goto ex;
}
/*
Calming down retries and breaking up endless cycle
*/
usleep_time = Libburn_sg_solaris_retry_usleeP +
i * Libburn_sg_solaris_retry_incR;
if (time(NULL) + usleep_time / 1000000 - start_time >
timeout_ms / 1000 + 1) {
c->error = 1;
goto ex;
}
usleep(usleep_time);
} else
break; /* retry-loop */
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
} /* end of retry-loop */
#ifndef Libburn_use_scsi_eval_cmd_outcomE
ex:;
if (c->error)
scsi_notify_error(d, c, c->sense, 18, 0);
if (burn_sg_log_scsi & 3)
/* >>> Need own duration time measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 18, 0, (c->error != 0) | 2);
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
return 1;
}

View File

@ -1558,12 +1558,12 @@ int scsi_eval_cmd_outcome(struct burn_drive *d, struct command *c, void *fp,
enum response outcome;
int done = -1, usleep_time;
if (burn_sg_log_scsi & 3)
scsi_log_err(c, fp, sense, sense_len, duration,
(sense_len > 0) | (flag & 2));
if (sense_len <= 0)
return 1;
if (burn_sg_log_scsi & 3)
scsi_log_err(c, fp, sense, sense_len, duration,
1 | (flag & 2));
outcome = scsi_error(d, sense, sense_len);
if (outcome == RETRY && c->retry && !(flag & 1)) {
/* Calming down retries and breaking up endless cycle

View File

@ -1,6 +1,6 @@
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -170,6 +170,8 @@ struct burn_track *burn_track_create(void)
/* ts A61031 */
t->open_ended = 0;
t->track_data_done = 0;
/* ts B10103 */
t->end_on_premature_eoi = 0;
t->postgap = 0;
t->pregap1 = 0;

View File

@ -1,6 +1,6 @@
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -55,6 +55,14 @@ struct burn_track
int open_ended;
/** End of open ended track flag : offset+payload+tail are delivered */
int track_data_done;
/* ts B10103 */
/** End track writing on premature End-of-input if source is of
defined length.
0= normal operation in case of eoi
1= be ready to end track writing on eoi
2= eoi was encountered with previously set value of 1
*/
int end_on_premature_eoi;
/** The audio/data mode for the entry. Derived from control and
possibly from reading the track's first sector. */

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

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -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) {
@ -2024,7 +2033,8 @@ int burn_stdio_open_write(struct burn_drive *d, off_t start_byte,
int sector_size, int flag)
{
/* <<< We need _LARGEFILE64_SOURCE defined by the build system.
/* 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
@ -2033,14 +2043,26 @@ int burn_stdio_open_write(struct burn_drive *d, off_t start_byte,
int fd = -1;
int mode = O_RDWR | O_CREAT | O_LARGEFILE;
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);
if (fd >= 0)
fd = dup(fd); /* check validity and make closeable */
else
fd = open(d->devname, mode, S_IRUSR | S_IWUSR);
fd = open(d->devname, mode,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (fd == -1) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020005,
@ -2051,10 +2073,11 @@ 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 (lseek(fd, start_byte, SEEK_SET)==-1) {
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",
(double) start_byte);
(double) start_byte);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020147,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
@ -2063,6 +2086,7 @@ int burn_stdio_open_write(struct burn_drive *d, off_t start_byte,
d->cancel = 1;
fd = -1;
}
}
d->nwa = start_byte / sector_size;
return fd;
}
@ -2255,6 +2279,8 @@ int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s,
burn_disc_init_track_status(o, s, tnum, sectors);
open_ended = burn_track_is_open_ended(t);
t->end_on_premature_eoi = (o->write_type == BURN_WRITE_TAO);
/* attach stdio emulators for mmc_*() functions */
if (o->simulate)
d->write = burn_stdio_mmc_dummy_write;
@ -2267,8 +2293,9 @@ int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s,
/* transact a (CD sized) sector */
if (!sector_data(o, t, 0))
{ret= 0; goto ex;}
if (open_ended) {
if (open_ended)
d->progress.sectors = sectors = d->progress.sector;
if (open_ended || t->end_on_premature_eoi) {
if (burn_track_is_data_done(t))
break;
}
@ -2295,6 +2322,8 @@ int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s,
ex:;
if (d->cancel)
burn_source_cancel(t->source);
if (t->end_on_premature_eoi == 2)
d->cancel = 1;
return ret;
}
@ -2323,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;}
@ -2405,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);
@ -2628,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;