Compare commits
49 Commits
ZeroEightE
...
1.0.6
Author | SHA1 | Date | |
---|---|---|---|
f61213abbf | |||
69dba03ef1 | |||
e031f94b40 | |||
db4b367c28 | |||
e86a7f9880 | |||
9c9b82ae61 | |||
d5cc482015 | |||
1f14074d59 | |||
d0c6889603 | |||
a088a85374 | |||
a3ac6c63aa | |||
af41742516 | |||
998fcdbefa | |||
ed811f45e6 | |||
240e6abff4 | |||
402f4c0b04 | |||
1b166f484d | |||
b945974dc7 | |||
cf214650c6 | |||
69ec9334d1 | |||
238fde4ef1 | |||
69e95016fb | |||
a8e54b86d7 | |||
9f5e967bdf | |||
fcaf3e9d9a | |||
b59429c568 | |||
1f72fe107d | |||
043d9a82d8 | |||
952c9b0432 | |||
4f5075d7a9 | |||
2b07bd0632 | |||
0a714850d7 | |||
3caf176aeb | |||
43f7e7d063 | |||
447a68d691 | |||
0a3b34d9c1 | |||
0b25a4d258 | |||
3b5aeb0f81 | |||
5ec4a7419e | |||
bf7e4c8027 | |||
682078575f | |||
43f3d4b70f | |||
523b59984b | |||
dcf79a188a | |||
84d6cac5c1 | |||
261f05eb45 | |||
9334b3190d | |||
9b0772fe9c | |||
20c0ae24a8 |
@ -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
|
||||
|
28
ChangeLog
28
ChangeLog
@ -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.
|
||||
|
@ -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
65
README
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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> </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> </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
|
||||
|
@ -1 +1 @@
|
||||
#define Cdrskin_timestamP "2010.10.19.165908"
|
||||
#define Cdrskin_timestamP "2011.04.08.180001"
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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."
|
||||
|
42
configure.ac
42
configure.ac
@ -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
|
||||
|
13
doc/comments
13
doc/comments
@ -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
|
||||
|
@ -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) {
|
||||
|
313
libburn/drive.c
313
libburn/drive.c
@ -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 */
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -2,6 +2,7 @@ LIBBURN4 {
|
||||
global:
|
||||
burn_abort;
|
||||
burn_abort_pacifier;
|
||||
burn_allow_drive_role_4;
|
||||
burn_allow_untested_profiles;
|
||||
burn_disc_add_session;
|
||||
burn_disc_available_space;
|
||||
|
@ -519,7 +519,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
||||
0x0002014d (SORRY,HIGH) = Asynchromous SCSI error
|
||||
0x0002014f (SORRY,HIGH) = Timeout with asynchromous SCSI command
|
||||
0x00020150 (DEBUG,LOW) = Reporting asynchronous waiting time
|
||||
0x00020151 (FATAL,HIGH) = Read attempt on write-only drive
|
||||
0x00020151 (FAILURE,HIGH) = Read attempt on write-only drive
|
||||
0x00020152 (FATAL,HIGH) = Cannot start fifo thread
|
||||
0x00020153 (SORRY,HIGH) = Read error on fifo input
|
||||
0x00020154 (NOTE,HIGH) = Forwarded input error ends output
|
||||
@ -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
|
||||
|
@ -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)) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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. */
|
||||
|
@ -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];
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user