Compare commits
5 Commits
ZeroEightZ
...
ZeroSevenS
Author | SHA1 | Date | |
---|---|---|---|
335b2b0ffc | |||
3505b761f4 | |||
cbb9125bd9 | |||
8385908bb3 | |||
e081477a8f |
@ -110,9 +110,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 - B00409
|
||||
## cdrskin construction site - ts A60816 - B00122
|
||||
cdrskin_cdrskin_CPPFLAGS = -Ilibburn
|
||||
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_8_0
|
||||
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_7_6
|
||||
|
||||
# cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
# ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking
|
||||
|
26
README
26
README
@ -11,7 +11,7 @@ Still containing parts of Libburn. By Derek Foreman <derek@signalmarketing.com>
|
||||
and Ben Jansens <xor@orodu.net>
|
||||
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
|
||||
http://files.libburnia-project.org/releases/libburn-0.8.0.pl00.tar.gz
|
||||
http://files.libburnia-project.org/releases/libburn-0.7.6.pl00.tar.gz
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
@ -19,10 +19,10 @@ Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
|
||||
From tarball
|
||||
|
||||
Obtain libburn-0.8.0.pl00.tar.gz, take it to a directory of your choice and do:
|
||||
Obtain libburn-0.7.6.pl00.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf libburn-0.8.0.pl00.tar.gz
|
||||
cd libburn-0.8.0
|
||||
tar xzf libburn-0.7.6.pl00.tar.gz
|
||||
cd libburn-0.7.6
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
|
||||
@ -496,24 +496,6 @@ Project history as far as known to me:
|
||||
fixes bugs about the generic X/Open system adapter, and allows to use
|
||||
libcdio >= 0.83 as SCSI transport facility.
|
||||
|
||||
- 10 Feb 2010 libisofs-0.6.28 fixes a regression about bootable images which
|
||||
was introduced by version 0.6.22 in August 2009.
|
||||
|
||||
- 23 Feb 2010 libisoburn-0.5.0 marks the transition of the xorriso standalone
|
||||
version to an official GNU project. The name changed to "GNU xorriso" and its
|
||||
license is now GPLv3+.
|
||||
The licenses of libburnia libraries and applications are not affected by
|
||||
this change.
|
||||
|
||||
- 10 Mar 2010 libburn-0.7.8 fixes bugs and improves the built-in abort handler
|
||||
on FreeBSD.
|
||||
|
||||
- 30 Mar 2010 Release 0.5.2 of libisoburn provides xorriso documentation in
|
||||
GNU Texinfo format with embedded extra data to derive a full man page.
|
||||
|
||||
- 09 Apr 2010 libburn-0.8.0 now works with ahci driver on FreeBSD 8-STABLE.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
11
acinclude.m4
11
acinclude.m4
@ -1,14 +1,3 @@
|
||||
AC_DEFUN([LIBBURNIA_SET_FLAGS],
|
||||
[
|
||||
case $target_os in
|
||||
freebsd*)
|
||||
LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
||||
CPPFLAGS="$CPPFLAGS -I/usr/local/include"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
|
||||
AC_DEFUN([TARGET_SHIZZLE],
|
||||
[
|
||||
ARCH=""
|
||||
|
@ -4,7 +4,7 @@
|
||||
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
|
||||
Integrated sub project of libburnia-project.org but also published via:
|
||||
http://scdbackup.sourceforge.net/cdrskin_eng.html
|
||||
http://scdbackup.sourceforge.net/cdrskin-0.8.0.pl00.tar.gz
|
||||
http://scdbackup.sourceforge.net/cdrskin-0.7.6.pl00.tar.gz
|
||||
|
||||
Copyright (C) 2006-2010 Thomas Schmitt, provided under GPL version 2 or later.
|
||||
------------------------------------------------------------------------------
|
||||
@ -25,10 +25,10 @@ By using this software you agree to the disclaimer at the end of this text
|
||||
|
||||
Compilation, First Glimpse, Installation
|
||||
|
||||
Obtain cdrskin-0.8.0.pl00.tar.gz, take it to a directory of your choice and do:
|
||||
Obtain cdrskin-0.7.6.pl00.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf cdrskin-0.8.0.pl00.tar.gz
|
||||
cd cdrskin-0.8.0
|
||||
tar xzf cdrskin-0.7.6.pl00.tar.gz
|
||||
cd cdrskin-0.7.6
|
||||
|
||||
Within that directory execute:
|
||||
|
||||
@ -146,7 +146,7 @@ Obtain some info about the drive
|
||||
cdrskin dev=0,1,0 -checkdrive
|
||||
|
||||
Obtain some info about the drive and the inserted media
|
||||
cdrskin dev=0,1,0 -atip -v -minfo
|
||||
cdrskin dev=0,1,0 -atip -v
|
||||
|
||||
Prepare CD-RW or DVD-RW for re-use, DVD-RAM or BD-RE for first use
|
||||
cdrskin -v dev=/dev/sg1 blank=as_needed -eject
|
||||
@ -399,14 +399,13 @@ drive. See man page section FILES for a way to lift that ban.
|
||||
Special compilation variations
|
||||
|
||||
All following options of ./configure and cdrskin/compile_cdrskin.sh are
|
||||
combinable. After runs of ./configure do as next:
|
||||
make clean ; make
|
||||
combinable.
|
||||
|
||||
In some situations Linux may deliver a better write performance to drives if
|
||||
the track input is read with O_DIRECT (see man 2 open). The API call
|
||||
burn_os_open_track_src() and the input readers of cdrskin and libburn fifo
|
||||
can be told to use this peculiar read mode by:
|
||||
--enable-track-src-odirect
|
||||
--enable-track-src-odirect
|
||||
|
||||
But often cdrskin option dvd_obs=64k will yield even better performance in
|
||||
such a situation. 64k can be made default at compile time by
|
||||
|
@ -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.0"
|
||||
skin_release="0.7.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.1"
|
||||
skin_release="0.7.7"
|
||||
patch_level=""
|
||||
skin_rev="$skin_release""$patch_level"
|
||||
|
@ -203,11 +203,10 @@ int Cdrfifo_close(struct CdrfifO *o, int flag)
|
||||
if(o->dest_fd!=-1)
|
||||
close(o->dest_fd);
|
||||
o->dest_fd= -1;
|
||||
for(i=0; i<o->follow_up_fd_counter; i++) {
|
||||
for(i=0; i<o->follow_up_fd_counter; i++)
|
||||
if(o->follow_up_fds[i][1]!=-1)
|
||||
close(o->follow_up_fds[i][1]);
|
||||
o->follow_up_fds[i][1]= -1;
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
@ -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 "Feb 29, 2010"
|
||||
.TH CDRSKIN 1 "Jan 19, 2010"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
@ -82,7 +82,7 @@ A \fBtrack\fP stores a stream of bytes.
|
||||
.br
|
||||
Each track is initiated by one track source address argument, which may either
|
||||
be "-" for standard input or the address of a readable file. If no write mode
|
||||
is given explicitly then one will be chosen which matches the peculiarities
|
||||
is given explicitely then one will be chosen which matches the peculiarities
|
||||
of track sources and the state of the output media.
|
||||
.PP
|
||||
More than one track can be burned by a single run of cdrskin.
|
||||
@ -93,13 +93,13 @@ Some media types can be kept appendable so that further tracks can
|
||||
be written to them in subsequent runs of cdrskin (see option -multi).
|
||||
Info about the addresses of burned tracks is kept in a table of
|
||||
content (TOC) on media and can be retrieved via cdrskin option -toc.
|
||||
This information is also used by the operating systems' CD-ROM read drivers.
|
||||
These informations are also used by the operating systems' CD-ROM read drivers.
|
||||
.PP
|
||||
In general there are two types of tracks: data and audio. They differ in
|
||||
sector size, throughput and readability via the systems' CD-ROM drivers
|
||||
resp. by music CD players. With DVD and BD there is only type data.
|
||||
.br
|
||||
If not explicitly option -audio is given, then any track is burned as type
|
||||
If not explicitely option -audio is given, then any track is burned as type
|
||||
data, unless the track source is a file with suffix ".wav" or ".au" and has a
|
||||
header part which identifies it as MS-WAVE resp. SUN Audio with suitable
|
||||
parameters. Such files are burned as audio tracks by default.
|
||||
@ -138,7 +138,7 @@ try to choose a write mode which matches the defined recording job,
|
||||
the capabilities of the drive and the state of the present media.
|
||||
.br
|
||||
So the mentioning of write modes in the following paragraphs and in the
|
||||
examples is not so much a demand that the user shall choose one explicitly,
|
||||
examples is not so much a demand that the user shall choose one explicitely,
|
||||
but rather an illustration of what to expect with particular media types.
|
||||
.SS
|
||||
.B Recordable CD Media:
|
||||
@ -181,20 +181,20 @@ With DVD-R[W] two write modes may be available:
|
||||
Mode DAO has many restrictions. It does not work with
|
||||
appendable media, allows no -multi and only a single track. The size of the
|
||||
track needs to be known in advance. So either its source has to be a disk file
|
||||
of recognizable size or the size has to be announced explicitly by options
|
||||
of recognizable size or the size has to be announced explicitely by options
|
||||
.B tsize=
|
||||
or
|
||||
.B tao_to_sao_tsize= .
|
||||
.br
|
||||
DAO is the only mode for media which do not offer feature 21h Incremental
|
||||
Streaming. DAO may also be selected explicitly by option
|
||||
Streaming. DAO may also be selected explicitely by option
|
||||
.B -sao .
|
||||
Program growisofs uses DAO on sequential DVD-R[W] media for maximum
|
||||
DVD-ROM/-Video compatibility.
|
||||
.br
|
||||
The other mode, Incremental Streaming, is the default write mode if
|
||||
it is available and if the restrictions of DAO would prevent the job.
|
||||
Incremental Streaming may be selected explicitly by option
|
||||
Incremental Streaming may be selected explicitely by option
|
||||
.B -tao
|
||||
as it resembles much CD TAO by allowing track sources of
|
||||
unpredicted length and to keep media appendable by option
|
||||
@ -225,7 +225,7 @@ Currently types DVD+RW, DVD-RW, DVD-RAM and BD-RE can be overwritten via
|
||||
cdrskin.
|
||||
.br
|
||||
Option -audio is not allowed. Only one track is allowed.
|
||||
Option -multi cannot mark a recognizable end of overwriteable media.
|
||||
Option -multi cannot mark a recognizeable end of overwriteable media.
|
||||
Therefore -multi is banned unless ISO-9660 images shall be expandable by help
|
||||
of option
|
||||
.B --grow_overwriteable_iso .
|
||||
@ -350,7 +350,7 @@ print "Mounted Media:" and media type text.
|
||||
Announces that the subsequent tracks are to be burned as audio.
|
||||
The source is supposed to be uncompressed headerless PCM, 44100 Hz, 16 bit,
|
||||
stereo. For little-endian byte order (which is usual on PCs) use option
|
||||
-swab. Unless marked explicitly by option -data, input files with suffix
|
||||
-swab. Unless marked explicitely by option -data, input files with suffix
|
||||
".wav" are examined wether they have a header in MS-WAVE format confirming
|
||||
those parameters and eventually raw audio data get extracted and burned as
|
||||
audio track. Same is done for suffix ".au" and SUN Audio.
|
||||
@ -527,7 +527,7 @@ of Bus,Target,Lun addresses.
|
||||
Set "driveropts=noburnfree" to disable the drive's eventual protection
|
||||
mechanism against temporary lack of source data (i.e. buffer underrun).
|
||||
A drive that announces no such capabilities will not get them enabled anyway,
|
||||
even if attempted explicitly via "driveropts=burnfree".
|
||||
even if attempted explicitely via "driveropts=burnfree".
|
||||
.TP
|
||||
.BI \-dummy
|
||||
Try to perform the drive operations without actually affecting the inserted
|
||||
@ -597,7 +597,7 @@ will be used under the assumption that it is a single session filesystem.
|
||||
.br
|
||||
If not, then the burn run will be aborted.
|
||||
.br
|
||||
The range of -isosize is exactly one track. Further tracks may be preceded
|
||||
The range of -isosize is exactly one track. Further tracks may be preceeded
|
||||
by further -isosize options, though. At least 15 blocks of padding will be
|
||||
added to each -isosize track. But be advised to rather use padsize=300k.
|
||||
.br
|
||||
@ -705,7 +705,7 @@ No -multi is allowed with DVD-R[W] -sao.
|
||||
only imposes restrictions without providing known advantages.
|
||||
.br
|
||||
-sao can only be used for tracks of fixely predicted size. This implies that
|
||||
track arguments which depict stdin or named pipes need to be preceded by
|
||||
track arguments which depict stdin or named pipes need to be preceeded by
|
||||
option tsize= or by option tao_to_sao_tsize=.
|
||||
.br
|
||||
-sao cannot be used on appendable media.
|
||||
@ -822,7 +822,7 @@ Alphabetical list of options which are genuine to cdrskin and intended for
|
||||
normal use:
|
||||
.TP
|
||||
.BI \--adjust_speed_to_drive
|
||||
Curb explicitly given speed= values to the maximum which is announced by the
|
||||
Curb explicitely given speed= values to the maximum which is announced by the
|
||||
drive for the loaded media. By default, such an adjustment is only made with
|
||||
pseudo-speeds 0 and -1 whereas speed settings > 0 are sent unchanged to the
|
||||
drive which will then choose an appropriate speed on its own.
|
||||
@ -916,7 +916,7 @@ to cdrskin, then cdrskin will delegate the job to said command.
|
||||
The natural commands to be given are cdrecord or wodim but one may well submit
|
||||
the address of an own program.
|
||||
.br
|
||||
The fallback program will get all arguments of cdrskin which do not match
|
||||
The fallback programm will get all arguments of cdrskin which do not match
|
||||
the shell patterns --?* or *_*=* . This eventually suppresses path names of
|
||||
track sources which happen to match those patterns. The options from the
|
||||
startup files are not handed to the fallback program.
|
||||
@ -962,12 +962,12 @@ source is a ISO-9660 filesystem image.
|
||||
With overwriteable media and no option blank=fast|all present it expands an
|
||||
eventual ISO-9660 filesystem on media. It is assumed that this image's inner
|
||||
size description points to the end of the valuable data.
|
||||
Overwriteable media with a recognizable ISO-9660 size will be regarded as
|
||||
Overwriteable media with a recognizeable ISO-9660 size will be regarded as
|
||||
appendable rather than as blank. I.e. options -msinfo and -toc will work.
|
||||
-toc will always show a single session with its size increasing with
|
||||
every added mkisofs image.
|
||||
.br
|
||||
If not overridden by option write_start_address=, the track with the new image
|
||||
If not overriden by option write_start_address=, the track with the new image
|
||||
will be placed behind the end of the old one. One may use option
|
||||
assert_write_lba= to make sure that media state and mkisofs job do match.
|
||||
.br
|
||||
@ -1062,7 +1062,7 @@ the available capacity. So for most realistic results one may set up
|
||||
the full burn session and add --tell_media_space. But if one has to expect
|
||||
a cdrskin version prior to 0.3.3 no track source should be given in order
|
||||
not to start an involuntary burn session.
|
||||
In this case set at least -sao or -tao explicitly.
|
||||
In this case set at least -sao or -tao explicitely.
|
||||
.br
|
||||
The result gets printed to standard output. It is 0 or empty if no writing
|
||||
is possible with the given options.
|
||||
@ -1130,7 +1130,7 @@ Wether this leads to senseful behavior depends on operating system and kernel.
|
||||
Linux specific: Select a SCSI device file family to be scanned for by
|
||||
options --devices and -scanbus.
|
||||
Normally this is /dev/sgN on kernel versions < 2.6 and /dev/srN
|
||||
on kernels >= 2.6 . This option allows to explicitly override that default
|
||||
on kernels >= 2.6 . This option allows to explicitely override that default
|
||||
in order to meet other programs at a common device file for each drive.
|
||||
On kernel 2.4 families sr and scd will find no drives.
|
||||
.br
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
/*
|
||||
cdrskin.c , Copyright 2006-2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
Provided under GPL version 2 or later. See future commitment below.
|
||||
|
||||
A cdrecord compatible command line interface for libburn.
|
||||
|
||||
@ -88,7 +88,7 @@ or
|
||||
|
||||
/** The official program version */
|
||||
#ifndef Cdrskin_prog_versioN
|
||||
#define Cdrskin_prog_versioN "0.8.0"
|
||||
#define Cdrskin_prog_versioN "0.7.6"
|
||||
#endif
|
||||
|
||||
/** The official libburn interface revision to use.
|
||||
@ -98,10 +98,10 @@ or
|
||||
#define Cdrskin_libburn_majoR 0
|
||||
#endif
|
||||
#ifndef Cdrskin_libburn_minoR
|
||||
#define Cdrskin_libburn_minoR 8
|
||||
#define Cdrskin_libburn_minoR 7
|
||||
#endif
|
||||
#ifndef Cdrskin_libburn_micrO
|
||||
#define Cdrskin_libburn_micrO 0
|
||||
#define Cdrskin_libburn_micrO 6
|
||||
#endif
|
||||
|
||||
|
||||
@ -135,47 +135,43 @@ or
|
||||
#endif /* Cdrskin_libburn_cvs_A60220_tS */
|
||||
|
||||
|
||||
#ifdef Cdrskin_libburn_0_8_0
|
||||
#define Cdrskin_libburn_versioN "0.8.0"
|
||||
#ifdef Cdrskin_libburn_0_7_6
|
||||
#define Cdrskin_libburn_versioN "0.7.6"
|
||||
#define Cdrskin_libburn_from_pykix_svN 1
|
||||
#endif /* Cdrskin_libburn_0_8_0 */
|
||||
#endif /* Cdrskin_libburn_0_7_6 */
|
||||
|
||||
#ifdef Cdrskin_libburn_0_8_1
|
||||
#define Cdrskin_libburn_versioN "0.8.1"
|
||||
#ifdef Cdrskin_libburn_0_7_7
|
||||
#define Cdrskin_libburn_versioN "0.7.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_1 */
|
||||
#endif /* Cdrskin_libburn_0_7_7 */
|
||||
|
||||
#ifndef Cdrskin_libburn_versioN
|
||||
#define Cdrskin_libburn_0_8_0
|
||||
#define Cdrskin_libburn_versioN "0.8.0"
|
||||
#define Cdrskin_libburn_0_7_6
|
||||
#define Cdrskin_libburn_versioN "0.7.6"
|
||||
#define Cdrskin_libburn_from_pykix_svN 1
|
||||
#endif
|
||||
|
||||
#ifdef Cdrskin_libburn_0_8_0
|
||||
#ifdef Cdrskin_libburn_0_7_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_micrO 0
|
||||
#define Cdrskin_libburn_minoR 7
|
||||
#define Cdrskin_libburn_micrO 6
|
||||
#endif
|
||||
#ifdef Cdrskin_libburn_0_8_1
|
||||
#ifdef Cdrskin_libburn_0_7_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_micrO 1
|
||||
#define Cdrskin_libburn_minoR 7
|
||||
#define Cdrskin_libburn_micrO 7
|
||||
#endif
|
||||
|
||||
|
||||
@ -372,34 +368,7 @@ or
|
||||
#define Cleanup_app_handler_T burn_abort_handler_t
|
||||
#else
|
||||
#include "cleanup.h"
|
||||
#ifdef Cdrskin_use_libburn_cleanuP
|
||||
#undef Cdrskin_use_libburn_cleanuP
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
# define Cdrskin_use_libburn_cleanuP 1
|
||||
*/
|
||||
/* May not use libburn cleanup with cdrskin fifo */
|
||||
#ifndef Cdrskin_use_libburn_fifO
|
||||
#ifdef Cdrskin_use_libburn_cleanuP
|
||||
#undef Cdrskin_use_libburn_cleanuP
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef Cdrskin_use_libburn_cleanuP
|
||||
#define Cleanup_handler_funC NULL
|
||||
#define Cleanup_handler_handlE "cdrskin: "
|
||||
#define Cleanup_handler_flaG 48
|
||||
#else
|
||||
#define Cleanup_handler_funC (Cleanup_app_handler_T) Cdrskin_abort_handler
|
||||
#define Cleanup_handler_handlE skin
|
||||
#define Cleanup_handler_flaG 4
|
||||
#endif /* ! Cdrskin_use_libburn_cleanuP */
|
||||
|
||||
/* 0= no abort going on, -1= Cdrskin_abort_handler was called
|
||||
*/
|
||||
static int Cdrskin_abort_leveL= 0;
|
||||
|
||||
|
||||
/** The size of a string buffer for pathnames and similar texts */
|
||||
@ -1827,6 +1796,7 @@ int Cdrtrack_add_to_session(struct CdrtracK *track, int trackno,
|
||||
|
||||
Cdrskin_get_fifo_par(track->boss, &fifo_enabled, &fifo_size, &fifo_start_at,
|
||||
0);
|
||||
fd_src= src;
|
||||
|
||||
if(track->track_type == BURN_AUDIO)
|
||||
chunksize= 2352;
|
||||
@ -1836,7 +1806,6 @@ int Cdrtrack_add_to_session(struct CdrtracK *track, int trackno,
|
||||
chunksize= 2048;
|
||||
chunks= fifo_size / chunksize;
|
||||
if(chunks > 1 && fifo_enabled) {
|
||||
fd_src= src;
|
||||
src= burn_fifo_source_new(fd_src, chunksize, chunks,
|
||||
(chunksize * chunks >= 128 * 1024));
|
||||
if((flag & 1) || src == NULL)
|
||||
@ -3646,7 +3615,6 @@ int Cdrskin_new(struct CdrskiN **skin, struct CdrpreskiN *preskin, int flag)
|
||||
o->write_type= BURN_WRITE_SAO;
|
||||
o->block_type= BURN_BLOCK_SAO;
|
||||
o->multi= 0;
|
||||
o->cdxa_conversion= 0;
|
||||
o->modesty_on_drive= 0;
|
||||
o->min_buffer_percent= 65;
|
||||
o->max_buffer_percent= 95;
|
||||
@ -4118,8 +4086,7 @@ ex:;
|
||||
#ifdef Cdrskin_grab_abort_brokeN
|
||||
if(restore_handler) {
|
||||
int Cdrskin_abort_handler(struct CdrskiN *, int, int);
|
||||
Cleanup_set_handlers(Cleanup_handler_handlE, Cleanup_handler_funC,
|
||||
Cleanup_handler_flaG);
|
||||
Cleanup_set_handlers(skin,(Cleanup_app_handler_T) Cdrskin_abort_handler,4);
|
||||
}
|
||||
#endif /* Cdrskin_grab_abort_brokeN */
|
||||
|
||||
@ -4152,42 +4119,17 @@ int Cdrskin_release_drive(struct CdrskiN *skin, int flag)
|
||||
}
|
||||
|
||||
|
||||
int Cdrskin__is_aborting(int flag)
|
||||
{
|
||||
if(Cdrskin_abort_leveL)
|
||||
return(-1);
|
||||
return(burn_is_aborting(0));
|
||||
}
|
||||
|
||||
|
||||
int Cdrskin_abort(struct CdrskiN *skin, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
Cdrskin_abort_leveL= 1;
|
||||
ret= burn_abort(skin->abort_max_wait, burn_abort_pacifier, "cdrskin: ");
|
||||
if(ret<=0) {
|
||||
fprintf(stderr,
|
||||
"\ncdrskin: ABORT : Cannot cancel burn session and release drive.\n");
|
||||
return(0);
|
||||
} else {
|
||||
fprintf(stderr,
|
||||
"cdrskin: ABORT : Drive is released and library is shut down now.\n");
|
||||
}
|
||||
fprintf(stderr,
|
||||
"cdrskin: ABORT : Program done. Even if you do not see a shell prompt.\n");
|
||||
fprintf(stderr,"\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
/** Clean up resources in abort situations. To be called by Cleanup subsystem
|
||||
but hardly ever by the application. The program must exit afterwards.
|
||||
*/
|
||||
int Cdrskin_abort_handler(struct CdrskiN *skin, int signum, int flag)
|
||||
{
|
||||
|
||||
#ifndef Cdrskin_libburn_has_burn_aborT
|
||||
#ifdef Cdrskin_libburn_has_burn_aborT
|
||||
|
||||
int ret;
|
||||
|
||||
#else
|
||||
|
||||
int wait_grain= 100000,first_status= 1;
|
||||
double start_time,last_time,current_time;
|
||||
@ -4239,15 +4181,14 @@ int Cdrskin_abort_handler(struct CdrskiN *skin, int signum, int flag)
|
||||
fprintf(stderr,"cdrskin: ABORT : Usually it is done with 4x speed after about a MINUTE\n");
|
||||
fprintf(stderr,"cdrskin: URGE : But wait at least the normal burning time before any kill -9\n");
|
||||
}
|
||||
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||
ClN(fprintf(stderr,"cdrskin_debug: ABORT : Calling burn_abort()\n"));
|
||||
|
||||
Cdrskin_abort_leveL= -1;
|
||||
if (!(flag & 1))
|
||||
burn_abort(-1, burn_abort_pacifier, "cdrskin: ");
|
||||
fprintf(stderr,
|
||||
"cdrskin: ABORT : Urged drive worker threads to do emergency halt.\n");
|
||||
return -2;
|
||||
ret= burn_abort(skin->abort_max_wait, burn_abort_pacifier, "cdrskin: ");
|
||||
if(ret<=0) {
|
||||
fprintf(stderr,
|
||||
"\ncdrskin: ABORT : Cannot cancel burn session and release drive.\n");
|
||||
return(0);
|
||||
}
|
||||
fprintf(stderr,"\n");
|
||||
|
||||
#else /* Cdrskin_libburn_has_burn_aborT */
|
||||
|
||||
@ -5276,8 +5217,8 @@ int Cdrskin_minfo(struct CdrskiN *skin, int flag)
|
||||
/* If last two blocks not readable then assume TAO and subtract 2
|
||||
from lra and size.
|
||||
*/;
|
||||
ret= burn_read_data(drive, (off_t) (lra - 1) * (off_t) 2048, buf,
|
||||
2 * 2048, &buf_count, 2 | 4);
|
||||
ret= burn_read_data(drive, (off_t) lra * (off_t) 2048, buf, 2 * 2048,
|
||||
&buf_count, 2 | 4);
|
||||
if(ret <= 0) {
|
||||
lra-= 2;
|
||||
size-= 2;
|
||||
@ -6092,8 +6033,6 @@ ex:;
|
||||
skin->drive_is_busy= 0;
|
||||
if(skin->drive_is_grabbed)
|
||||
Cdrskin_release_drive(skin,0);
|
||||
if(Cdrskin__is_aborting(0))
|
||||
Cdrskin_abort(skin, 0); /* Never comes back */
|
||||
return(ret);
|
||||
}
|
||||
|
||||
@ -6147,9 +6086,6 @@ int Cdrskin_burn_pacifier(struct CdrskiN *skin,
|
||||
/* for debugging */
|
||||
static double last_fifo_in= 0.0,last_fifo_out= 0.0,curr_fifo_in,curr_fifo_out;
|
||||
|
||||
if(Cdrskin__is_aborting(0))
|
||||
Cdrskin_abort(skin, 0); /* Never comes back */
|
||||
|
||||
current_time= Sfile_microtime(0);
|
||||
elapsed_total_time= current_time-start_time;
|
||||
elapsed_time= current_time-*last_time;
|
||||
@ -7358,8 +7294,7 @@ fifo_filling_failed:;
|
||||
skin->drive_is_busy= 1;
|
||||
burn_disc_write(o, disc);
|
||||
if(skin->preskin->abort_handler==-1)
|
||||
Cleanup_set_handlers(Cleanup_handler_handlE, Cleanup_handler_funC,
|
||||
Cleanup_handler_flaG);
|
||||
Cleanup_set_handlers(skin,(Cleanup_app_handler_T) Cdrskin_abort_handler,4);
|
||||
last_time= start_time= Sfile_microtime(0);
|
||||
|
||||
burn_write_opts_free(o);
|
||||
@ -7378,7 +7313,7 @@ fifo_filling_failed:;
|
||||
|
||||
/* >>> how do i learn about success or failure ? */
|
||||
|
||||
if(loop_counter>0 || Cdrskin__is_aborting(0))
|
||||
if(loop_counter>0)
|
||||
Cdrskin_burn_pacifier(skin,drive_status,&p,start_time,&last_time,
|
||||
&total_count,&last_count,&min_buffer_fill,0);
|
||||
|
||||
@ -7452,9 +7387,6 @@ fifo_filling_failed:;
|
||||
if(skin->verbosity>=Cdrskin_verbose_progresS)
|
||||
printf("\n");
|
||||
|
||||
if(Cdrskin__is_aborting(0))
|
||||
Cdrskin_abort(skin, 0); /* Never comes back */
|
||||
|
||||
#ifdef Cdrskin_libburn_has_wrote_welL
|
||||
wrote_well = burn_drive_wrote_well(drive);
|
||||
#endif
|
||||
@ -8953,11 +8885,9 @@ int Cdrskin_create(struct CdrskiN **o, struct CdrpreskiN **preskin,
|
||||
*o= skin;
|
||||
if(skin->preskin->abort_handler==1 || skin->preskin->abort_handler==3 ||
|
||||
skin->preskin->abort_handler==4)
|
||||
Cleanup_set_handlers(Cleanup_handler_handlE, Cleanup_handler_funC,
|
||||
Cleanup_handler_flaG);
|
||||
Cleanup_set_handlers(skin,(Cleanup_app_handler_T) Cdrskin_abort_handler,4);
|
||||
else if(skin->preskin->abort_handler==2)
|
||||
Cleanup_set_handlers(Cleanup_handler_handlE, Cleanup_handler_funC,
|
||||
2 | 8);
|
||||
Cleanup_set_handlers(skin,(Cleanup_app_handler_T) Cdrskin_abort_handler,2|8);
|
||||
|
||||
printf("cdrskin: scanning for devices ...\n");
|
||||
fflush(stdout);
|
||||
@ -9033,28 +8963,21 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag)
|
||||
if(skin->do_devices) {
|
||||
if(skin->n_drives<=0 && skin->preskin->scan_demands_drive)
|
||||
{*exit_value= 4; goto no_drive;}
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_scanbus(skin,1);
|
||||
if(ret<=0) {
|
||||
fprintf(stderr,"cdrskin: FATAL : --devices failed.\n");
|
||||
{*exit_value= 4; goto ex;}
|
||||
}
|
||||
}
|
||||
|
||||
if(skin->do_scanbus) {
|
||||
if(skin->n_drives<=0 && skin->preskin->scan_demands_drive)
|
||||
{*exit_value= 5; goto no_drive;}
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_scanbus(skin,0);
|
||||
if(ret<=0)
|
||||
fprintf(stderr,"cdrskin: FATAL : -scanbus failed.\n");
|
||||
{*exit_value= 5*(ret<=0); goto ex;}
|
||||
}
|
||||
if(skin->do_load) {
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_grab_drive(skin,8);
|
||||
if(ret>0) {
|
||||
if(skin->do_load==2 && !skin->do_eject) {
|
||||
@ -9070,16 +8993,12 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag)
|
||||
{*exit_value= 14*(ret<=0); goto ex;}
|
||||
}
|
||||
if(skin->do_checkdrive) {
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_checkdrive(skin,"",(skin->do_checkdrive==2)<<1);
|
||||
{*exit_value= 6*(ret<=0); goto ex;}
|
||||
}
|
||||
if(skin->do_msinfo) {
|
||||
if(skin->n_drives<=0)
|
||||
{*exit_value= 12; goto no_drive;}
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_msinfo(skin,0);
|
||||
if(ret<=0)
|
||||
{*exit_value= 12; goto ex;}
|
||||
@ -9087,8 +9006,6 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag)
|
||||
if(skin->do_atip) {
|
||||
if(skin->n_drives<=0)
|
||||
{*exit_value= 7; goto no_drive;}
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_atip(skin, skin->do_atip == 4 ? 4 :
|
||||
(skin->do_atip>1) | (2 * (skin->do_atip > 2)));
|
||||
if(ret<=0)
|
||||
@ -9097,8 +9014,6 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag)
|
||||
if(skin->do_list_formats) {
|
||||
if(skin->n_drives<=0)
|
||||
{*exit_value= 14; goto no_drive;}
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_list_formats(skin, 0);
|
||||
if(ret<=0)
|
||||
{*exit_value= 14; goto ex;}
|
||||
@ -9106,8 +9021,6 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag)
|
||||
if(skin->do_blank) {
|
||||
if(skin->n_drives<=0)
|
||||
{*exit_value= 8; goto no_drive;}
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_blank(skin,0);
|
||||
if(ret<=0)
|
||||
{*exit_value= 8; goto ex;}
|
||||
@ -9116,8 +9029,6 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag)
|
||||
#ifdef Cdrskin_libburn_has_random_access_rW
|
||||
if(skin->do_direct_write) {
|
||||
skin->do_burn= 0;
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_direct_write(skin,0);
|
||||
if(ret<=0)
|
||||
{*exit_value= 13; goto ex;}
|
||||
@ -9127,15 +9038,11 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag)
|
||||
if(skin->do_burn || skin->tell_media_space) {
|
||||
if(skin->n_drives<=0)
|
||||
{*exit_value= 10; goto no_drive;}
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_burn(skin,0);
|
||||
if(ret<=0)
|
||||
{*exit_value= 10; goto ex;}
|
||||
}
|
||||
ex:;
|
||||
if(Cdrskin__is_aborting(0))
|
||||
Cdrskin_abort(skin, 0); /* Never comes back */
|
||||
return((*exit_value)==0);
|
||||
no_drive:;
|
||||
fprintf(stderr,"cdrskin: FATAL : This run would need an accessible drive\n");
|
||||
@ -9183,7 +9090,7 @@ int main(int argc, char **argv)
|
||||
messaging need libburn running */
|
||||
ret= Cdrpreskin_initialize_lib(preskin,0);
|
||||
if(ret<=0) {
|
||||
fprintf(stderr,"cdrskin: FATAL : Initialization of burn library failed\n");
|
||||
fprintf(stderr,"cdrskin: FATAL : Initializiation of burn library failed\n");
|
||||
{exit_value= 2; goto ex;}
|
||||
}
|
||||
lib_initialized= 1;
|
||||
@ -9223,13 +9130,9 @@ int main(int argc, char **argv)
|
||||
#endif
|
||||
}
|
||||
|
||||
if(!Cdrskin__is_aborting(0))
|
||||
Cdrskin_run(skin,&exit_value,0);
|
||||
Cdrskin_run(skin,&exit_value,0);
|
||||
|
||||
ex:;
|
||||
if(Cdrskin__is_aborting(0))
|
||||
Cdrskin_abort(skin, 0); /* Never comes back */
|
||||
|
||||
if(preskin!=NULL)
|
||||
h_preskin= preskin;
|
||||
else if(skin!=NULL)
|
||||
|
@ -62,7 +62,7 @@ via SCSI, PATA (aka IDE, ATA), USB, or SATA.
|
||||
GPL software included:<BR>
|
||||
</H2>
|
||||
<DL>
|
||||
<DT>libburn-0.8.0</DT>
|
||||
<DT>libburn-0.7.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)
|
||||
@ -194,8 +194,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.0.pl00.tar.gz">cdrskin-0.8.0.pl00.tar.gz</A>
|
||||
(835 KB).
|
||||
<DD><A HREF="cdrskin-0.7.6.pl00.tar.gz">cdrskin-0.7.6.pl00.tar.gz</A>
|
||||
(810 KB).
|
||||
</DD>
|
||||
<DD>
|
||||
The cdrskin tarballs are source code identical with libburn releases
|
||||
@ -244,21 +244,22 @@ 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.7.8.pl00:
|
||||
Enhancements towards previous stable version cdrskin-0.7.4.pl00:
|
||||
<UL>
|
||||
<LI>
|
||||
Now able to work with ahci driver of FreeBSD 8-STABLE
|
||||
Made FreeBSD system adapter safe from mutal burn spoiling and drive deadlock
|
||||
</LI>
|
||||
<LI>Experimental system adapter via GNU libcdio on X/Open systems</LI>
|
||||
<LI>Experimentally using FreeBSD system adapter for Debian kfreebsd</LI>
|
||||
<!--
|
||||
<LI>none</LI>
|
||||
-->
|
||||
</UL>
|
||||
|
||||
Bug fixes towards cdrskin-0.7.8.pl00:
|
||||
Bug fixes towards cdrskin-0.7.4.pl00:
|
||||
<UL>
|
||||
<LI>none</LI>
|
||||
<!--
|
||||
<LI>none</LI>
|
||||
-->
|
||||
</UL>
|
||||
|
||||
@ -266,8 +267,8 @@ Bug fixes towards cdrskin-0.7.8.pl00:
|
||||
|
||||
<P>
|
||||
<DL>
|
||||
<DT><H3>Development snapshot, version 0.8.1 :</H3></DT>
|
||||
<DD>Enhancements towards current stable version 0.8.0.pl00:
|
||||
<DT><H3>Development snapshot, version 0.7.7 :</H3></DT>
|
||||
<DD>Enhancements towards current stable version 0.7.6.pl00:
|
||||
<UL>
|
||||
<LI>none yet</LI>
|
||||
<!--
|
||||
@ -276,7 +277,7 @@ Bug fixes towards cdrskin-0.7.8.pl00:
|
||||
</UL>
|
||||
</DD>
|
||||
|
||||
<DD>Bug fixes towards cdrskin-0.8.0.pl00:
|
||||
<DD>Bug fixes towards cdrskin-0.7.6.pl00:
|
||||
<UL>
|
||||
<LI>none yet</LI>
|
||||
<!--
|
||||
@ -285,10 +286,10 @@ Bug fixes towards cdrskin-0.7.8.pl00:
|
||||
</DD>
|
||||
|
||||
<DD> </DD>
|
||||
<DD><A HREF="README_cdrskin_devel">README 0.8.1</A>
|
||||
<DD><A HREF="cdrskin__help_devel">cdrskin_0.8.1 --help</A></DD>
|
||||
<DD><A HREF="cdrskin_help_devel">cdrskin_0.8.1 -help</A></DD>
|
||||
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 0.8.1)</A></DD>
|
||||
<DD><A HREF="README_cdrskin_devel">README 0.7.7</A>
|
||||
<DD><A HREF="cdrskin__help_devel">cdrskin_0.7.7 --help</A></DD>
|
||||
<DD><A HREF="cdrskin_help_devel">cdrskin_0.7.7 -help</A></DD>
|
||||
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 0.7.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>
|
||||
@ -308,8 +309,8 @@ admins with full system souvereignty.</DT>
|
||||
<A HREF="README_cdrskin_devel">upcoming README</A> ):
|
||||
</DD>
|
||||
<DD>
|
||||
<A HREF="cdrskin-0.8.1.tar.gz">cdrskin-0.8.1.tar.gz</A>
|
||||
(840 KB).
|
||||
<A HREF="cdrskin-0.7.7.tar.gz">cdrskin-0.7.7.tar.gz</A>
|
||||
(810 KB).
|
||||
</DD>
|
||||
|
||||
<!-- This is not offered any more since spring 2008
|
||||
|
@ -1 +1 @@
|
||||
#define Cdrskin_timestamP "2010.04.09.100001"
|
||||
#define Cdrskin_timestamP "2010.01.22.130001"
|
||||
|
@ -7929,7 +7929,7 @@ Lifted ban to derive GPLv3, extended copyright range to 2010
|
||||
+ cdrskin/add_ts_changes_to_libburn_0_7_7
|
||||
Updated cdrskin tarball generator
|
||||
|
||||
22 Jan 2009 [3034]
|
||||
22 Jan 2009 []
|
||||
cdrskin/changelog.txt
|
||||
Documented changes and release timestamp
|
||||
|
||||
@ -7940,387 +7940,84 @@ Documented changes and release timestamp
|
||||
* Enabled FreeBSD system adapter for Debian kfreebsd
|
||||
* Experimental SCSI transport adapter via GNU libcdio 0.83git
|
||||
|
||||
|
||||
2010.01.23.103338 [3035]
|
||||
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.7.7
|
||||
|
||||
2010.01.23.104423 [3036]
|
||||
COPYRIGHT
|
||||
doc/cookbook.txt
|
||||
libburn/libdax_msgs.h
|
||||
libburn/libdax_msgs.c
|
||||
test/libburner.c
|
||||
test/telltoc.c
|
||||
Lifted ban to derive GPLv3, extended copyright range to 2010
|
||||
|
||||
23 Jan 2010 [3037]
|
||||
- cdrskin/add_ts_changes_to_libburn_0_7_4
|
||||
- cdrskin/add_ts_changes_to_libburn_0_7_5
|
||||
+ cdrskin/add_ts_changes_to_libburn_0_7_6
|
||||
+ cdrskin/add_ts_changes_to_libburn_0_7_7
|
||||
Updated cdrskin tarball generator
|
||||
|
||||
------------------------------------ cycle - cdrskin-0.7.7 - 2010.01.23.104423
|
||||
|
||||
|
||||
23 Jan 2010 [3038]
|
||||
svn move -m 'libburn release 0.7.6 is ready'
|
||||
http://svn.libburnia-project.org/libburn/branches/ZeroSevenSix
|
||||
http://svn.libburnia-project.org/libburn/tags/ZeroSevenSix
|
||||
|
||||
2010.02.04.083315 [3054]
|
||||
acinclude.m4
|
||||
configure.ac
|
||||
Forcing use of /usr/local on FreeBSD by LDFLAGS and CPPFLAGS
|
||||
|
||||
2010.02.12.173236 [3063]
|
||||
libburn/os-linux.h
|
||||
libburn/sg-linux.c
|
||||
Changed system adapter id and some remarks from "Linux" to "GNU/Linux"
|
||||
|
||||
2010.02.12.212818 [3064]
|
||||
libburn/libburn.h
|
||||
libburn/sg.c
|
||||
libburn/mmc.c
|
||||
libburn/drive.c
|
||||
libburn/init.c
|
||||
libburn/cleanup.c
|
||||
libburn/os-linux.h
|
||||
libburn/sg-linux.c
|
||||
libburn/write.c
|
||||
libburn/read.c
|
||||
libburn/sg-libcdio.c
|
||||
libburn/os-libcdio.h
|
||||
libburn/os.h
|
||||
libburn/toc.c
|
||||
Changed docs and comments to "GNU/Linux" where appropriate
|
||||
|
||||
2010.02.14.084452 [3066]
|
||||
libburn/sbc.c
|
||||
libburn/file.h
|
||||
libburn/os-libcdio.h
|
||||
libburn/os-dummy.h
|
||||
libburn/cleanup.h
|
||||
libburn/sector.h
|
||||
libburn/libiso_msgs.c
|
||||
libburn/async.c
|
||||
libburn/libdax_audioxtr.h
|
||||
libburn/ecma130ab.c
|
||||
libburn/back_hacks.h
|
||||
libburn/libdax_msgs.h
|
||||
libburn/drive.h
|
||||
libburn/read.c
|
||||
libburn/source.c
|
||||
libburn/util.h
|
||||
libburn/cleanup.c
|
||||
libburn/sg.c
|
||||
libburn/init.c
|
||||
libburn/write.c
|
||||
libburn/transport.h
|
||||
libburn/write.h
|
||||
libburn/libburn.h
|
||||
libburn/options.c
|
||||
libburn/mmc.h
|
||||
libburn/sg.h
|
||||
libburn/sbc.h
|
||||
libburn/sg-dummy.c
|
||||
libburn/ecma130ab.h
|
||||
libburn/null.c
|
||||
libburn/structure.c
|
||||
libburn/mmc.c
|
||||
libburn/spc.h
|
||||
libburn/drive.c
|
||||
libburn/sg-linux.c
|
||||
libburn/options.h
|
||||
libburn/os-linux.h
|
||||
libburn/sg-libcdio.c
|
||||
libburn/os-freebsd.h
|
||||
libburn/sg-freebsd-port.c
|
||||
libburn/sector.c
|
||||
libburn/debug.c
|
||||
libburn/util.c
|
||||
libburn/toc.h
|
||||
libburn/file.c
|
||||
libburn/libdax_audioxtr.c
|
||||
libburn/libdax_msgs.c
|
||||
libburn/toc.c
|
||||
libburn/sg-freebsd.c
|
||||
libburn/spc.c
|
||||
libburn/structure.h
|
||||
Added or adjusted copyright and license statements in single files
|
||||
|
||||
2010.02.14.171833 [3069]
|
||||
libburn/write.c
|
||||
libburn/read.c
|
||||
libburn/sector.c
|
||||
libburn/crc.h
|
||||
Created opportunity to omit source module libburn/crc.c
|
||||
|
||||
2010.02.15.125922 [3071]
|
||||
libburn/crc.h
|
||||
Changed a comment in libburn/crc.h
|
||||
|
||||
2010.02.16.194147 [3073]
|
||||
libburn/file.c
|
||||
Bug fix on FreeBSD: Piped input was falsely attributed a small fixed size
|
||||
|
||||
2010.02.17.141409 [3075]
|
||||
libburn/async.c
|
||||
libburn/drive.c
|
||||
libburn/write.c
|
||||
Avoided random percentage display at start of blanking
|
||||
|
||||
2010.02.22.134904 [3080]
|
||||
libburn/init.c
|
||||
Made burn_set_signal_handling() more suitable for cdrskin
|
||||
|
||||
2010.02.25.070635 [3090]
|
||||
libburn/write.c
|
||||
Corrected optional speed curb for stdio: drives. Was damaged by revision 2903.
|
||||
|
||||
2010.02.28.104003 [3091]
|
||||
cdrskin/cdrskin.c
|
||||
Added forgotten initialization of a variable
|
||||
|
||||
2010.02.28.110749 [3092]
|
||||
cdrskin/cdrskin.c
|
||||
Bug fix: cdrskin fs=0 lead to SIGSEGV. Regression introduced by revision 2936.
|
||||
|
||||
28 Feb 2010 [3093]
|
||||
cdrskin/cdrskin.1
|
||||
Corrected spelling errors in cdrskin man page
|
||||
|
||||
2010.03.03.140639 [3096]
|
||||
libburn/drive.c
|
||||
Enabled patience 0 within burn_abort()
|
||||
|
||||
2010.03.03.141407 [3097]
|
||||
cdrskin/cdrskin.c
|
||||
cdrskin/cdrfifo.c
|
||||
Adapted cdrskin abort handler to FreeBSD peculiarities
|
||||
|
||||
3 Mar 2010 [3098] [3099]
|
||||
cdrskin/compile_cdrskin.sh
|
||||
Enabled static compile script compile_cdrskin.sh for FreeBSD
|
||||
|
||||
2010.03.04.121441 [3100]
|
||||
libburn/sg-linux.c
|
||||
Showing more patience with temporarily busy drives on Linux
|
||||
|
||||
2010.03.04.180102 [3101]
|
||||
cdrskin/cdrskin.c
|
||||
Changed burn_abort(0) to burn_abort(-1)
|
||||
|
||||
2010.03.05.090948 [3102]
|
||||
libburn/libburn.h
|
||||
libburn/transport.h
|
||||
libburn/drive.h
|
||||
libburn/drive.c
|
||||
libburn/init.h
|
||||
libburn/init.c
|
||||
libburn/async.c
|
||||
libburn/write.c
|
||||
libburn/sector.c
|
||||
libburn/libdax_msgs.h
|
||||
libburn/libdax_msgs.c
|
||||
Introduced alternative signal handling actions
|
||||
|
||||
2010.03.05.091432 [3103]
|
||||
cdrskin/cdrskin.c
|
||||
Enabled optional use of new signal action 2 with libburn built-in handler
|
||||
|
||||
2010.03.05.111712 [3104]
|
||||
libburn/init.c
|
||||
libburn/drive.h
|
||||
libburn/drive.c
|
||||
Removed some debugging printing
|
||||
|
||||
------------------------------------ cycle - cdrskin-0.7.7 - 2010.03.05.111954
|
||||
Bug fix on FreeBSD: Piped input was falsely attributed a small fixed size
|
||||
Bug fix: cdrskin fs=0 led to SIGSEGV. Regression introduced by revision 2936.
|
||||
|
||||
|
||||
2010.03.05.190110 [3105]
|
||||
libburn/async.c
|
||||
Protected blanker and formatter thread from signals
|
||||
|
||||
06 Mar 2010 [3106]
|
||||
test/libburner.c
|
||||
Adapted libburner to new advise about signal handling
|
||||
|
||||
07 Mar 2010 [3107]
|
||||
libburn/libburn.h
|
||||
test/libburner.c
|
||||
Changed examples burn_set_signal_handling(...,48) to (...,0x30)
|
||||
|
||||
2010.03.08.092608 [3108]
|
||||
libburn/libburn.h
|
||||
libburn/init.c
|
||||
Prevented potential memory fault with burn_set_signal_handling()
|
||||
|
||||
2010.03.09.140341 [3111]
|
||||
libburn/libburn.h
|
||||
Clarifications in API description of burn_set_signal_handling()
|
||||
|
||||
10 Mar 2010 [3112]
|
||||
svn copy -m "Branching for libburn release 0.7.8" \
|
||||
http://svn.libburnia-project.org/libburn/trunk \
|
||||
http://svn.libburnia-project.org/libburn/branches/ZeroSevenEight
|
||||
|
||||
2010.03.10.120001 [3113]
|
||||
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.7.8
|
||||
|
||||
10 Mar 2010 [3114]
|
||||
- cdrskin/add_ts_changes_to_libburn_0_7_6
|
||||
- cdrskin/add_ts_changes_to_libburn_0_7_7
|
||||
+ cdrskin/add_ts_changes_to_libburn_0_7_8
|
||||
+ cdrskin/add_ts_changes_to_libburn_0_7_9
|
||||
Updated cdrskin tarball generator
|
||||
|
||||
10 Mar 2010 [3115]
|
||||
cdrskin/cdrskin.c
|
||||
Removed unused variable
|
||||
|
||||
10 Mar 2010 [3116]
|
||||
cdrskin/changelog.txt
|
||||
Documented changes and release timestamp
|
||||
|
||||
------------------------------ release - cdrskin-0.7.8.pl00 - 2010.03.10.120001
|
||||
Bug fix on FreeBSD: Piped input was falsely attributed a small fixed size
|
||||
Bug fix: cdrskin fs=0 led to SIGSEGV. Regression introduced by version 0.7.4.
|
||||
|
||||
|
||||
2010.03.10.134802 [3117]
|
||||
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.7.9
|
||||
|
||||
10 Mar 2010 [3118]
|
||||
- cdrskin/add_ts_changes_to_libburn_0_7_6
|
||||
- cdrskin/add_ts_changes_to_libburn_0_7_7
|
||||
+ cdrskin/add_ts_changes_to_libburn_0_7_8
|
||||
+ cdrskin/add_ts_changes_to_libburn_0_7_9
|
||||
Updated cdrskin tarball generator
|
||||
|
||||
10 Mar 2010 [3119]
|
||||
cdrskin/changelog.txt
|
||||
Documented changes and release timestamp
|
||||
|
||||
10 Mar 2010 [3120]
|
||||
svn move -m 'libburn release 0.7.8 is ready'
|
||||
http://svn.libburnia-project.org/libburn/branches/ZeroSevenEight
|
||||
http://svn.libburnia-project.org/libburn/tags/ZeroSevenEight
|
||||
|
||||
------------------------------------ cycle - cdrskin-0.7.9 - 2010.03.10.143607
|
||||
|
||||
2010.03.17.185222 [3123]
|
||||
cdrskin/cdrskin.c
|
||||
Small bug fix about track size with cdrskin -minfo
|
||||
|
||||
17 Mar 2010 [3124]
|
||||
configure.ac
|
||||
Corrected initialization of configure option --enable-dvd-obs-64k
|
||||
|
||||
2010.03.25.113536 [3131]
|
||||
libburn/spc.c
|
||||
libburn/sg-freebsd.c
|
||||
Changed sg-freebsd.c to work with ahci, advise by Alexander Motin
|
||||
|
||||
2010.03.26.083158 [3132]
|
||||
libburn/sg-freebsd.c
|
||||
Had to make ahci change conditional for now: -DLibburn_for_freebsd_ahcI
|
||||
|
||||
2010.03.27.155659 [3133]
|
||||
libburn/mmc.c
|
||||
Avoiding to inquire NWA of unwritable media or states
|
||||
|
||||
2010.03.27.172644 [3134]
|
||||
libburn/os-freebsd.h
|
||||
libburn/sg-freebsd.c
|
||||
Trying to detect FreeBSD ahci devices and to handle others the old way
|
||||
|
||||
------------------------------------ cycle - cdrskin-0.7.9 - 2010.03.27.184614
|
||||
* Now able to work with ahci driver of FreeBSD 8-STABLE
|
||||
|
||||
|
||||
2010.03.29.103141 [3135]
|
||||
libburn/spc.c
|
||||
libburn/sg-linux.c
|
||||
libburn/sg-freebsd.c
|
||||
libburn/sg-libcdio.c
|
||||
Adjusted libcdio system adapter to FreeBSD peculiarities
|
||||
|
||||
2010.04.04.181237 [3146]
|
||||
test/libburner.c
|
||||
Let libburner warn programmers if they forget to set 64 bit off_t
|
||||
|
||||
2010.04.09.090645 [3155]
|
||||
libburn/sg-linux.c
|
||||
Reporting eventual SCSI sense in sg-linux repeat loop
|
||||
|
||||
9 Apr 2010 [3156]
|
||||
svn copy -m "Branching for libburn release 0.8.0" \
|
||||
http://svn.libburnia-project.org/libburn/trunk \
|
||||
http://svn.libburnia-project.org/libburn/branches/ZeroEightZero
|
||||
|
||||
2010.04.09.100001 [3157]
|
||||
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.0
|
||||
|
||||
09 Apr 2010 [3158]
|
||||
- cdrskin/add_ts_changes_to_libburn_0_7_8
|
||||
- cdrskin/add_ts_changes_to_libburn_0_7_9
|
||||
+ cdrskin/add_ts_changes_to_libburn_0_8_0
|
||||
+ cdrskin/add_ts_changes_to_libburn_0_8_1
|
||||
Updated cdrskin tarball generator
|
||||
|
||||
------------------------------ release - cdrskin-0.8.0.pl00 - 2010.04.09.100001
|
||||
* Now able to work with ahci driver of FreeBSD 8-STABLE
|
||||
|
||||
------------------------------------ cycle - cdrskin-0.8.1 -
|
||||
------------------------------------ cycle - cdrskin-0.8.1 -
|
||||
------------------------------------ cycle - cdrskin-0.7.7 -
|
||||
------------------------------------ cycle - cdrskin-0.7.7 -
|
||||
------------------------------------ cycle - cdrskin-0.7.7 -
|
||||
|
||||
|
||||
===============================================================================
|
||||
TODO
|
||||
===============================================================================
|
||||
|
||||
- change all malloc() to calloc()
|
||||
- After writing first session and reload:
|
||||
Drive current: -dev '/dev/cd0'
|
||||
Drive type : vendor 'TSSTcorp' product 'CDDVDW SH-S223C' revision 'SB02'
|
||||
Media current: DVD-RW sequential recording
|
||||
Media product: RITEKW01 , Ritek Corp
|
||||
Media status : is written , is appendable
|
||||
TOC layout : Idx , sbsector , Size , Volume Id
|
||||
ISO session : 1 , 0 , 232357s , ISOIMAGE
|
||||
Other session: 2 , 261200 , 2036688s ,
|
||||
Media summary: 2 sessions, 2269200 data blocks, 4432m data, 3978m free
|
||||
Media nwa : 261200s
|
||||
dvd+rw-mediainfo shows 3 sessions with 2 tracks.
|
||||
Firmware bug.
|
||||
|
||||
- find out from where libburn/crc.c stems. What algorithm is crc_32() ?
|
||||
|
||||
|
||||
- USB stick and drive on FreeBSD
|
||||
- how to detect random-read-write device ?
|
||||
|
||||
|
||||
--- libcdio ---
|
||||
|
||||
24 Dec 2009 [29de1d8bcb614a8360b519c5843c5852f78101db]
|
||||
include/cdio/mmc.h
|
||||
lib/driver/generic.h
|
||||
lib/driver/mmc.c
|
||||
lib/driver/libcdio.sym ( - cdio_version)
|
||||
New API function mmc_last_cmd_sense()
|
||||
|
||||
24 Dec 2009 [890b5610a8ec01609df8997f8031324af5bb4219]
|
||||
lib/driver/gnu_linux.c
|
||||
Linux driver makes available the sense reply of the most recent MMC command
|
||||
(Is there a place to register access modes MMC_RDWR and MMC_RDWR_EXCL ?)
|
||||
|
||||
24 Dec 2009 [20f762c3c12c06b52a47b401eb913c69c72ddcf8]
|
||||
include/cdio/version.h.in
|
||||
lib/driver/util.c
|
||||
lib/driver/libcdio.sym ( + cdio_version)
|
||||
New API function cdio_version() tell libcdio version at runtime
|
||||
|
||||
24 Dec 2009 [7cc7484a0b93268260c02ec35c46e1456f0fb38a]
|
||||
lib/driver/gnu_linux.c
|
||||
lib/driver/util.c
|
||||
Small repairs to the previous two changees
|
||||
|
||||
30 Dec 2009 07_cdio_get_arg_scsi_tuple_linux.tgz [cf882cfd20912fed94d1a4a2e057bbcf68c496a1]
|
||||
lib/driver/generic.h
|
||||
lib/driver/_cdio_generic.c
|
||||
lib/driver/gnu_linux.c
|
||||
New cdio_get_arg() key "scsi-tuple-linux"
|
||||
|
||||
15 Jan 2010 10_add_mmc_rdwr_excl_on_freebsd.tgz [bd096b3eca0644044a872c1f0d31a75395d420a4]
|
||||
NEWS
|
||||
test/test_mmc_rdwr.c
|
||||
lib/driver/FreeBSD/freebsd.h
|
||||
lib/driver/FreeBSD/freebsd.c
|
||||
lib/driver/FreeBSD/freebsd_cam.c
|
||||
lib/driver/FreeBSD/freebsd_ioctl.c
|
||||
FreeBSD driver augmented by MMC_RDWR_EXCL
|
||||
|
||||
|
||||
Todo:
|
||||
|
||||
Driver-Todo:
|
||||
- implement MMC_RDWR and MMC_RDWR_EXCL
|
||||
- record SCSI sense reply in generic_img_private_t.scsi_mmc_sense
|
||||
- rectify return values to DRIVER_OP_*
|
||||
(- obtain SCSI address tuple)
|
||||
- test concurrent drive access attempts resp. exclusivity of drive access
|
||||
|
||||
|
||||
--------------------------------- bugs -------------------------------------
|
||||
@ -8348,8 +8045,13 @@ READ TRACK INFORMATION[#5]:
|
||||
|
||||
------------------------------ end of bugs ---------------------------------
|
||||
|
||||
- xorriso -as tar (Rocky wants me to begin with -x)
|
||||
|
||||
Support for BD-R SRM+POW
|
||||
|
||||
? Provide an option to open track source file O_DIRECT ?
|
||||
(needs read chunks much larger than 2 kB)
|
||||
|
||||
? Enable profile 0x42 BD-R random recording
|
||||
|
||||
Provide DVD+R DL layer break setter
|
||||
|
@ -7,8 +7,8 @@
|
||||
debug_opts="-O2"
|
||||
def_opts=
|
||||
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
|
||||
fifo_opts=""
|
||||
libvers="-DCdrskin_libburn_0_8_0"
|
||||
fifo_opts="-DCdrskin_use_libburn_fifO"
|
||||
libvers="-DCdrskin_libburn_0_7_6"
|
||||
|
||||
# To be used if Makefile.am uses libburn_libburn_la_CFLAGS
|
||||
# burn="libburn/libburn_libburn_la-"
|
||||
@ -26,13 +26,6 @@ compile_cdrskin=1
|
||||
compile_cdrfifo=0
|
||||
compile_dewav=0
|
||||
|
||||
libcam=
|
||||
os=$(uname -s)
|
||||
case $os in
|
||||
*FreeBSD)
|
||||
libcam="-lcam"
|
||||
esac
|
||||
|
||||
for i in "$@"
|
||||
do
|
||||
if test "$i" = "-compile_cdrfifo"
|
||||
@ -47,15 +40,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_0"
|
||||
elif test "$i" = "-libburn_0_7_6"
|
||||
then
|
||||
libvers="-DCdrskin_libburn_0_8_0"
|
||||
libvers="-DCdrskin_libburn_0_7_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_1"
|
||||
libvers="-DCdrskin_libburn_0_7_7"
|
||||
libdax_audioxtr_o="$burn"libdax_audioxtr.o
|
||||
libdax_msgs_o="$burn"libdax_msgs.o
|
||||
cleanup_src_or_obj="$burn"cleanup.o
|
||||
@ -93,10 +86,6 @@ do
|
||||
then
|
||||
fifo_source=
|
||||
fifo_opts="-DCdrskin_use_libburn_fifO -DCdrskin_no_cdrfifO"
|
||||
elif test "$i" = "-use_libburn_cleanup"
|
||||
then
|
||||
fifo_source=
|
||||
fifo_opts="-DCdrskin_use_libburn_cleanuP -DCdrskin_use_libburn_fifO -DCdrskin_no_cdrfifO"
|
||||
elif test "$i" = "-use_libcdio"
|
||||
then
|
||||
libcdio="-lcdio"
|
||||
@ -109,7 +98,7 @@ do
|
||||
echo "Options:"
|
||||
echo " -compile_cdrfifo compile program cdrskin/cdrfifo."
|
||||
echo " -compile_dewav compile program test/dewav without libburn."
|
||||
echo " -libburn_0_8_0 set macro to match libburn-0.8.0"
|
||||
echo " -libburn_0_7_6 set macro to match libburn-0.7.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."
|
||||
@ -136,7 +125,7 @@ echo "Build timestamp : $timestamp"
|
||||
|
||||
if test "$compile_cdrskin"
|
||||
then
|
||||
echo "compiling program cdrskin/cdrskin.c $fifo_source $static_opts $debug_opts $libvers $fifo_opts $def_opts $cleanup_src_or_obj $libcdio $libcam"
|
||||
echo "compiling program cdrskin/cdrskin.c $fifo_source $static_opts $debug_opts $libvers $fifo_opts $def_opts $cleanup_src_or_obj $libcdio"
|
||||
cc -I. \
|
||||
$warn_opts \
|
||||
$static_opts \
|
||||
@ -182,7 +171,6 @@ then
|
||||
"$burn"ecma130ab.o \
|
||||
\
|
||||
$libcdio \
|
||||
$libcam \
|
||||
-lpthread
|
||||
|
||||
ret=$?
|
||||
|
24
configure.ac
24
configure.ac
@ -1,15 +1,13 @@
|
||||
AC_INIT([libburn], [0.8.0], [http://libburnia-project.org])
|
||||
AC_INIT([libburn], [0.7.6], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
dnl AC_CONFIG_HEADER([config.h])
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
AC_CANONICAL_TARGET
|
||||
|
||||
LIBBURNIA_SET_FLAGS
|
||||
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
|
||||
dnl Notes by ts A71207 - B00310 :
|
||||
dnl Notes by ts A71207 - B00122 :
|
||||
dnl
|
||||
dnl Regrettably the meaning of the various version types was misunderstood
|
||||
dnl before version 0.4.1.
|
||||
@ -79,8 +77,6 @@ dnl 0.7.0 = libburn.so.4.35.0
|
||||
dnl 0.7.2 = libburn.so.4.37.0
|
||||
dnl 0.7.4 = libburn.so.4.39.0
|
||||
dnl 0.7.6 = libburn.so.4.41.0
|
||||
dnl 0.7.8 = libburn.so.4.43.0
|
||||
dnl 0.8.0 = libburn.so.4.45.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.
|
||||
@ -105,8 +101,8 @@ 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=0
|
||||
BURN_MINOR_VERSION=7
|
||||
BURN_MICRO_VERSION=6
|
||||
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
|
||||
|
||||
AC_SUBST(BURN_MAJOR_VERSION)
|
||||
@ -117,15 +113,15 @@ AC_SUBST(BURN_VERSION)
|
||||
dnl Libtool versioning
|
||||
LT_RELEASE=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
|
||||
dnl
|
||||
dnl ts B00409
|
||||
dnl This is the release version libburn-0.8.0
|
||||
dnl ts B00122
|
||||
dnl This is the release version libburn-0.7.6 = libburn.so.4.41.0
|
||||
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 = 49 - 45 = 4 . Linux library name = libburn.so.4.45.0
|
||||
LT_CURRENT=49
|
||||
LT_AGE=45
|
||||
dnl SONAME = 45 - 41 = 4 . Linux library name = libburn.so.4.41.0
|
||||
LT_CURRENT=45
|
||||
LT_AGE=41
|
||||
LT_REVISION=0
|
||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||
|
||||
@ -203,7 +199,7 @@ CFLAGS="$CFLAGS $LIBBURN_O_DIRECT_DEF"
|
||||
dnl ts A91116
|
||||
AC_ARG_ENABLE(dvd-obs-64k,
|
||||
[ --enable-dvd-obs-64k 64 KB default size for DVD/BD writing, default=no],
|
||||
, enable_dvd_obs_64k=no)
|
||||
, enable_fifo_odirect=no)
|
||||
if test x$enable_dvd_obs_64k = xyes; then
|
||||
LIBBURN_DVD_OBS_64K="-DLibburn_dvd_obs_default_64K"
|
||||
echo "enabled write size default 64 KB on DVD and BD"
|
||||
|
113
libburn/async.c
113
libburn/async.c
@ -1,9 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
/* ts A71019 */
|
||||
|
||||
@ -40,7 +36,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
|
||||
/*
|
||||
#include <a ssert.h>
|
||||
@ -233,22 +228,6 @@ static void *scan_worker_func(struct w_list *w)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void reset_progress(struct burn_drive *d, int sessions, int tracks,
|
||||
int indices, int sectors, int flag)
|
||||
{
|
||||
/* reset the progress indicator */
|
||||
d->progress.session = 0;
|
||||
d->progress.sessions = sessions;
|
||||
d->progress.track = 0;
|
||||
d->progress.tracks = tracks;
|
||||
d->progress.index = 0;
|
||||
d->progress.indices = indices;
|
||||
d->progress.start_sector = 0;
|
||||
d->progress.sectors = sectors;
|
||||
d->progress.sector = 0;
|
||||
}
|
||||
|
||||
|
||||
int burn_drive_scan(struct burn_drive_info *drives[], unsigned int *n_drives)
|
||||
{
|
||||
struct scan_opts o;
|
||||
@ -318,27 +297,8 @@ drive_is_active:;
|
||||
|
||||
static void *erase_worker_func(struct w_list *w)
|
||||
{
|
||||
|
||||
#define Libburn_protect_erase_threaD 1
|
||||
|
||||
#ifdef Libburn_protect_erase_threaD
|
||||
sigset_t sigset, oldset;
|
||||
|
||||
/* Protect blank thread from being interrupted by external signals */
|
||||
sigfillset(&sigset);
|
||||
sigdelset(&sigset, SIGSEGV);
|
||||
sigdelset(&sigset, SIGILL);
|
||||
pthread_sigmask(SIG_SETMASK, &sigset, &oldset);
|
||||
#endif /* Libburn_protect_erase_threaD */
|
||||
|
||||
burn_disc_erase_sync(w->u.erase.drive, w->u.erase.fast);
|
||||
remove_worker(pthread_self());
|
||||
|
||||
#ifdef Libburn_protect_erase_threaD
|
||||
/* (just in case it would not end with all signals blocked) */
|
||||
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
|
||||
#endif /* Libburn_protect_erase_threaD */
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -350,7 +310,6 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
|
||||
/* a ssert(drive); */
|
||||
/* a ssert(!SCAN_GOING()); */
|
||||
/* a ssert(!find_worker(drive)); */
|
||||
|
||||
if((drive == NULL)) {
|
||||
libdax_msgs_submit(libdax_messenger, drive->global_index,
|
||||
0x00020104,
|
||||
@ -366,9 +325,6 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
|
||||
0, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
reset_progress(drive, 1, 1, 1, 0x10000, 0);
|
||||
|
||||
/* A70103 : will be set to 0 by burn_disc_erase_sync() */
|
||||
drive->cancel = 1;
|
||||
|
||||
@ -409,28 +365,9 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
|
||||
/* ts A61230 */
|
||||
static void *format_worker_func(struct w_list *w)
|
||||
{
|
||||
|
||||
#define Libburn_protect_format_threaD 1
|
||||
|
||||
#ifdef Libburn_protect_format_threaD
|
||||
sigset_t sigset, oldset;
|
||||
|
||||
/* Protect format thread from being interrupted by external signals */
|
||||
sigfillset(&sigset);
|
||||
sigdelset(&sigset, SIGSEGV);
|
||||
sigdelset(&sigset, SIGILL);
|
||||
pthread_sigmask(SIG_SETMASK, &sigset, &oldset);
|
||||
#endif /* Libburn_protect_format_threaD */
|
||||
|
||||
burn_disc_format_sync(w->u.format.drive, w->u.format.size,
|
||||
w->u.format.flag);
|
||||
remove_worker(pthread_self());
|
||||
|
||||
#ifdef Libburn_protect_format_threaD
|
||||
/* (just in case it would not end with all signals blocked) */
|
||||
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
|
||||
#endif /* Libburn_protect_format_threaD */
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -442,8 +379,6 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag)
|
||||
int ok = 0, ret;
|
||||
char msg[160];
|
||||
|
||||
reset_progress(drive, 1, 1, 1, 0x10000, 0);
|
||||
|
||||
if ((SCAN_GOING()) || find_worker(drive) != NULL) {
|
||||
libdax_msgs_submit(libdax_messenger, drive->global_index,
|
||||
0x00020102,
|
||||
@ -573,22 +508,8 @@ no_non_default_bd_re:;
|
||||
static void *write_disc_worker_func(struct w_list *w)
|
||||
{
|
||||
struct burn_drive *d = w->u.write.drive;
|
||||
char msg[80];
|
||||
|
||||
#define Libburn_protect_write_threaD 1
|
||||
|
||||
#ifdef Libburn_protect_write_threaD
|
||||
sigset_t sigset, oldset;
|
||||
|
||||
/* Protect write thread from being interrupted by external signals */
|
||||
sigfillset(&sigset);
|
||||
sigdelset(&sigset, SIGSEGV);
|
||||
sigdelset(&sigset, SIGILL);
|
||||
pthread_sigmask(SIG_SETMASK, &sigset, &oldset);
|
||||
#endif /* Libburn_protect_write_threaD */
|
||||
|
||||
d->thread_pid = getpid();
|
||||
d->thread_tid = pthread_self();
|
||||
d->thread_pid_valid= 1;
|
||||
burn_disc_write_sync(w->u.write.opts, w->u.write.disc);
|
||||
d->thread_pid_valid= 0;
|
||||
@ -598,19 +519,7 @@ static void *write_disc_worker_func(struct w_list *w)
|
||||
*/
|
||||
burn_write_opts_free(w->u.write.opts);
|
||||
|
||||
sprintf(msg, "Write thread on drive %d ended", d->global_index);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index, 0x00020178,
|
||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
|
||||
remove_worker(pthread_self());
|
||||
d->busy = BURN_DRIVE_IDLE;
|
||||
|
||||
#ifdef Libburn_protect_write_threaD
|
||||
/* (just in case it would not end with all signals blocked) */
|
||||
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
|
||||
#endif /* Libburn_protect_write_threaD */
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -634,9 +543,6 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||
return;
|
||||
}
|
||||
|
||||
reset_progress(d, disc->sessions, disc->session[0]->tracks,
|
||||
disc->session[0]->track[0]->indices, 0, 0);
|
||||
|
||||
/* For the next lines any return indicates failure */
|
||||
d->cancel = 1;
|
||||
|
||||
@ -703,30 +609,12 @@ static void *fifo_worker_func(struct w_list *w)
|
||||
{
|
||||
int old;
|
||||
|
||||
#define Libburn_protect_fifo_threaD 1
|
||||
|
||||
#ifdef Libburn_protect_fifo_threaD
|
||||
sigset_t sigset, oldset;
|
||||
|
||||
/* Protect fifo thread from being interrupted by external signals */
|
||||
sigfillset(&sigset);
|
||||
sigdelset(&sigset, SIGSEGV);
|
||||
sigdelset(&sigset, SIGILL);
|
||||
pthread_sigmask(SIG_SETMASK, &sigset, &oldset);
|
||||
#endif /* Libburn_protect_fifo_threaD */
|
||||
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old);
|
||||
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &old);
|
||||
/* Note: Only burn_fifo_abort() shall cancel the fifo thread */
|
||||
|
||||
burn_fifo_source_shoveller(w->u.fifo.source, w->u.fifo.flag);
|
||||
remove_worker(pthread_self());
|
||||
|
||||
#ifdef Libburn_protect_fifo_threaD
|
||||
/* (just in case it would not end with all signals blocked) */
|
||||
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
|
||||
#endif /* Libburn_protect_fifo_threaD */
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -751,7 +639,6 @@ int burn_fifo_start(struct burn_source *source, int flag)
|
||||
add_worker(Burnworker_type_fifO, NULL,
|
||||
(WorkerFunc) fifo_worker_func, &o);
|
||||
fs->is_started = 1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,4 @@
|
||||
/**
|
||||
Copyright (c) 2006 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file bundles variables which disable changes in libburn which are
|
||||
not yet completely accepted.
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
A signal handler which cleans up an application and exits.
|
||||
|
||||
Provided under GPLv2+ license within GPL projects, BSD license elsewise.
|
||||
Provided under GPL license within GPL projects, BSD license elsewise.
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -40,8 +40,7 @@ static int non_signal_list_count= BURN_OS_NON_SIGNAL_COUNT;
|
||||
#else /* ! Cleanup_has_no_libburn_os_H */
|
||||
|
||||
|
||||
/* Outdated. GNU/Linux only.
|
||||
For backward compatibility with pre-libburn-0.2.3 */
|
||||
/* Outdated. Linux only. For backward compatibility with pre-libburn-0.2.3 */
|
||||
|
||||
/* Signals to be caught */
|
||||
static int signal_list[]= {
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
A signal handler which cleans up an application and exits.
|
||||
|
||||
Provided under GPLv2+ within GPL projects, BSD license elsewise.
|
||||
Provided under GPL license within GPL projects, BSD license elsewise.
|
||||
*/
|
||||
|
||||
#ifndef Cleanup_includeD
|
||||
|
@ -3,21 +3,7 @@
|
||||
#ifndef BURN__CRC_H
|
||||
#define BURN__CRC_H
|
||||
|
||||
|
||||
#ifdef Xorriso_standalonE
|
||||
/* Source module crc.c of yet unclear ancestry is excluded from GNU xorriso */
|
||||
#ifndef Libburn_no_crc_C
|
||||
#define Libburn_no_crc_C 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef Libburn_no_crc_C
|
||||
|
||||
unsigned short crc_ccitt(unsigned char *, int len);
|
||||
unsigned int crc_32(unsigned char *, int len);
|
||||
|
||||
#endif /* Libburn_no_crc_C */
|
||||
|
||||
|
||||
#endif /* BURN__CRC_H */
|
||||
|
@ -1,10 +1,5 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
105
libburn/drive.c
105
libburn/drive.c
@ -1,15 +1,9 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
/* #include <m alloc.h> ts A61013 : not in GNU/Linux man 3 malloc */
|
||||
/* #include <m alloc.h> ts A61013 : not in Linux man 3 malloc */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
@ -376,7 +370,6 @@ struct burn_drive *burn_drive_register(struct burn_drive *d)
|
||||
d->busy = BURN_DRIVE_IDLE;
|
||||
d->thread_pid = 0;
|
||||
d->thread_pid_valid = 0;
|
||||
memset(&(d->thread_tid), 0, sizeof(d->thread_tid));
|
||||
d->toc_entries = 0;
|
||||
d->toc_entry = NULL;
|
||||
d->disc = NULL;
|
||||
@ -622,9 +615,8 @@ void burn_disc_erase_sync(struct burn_drive *d, int fast)
|
||||
d->idata->product);
|
||||
|
||||
d->cancel = 0;
|
||||
|
||||
#ifdef Libburn_reset_progress_asynC
|
||||
/* <<< This is now done in async.c */
|
||||
d->busy = BURN_DRIVE_ERASING;
|
||||
d->erase(d, fast);
|
||||
/* reset the progress */
|
||||
d->progress.session = 0;
|
||||
d->progress.sessions = 1;
|
||||
@ -635,11 +627,6 @@ void burn_disc_erase_sync(struct burn_drive *d, int fast)
|
||||
d->progress.start_sector = 0;
|
||||
d->progress.sectors = 0x10000;
|
||||
d->progress.sector = 0;
|
||||
#endif /* Libburn_reset_progress_asynC */
|
||||
|
||||
d->erase(d, fast);
|
||||
d->busy = BURN_DRIVE_ERASING;
|
||||
|
||||
/* read the initial 0 stage */
|
||||
while (!d->test_unit_ready(d) && d->get_erase_progress(d) == 0)
|
||||
sleep(1);
|
||||
@ -666,8 +653,6 @@ void burn_disc_format_sync(struct burn_drive *d, off_t size, int flag)
|
||||
char msg[80];
|
||||
struct buffer buf, *buf_mem = d->buffer;
|
||||
|
||||
#ifdef Libburn_reset_progress_asynC
|
||||
/* <<< This is now done in async.c */
|
||||
/* reset the progress */
|
||||
d->progress.session = 0;
|
||||
d->progress.sessions = 1;
|
||||
@ -678,8 +663,6 @@ void burn_disc_format_sync(struct burn_drive *d, off_t size, int flag)
|
||||
d->progress.start_sector = 0;
|
||||
d->progress.sectors = 0x10000;
|
||||
d->progress.sector = 0;
|
||||
#endif /* Libburn_reset_progress_asynC */
|
||||
|
||||
stages = 1 + ((flag & 1) && size > 1024 * 1024);
|
||||
d->cancel = 0;
|
||||
d->busy = BURN_DRIVE_FORMATTING;
|
||||
@ -816,22 +799,10 @@ int burn_disc_erasable(struct burn_drive *d)
|
||||
enum burn_drive_status burn_drive_get_status(struct burn_drive *d,
|
||||
struct burn_progress *p)
|
||||
{
|
||||
/* --- Part of asynchronous signal handling --- */
|
||||
/* This frequently used call may be used to react on messages from
|
||||
the libburn built-in signal handler.
|
||||
*/
|
||||
|
||||
/* ts B00225 :
|
||||
If aborting with action 2:
|
||||
catch control thread after it returned from signal handler.
|
||||
Let it run burn_abort(4440,...)
|
||||
*/
|
||||
burn_init_catch_on_abort(0);
|
||||
|
||||
/* ts A70928 : inform control thread of signal in sub-threads */
|
||||
if (burn_builtin_triggered_action < 2 && burn_global_abort_level > 0)
|
||||
if (burn_global_abort_level > 0)
|
||||
burn_global_abort_level++;
|
||||
if (burn_builtin_triggered_action < 2 && burn_global_abort_level > 5) {
|
||||
if (burn_global_abort_level > 5) {
|
||||
if (burn_global_signal_handler == NULL)
|
||||
kill(getpid(), burn_global_abort_signum);
|
||||
else
|
||||
@ -841,9 +812,6 @@ enum burn_drive_status burn_drive_get_status(struct burn_drive *d,
|
||||
burn_global_abort_level = -1;
|
||||
}
|
||||
|
||||
/* --- End of asynchronous signal handling --- */
|
||||
|
||||
|
||||
if (p != NULL) {
|
||||
memcpy(p, &(d->progress), sizeof(struct burn_progress));
|
||||
/* TODO: add mutex */
|
||||
@ -865,13 +833,9 @@ int burn_drive_set_stream_recording(struct burn_drive *d, int recmode,
|
||||
|
||||
void burn_drive_cancel(struct burn_drive *d)
|
||||
{
|
||||
/* ts B00225 : these mutexes are unnecessary because "= 1" is atomar.
|
||||
pthread_mutex_lock(&d->access_lock);
|
||||
*/
|
||||
d->cancel = 1;
|
||||
/*
|
||||
pthread_mutex_unlock(&d->access_lock);
|
||||
*/
|
||||
}
|
||||
|
||||
/* ts A61007 : defunct because unused */
|
||||
@ -1888,12 +1852,17 @@ int burn_abort_pacifier(void *handle, int patience, int elapsed)
|
||||
}
|
||||
|
||||
|
||||
/* ts B00226 : Outsourced backend of burn_abort()
|
||||
@param flag bit0= do not call burn_finish()
|
||||
/** Abort any running drive operation and finish libburn.
|
||||
@param patience Maximum number of seconds to wait for drives to finish
|
||||
@param pacifier_func Function to produce appeasing messages. See
|
||||
burn_abort_pacifier() for an example.
|
||||
@return 1 ok, all went well
|
||||
0 had to leave a drive in unclean state
|
||||
<0 severe error, do no use libburn again
|
||||
*/
|
||||
int burn_abort_5(int patience,
|
||||
int burn_abort(int patience,
|
||||
int (*pacifier_func)(void *handle, int patience, int elapsed),
|
||||
void *handle, int elapsed, int flag)
|
||||
void *handle)
|
||||
{
|
||||
int ret, i, occup, still_not_done= 1, pacifier_off= 0, first_round= 1;
|
||||
unsigned long wait_grain= 100000;
|
||||
@ -1903,14 +1872,7 @@ int burn_abort_5(int patience,
|
||||
time_t stdio_patience = 3;
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
fprintf(stderr,
|
||||
"libburn_EXPERIMENTAL: burn_abort_5(%d,%d)\n", patience, flag);
|
||||
*/
|
||||
|
||||
current_time = start_time = pacifier_time = time(0);
|
||||
start_time -= elapsed;
|
||||
end_time = start_time + patience;
|
||||
|
||||
/* >>> ts A71002 : are there any threads at work ?
|
||||
@ -1918,7 +1880,7 @@ int burn_abort_5(int patience,
|
||||
change status on their own.
|
||||
*/
|
||||
|
||||
while(current_time < end_time || (patience <= 0 && first_round)) {
|
||||
while(current_time-end_time < patience) {
|
||||
still_not_done = 0;
|
||||
|
||||
for(i = 0; i < drivetop + 1; i++) {
|
||||
@ -1957,9 +1919,6 @@ int burn_abort_5(int patience,
|
||||
}
|
||||
|
||||
if(occup <= 10) {
|
||||
if (drive_array[i].drive_role != 1)
|
||||
/* occup == -1 comes early */
|
||||
usleep(1000000);
|
||||
burn_drive_forget(&(drive_array[i]), 1);
|
||||
} else if(occup <= 100) {
|
||||
if(first_round)
|
||||
@ -1971,7 +1930,7 @@ int burn_abort_5(int patience,
|
||||
}
|
||||
first_round = 0;
|
||||
|
||||
if(still_not_done == 0 || patience <= 0)
|
||||
if(still_not_done == 0)
|
||||
break;
|
||||
usleep(wait_grain);
|
||||
current_time = time(0);
|
||||
@ -1984,35 +1943,11 @@ int burn_abort_5(int patience,
|
||||
pacifier_time = current_time;
|
||||
}
|
||||
}
|
||||
if (!(flag & 1))
|
||||
burn_finish();
|
||||
burn_finish();
|
||||
return(still_not_done == 0);
|
||||
}
|
||||
|
||||
|
||||
/** Abort any running drive operation and finish libburn.
|
||||
@param patience Maximum number of seconds to wait for drives to finish
|
||||
@param pacifier_func Function to produce appeasing messages. See
|
||||
burn_abort_pacifier() for an example.
|
||||
@return 1 ok, all went well
|
||||
0 had to leave a drive in unclean state
|
||||
<0 severe error, do no use libburn again
|
||||
*/
|
||||
int burn_abort(int patience,
|
||||
int (*pacifier_func)(void *handle, int patience, int elapsed),
|
||||
void *handle)
|
||||
{
|
||||
int ret, flg = 0;
|
||||
|
||||
if (patience < 0) {
|
||||
patience = 0;
|
||||
flg |= 1;
|
||||
}
|
||||
ret = burn_abort_5(patience, pacifier_func, handle, 0, flg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* ts A61020 API function */
|
||||
int burn_drive_get_start_end_lba(struct burn_drive *d,
|
||||
int *start_lba, int *end_lba, int flag)
|
||||
@ -2746,8 +2681,7 @@ int burn_drive_equals_adr(struct burn_drive *d1, char *adr2_in, int role2)
|
||||
}
|
||||
|
||||
|
||||
int burn_drive_find_by_thread_pid(struct burn_drive **d, pid_t pid,
|
||||
pthread_t tid)
|
||||
int burn_drive_find_by_thread_pid(struct burn_drive **d, pid_t pid)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -2759,8 +2693,7 @@ int burn_drive_find_by_thread_pid(struct burn_drive **d, pid_t pid,
|
||||
*/
|
||||
|
||||
if (drive_array[i].thread_pid_valid &&
|
||||
drive_array[i].thread_pid == pid &&
|
||||
pthread_equal(drive_array[i].thread_tid, tid)) {
|
||||
drive_array[i].thread_pid == pid) {
|
||||
*d = &(drive_array[i]);
|
||||
return 1;
|
||||
}
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __DRIVE
|
||||
#define __DRIVE
|
||||
|
||||
@ -127,9 +121,8 @@ int burn_disc_get_write_mode_demands(struct burn_disc *disc,
|
||||
int burn_drive__fd_from_special_adr(char *adr);
|
||||
|
||||
|
||||
/* ts A70929 : Find the drive which is being worked on by pid , tid */
|
||||
int burn_drive_find_by_thread_pid(struct burn_drive **d, pid_t pid,
|
||||
pthread_t tid);
|
||||
/* ts A70929 : Find the drive which is being worked on by pid */
|
||||
int burn_drive_find_by_thread_pid(struct burn_drive **d, pid_t pid);
|
||||
|
||||
|
||||
/* ts A51221 - A80731 : Whitelist inquiry functions */
|
||||
@ -142,12 +135,4 @@ char *burn_drive_whitelist_item(int idx, int flag);
|
||||
int burn_drive_is_listed(char *path, struct burn_drive **found, int flag);
|
||||
|
||||
|
||||
/* ts B00226 : Outsourced backend of burn_abort()
|
||||
@param elapsed to be subtracted from start time
|
||||
@param flag bit0= do not shutdown the library
|
||||
*/
|
||||
int burn_abort_5(int patience,
|
||||
int (*pacifier_func)(void *handle, int patience, int elapsed),
|
||||
void *handle, int elapsed, int flag);
|
||||
|
||||
#endif /* __DRIVE */
|
||||
|
@ -4,7 +4,6 @@
|
||||
/* ts A91016 : libburn/ecma130ab.c is the replacement for old libburn/lec.c
|
||||
|
||||
Copyright 2009, Thomas Schmitt <scdbackup@gmx.net>, libburnia-project.org
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This code module implements the production of RSPC parity bytes (P- and Q-
|
||||
parity) and the scrambling of raw CD-ROM sectors as specified in ECMA-130:
|
||||
|
@ -4,7 +4,6 @@
|
||||
/* ts A91016 : libburn/ecma130ab.h is the replacement for old libburn/lec.h
|
||||
|
||||
Copyright 2009, Thomas Schmitt <scdbackup@gmx.net>, libburnia-project.org
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This code module implements the computations prescribed in ECMA-130 Annex A
|
||||
and B. For explanations of the underlying mathematics see ecma130ab.c .
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
@ -89,9 +83,7 @@ static off_t file_size(struct burn_source *source)
|
||||
|
||||
if (fs->fixed_size > 0)
|
||||
return fs->fixed_size;
|
||||
if (fstat(fs->datafd, &buf) != 0)
|
||||
return (off_t) 0;
|
||||
if ((buf.st_mode & S_IFMT) != S_IFREG)
|
||||
if (fstat(fs->datafd, &buf) == -1)
|
||||
return (off_t) 0;
|
||||
return (off_t) buf.st_size;
|
||||
}
|
||||
|
@ -1,10 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifndef BURN__FILE_H
|
||||
#define BURN__FILE_H
|
||||
|
||||
|
134
libburn/init.c
134
libburn/init.c
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
/* ts A61007 */
|
||||
@ -15,7 +9,6 @@
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
|
||||
/* ts A70928 : init.h is for others, not for init .c
|
||||
#include "init.h"
|
||||
@ -39,16 +32,14 @@ struct libdax_msgs *libdax_messenger= NULL;
|
||||
|
||||
int burn_running = 0;
|
||||
|
||||
/* ts A60813 : GNU/Linux: whether to use O_EXCL on open() of device files
|
||||
ts B00212 : FreeBSD: whether to use flock(LOCK_EX) after open()
|
||||
*/
|
||||
/* ts A60813 : Linux: wether to use O_EXCL on open() of device files */
|
||||
int burn_sg_open_o_excl = 1;
|
||||
|
||||
/* ts A70403 : GNU/Linux: wether to use fcntl(,F_SETLK,)
|
||||
/* ts A70403 : Linux: wether to use fcntl(,F_SETLK,)
|
||||
after open() of device files */
|
||||
int burn_sg_fcntl_f_setlk = 1;
|
||||
|
||||
/* ts A70314 : GNU/Linux: what device family to use :
|
||||
/* ts A70314 : Linux: what device family to use :
|
||||
0= default family
|
||||
1= sr
|
||||
2= scd
|
||||
@ -81,13 +72,10 @@ static char sg_initialize_msg[1024] = {""};
|
||||
/* Parameters for builtin abort handler */
|
||||
static char abort_message_prefix[81] = {"libburn : "};
|
||||
static pid_t abort_control_pid= 0;
|
||||
static pthread_t abort_control_thread;
|
||||
volatile int burn_global_abort_level= 0;
|
||||
int burn_global_abort_signum= 0;
|
||||
void *burn_global_signal_handle = NULL;
|
||||
burn_abort_handler_t burn_global_signal_handler = NULL;
|
||||
int burn_builtin_signal_action = 0; /* burn_set_signal_handling() */
|
||||
volatile int burn_builtin_triggered_action = 0; /* burn_is_aborting() */
|
||||
|
||||
|
||||
/* ts A70223 : wether implemented untested profiles are supported */
|
||||
@ -333,20 +321,6 @@ int burn_sev_to_text(int severity_number, char **severity_name, int flag)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* ts B00224 */
|
||||
char *burn_util_thread_id(pid_t pid, pthread_t tid, char text[80])
|
||||
{
|
||||
int i, l;
|
||||
|
||||
sprintf(text, "[%d,", getpid());
|
||||
l= strlen(text);
|
||||
for(i= 0; i < sizeof(pthread_t) && 2 * i < 80 - l - 3; i++)
|
||||
sprintf(text + l + 2 * i,
|
||||
"%2.2X", ((unsigned char *) &tid)[i]);
|
||||
|
||||
sprintf(text + l + 2 * i, "]");
|
||||
return text;
|
||||
}
|
||||
|
||||
int burn_builtin_abort_handler(void *handle, int signum, int flag)
|
||||
{
|
||||
@ -355,53 +329,15 @@ int burn_builtin_abort_handler(void *handle, int signum, int flag)
|
||||
/*
|
||||
#define Libburn_signal_handler_verbouS 1
|
||||
*/
|
||||
|
||||
int ret;
|
||||
struct burn_drive *d;
|
||||
|
||||
#ifdef Libburn_signal_handler_verbouS
|
||||
char text[80];
|
||||
|
||||
fprintf(stderr, "libburn_ABORT: in = %s\n",
|
||||
burn_util_thread_id(getpid(), pthread_self(), text));
|
||||
fprintf(stderr, "libburn_ABORT: ctrl = %s\n",
|
||||
burn_util_thread_id(abort_control_pid, abort_control_thread,
|
||||
text));
|
||||
if (burn_global_signal_handler == burn_builtin_abort_handler)
|
||||
fprintf(stderr, "libburn_ABORT: signal action = %d\n",
|
||||
burn_builtin_signal_action);
|
||||
|
||||
/* >>> find writing drives and report their tid
|
||||
fprintf(stderr, "libburn_ABORT: wrt = %s\n",
|
||||
burn_util_thread_id(0, burn_write_thread_id, text));
|
||||
fprintf(stderr, "libburn_ABORT: sig= %d\n", signum);
|
||||
*/
|
||||
fprintf(stderr,
|
||||
"libburn_ABORT: pid = %d , abort_control_pid = %d , sig= %d\n",
|
||||
getpid(), abort_control_pid, signum);
|
||||
#endif
|
||||
|
||||
burn_builtin_triggered_action = burn_builtin_signal_action;
|
||||
burn_global_abort_level = -1;
|
||||
|
||||
if (burn_builtin_signal_action > 1) {
|
||||
Cleanup_set_handlers(NULL, NULL, 2);
|
||||
if (burn_builtin_signal_action == 4)
|
||||
return -2;
|
||||
fprintf(stderr,"%sABORT : Trying to shut down busy drives\n",
|
||||
abort_message_prefix);
|
||||
fprintf(stderr,
|
||||
"%sABORT : Wait the normal burning time before any kill -9\n",
|
||||
abort_message_prefix);
|
||||
burn_abort_5(0, burn_abort_pacifier, abort_message_prefix,
|
||||
0, 1);
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00020177,
|
||||
LIBDAX_MSGS_SEV_ABORT, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Urged drive worker threads to do emergency halt",
|
||||
0, 0);
|
||||
return -2;
|
||||
}
|
||||
|
||||
|
||||
/* ---- old deprecated stuck-in-abort-handler loop ---- */
|
||||
|
||||
/* ts A70928:
|
||||
Must be quick. Allowed to coincide with other thread and to share
|
||||
the increment with that one. It must not decrease, though, and
|
||||
@ -414,8 +350,7 @@ int burn_builtin_abort_handler(void *handle, int signum, int flag)
|
||||
|
||||
#ifdef Libburn_new_thread_signal_handleR
|
||||
|
||||
ret = burn_drive_find_by_thread_pid(&d, getpid(),
|
||||
pthread_self());
|
||||
ret = burn_drive_find_by_thread_pid(&d, getpid());
|
||||
if (ret > 0 && d->busy == BURN_DRIVE_WRITING) {
|
||||
/* This is an active writer thread */
|
||||
|
||||
@ -455,13 +390,13 @@ int burn_builtin_abort_handler(void *handle, int signum, int flag)
|
||||
}
|
||||
burn_global_abort_level = -1;
|
||||
Cleanup_set_handlers(NULL, NULL, 2);
|
||||
|
||||
fprintf(stderr,"%sABORT : Trying to shut down drive and library\n",
|
||||
abort_message_prefix);
|
||||
fprintf(stderr,
|
||||
"%sABORT : Wait the normal burning time before any kill -9\n",
|
||||
abort_message_prefix);
|
||||
close(0); /* somehow stdin as input blocks abort until EOF */
|
||||
|
||||
burn_abort(4440, burn_abort_pacifier, abort_message_prefix);
|
||||
|
||||
fprintf(stderr,
|
||||
@ -471,71 +406,28 @@ int burn_builtin_abort_handler(void *handle, int signum, int flag)
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* ts A61002 : API */
|
||||
void burn_set_signal_handling(void *handle, burn_abort_handler_t handler,
|
||||
int mode)
|
||||
int mode)
|
||||
{
|
||||
|
||||
/*
|
||||
fprintf(stderr, "libburn_experimental: burn_set_signal_handling, handler==%lx mode=%d\n", (unsigned long) handler, mode);
|
||||
*/
|
||||
|
||||
if(handler == NULL) {
|
||||
if(handler == NULL && mode == 0) {
|
||||
handler = burn_builtin_abort_handler;
|
||||
/*
|
||||
if ((mode & ~4) == 0)
|
||||
fprintf(stderr, "libburn_experimental: activated burn_builtin_abort_handler() with handle '%s'\n",(handle==NULL ? "libburn : " : (char *) handle));
|
||||
fprintf(stderr, "libburn_experimental: activated burn_builtin_abort_handler() with handle '%s'\n",(handle==NULL ? "libburn : " : (char *) handle));
|
||||
*/
|
||||
|
||||
}
|
||||
strcpy(abort_message_prefix, "libburn : ");
|
||||
abort_message_prefix[0] = 0;
|
||||
if(handle != NULL && handler == burn_builtin_abort_handler)
|
||||
if(handle != NULL)
|
||||
strncpy(abort_message_prefix, (char *) handle,
|
||||
sizeof(abort_message_prefix)-1);
|
||||
abort_message_prefix[sizeof(abort_message_prefix)-1] = 0;
|
||||
abort_control_pid = getpid();
|
||||
abort_control_thread = pthread_self();
|
||||
burn_builtin_signal_action = (mode >> 4) & 15;
|
||||
if((mode & 11) != 0)
|
||||
burn_builtin_signal_action = 0;
|
||||
if(burn_builtin_signal_action > 1)
|
||||
burn_builtin_triggered_action = 0;
|
||||
if(burn_builtin_signal_action == 0)
|
||||
burn_builtin_signal_action = 1;
|
||||
Cleanup_set_handlers(handle, (Cleanup_app_handler_T) handler,
|
||||
(mode & 15) | 4);
|
||||
Cleanup_set_handlers(handle, (Cleanup_app_handler_T) handler, mode|4);
|
||||
burn_global_signal_handle = handle;
|
||||
burn_global_signal_handler = handler;
|
||||
}
|
||||
|
||||
|
||||
/* ts B00304 : API */
|
||||
int burn_is_aborting(int flag)
|
||||
{
|
||||
return burn_builtin_triggered_action;
|
||||
}
|
||||
|
||||
|
||||
/* ts B00225 */
|
||||
/* @return 0= no abort action 2 pending , 1= not control thread
|
||||
*/
|
||||
int burn_init_catch_on_abort(int flag)
|
||||
{
|
||||
if (burn_builtin_triggered_action != 2)
|
||||
return 0;
|
||||
if (abort_control_pid != getpid() ||
|
||||
abort_control_thread != pthread_self())
|
||||
return 1;
|
||||
burn_abort(4440, burn_abort_pacifier, abort_message_prefix);
|
||||
fprintf(stderr,
|
||||
"\n%sABORT : Program done. Even if you do not see a shell prompt.\n\n",
|
||||
abort_message_prefix);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
/* ts A70223 : API */
|
||||
void burn_allow_untested_profiles(int yes)
|
||||
{
|
||||
|
@ -17,15 +17,5 @@ extern int burn_global_abort_signum;
|
||||
extern void *burn_global_signal_handle;
|
||||
extern burn_abort_handler_t burn_global_signal_handler;
|
||||
|
||||
extern int burn_builtin_signal_action; /* burn_set_signal_handling() */
|
||||
extern volatile int burn_builtin_triggered_action; /* burn_is_aborting() */
|
||||
|
||||
|
||||
/* ts B00225 */
|
||||
/* @return 0= no abort pending , 1= not control thread ,
|
||||
-1= surprisingly burn_abort returned
|
||||
*/
|
||||
int burn_init_catch_on_abort(int flag);
|
||||
|
||||
|
||||
#endif /* BURN__INIT_H */
|
||||
|
@ -1,14 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This is the official API definition of libburn.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LIBBURN_H
|
||||
#define LIBBURN_H
|
||||
|
||||
@ -736,22 +727,17 @@ void burn_finish(void);
|
||||
|
||||
|
||||
/* ts A61002 */
|
||||
/** Abort any running drive operation and eventually call burn_finish().
|
||||
|
||||
You MUST shut down the busy drives if an aborting event occurs during a
|
||||
/** Abort any running drive operation and finally call burn_finish().
|
||||
You MUST calm down the busy drive if an aborting event occurs during a
|
||||
burn run. For that you may call this function either from your own signal
|
||||
handling code or indirectly by activating the built-in signal handling:
|
||||
handling code or indirectly by activating the builtin signal handling:
|
||||
burn_set_signal_handling("my_app_name : ", NULL, 0);
|
||||
Else you may eventually call burn_drive_cancel() on the active drives and
|
||||
wait for them to assume state BURN_DRIVE_IDLE.
|
||||
@param patience Maximum number of seconds to wait for drives to
|
||||
finish.
|
||||
@since 0.7.8 :
|
||||
If this is -1, then only the cancel operations will
|
||||
be performed and no burn_finish() will happen.
|
||||
Else you may eventually call burn_drive_cancel() on the active drive and
|
||||
wait for it to assume state BURN_DRIVE_IDLE.
|
||||
@param patience Maximum number of seconds to wait for drives to finish
|
||||
@param pacifier_func If not NULL: a function to produce appeasing messages.
|
||||
See burn_abort_pacifier() for an example.
|
||||
@param handle Opaque handle to be used with pacifier_func
|
||||
@param handle Opaque handle to be used with pacifier_func
|
||||
@return 1 ok, all went well
|
||||
0 had to leave a drive in unclean state
|
||||
<0 severe error, do no use libburn again
|
||||
@ -779,7 +765,7 @@ int burn_abort_pacifier(void *handle, int patience, int elapsed);
|
||||
void burn_set_verbosity(int level);
|
||||
|
||||
/* ts A91111 */
|
||||
/** Enable resp. disable logging of SCSI commands (currently GNU/Linux only).
|
||||
/** Enable resp. disable logging of SCSI commands (currently Linux only).
|
||||
This call can be made at any time - even before burn_initialize().
|
||||
It is in effect for all active drives and currently not very thread
|
||||
safe for multiple drives.
|
||||
@ -796,11 +782,12 @@ void burn_set_scsi_logging(int flag);
|
||||
after burn_initialize() and before any bus scan. But not mandatory at all.
|
||||
Parameter value 1 enables a feature, 0 disables.
|
||||
Default is (1,0,0). Have a good reason before you change it.
|
||||
@param exclusive
|
||||
@param exclusive Linux only:
|
||||
0 = no attempt to make drive access exclusive.
|
||||
1 = Try to open only devices which are not marked as busy
|
||||
and try to mark them busy if opened sucessfully. (O_EXCL
|
||||
on GNU/Linux , flock(LOCK_EX) on FreeBSD.)
|
||||
and try to mark them busy if opened sucessfully. (O_EXCL)
|
||||
There are kernels which simply don't care about O_EXCL.
|
||||
Some have it off, some have it on, some are switchable.
|
||||
2 = in case of a SCSI device, also try to open exclusively
|
||||
the matching /dev/sr, /dev/scd and /dev/st .
|
||||
One may select a device SCSI file family by adding
|
||||
@ -809,8 +796,8 @@ void burn_set_scsi_logging(int flag);
|
||||
8 = /dev/scd%d
|
||||
16 = /dev/sg%d
|
||||
Do not use other values !
|
||||
Add 32 to demand on GNU/Linux an exclusive lock by
|
||||
fcntl(,F_SETLK,) after open() has succeeded.
|
||||
Add 32 to demand an exclusive lock by fcntl(,F_SETLK,)
|
||||
after open() has succeeded.
|
||||
@param blocking Try to wait for drives which do not open immediately but
|
||||
also do not return an error as well. (O_NONBLOCK)
|
||||
This might stall indefinitely with /dev/hdX hard disks.
|
||||
@ -1110,6 +1097,7 @@ int burn_drive_snooze(struct burn_drive *d, int flag);
|
||||
|
||||
/** Release a drive. This should not be done until the drive is no longer
|
||||
busy (see burn_drive_get_status).
|
||||
Linux: The drive device file is not reserved afterwards. (O_EXCL, F_SETLK).
|
||||
@param drive The drive to release.
|
||||
@param eject Nonzero to make the drive eject the disc in it.
|
||||
*/
|
||||
@ -2627,12 +2615,12 @@ 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 0
|
||||
#define burn_header_version_minor 7
|
||||
#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.
|
||||
For the library compatibility check, BURN_*_VERSION in configure.ac
|
||||
For the library compatibility check BURN_*_VERSION in configure.ac
|
||||
are not decisive. Only the three numbers above do matter.
|
||||
*/
|
||||
/** Usage discussion:
|
||||
@ -2789,82 +2777,30 @@ int burn_set_messenger(void *messenger);
|
||||
|
||||
/* ts A61002 */
|
||||
/* @since 0.2.6 */
|
||||
/** The prototype of a handler function suitable for burn_set_signal_handling()
|
||||
/** The prototype of a handler function suitable for burn_set_abort_handling().
|
||||
Such a function has to return -2 if it does not want the process to
|
||||
exit with value 1.
|
||||
*/
|
||||
typedef int (*burn_abort_handler_t)(void *handle, int signum, int flag);
|
||||
|
||||
/** Control built-in signal handling. Either by setting an own handler or
|
||||
by activating the built-in signal handler.
|
||||
|
||||
A function parameter handle of NULL activates the built-in abort handler.
|
||||
Depending on mode it may cancel all drive operations, wait for all drives
|
||||
to become idle, exit(1). It may also prepare function
|
||||
burn_drive_get_status() for waiting and performing exit(1).
|
||||
If parameter handle may be NULL or a text that shall be used as prefix for
|
||||
pacifier messages of burn_abort_pacifier(). Other than with an application
|
||||
provided handler, the prefix char array does not have to be kept existing
|
||||
until the eventual signal event.
|
||||
Before version 0.7.8 only action 0 was available. I.e. the built-in handler
|
||||
waited for the drives to become idle and then performed exit(1) directly.
|
||||
But during burn_disc_write() onto real CD or DVD, FreeBSD 8.0 pauses the
|
||||
other threads until the signal handler returns.
|
||||
The new actions try to avoid this deadlock. It is advised to use action 3
|
||||
at least during burn_disc_write(), burn_disc_rease(), burn_disc_format():
|
||||
burn_set_signal_handling(text, NULL, 0x30);
|
||||
and to call burn_is_aborting(0) when the drive is BURN_DRIVE_IDLE.
|
||||
If burn_is_aborting(0) returns 1, then call burn_abort() and exit(1).
|
||||
|
||||
/** Control builtin signal handling. See also burn_abort().
|
||||
@param handle Opaque handle eventually pointing to an application
|
||||
provided memory object
|
||||
@param handler A function to be called on signals. It will get handle as
|
||||
argument. flag will be 0.
|
||||
It should finally call burn_abort(). See there.
|
||||
@param mode : bit0 - bit3:
|
||||
Receiving signals:
|
||||
0 Call handler(handle, signum, 0) on nearly all signals
|
||||
1 Enable system default reaction on all signals
|
||||
2 Try to ignore nearly all signals
|
||||
10 like mode 2 but handle SIGABRT like with mode 0
|
||||
bit4 - bit7: With handler == NULL :
|
||||
Action of built-in handler. "control thread" is the one
|
||||
which called burn_set_signal_handling().
|
||||
All actions activate receive mode 2 to ignore further
|
||||
signals.
|
||||
0 Same as 1 (for pre-0.7.8 backward compatibility)
|
||||
@since 0.7.8
|
||||
1 Catch the control thread in abort handler, call
|
||||
burn_abort(>0) and finally exit(1).
|
||||
Does not always work with FreeBSD.
|
||||
2 Call burn_abort(-1) and return from handler. When the
|
||||
control thread calls burn_drive_get_status(), then do
|
||||
burn_abort(>0) instead, and finally exit(1).
|
||||
Does not always work with FreeBSD.
|
||||
3 Call burn_abort(-1), return from handler. It is duty of
|
||||
the application to detect a pending abort condition
|
||||
by calling burn_is_aborting() and to wait for all
|
||||
drives to become idle. E.g. by calling burn_abort(>0).
|
||||
4 Like 3, but without calling burn_abort(-1). Only the
|
||||
indicator of burn_is_aborting() gets set.
|
||||
argument. It should finally call burn_abort(). See there.
|
||||
@param mode : 0 call handler(handle, signum, 0) on nearly all signals
|
||||
1 enable system default reaction on all signals
|
||||
2 try to ignore nearly all signals
|
||||
10 like mode 2 but handle SIGABRT like with mode 0
|
||||
Arguments (text, NULL, 0) activate the builtin abort handler. It will
|
||||
eventually call burn_abort() and then perform exit(1). If text is not NULL
|
||||
then it is used as prefix for pacifier messages of burn_abort_pacifier().
|
||||
@since 0.2.6
|
||||
*/
|
||||
void burn_set_signal_handling(void *handle, burn_abort_handler_t handler,
|
||||
int mode);
|
||||
|
||||
|
||||
/* ts B00304 */
|
||||
/* Inquire whether the built-in abort handler was triggered by a signal.
|
||||
This has to be done to detect pending abort handling if signal handling
|
||||
was set to the built-in handler and action was set to 2 or 3.
|
||||
@param flag Bitfield for control purposes (unused yet, submit 0)
|
||||
@return 0 = no abort was triggered
|
||||
>0 = action that was triggered (action 0 is reported as 1)
|
||||
@since 0.7.8
|
||||
*/
|
||||
int burn_is_aborting(int flag);
|
||||
|
||||
|
||||
/* ts A70811 */
|
||||
/** Write data in random access mode.
|
||||
The drive must be grabbed successfully before calling this function which
|
||||
@ -3012,4 +2948,5 @@ BURN_END_DECLS
|
||||
#define Libburn_dummy_probe_write_modeS 1
|
||||
|
||||
|
||||
|
||||
#endif /*LIBBURN_H*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
/* libdax_audioxtr
|
||||
Audio track data extraction facility of libdax and libburn.
|
||||
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
|
||||
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
/* libdax_audioxtr
|
||||
Audio track data extraction facility of libdax and libburn.
|
||||
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
|
||||
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
|
||||
*/
|
||||
|
||||
#ifndef LIBDAX_AUDIOXTR_H_INCLUDED
|
||||
|
@ -2,7 +2,7 @@
|
||||
/* libdax_msgs
|
||||
Message handling facility of libdax.
|
||||
Copyright (C) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
provided under GPL version 2 or later.
|
||||
provided under GPL
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
@ -12,7 +12,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <sys/time.h>
|
||||
#include <pthread.h>
|
||||
|
||||
/* Only this single source module is entitled to do this */
|
||||
#define LIBDAX_MSGS_H_INTERNAL 1
|
||||
|
@ -2,7 +2,7 @@
|
||||
/* libdax_msgs
|
||||
Message handling facility of libdax.
|
||||
Copyright (C) 2006-2010 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
provided under GPL version 2 or later.
|
||||
provided under GPL
|
||||
*/
|
||||
|
||||
|
||||
@ -554,8 +554,6 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
||||
0x00020174 (SORRY,HIGH) = Fifo alignment does not allow desired read size
|
||||
0x00020175 (FATAL,HIGH) = Supporting library is too old
|
||||
0x00020176 (NOTE,HIGH) = Stream recording disabled because of small OS buffer
|
||||
0x00020177 (ABORT,HIGH) = Urged drive worker threads to do emergency halt
|
||||
0x00020178 (DEBUG,HIGH) = Write thread ended
|
||||
|
||||
|
||||
libdax_audioxtr:
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
/* ts A61009 */
|
||||
/* #include <a ssert.h> */
|
||||
|
||||
@ -425,10 +419,6 @@ int mmc_get_nwa(struct burn_drive *d, int trackno, int *lba, int *nwa)
|
||||
if (mmc_function_spy(d, "mmc_get_nwa") <= 0)
|
||||
return -1;
|
||||
|
||||
/* ts B00327 : Avoid to inquire unsuitable media states */
|
||||
if (d->status != BURN_DISC_BLANK && d->status != BURN_DISC_APPENDABLE)
|
||||
return 0;
|
||||
|
||||
ret = mmc_read_track_info(d, trackno, &buf, alloc_len);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
@ -4088,7 +4078,7 @@ int mmc_read_disc_structure(struct burn_drive *d,
|
||||
desired payload bytes. The drive then returns 35
|
||||
bytes as requested and the media id is "RITEKF1".
|
||||
Nevertheless this is not a generally usable gesture
|
||||
because older GNU/Linux USB dislikes requests to fetch
|
||||
because older Linux USB dislikes requests to fetch
|
||||
more bytes than the drive will deliver.
|
||||
|
||||
# define Libburn_enforce_structure_code_0x0E 1
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __MMC
|
||||
#define __MMC
|
||||
|
||||
|
@ -1,10 +1,5 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#include "null.h"
|
||||
#include "libburn.h"
|
||||
#include <stdlib.h>
|
||||
|
@ -1,9 +1,3 @@
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#include "libburn.h"
|
||||
#include "options.h"
|
||||
#include "drive.h"
|
||||
|
@ -1,9 +1,3 @@
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifndef BURN__OPTIONS_H
|
||||
#define BURN__OPTIONS_H
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
Unknown POSIX like systems
|
||||
with the dummy MMC transport adapter sg-dummy.c
|
||||
|
||||
Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
|
||||
Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
|
||||
*/
|
||||
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
by os.h in case of compilation for
|
||||
FreeBSD with CAM
|
||||
|
||||
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
|
||||
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
|
||||
*/
|
||||
|
||||
/** List of all signals which shall be caught by signal handlers and trigger
|
||||
@ -59,6 +59,5 @@ typedef struct burn_drive_enumeration_state *burn_drive_enumerator_t;
|
||||
#define BURN_OS_TRANSPORT_DRIVE_ELEMENTS \
|
||||
struct cam_device* cam; \
|
||||
int lock_fd; \
|
||||
int is_ahci; \
|
||||
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
Unknown X/Open-like systems
|
||||
with GNU libcdio MMC transport adapter sg-libcdio.c
|
||||
|
||||
Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
|
||||
Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
|
||||
*/
|
||||
|
||||
|
||||
@ -41,7 +41,7 @@ SIGKILL, SIGCHLD, SIGSTOP
|
||||
/* Important : MUST be at least 32768 ! */
|
||||
/* My Blu-ray burner LG GGW-H20 writes junk if stream recording is combined
|
||||
with buffer size 32 kB. So stream recording is allowed only with size 64k.
|
||||
This makes it worth to have a special case for GNU/Linux buffer size here.
|
||||
This makes it worth to have a special case for Linux buffer size here.
|
||||
*/
|
||||
#ifdef __linux
|
||||
#define BURN_OS_TRANSPORT_BUFFER_SIZE 65536
|
||||
|
@ -2,10 +2,9 @@
|
||||
/* os-linux.h
|
||||
Operating system specific libburn definitions and declarations. Included
|
||||
by os.h in case of compilation for
|
||||
Linux kernels 2.4 and 2.6, GNU/Linux SCSI Generic (sg)
|
||||
Linux kernels 2.4 and 2.6 with Linux SCSI Generic (sg)
|
||||
|
||||
Copyright (C) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
|
||||
*/
|
||||
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
Operating system specific libburn definitions and declarations.
|
||||
The macros defined here are used by libburn modules in order to
|
||||
avoid own system dependent case distinctions.
|
||||
Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
|
||||
Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
|
||||
*/
|
||||
|
||||
#ifndef BURN_OS_H_INCLUDED
|
||||
@ -41,7 +41,7 @@
|
||||
#ifdef __linux
|
||||
|
||||
|
||||
/* ------- Linux kernels 2.4 and 2.6 with GNU/Linux SCSI Generic (sg) ------ */
|
||||
/* --------- Linux kernels 2.4 and 2.6 with Linux SCSI Generic (sg) -------- */
|
||||
#include "os-linux.h"
|
||||
|
||||
|
||||
|
@ -1,12 +1,6 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
/* #include <m alloc.h> ts A61013 : not in GNU/Linux man 3 malloc */
|
||||
/* #include <m alloc.h> ts A61013 : not in Linux man 3 malloc */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
@ -100,13 +94,7 @@ drive, or only store a subset of the _opts structs in drives */
|
||||
fakesub[20] = 2;
|
||||
fakesub[12] = (d->toc->toc_entry[0].control << 4) +
|
||||
d->toc->toc_entry[0].adr;
|
||||
|
||||
#ifdef Libburn_no_crc_C
|
||||
crc = 0; /* dummy */
|
||||
#else
|
||||
crc = crc_ccitt(fakesub + 12, 10);
|
||||
#endif
|
||||
|
||||
fakesub[22] = crc >> 8;
|
||||
fakesub[23] = crc & 0xFF;
|
||||
write(o->subfd, fakesub, 96);
|
||||
@ -253,8 +241,6 @@ void burn_packet_process(struct burn_drive *d, unsigned char *data,
|
||||
}
|
||||
}
|
||||
crc = (*(sub + 22) << 8) + *(sub + 23);
|
||||
|
||||
#ifndef Libburn_no_crc_C
|
||||
if (crc != crc_ccitt(sub + 12, 10)) {
|
||||
burn_print(1, "sending error on %s %s\n",
|
||||
d->idata->vendor, d->idata->product);
|
||||
@ -263,8 +249,6 @@ void burn_packet_process(struct burn_drive *d, unsigned char *data,
|
||||
*/
|
||||
burn_print(1, "crc mismatch in Q\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/* else process_q(d, sub + 12); */
|
||||
/*
|
||||
if (o->subfd != -1) write(o->subfd, sub, 96); */
|
||||
|
@ -2,12 +2,6 @@
|
||||
|
||||
/* scsi block commands */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __SBC
|
||||
#define __SBC
|
||||
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* ts A61010 */
|
||||
@ -31,7 +25,7 @@ extern struct libdax_msgs *libdax_messenger;
|
||||
|
||||
|
||||
#ifdef Libburn_log_in_and_out_streaM
|
||||
/* ts A61031 */
|
||||
/* <<< ts A61031 */
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
@ -102,7 +96,7 @@ static void get_bytes(struct burn_track *track, int count, unsigned char *data)
|
||||
int valid, shortage, curr, i, tr;
|
||||
|
||||
#ifdef Libburn_log_in_and_out_streaM
|
||||
/* ts A61031 */
|
||||
/* <<< ts A61031 */
|
||||
static int tee_fd= -1;
|
||||
if(tee_fd==-1)
|
||||
tee_fd= open("/tmp/libburn_sg_readin",
|
||||
@ -148,7 +142,7 @@ static void get_bytes(struct burn_track *track, int count, unsigned char *data)
|
||||
track->sourcecount += valid;
|
||||
|
||||
#ifdef Libburn_log_in_and_out_streaM
|
||||
/* ts A61031 */
|
||||
/* <<< ts A61031 */
|
||||
if(tee_fd!=-1 && valid>0) {
|
||||
write(tee_fd, data + curr, valid);
|
||||
}
|
||||
@ -411,13 +405,7 @@ a2 - lout ctrl
|
||||
q[7] = dec_to_bcd(d->toc_entry[track].pmin);
|
||||
q[8] = dec_to_bcd(d->toc_entry[track].psec);
|
||||
q[9] = dec_to_bcd(d->toc_entry[track].pframe);
|
||||
|
||||
#ifdef Libburn_no_crc_C
|
||||
crc = 0; /* dummy */
|
||||
#else
|
||||
crc = crc_ccitt(q, 10);
|
||||
#endif
|
||||
|
||||
q[10] = crc >> 8;
|
||||
q[11] = crc & 0xFF;
|
||||
d->toc_temp++;
|
||||
@ -514,13 +502,7 @@ static void subcode_lout(struct burn_write_opts *o, unsigned char control,
|
||||
q[7] = dec_to_bcd(min);
|
||||
q[8] = dec_to_bcd(sec);
|
||||
q[9] = dec_to_bcd(frame);
|
||||
|
||||
#ifdef Libburn_no_crc_C
|
||||
crc = 0; /* dummy */
|
||||
#else
|
||||
crc = crc_ccitt(q, 10);
|
||||
#endif
|
||||
|
||||
q[10] = crc >> 8;
|
||||
q[11] = crc & 0xFF;
|
||||
}
|
||||
@ -640,13 +622,7 @@ void subcode_user(struct burn_write_opts *o, unsigned char *subcodes,
|
||||
}
|
||||
q[0] = (control << 4) + qmode;
|
||||
|
||||
|
||||
#ifdef Libburn_no_crc_C
|
||||
crc = 0; /* dummy */
|
||||
#else
|
||||
crc = crc_ccitt(q, 10);
|
||||
#endif
|
||||
|
||||
q[10] = crc >> 8;
|
||||
q[11] = crc & 0xff;
|
||||
}
|
||||
@ -678,7 +654,7 @@ int sector_data(struct burn_write_opts *o, struct burn_track *t, int psub)
|
||||
unsigned char *data;
|
||||
|
||||
data = get_sector(o, t, t->mode);
|
||||
if (data == NULL)
|
||||
if (!data)
|
||||
return 0;
|
||||
/* ts A61010 */
|
||||
if (convert_data(o, t, t->mode, data) <= 0)
|
||||
@ -792,13 +768,7 @@ int sector_headers(struct burn_write_opts *o, unsigned char *out,
|
||||
out[15] = modebyte;
|
||||
}
|
||||
if (mode & BURN_MODE1) {
|
||||
|
||||
#ifdef Libburn_no_crc_C
|
||||
crc = 0; /* dummy */
|
||||
#else
|
||||
crc = crc_32(out, 2064);
|
||||
#endif
|
||||
|
||||
out[2064] = crc & 0xFF;
|
||||
crc >>= 8;
|
||||
out[2065] = crc & 0xFF;
|
||||
|
@ -1,10 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifndef __SECTOR
|
||||
#define __SECTOR
|
||||
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/*
|
||||
Copyright (c) 2009 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
|
||||
This is the main operating system dependent SCSI part of libburn. It implements
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/*
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
|
||||
This is the main operating system dependent SCSI part of libburn. It implements
|
||||
|
@ -1,10 +1,5 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/*
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
@ -29,18 +24,6 @@
|
||||
#include <sys/disk.h> /* DIOCGMEDIASIZE */
|
||||
|
||||
|
||||
/* ts B00326 : For use of CAM_PASS_ERR_RECOVER with ahci */
|
||||
#define Libburn_for_freebsd_ahcI yes
|
||||
|
||||
/* ts B00327 : for debugging of cam_send_cdb() failures
|
||||
# define Libburn_ahci_verbouS yes
|
||||
*/
|
||||
|
||||
/* ts B00327 : Apply CAM_PASS_ERR_RECOVER to drives even if not ahci
|
||||
# define libburn_ahci_style_for_alL yes
|
||||
*/
|
||||
|
||||
|
||||
#include "transport.h"
|
||||
#include "drive.h"
|
||||
#include "sg.h"
|
||||
@ -446,7 +429,6 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
||||
|
||||
out.cam = NULL;
|
||||
out.lock_fd = -1;
|
||||
out.is_ahci = 0;
|
||||
|
||||
out.start_lba= -2000000000;
|
||||
out.end_lba= -2000000000;
|
||||
@ -539,7 +521,6 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
||||
/* Adapter specific handles and data */
|
||||
out.cam = NULL;
|
||||
out.lock_fd = -1;
|
||||
out.is_ahci = 0;
|
||||
|
||||
/* Adapter specific functions */
|
||||
out.grab = sg_grab;
|
||||
@ -691,7 +672,6 @@ static int sg_lock(struct burn_drive *d, int flag)
|
||||
int sg_grab(struct burn_drive *d)
|
||||
{
|
||||
struct cam_device *cam;
|
||||
char path_string[80];
|
||||
|
||||
if (mmc_function_spy(d, "sg_grab") <= 0)
|
||||
return 0;
|
||||
@ -714,18 +694,6 @@ int sg_grab(struct burn_drive *d)
|
||||
if (sg_lock(d, 0) <= 0)
|
||||
return 0;
|
||||
fcntl(cam->fd, F_SETOWN, getpid());
|
||||
|
||||
cam_path_string(d->cam, path_string, sizeof(path_string));
|
||||
|
||||
#ifdef Libburn_ahci_verbouS
|
||||
fprintf(stderr, "libburn_EXPERIMENTAL: CAM path = %s\n", path_string);
|
||||
#endif
|
||||
|
||||
if (strstr(path_string, ":ahcich") != NULL)
|
||||
d->is_ahci = 1;
|
||||
else
|
||||
d->is_ahci = -1;
|
||||
|
||||
d->released = 0;
|
||||
return 1;
|
||||
}
|
||||
@ -755,8 +723,7 @@ int sg_release(struct burn_drive *d)
|
||||
|
||||
int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
{
|
||||
int done = 0, err, sense_len = 0, ret, ignore_error, no_retry = 0;
|
||||
int cam_pass_err_recover = 0;
|
||||
int done = 0, err, sense_len, ret;
|
||||
union ccb *ccb;
|
||||
char buf[161];
|
||||
static FILE *fp = NULL;
|
||||
@ -804,23 +771,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef Libburn_for_freebsd_ahcI
|
||||
/* ts B00325 : Advise by Alexander Motin */
|
||||
/* Runs well on 8-STABLE (23 Mar 2003)
|
||||
But on 8-RELEASE cam_send_ccb() returns non-zero with errno 6
|
||||
on eject. Long lasting TEST UNIT READY cycles break with
|
||||
errno 16.
|
||||
*/
|
||||
#ifdef Libburn_ahci_style_for_alL
|
||||
{
|
||||
#else
|
||||
if (d->is_ahci > 0) {
|
||||
#endif
|
||||
ccb->ccb_h.flags |= CAM_PASS_ERR_RECOVER;
|
||||
cam_pass_err_recover = 1;
|
||||
}
|
||||
#endif /* Libburn_for_freebsd_ahcI */
|
||||
|
||||
ccb->csio.cdb_len = c->oplen;
|
||||
memcpy(&ccb->csio.cdb_io.cdb_bytes, &c->opcode, c->oplen);
|
||||
|
||||
@ -851,74 +801,8 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
}
|
||||
|
||||
do {
|
||||
memset(c->sense, 0, sizeof(c->sense));
|
||||
err = cam_send_ccb(d->cam, ccb);
|
||||
|
||||
ignore_error = sense_len = 0;
|
||||
/* ts B00325 : CAM_AUTOSNS_VALID advised by Alexander Motin */
|
||||
if (ccb->ccb_h.status & CAM_AUTOSNS_VALID) {
|
||||
/* ts B00110 */
|
||||
/* Better curb sense_len */
|
||||
sense_len = ccb->csio.sense_len;
|
||||
if (sense_len > sizeof(c->sense))
|
||||
sense_len = sizeof(c->sense);
|
||||
memcpy(c->sense, &ccb->csio.sense_data, sense_len);
|
||||
if (sense_len >= 14 && cam_pass_err_recover &&
|
||||
(c->sense[2] & 0x0f))
|
||||
ignore_error = 1;
|
||||
}
|
||||
|
||||
if (err == -1 && cam_pass_err_recover && ! ignore_error) {
|
||||
|
||||
#ifdef Libburn_ahci_verbouS
|
||||
fprintf(stderr, "libburn_EXPERIMENTAL: errno = %d . cam_errbuf = '%s'\n", errno, cam_errbuf);
|
||||
#endif
|
||||
|
||||
if (errno == ENXIO && c->opcode[0] != 0) {
|
||||
/* Operations on empty or ejected tray */
|
||||
/* MEDIUM NOT PRESENT */
|
||||
|
||||
#ifdef Libburn_ahci_verbouS
|
||||
fprintf(stderr, "libburn_EXPERIMENTAL: Emulating [2,3A,00] MEDIUM NOT PRESENT\n");
|
||||
#endif
|
||||
|
||||
c->sense[2] = 0x02;
|
||||
c->sense[12] = 0x3A;
|
||||
c->sense[13] = 0x00;
|
||||
sense_len = 14;
|
||||
ignore_error = 1;
|
||||
} else if (c->opcode[0] == 0 &&
|
||||
(errno == EBUSY || errno == ENXIO)) {
|
||||
/* Timeout of TEST UNIT READY loop */
|
||||
/* Inquiries while tray is being loaded */
|
||||
/*LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE*/
|
||||
|
||||
#ifdef Libburn_ahci_verbouS
|
||||
fprintf(stderr, "libburn_EXPERIMENTAL: Emulating [2,04,00] LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE\n");
|
||||
#endif
|
||||
|
||||
c->sense[2] = 0x02;
|
||||
c->sense[12] = 0x04;
|
||||
c->sense[13] = 0x00;
|
||||
sense_len = 14;
|
||||
ignore_error = 1;
|
||||
} else if (errno == EINVAL) {
|
||||
/* Inappropriate MODE SENSE */
|
||||
/* INVALID FIELD IN CDB */
|
||||
|
||||
#ifdef Libburn_ahci_verbouS
|
||||
fprintf(stderr, "libburn_EXPERIMENTAL: Emulating [5,24,00] INVALID FIELD IN CDB\n");
|
||||
#endif
|
||||
|
||||
c->sense[2] = 0x05;
|
||||
c->sense[12] = 0x24;
|
||||
c->sense[13] = 0x00;
|
||||
sense_len = 14;
|
||||
ignore_error = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (err == -1 && !ignore_error) {
|
||||
if (err == -1) {
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index, 0x0002010c,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
@ -932,33 +816,20 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
}
|
||||
/* XXX */
|
||||
|
||||
/* ts B00110 */
|
||||
/* Better curb sense_len */
|
||||
sense_len = ccb->csio.sense_len;
|
||||
if (sense_len > sizeof(c->sense))
|
||||
sense_len = sizeof(c->sense);
|
||||
memcpy(c->sense, &ccb->csio.sense_data, ccb->csio.sense_len);
|
||||
if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
|
||||
if (sense_len < 14) {
|
||||
/*LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE*/
|
||||
|
||||
#ifdef Libburn_ahci_verbouS
|
||||
fprintf(stderr, "libburn_EXPERIMENTAL: CAM_STATUS= %d .Emulating [2,04,00] LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE\n", (ccb->ccb_h.status & CAM_STATUS_MASK));
|
||||
#endif
|
||||
|
||||
c->sense[2] = 0x02;
|
||||
c->sense[12] = 0x04;
|
||||
c->sense[13] = 0x00;
|
||||
no_retry = 1;
|
||||
}
|
||||
if (no_retry || ignore_error || !c->retry) {
|
||||
if (!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, 0,
|
||||
(c->error != 0) | 2);
|
||||
scsi_log_cmd(c,fp,0);
|
||||
}
|
||||
break;
|
||||
case FAIL:
|
||||
done = 1;
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/*
|
||||
Copyright (c) 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
|
||||
This is the main operating system dependent SCSI part of libburn. It implements
|
||||
@ -553,7 +547,7 @@ int sg_release(struct burn_drive *d)
|
||||
*/
|
||||
int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
{
|
||||
int sense_valid = 0, i, usleep_time, timeout_ms, no_retry = 0;
|
||||
int sense_valid = 0, i, usleep_time, timeout_ms;
|
||||
time_t start_time;
|
||||
driver_return_code_t i_status;
|
||||
unsigned int dxfer_len;
|
||||
@ -568,15 +562,15 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
return 0;
|
||||
}
|
||||
p_cdio = (CdIo_t *) d->p_cdio;
|
||||
if (burn_sg_log_scsi & 1) {
|
||||
if (fp == NULL) {
|
||||
fp= fopen("/tmp/libburn_sg_command_log", "a");
|
||||
fprintf(fp,
|
||||
"\n-----------------------------------------\n");
|
||||
}
|
||||
}
|
||||
if (burn_sg_log_scsi & 3)
|
||||
scsi_log_cmd(c,fp,0);
|
||||
if (burn_sg_log_scsi & 1) {
|
||||
if (fp == NULL) {
|
||||
fp= fopen("/tmp/libburn_sg_command_log", "a");
|
||||
fprintf(fp,
|
||||
"\n-----------------------------------------\n");
|
||||
}
|
||||
}
|
||||
if (burn_sg_log_scsi & 3)
|
||||
scsi_log_cmd(c,fp,0);
|
||||
|
||||
memcpy(cdb.field, c->opcode, c->oplen);
|
||||
if (c->dir == TO_DRIVE) {
|
||||
@ -628,35 +622,24 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
}
|
||||
*/
|
||||
|
||||
if ((!sense_valid) ||
|
||||
((c->sense[2] & 0x0f) == 0 && c->sense[12] == 0 &&
|
||||
c->sense[13] == 0)) {
|
||||
if (!sense_valid) {
|
||||
memset(c->sense, 0, sizeof(c->sense));
|
||||
if (i_status != 0) { /* set dummy sense */
|
||||
/*LOGICAL UNIT NOT READY,
|
||||
CAUSE NOT REPORTABLE*/
|
||||
/*LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE*/
|
||||
c->sense[2] = 0x02;
|
||||
c->sense[12] = 0x04;
|
||||
no_retry = 1;
|
||||
}
|
||||
} else
|
||||
c->sense[2] &= 15;
|
||||
|
||||
if (i_status != 0 ||
|
||||
(c->sense[2] || c->sense[12] || c->sense[13])) {
|
||||
if (no_retry || !c->retry) {
|
||||
if (!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, 0,
|
||||
(c->error != 0) | 2);
|
||||
scsi_log_cmd(c,fp,0);
|
||||
}
|
||||
break;
|
||||
case FAIL:
|
||||
c->error = 1;
|
||||
@ -851,7 +834,7 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
|
||||
#ifdef __linux
|
||||
|
||||
/* GNU/Linux specific determination of block device size */
|
||||
/* Linux specific determination of block device size */
|
||||
} else if(S_ISBLK(stbuf.st_mode)) {
|
||||
int open_mode = O_RDONLY, fd, ret;
|
||||
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/* <<< ts A91112 : experiments to get better speed with USB
|
||||
#define Libburn_sgio_as_growisofS 1
|
||||
@ -17,7 +11,7 @@
|
||||
This is the main operating system dependent SCSI part of libburn. It implements
|
||||
the transport level aspects of SCSI control and command i/o.
|
||||
|
||||
Present implementation: GNU/Linux SCSI Generic (sg)
|
||||
Present implementation: Linux SCSI Generic (sg)
|
||||
|
||||
|
||||
PORTING:
|
||||
@ -899,7 +893,7 @@ static int is_scsi_drive(char *fname, int *bus_no, int *host_no,
|
||||
#endif /* Libburn_drive_new_deaL */
|
||||
|
||||
|
||||
/** Speciality of GNU/Linux: detect non-SCSI ATAPI (EIDE) which will from
|
||||
/** Speciality of 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)
|
||||
{
|
||||
@ -1408,7 +1402,7 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
||||
|
||||
/* PORTING: ------------------- non portable part --------------- */
|
||||
|
||||
/* Operating system adapter is GNU/Linux Generic SCSI (sg) */
|
||||
/* Operating system adapter is Linux Generic SCSI (sg) */
|
||||
/* Adapter specific handles and data */
|
||||
out.fd = -1337;
|
||||
out.sibling_count = 0;
|
||||
@ -1445,7 +1439,7 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
||||
*/
|
||||
int sg_id_string(char msg[1024], int flag)
|
||||
{
|
||||
strcpy(msg, "internal GNU/Linux SG_IO adapter sg-linux");
|
||||
strcpy(msg, "internal Linux SG_IO adapter sg-linux");
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -1490,7 +1484,7 @@ int sg_dispose_drive(struct burn_drive *d, int flag)
|
||||
|
||||
|
||||
/** PORTING:
|
||||
In this GNU/Linux implementation, this function mirrors the enumeration
|
||||
In this Linux implementation, this function mirrors the enumeration
|
||||
done in sg_enumerate and ata_enumerate(). It would be better to base those
|
||||
functions on this sg_give_next_adr() but the situation is not inviting.
|
||||
*/
|
||||
@ -1587,7 +1581,7 @@ return_1_pre_proc:;
|
||||
libburn's list of drives.
|
||||
*/
|
||||
/** PORTING:
|
||||
If not stricken with an incompletely unified situation like in GNU/Linux
|
||||
If not stricken with an incompletely unified situation like in Linux
|
||||
one would rather implement this by a loop calling sg_give_next_adr().
|
||||
If needed with your sg_give_next_adr() results, do a test for existence
|
||||
and accessability. If burn activities are prone to external interference
|
||||
@ -1651,7 +1645,6 @@ int sg_drive_is_open(struct burn_drive * d)
|
||||
int sg_grab(struct burn_drive *d)
|
||||
{
|
||||
int fd, os_errno= 0, ret;
|
||||
int max_tries = 3, tries = 0;
|
||||
|
||||
/* ts A60813 */
|
||||
int open_mode = O_RDWR;
|
||||
@ -1685,7 +1678,6 @@ int sg_grab(struct burn_drive *d)
|
||||
value -1 of open(2) war used. */
|
||||
if(! burn_drive_is_open(d)) {
|
||||
|
||||
try_open:;
|
||||
/* ts A60821
|
||||
<<< debug: for tracing calls which might use open drive fds */
|
||||
mmc_function_spy(NULL, "sg_grab ----------- opening");
|
||||
@ -1719,19 +1711,13 @@ try_open:;
|
||||
fcntl(fd, F_SETOWN, getpid());
|
||||
d->released = 0;
|
||||
return 1;
|
||||
} else if (errno == EBUSY)
|
||||
goto drive_is_in_use;
|
||||
}
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index, 0x00020003,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Could not grab drive", os_errno, 0);
|
||||
return 0;
|
||||
|
||||
drive_is_in_use:;
|
||||
tries++;
|
||||
if (tries < max_tries) {
|
||||
usleep(2000000);
|
||||
goto try_open;
|
||||
}
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x00020003,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
@ -1928,11 +1914,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
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.duration,
|
||||
c->error != 0);
|
||||
scsi_log_cmd(c,fp,0);
|
||||
}
|
||||
break;
|
||||
case FAIL:
|
||||
done = 1;
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
/* sg.c
|
||||
Switcher for operating system dependent transport level modules of libburn.
|
||||
Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
|
||||
Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
|
||||
*/
|
||||
|
||||
|
||||
@ -34,11 +34,11 @@
|
||||
static int intentional_compiler_warning(void)
|
||||
{
|
||||
int INTENTIONAL_COMPILER_WARNING_;
|
||||
int Cannot_recognize_GNU_Linux_nor_FreeBSD_;
|
||||
int Cannot_recognize_Linux_nor_FreeBSD_;
|
||||
int Have_to_use_dummy_MMC_transport_adapter_;
|
||||
int This_libburn_will_not_be_able_to_operate_on_real_CD_drives;
|
||||
int Have_to_use_dummy_MMC_transport_adapter;
|
||||
int Cannot_recognize_GNU_Linux_nor_FreeBSD;
|
||||
int Cannot_recognize_Linux_nor_FreeBSD;
|
||||
int INTENTIONAL_COMPILER_WARNING;
|
||||
|
||||
return(0);
|
||||
|
@ -1,8 +1,5 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
|
||||
*/
|
||||
|
||||
#ifndef __SG
|
||||
#define __SG
|
||||
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "libburn.h"
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
/* scsi primary commands */
|
||||
|
||||
#include <unistd.h>
|
||||
@ -113,8 +107,7 @@ int spc_test_unit_ready(struct burn_drive *d)
|
||||
int spc_wait_unit_attention(struct burn_drive *d, int max_sec, char *cmd_text,
|
||||
int flag)
|
||||
{
|
||||
int i, ret = 1, key = 0, asc = 0, ascq = 0, clueless_start = 0;
|
||||
static int clueless_timeout = 5 * 10;
|
||||
int i, ret = 1, key = 0, asc = 0, ascq = 0;
|
||||
char msg[320];
|
||||
unsigned char sense[14];
|
||||
enum response resp;
|
||||
@ -144,7 +137,6 @@ int spc_wait_unit_attention(struct burn_drive *d, int max_sec, char *cmd_text,
|
||||
/* media change notice = try again */
|
||||
goto slumber;
|
||||
|
||||
handle_error:;
|
||||
/* ts A90213 */
|
||||
sprintf(msg,
|
||||
"Asynchronous SCSI error on %s: ", cmd_text);
|
||||
@ -159,23 +151,7 @@ handle_error:;
|
||||
msg, 0, 0);
|
||||
d->cancel = 1;
|
||||
break;
|
||||
} else if (ascq == 0x00) { /* CAUSE NOT REPORTABLE */
|
||||
/* Might be a clueless system adapter */
|
||||
if (clueless_start == 0)
|
||||
clueless_start = i;
|
||||
if (i - clueless_start > clueless_timeout) {
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index,
|
||||
0x00000002,
|
||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Ended clueless NOT READY cycle",
|
||||
0, 0);
|
||||
ret = 1; /* medium not present = ok */
|
||||
break;
|
||||
}
|
||||
} else if (ascq == 0x02 || ascq == 0x03)
|
||||
goto handle_error;
|
||||
|
||||
}
|
||||
slumber:;
|
||||
usleep(100000);
|
||||
}
|
||||
@ -979,13 +955,13 @@ enum response scsi_error_msg(struct burn_drive *d, unsigned char *sense,
|
||||
*key= *asc= *ascq= -1;
|
||||
|
||||
if (senselen<=0 || senselen>2)
|
||||
*key = sense[2] & 0x0f;
|
||||
*key = sense[2];
|
||||
if (senselen<=0 || senselen>12)
|
||||
*asc = sense[12];
|
||||
if (senselen<=0 || senselen>13)
|
||||
*ascq = sense[13];
|
||||
|
||||
sprintf(msg, "[%X %2.2X %2.2X] ", *key, *asc, *ascq);
|
||||
sprintf(msg, "[%X %2.2X %2.2X] ", (*key) & 0xf, *asc, *ascq);
|
||||
msg= msg + strlen(msg);
|
||||
|
||||
burn_print(12, "CONDITION: 0x%x 0x%x 0x%x on %s %s\n",
|
||||
@ -1000,11 +976,8 @@ enum response scsi_error_msg(struct burn_drive *d, unsigned char *sense,
|
||||
sprintf(msg, "Not ready");
|
||||
return RETRY;
|
||||
case 0x04:
|
||||
if (*ascq == 1)
|
||||
sprintf(msg,
|
||||
sprintf(msg,
|
||||
"Logical unit is in the process of becoming ready");
|
||||
else
|
||||
sprintf(msg, "Logical unit is not ready");
|
||||
return RETRY;
|
||||
case 0x08:
|
||||
if (*key != 4)
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __SPC
|
||||
#define __SPC
|
||||
|
||||
|
@ -1,9 +1,4 @@
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
/* ts A61008 */
|
||||
/* #include <a ssert.h> */
|
||||
|
||||
|
@ -1,9 +1,3 @@
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifndef BURN__STRUCTURE_H
|
||||
#define BURN__STRUCTURE_H
|
||||
|
||||
|
@ -1,10 +1,5 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
/* ts A61008 */
|
||||
/* #include <a ssert.h> */
|
||||
|
||||
@ -135,7 +130,7 @@ void toc_find_modes(struct burn_drive *d)
|
||||
} else {
|
||||
|
||||
t->mode = BURN_MODE1;
|
||||
/* ts A70519 : this does not work with GNU/Linux 2.4 USB because one cannot
|
||||
/* ts A70519 : this does not work with Linux 2.4 USB because one cannot
|
||||
predict the exact dxfer_size without knowing the sector type.
|
||||
mem.sectors = 1;
|
||||
d->read_sectors(d, lba, mem.sectors, &o, &mem);
|
||||
|
@ -1,10 +1,5 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __TOC_H
|
||||
#define __TOC_H
|
||||
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __TRANSPORT
|
||||
#define __TRANSPORT
|
||||
|
||||
@ -312,8 +306,6 @@ struct burn_drive
|
||||
/* ts A70929 */
|
||||
pid_t thread_pid;
|
||||
int thread_pid_valid;
|
||||
/* ts B00225 */
|
||||
pthread_t thread_tid;
|
||||
|
||||
|
||||
/* transport functions */
|
||||
|
@ -1,9 +1,3 @@
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/* ts A61008 */
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
|
||||
@ -39,6 +33,7 @@
|
||||
#include "libburn.h"
|
||||
#include "drive.h"
|
||||
#include "transport.h"
|
||||
#include "crc.h"
|
||||
#include "debug.h"
|
||||
#include "init.h"
|
||||
#include "toc.h"
|
||||
@ -942,8 +937,6 @@ int burn_disc_init_write_status(struct burn_write_opts *o,
|
||||
|
||||
d->cancel = 0;
|
||||
|
||||
#ifdef Libburn_reset_progress_asynC
|
||||
/* <<< This is now done in async.c */
|
||||
/* init progress before showing the state */
|
||||
d->progress.session = 0;
|
||||
d->progress.sessions = disc->sessions;
|
||||
@ -958,7 +951,6 @@ int burn_disc_init_write_status(struct burn_write_opts *o,
|
||||
d->progress.sectors = 0;
|
||||
d->progress.sector = 0;
|
||||
d->progress.track = 0;
|
||||
#endif /* Libburn_reset_progress_asynC */
|
||||
|
||||
/* ts A61023 */
|
||||
d->progress.buffer_capacity = 0;
|
||||
@ -1271,8 +1263,8 @@ int burn_disc_close_track_dvd_plus_r(struct burn_write_opts *o,
|
||||
|
||||
/* ts A91114 : EXPERIMENTAL, NOT COMPLETELY IMPLEMENTED
|
||||
|
||||
Simplified data transmission for DVD. libburn via GNU/Linux USB is 30 %
|
||||
slower than growisofs or cdrecord when transmitting 32 KB chunks.
|
||||
Simplified data transmission for DVD. libburn via Linux USB is 30 % slower
|
||||
than growisofs or cdrecord when transmitting 32 KB chunks.
|
||||
With 64 KB chunks it is 20% faster than the competitors.
|
||||
No heavy CPU load is visible but there might be subtle race conditions in
|
||||
the USB driver which work better with shorter time gaps between WRITE
|
||||
@ -1312,7 +1304,7 @@ static int transact_dvd_chunk(struct burn_write_opts *opts,
|
||||
unsigned char *data = out->data;
|
||||
|
||||
#ifdef Libburn_log_in_and_out_streaM
|
||||
/* ts A61031 */
|
||||
/* <<< ts A61031 */
|
||||
static int tee_fd= -1;
|
||||
if(tee_fd==-1)
|
||||
tee_fd= open("/tmp/libburn_sg_readin",
|
||||
@ -2002,7 +1994,7 @@ ex:;
|
||||
burn_drive_mark_unready(d);
|
||||
burn_drive_inquire_media(d);
|
||||
|
||||
/* <<< d->busy = BURN_DRIVE_IDLE; */
|
||||
d->busy = BURN_DRIVE_IDLE;
|
||||
return ret;
|
||||
early_failure:;
|
||||
return 0;
|
||||
@ -2265,9 +2257,8 @@ int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s,
|
||||
prev_sync_sector = d->progress.sector;
|
||||
if (!o->simulate)
|
||||
burn_stdio_sync_cache(d->stdio_fd, d, 1);
|
||||
}
|
||||
if ((d->progress.sector % 512) == 0)
|
||||
burn_stdio_slowdown(d, &prev_time, 512 * 2, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Pad up buffer to next full o->obs (usually 32 kB) */
|
||||
@ -2330,7 +2321,7 @@ ex:;
|
||||
/* update media state records */
|
||||
burn_drive_mark_unready(d);
|
||||
|
||||
/* <<< d->busy = BURN_DRIVE_IDLE; */
|
||||
d->busy = BURN_DRIVE_IDLE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -2406,7 +2397,7 @@ calloc() seems not to have the desired effect. valgrind warns:
|
||||
goto ex;
|
||||
}
|
||||
|
||||
/* ts A70521 : GNU/Linux 2.4 USB audio fails with 64 kiB */
|
||||
/* ts A70521 : Linux 2.4 USB audio fails with 64 kiB */
|
||||
/* ts A80414 : might need 64 kiB for BD-RE streaming */
|
||||
/* buffer flush trigger for sector.c:get_sector() */
|
||||
o->obs = Libburn_cd_obS;
|
||||
@ -2567,7 +2558,7 @@ return crap. so we send the command, then ignore the result.
|
||||
burn_drive_inquire_media(d);
|
||||
|
||||
burn_print(1, "done\n");
|
||||
/* <<< d->busy = BURN_DRIVE_IDLE; */
|
||||
d->busy = BURN_DRIVE_IDLE;
|
||||
|
||||
/* ts A61012 : This return was traditionally missing. I suspect this
|
||||
to have caused Cdrskin_eject() failures */
|
||||
@ -2582,7 +2573,7 @@ fail_wo_sync:;
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Burn run failed", 0, 0);
|
||||
d->cancel = 1;
|
||||
/* <<< d->busy = BURN_DRIVE_IDLE; */
|
||||
d->busy = BURN_DRIVE_IDLE;
|
||||
ex:;
|
||||
d->do_stream_recording = 0;
|
||||
if (d->buffer != NULL)
|
||||
|
@ -1,11 +1,5 @@
|
||||
/* -*- 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>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef BURN__WRITE_H
|
||||
#define BURN__WRITE_H
|
||||
|
||||
|
@ -26,7 +26,7 @@
|
||||
approaches are shown here in application functions:
|
||||
libburner_aquire_by_adr() demonstrates usage as of cdrecord traditions
|
||||
libburner_aquire_by_driveno() demonstrates a scan-and-choose approach
|
||||
With that aquired drive you can blank a CD-RW or DVD-RW
|
||||
With that aquired drive you can blank a CD-RW
|
||||
libburner_blank_disc()
|
||||
or you can format a DVD-RW to profile "Restricted Overwrite" (needed once)
|
||||
or an unused BD to default size with spare blocks
|
||||
@ -36,15 +36,9 @@
|
||||
When everything is done, main() releases the drive and shuts down libburn:
|
||||
burn_drive_release();
|
||||
burn_finish()
|
||||
|
||||
FreeBSD does not work well with the convenient synchronous signal handler. So
|
||||
the waiting loops for blanking, formatting, and writing use the asynchronous
|
||||
mode of the libburn signal handler. It will not shutdown the library and
|
||||
abort the program, but rather tell the ongoing drive operation to stop as
|
||||
soon as possible. After the loops and at the end of the program there is a
|
||||
call to determine whether an abort happened:
|
||||
burn_is_aborting()
|
||||
|
||||
*/
|
||||
/*
|
||||
Applications must use 64 bit off_t. E.g. by defining
|
||||
#define _LARGEFILE_SOURCE
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
@ -316,12 +310,9 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
|
||||
"FATAL : Media is not of erasable type\n");
|
||||
return 0;
|
||||
}
|
||||
/* Switch to asynchronous signal handling for the time of waiting */
|
||||
burn_set_signal_handling("libburner : ", NULL, 0x30);
|
||||
|
||||
printf("Beginning to %s-blank media.\n", (blank_fast?"fast":"full"));
|
||||
printf(
|
||||
"Beginning to %s-blank media.\n", (blank_fast?"fast":"full"));
|
||||
burn_disc_erase(drive, blank_fast);
|
||||
|
||||
sleep(1);
|
||||
while (burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) {
|
||||
if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */
|
||||
@ -330,10 +321,6 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
|
||||
printf("Blanking ( %.1f%% done )\n", percent);
|
||||
sleep(1);
|
||||
}
|
||||
if (burn_is_aborting(0) > 0)
|
||||
return -1;
|
||||
/* Back to synchronous handling */
|
||||
burn_set_signal_handling("libburner : ", NULL, 0);
|
||||
printf("Done\n");
|
||||
return 1;
|
||||
}
|
||||
@ -386,7 +373,6 @@ int libburner_format(struct burn_drive *drive)
|
||||
fprintf(stderr, "FATAL: Can only format DVD-RW or BD\n");
|
||||
return 0;
|
||||
}
|
||||
burn_set_signal_handling("libburner : ", NULL, 0x30);
|
||||
|
||||
printf("Beginning to format media.\n");
|
||||
burn_disc_format(drive, size, format_flag);
|
||||
@ -399,9 +385,6 @@ int libburner_format(struct burn_drive *drive)
|
||||
printf("Formatting ( %.1f%% done )\n", percent);
|
||||
sleep(1);
|
||||
}
|
||||
if (burn_is_aborting(0) > 0)
|
||||
return -1;
|
||||
burn_set_signal_handling("libburner : ", NULL, 0);
|
||||
burn_disc_get_profile(drive_list[0].drive, ¤t_profile,
|
||||
current_profile_name);
|
||||
if (current_profile == 0x14 || current_profile == 0x13)
|
||||
@ -547,7 +530,6 @@ int libburner_payload(struct burn_drive *drive,
|
||||
fprintf(stderr, "Reasons given:\n%s\n", reasons);
|
||||
return 0;
|
||||
}
|
||||
burn_set_signal_handling("libburner : ", NULL, 0x30);
|
||||
|
||||
printf("Burning starts. With e.g. 4x media expect up to a minute of zero progress.\n");
|
||||
start_time = time(0);
|
||||
@ -595,8 +577,6 @@ int libburner_payload(struct burn_drive *drive,
|
||||
}
|
||||
burn_session_free(session);
|
||||
burn_disc_free(target_disc);
|
||||
if (burn_is_aborting(0) > 0)
|
||||
return -1;
|
||||
if (multi && current_profile != 0x1a && current_profile != 0x13 &&
|
||||
current_profile != 0x12 && current_profile != 0x43)
|
||||
/* not with DVD+RW, formatted DVD-RW, DVD-RAM, BD-RE */
|
||||
@ -732,13 +712,6 @@ int main(int argc, char **argv)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* A warning to programmers who start their own projekt from here. */
|
||||
if (sizeof(off_t) != 8) {
|
||||
fprintf(stderr,
|
||||
"\nFATAL: Compile time misconfiguration. off_t is not 64 bit.\n\n");
|
||||
exit(39);
|
||||
}
|
||||
|
||||
ret = libburner_setup(argc, argv);
|
||||
if (ret)
|
||||
exit(ret);
|
||||
@ -755,7 +728,7 @@ int main(int argc, char **argv)
|
||||
/* Print messages of severity SORRY or more directly to stderr */
|
||||
burn_msgs_set_severities("NEVER", "SORRY", "libburner : ");
|
||||
|
||||
/* Activate the synchronous signal handler which eventually will try to
|
||||
/* Activate the default signal handler which eventually will try to
|
||||
properly shutdown drive and library on aborting events. */
|
||||
burn_set_signal_handling("libburner : ", NULL, 0);
|
||||
|
||||
@ -789,14 +762,10 @@ release_drive:;
|
||||
burn_drive_release(drive_list[driveno].drive, 0);
|
||||
|
||||
finish_libburn:;
|
||||
if (burn_is_aborting(0) > 0) {
|
||||
burn_abort(4400, burn_abort_pacifier, "libburner : ");
|
||||
fprintf(stderr,"\nlibburner run aborted\n");
|
||||
exit(1);
|
||||
}
|
||||
/* This app does not bother to know about exact scan state.
|
||||
Better to accept a memory leak here. We are done anyway. */
|
||||
/* burn_drive_info_free(drive_list); */
|
||||
|
||||
burn_finish();
|
||||
exit(ret);
|
||||
}
|
||||
|
Reference in New Issue
Block a user