Compare commits
6 Commits
Author | SHA1 | Date |
---|---|---|
Thomas Schmitt | 933fb04a2f | |
Thomas Schmitt | 0f21c13420 | |
Thomas Schmitt | 1127054deb | |
Thomas Schmitt | 967de65090 | |
Thomas Schmitt | 17613d6a5d | |
Thomas Schmitt | 0d5450520a |
|
@ -1,7 +1,7 @@
|
|||
Derek Foreman <derek@signalmarketing.com> and Ben Jansens <xor@orodu.net>
|
||||
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
Mario Danic <mario.danic@gmail.com>, Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-2017 Mario Danic, Thomas Schmitt
|
||||
Copyright (C) 2006-2014 Mario Danic, Thomas Schmitt
|
||||
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
|
84
ChangeLog
84
ChangeLog
|
@ -1,87 +1,3 @@
|
|||
git clone git@dev.lovelyhq.com:libburnia/libburn.git
|
||||
(to become libburn-1.5.8 or higher)
|
||||
===============================================================================
|
||||
- no novelties yet -
|
||||
|
||||
|
||||
libburn-1.5.6.tar.gz Wed Jun 07 2023
|
||||
===============================================================================
|
||||
* Bug fix: Overburning with cdrskin option -force ended by a libburn error
|
||||
* New API call burn_write_opts_set_bdr_obs_exempt()
|
||||
* New cdrskin option --bdr_obs_exempt
|
||||
* Officially enabled overburning with burn_write_opts_set_force(,1)
|
||||
|
||||
libburn-1.5.4.tar.gz Sat Jan 30 2021
|
||||
===============================================================================
|
||||
* Bug fix: Early SCSI commands from sg-linux.c were not logged
|
||||
* New API call burn_drive_set_speed_exact()
|
||||
* New API call burn_nominal_slowdown()
|
||||
|
||||
libburn-1.5.2.pl01.tar.gz Mon Nov 25 2019
|
||||
===============================================================================
|
||||
* Bug fix: cdrskin multi-track burning was slow and stalled after track 1.
|
||||
Regression introduced in version 1.5.0 by commit 84fad99, 2018.02.05
|
||||
O_DIRECT is now disabled for track sources.
|
||||
|
||||
libburn-1.5.2.tar.gz Sat Oct 26 2019
|
||||
===============================================================================
|
||||
* Bug fix: No lock was obtained for setting up a fifo object
|
||||
* Bug fix: Stream recording was applied regardless whether the drive offers it.
|
||||
This caused Xfburn failures with some MATSHITA laptop drives.
|
||||
* Bug fix: TDK Corporation was not recognized as manufacturer of DVD-R "TTH02"
|
||||
* Made libburn ready for building out-of-source. Thanks Ross Burton.
|
||||
* New API calls burn_drive_get_feature_codes(), burn_drive_get_feature()
|
||||
* New cdrskin option --list_features
|
||||
|
||||
libburn-1.5.0.tar.gz Sat Sep 15 2018
|
||||
===============================================================================
|
||||
* Bug fix: cdrskin threw errno 22 on data file input if libburn is
|
||||
configured with --enable-track-src-odirect
|
||||
* Bug fix: SIGSEGV could happen if a track ended by reaching its fixed size
|
||||
while the track source still was willing to deliver bytes.
|
||||
Thanks to user swordragon.
|
||||
* Bug fix: Device file comparison parameters were recorded wrong with Linux sg
|
||||
|
||||
libburn-1.4.8.tar.gz Tue Sep 12 2017
|
||||
===============================================================================
|
||||
* Bug fix: Option -dummy did not affect writing by direct_write_amount=
|
||||
* New API call burn_drive_reset_simulate()
|
||||
* New API call burn_drive_get_bd_r_pow()
|
||||
* Refusing to write to BD-R if formatted to Pseudo Overwrite
|
||||
|
||||
libburn-1.4.6.tar.gz Fri Sep 16 2016
|
||||
===============================================================================
|
||||
* Bug fix: SAO CD could be perceived 2 blocks to short.
|
||||
Regression in 1.4.4 by rev 5672.
|
||||
* Now operating optical drives on OpenBSD. Thanks to SASANO Takayoshi.
|
||||
* New API call burn_drive_set_immed()
|
||||
* New cdrskin option use_immed_bit=
|
||||
|
||||
libburn-1.4.4.tar.gz Fri Jul 01 2016
|
||||
===============================================================================
|
||||
* Bug fix: Option drive_scsi_dev_family=sg did not convert /dev/sr* to /dev/sg*
|
||||
* Bug fix: burn_make_input_sheet_v07t() falsly recognized double byte encoding.
|
||||
Affected cdrskin option: cdtext_to_v07t=
|
||||
* Bug fix: Double free at end of run if burn_write_opts_set_leadin_text() is
|
||||
used. Affected cdrskin option: textfile=
|
||||
* Bug fix: DVD book type of DVD+RW DL and DVD+R DL was reported wrong.
|
||||
Thanks to Etienne Bergeron.
|
||||
|
||||
libburn-1.4.2.pl01.tar.gz Fri Jan 29 2016
|
||||
===============================================================================
|
||||
* Bug fix: cdrskin "failed to attach fifo" when burning from stdin.
|
||||
Regression of 1.4.2, rev 5522.
|
||||
|
||||
libburn-1.4.2.tar.gz Sat Nov 28 2015
|
||||
===============================================================================
|
||||
* Bug fix: burn_disc_get_media_id() returned BD identifiers 2 chars too long
|
||||
* Bug fix: burn_disc_get_multi_caps() returned 2048 bytes too many in
|
||||
caps.start_range_high
|
||||
* Bug fix: Media summary session count of blank and closed media was short by 1
|
||||
* Bug fix: Endless loop if transport error occurs while waiting for drive ready
|
||||
* New API calls burn_drive_get_serial_no() and burn_drive_get_media_sno()
|
||||
* Result of a Coverity audit: 40+ code changes, but no easy-to-trigger bugs
|
||||
|
||||
libburn-1.4.0.tar.gz Sun May 17 2015
|
||||
===============================================================================
|
||||
* Bug fix: Double free with cdrskin -vvv.
|
||||
|
|
16
Makefile.am
16
Makefile.am
|
@ -12,7 +12,7 @@ ACLOCAL_AMFLAGS = -I ./
|
|||
|
||||
# Build libraries
|
||||
libburn_libburn_la_LDFLAGS = \
|
||||
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) $(LIBLDFLAGS)
|
||||
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
||||
# This causes undesired .o names
|
||||
# configure.ac appends -D options to variable CFLAG
|
||||
### libburn_libburn_la_CFLAGS = $(LIBBURN_DVD_OBS_64K)
|
||||
|
@ -88,7 +88,8 @@ noinst_PROGRAMS = \
|
|||
test/telltoc \
|
||||
test/dewav \
|
||||
test/fake_au \
|
||||
test/poll
|
||||
test/poll \
|
||||
test/structest
|
||||
|
||||
bin_PROGRAMS = \
|
||||
cdrskin/cdrskin
|
||||
|
@ -113,10 +114,13 @@ test_fake_au_SOURCES = test/fake_au.c
|
|||
test_poll_CPPFLAGS = -Ilibburn
|
||||
test_poll_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
test_poll_SOURCES = test/poll.c
|
||||
test_structest_CPPFLAGS = -Ilibburn
|
||||
test_structest_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
test_structest_SOURCES = test/structest.c
|
||||
|
||||
## cdrskin construction site - ts A60816 - C30607
|
||||
## cdrskin construction site - ts A60816 - B50517
|
||||
cdrskin_cdrskin_CPPFLAGS = -Ilibburn
|
||||
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_5_7
|
||||
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_4_0
|
||||
|
||||
# cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
# ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking
|
||||
|
@ -171,7 +175,8 @@ uninstall-local:
|
|||
# Indent source files
|
||||
indent_files = \
|
||||
$(libburn_libburn_la_SOURCES) \
|
||||
$(test_poll_SOURCES)
|
||||
$(test_poll_SOURCES) \
|
||||
$(test_structest_SOURCES)
|
||||
|
||||
|
||||
indent: $(indent_files)
|
||||
|
@ -201,7 +206,6 @@ EXTRA_DIST = \
|
|||
doc/cookbook.txt \
|
||||
doc/mediainfo.txt \
|
||||
doc/cdtext.txt \
|
||||
doc/waveformat.txt \
|
||||
README \
|
||||
AUTHORS \
|
||||
CONTRIBUTORS \
|
||||
|
|
194
README
194
README
|
@ -6,12 +6,12 @@ This all is under GPL.
|
|||
------------------------------------------------------------------------------
|
||||
libburnia-project.org
|
||||
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-2023 Mario Danic, Thomas Schmitt
|
||||
Copyright (C) 2006-2015 Mario Danic, Thomas Schmitt
|
||||
Still containing parts of Libburn. By Derek Foreman <derek@signalmarketing.com>
|
||||
and Ben Jansens <xor@orodu.net>
|
||||
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
|
||||
http://files.libburnia-project.org/releases/libburn-1.5.6.tar.gz
|
||||
http://files.libburnia-project.org/releases/libburn-1.4.0.tar.gz
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
@ -19,14 +19,14 @@ Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
|||
|
||||
From tarball
|
||||
|
||||
Obtain libburn-1.5.6.tar.gz, take it to a directory of your choice and do:
|
||||
Obtain libburn-1.4.0.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf libburn-1.5.6.tar.gz
|
||||
cd libburn-1.5.6
|
||||
tar xzf libburn-1.4.0.tar.gz
|
||||
cd libburn-1.4.0
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
|
||||
To make libburn accessible for running and application development,
|
||||
To make libburn accessible for running resp. application development,
|
||||
and to install the cdrecord compatibility binary cdrskin, do
|
||||
(as Superuser):
|
||||
|
||||
|
@ -41,21 +41,21 @@ You may have to keep your hald away from the drive. See for example
|
|||
http://www.freebsd.org/gnome/docs/halfaq.html
|
||||
|
||||
|
||||
From git
|
||||
From SVN
|
||||
|
||||
Our build system is based on autotools. For preparing the build of a git
|
||||
Our build system is based on autotools. For preparing the build of a SVN
|
||||
snapshot you will need autotools of at least version 1.7.
|
||||
Do in a directory of your choice:
|
||||
|
||||
git clone https://dev.lovelyhq.com/libburnia/libburn.git libburn-git
|
||||
cd libburn-git
|
||||
svn co http://svn.libburnia-project.org/libburn/trunk libburn-svn
|
||||
cd libburn-svn
|
||||
./bootstrap
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
make install
|
||||
|
||||
Warning: The master branch might contain experimental features which might
|
||||
not persist until next release.
|
||||
Warning: The trunk might contain experimental features which might not
|
||||
persist until next release.
|
||||
|
||||
|
||||
Special ./configure options
|
||||
|
@ -78,7 +78,7 @@ configure time by:
|
|||
This may be combined with above --enable-track-src-odirect .
|
||||
|
||||
If it is desired that DVD DAO writing and stdio: writing get padded up to
|
||||
a full write chunk of 32k or 64k, then use ./configure option:
|
||||
a full write chunk of 32k resp. 64k, then use ./configure option:
|
||||
--enable-dvd-obs-pad
|
||||
|
||||
Alternatively the transport of SCSI commands can be done via libcdio-0.83.
|
||||
|
@ -113,11 +113,12 @@ closing it immediately, waiting, and only then opening it for real:
|
|||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
The other parts of the the libburnia project are hosted as neighbors of
|
||||
libburn:
|
||||
An important part of the project, libisofs, is hosted in a bzr repository at
|
||||
launchpad.net :
|
||||
bzr branch lp:libisofs
|
||||
|
||||
git clone https://dev.lovelyhq.com/libburnia/libisofs.git
|
||||
git clone https://dev.lovelyhq.com/libburnia/libisoburn.git
|
||||
Another part the project, libisoburn, is hosted in the libburnia SVN, too:
|
||||
svn co http://svn.libburnia-project.org/libisoburn/trunk libisoburn
|
||||
|
||||
See README files there.
|
||||
|
||||
|
@ -142,7 +143,7 @@ On other X/Open compliant systems there will only be pseudo drives, but no
|
|||
direct MMC operation on real CD/DVD/BD drives.
|
||||
|
||||
For full ports to other systems we would need : login on a development machine
|
||||
or a live OS on CD or DVD, advise from a system person about the equivalent
|
||||
resp. a live OS on CD or DVD, advise from a system person about the equivalent
|
||||
of Linux sg or FreeBSD CAM, volunteers for testing of realistic use cases.
|
||||
|
||||
We have a well tested code base for burning data and audio CDs, DVDs and BDs.
|
||||
|
@ -173,8 +174,8 @@ The project components (list subject to growth, hopefully):
|
|||
content.
|
||||
|
||||
- libisoburn is an add-on to libburn and libisofs which coordinates both and
|
||||
also can grow ISO-9660 filesystem images on multi-session media
|
||||
as well as on overwriteable media via the same API.
|
||||
also allows to grow ISO-9660 filesystem images on multi-session
|
||||
media as well as on overwriteable media via the same API.
|
||||
All media peculiarities are handled automatically.
|
||||
It also contains the methods of command oriented application
|
||||
xorriso and offers them via a C language API.
|
||||
|
@ -254,7 +255,7 @@ Project history as far as known to me:
|
|||
which by about nearly everybody else was perceived as unfriendly fork.
|
||||
Derek Foreman four days later posted a message which expressed his
|
||||
discontent.
|
||||
The situation first caused me to publicly regret it and then - after i
|
||||
The situation first caused me to publically regret it and then - after i
|
||||
got the opportunity to move in with cdrskin - gave me true reason to
|
||||
personally apologize to Derek Foreman, Ben Jansens and the contributors at
|
||||
icculus.org/burn. Posted to both projects:
|
||||
|
@ -328,7 +329,7 @@ Project history as far as known to me:
|
|||
and write modes, and better protection against typical user mishaps.
|
||||
|
||||
- 24th October 2007 version 0.4.0 is the foundation of new library libisoburn
|
||||
and an upcoming integrated application for manipulating and writing
|
||||
and an upcomming integrated application for manipulating and writing
|
||||
ISO 9660 + Rock Ridge images. cdrskin-0.4.0 got capabilities like growisofs
|
||||
by these enhancements: growing of overwriteable media and disk files.
|
||||
Taking again a bow towards Andy Polyakov.
|
||||
|
@ -354,7 +355,7 @@ Project history as far as known to me:
|
|||
- 27th Apr 2008 libisofs-0.6.4 can now read data file content from images
|
||||
and can map pieces of disk files onto image files. Image directory iteration
|
||||
has been enhanced. Input data streams and extended information have been
|
||||
exposed in the API to enable future development.
|
||||
exposed in the API to allow future development.
|
||||
|
||||
- 29th Apr 2008 libisoburn-0.1.4 was made more efficient with reading of
|
||||
image tree nodes. It now depends on libisofs-0.6.4 and libburn-0.4.4.
|
||||
|
@ -368,8 +369,7 @@ Project history as far as known to me:
|
|||
type with automatic media state recognition.
|
||||
|
||||
- 17th May 2008 an old bug with DVD-RAM and now with BD-RE is fixed by
|
||||
libburn-0.4.8. So libisoburn can now perform emulation of multisession
|
||||
on those media.
|
||||
libburn-0.4.8 to allow libisoburn emulation of multisession on those media.
|
||||
|
||||
- 19th May 2008 libisoburn-0.1.6 brings better table-of-content emulation
|
||||
on overwriteble media and disk files.
|
||||
|
@ -388,14 +388,14 @@ Project history as far as known to me:
|
|||
and cdrecord style. xorriso now can serve underneath growisofs.
|
||||
|
||||
- 20th Aug 2008 libburn-0.5.2 revokes the necessity that a drive must be
|
||||
enumerable in order to be addressable. Enumeration is enhanced by examining
|
||||
enumerable in order to be adressable. Enumeration is enhanced by examining
|
||||
/proc/sys/dev/cdrom/info.
|
||||
|
||||
- 24th Aug 2008 libisoburn/xorriso-0.2.4 introduces a media readability check
|
||||
with data retrieval option.
|
||||
|
||||
- 18th Sep 2008 libisofs-0.6.8 supports ISO 9660 Level 3 which can represent
|
||||
very large data files in the image.
|
||||
- 18th Sep 2008 libisofs-0.6.8 supports ISO 9660 Level 3 which allows very
|
||||
large data files in the image.
|
||||
|
||||
- 20th Sep 2008 libisoburn/xorriso-0.2.6 takes into respect the new Level 3
|
||||
capabilities of libisofs.
|
||||
|
@ -413,19 +413,19 @@ Project history as far as known to me:
|
|||
of an aborted burn run.
|
||||
|
||||
- 26th Nov 2008 libisofs-0.6.12 can produce a ISOLINUX isohybrid MBR on the fly
|
||||
and can produce ISO images which resemble old mkisofs images.
|
||||
and allows to produce ISO images which resemble old mkisofs images.
|
||||
|
||||
- 2nd Dec 2008 libisoburn-0.3.0. xorriso now is ready for exotic character
|
||||
sets, for legacy FreeBSD systems which expect an outdated Rock Ridge
|
||||
signature, and for producing ISO images with MBR which boot from hard disk
|
||||
or USB stick. Three minor bugs were fixed.
|
||||
|
||||
- 7th Dec 2008 libburn-0.5.8 prevents a SIGSEGV with weird CD table-of-content
|
||||
- 7th Dec 2008 libburn-0.5.8 prevents a SIGSEGV with wierd CD table-of-content
|
||||
and improves BD-RE formatting.
|
||||
|
||||
- 9th Dec 2008 Our project received a donation from Thomas Weber.
|
||||
|
||||
- 2nd Jan 2009 libburn-0.6.0 learned to format BD-R and write to either
|
||||
- 2nd Jan 2009 libburn-0.6.0 allows to format BD-R and to write to either
|
||||
formatted or unformatted BD-R.
|
||||
|
||||
- 6th Jan 2009 libisoburn-0.3.2. xorriso can produce and execute commands for
|
||||
|
@ -448,16 +448,15 @@ Project history as far as known to me:
|
|||
|
||||
- 13 Mar 2009 libburn-0.6.4 got a dummy adapter for SCSI/MMC command transport.
|
||||
It will show no drives and thus libburn will only be able to perform
|
||||
operations on "stdio:" pseudo drives. Nevertheless this was precondition
|
||||
to lift the ban to build libburn on operating systems other than Linux
|
||||
and FreeBSD.
|
||||
operations on "stdio:" pseudo drives. Nevertheless this allowed to lift the
|
||||
ban to build libburn on operating systems other than Linux and FreeBSD.
|
||||
|
||||
- 16 Mar 2009 libisoburn-0.3.6: xorriso uses RRIP version 1.10 as default
|
||||
in order to be mountable where mkisofs images are mountable.
|
||||
|
||||
- 17 Apr 2009 libisofs-0.6.18 introduces content filtering of data files.
|
||||
Built-in filters implement compression to formats gzip and zisofs. External
|
||||
filter processes can perform arbitrary data conversions like encryption.
|
||||
Built-in filters allow compression to formats gzip and zisofs. External
|
||||
filter processes allow arbitrary data conversions like encryption.
|
||||
|
||||
- 19 Apr 2009 libisoburn-0.3.8 makes use of the new libisofs capability to
|
||||
perform content filtering of data files.
|
||||
|
@ -482,10 +481,10 @@ Project history as far as known to me:
|
|||
Affected are releases since libisoburn-0.3.2 in january 2009.
|
||||
|
||||
- 25 Aug 2009 libisofs-0.6.22 can record MD5 checksums for the whole session
|
||||
and for each single data file. Checksum tags can be used to verify superblock
|
||||
and directory tree before importing them.
|
||||
and for each single data file. Checksum tags allow to verify superblock and
|
||||
directory tree before importing them.
|
||||
|
||||
- 27 Aug 2009 libburn-0.7.0 learned to calm down a drive and to inquire its
|
||||
- 27 Aug 2009 libburn-0.7.0 allows to calm down a drive and to inquire its
|
||||
supported profiles. It works around some pitfalls with U3 enhanced memory
|
||||
sticks which emulate a CD-ROM.
|
||||
|
||||
|
@ -519,7 +518,7 @@ Project history as far as known to me:
|
|||
provides throughput enhancements with hampered busses on Linux, and new
|
||||
API calls to log SCSI commands and to control the libburn fifo.
|
||||
|
||||
- 09 Dec 2009 libisoburn-0.4.6 now offers performance tuning of output to DVD
|
||||
- 09 Dec 2009 libisoburn-0.4.6 allows performance tuning of output to DVD
|
||||
drives or disk files.
|
||||
|
||||
- 26 Dec 2009 libburn-0.7.4.pl01 fixes the release tarball which was lacking
|
||||
|
@ -532,7 +531,7 @@ Project history as far as known to me:
|
|||
portability.
|
||||
|
||||
- 22 Jan 2010 libburn-0.7.6 has an improved system adapter for FreeBSD,
|
||||
fixes bugs about the generic X/Open system adapter, and can use
|
||||
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
|
||||
|
@ -554,8 +553,7 @@ Project history as far as known to me:
|
|||
|
||||
- 03 May 2010 Version 0.6.32 of libisofs is able to create ISO images with
|
||||
multiple boot images. All boot catalog parameters described in El-Torito
|
||||
specs can be set and inquired. This was needed to use GRUB boot images
|
||||
for EFI.
|
||||
specs can be set and inquired. This allows to use GRUB boot images for EFI.
|
||||
|
||||
- 04 May 2010 Release 0.5.6.pl00 of libisoburn makes use of the new libisofs
|
||||
capabilities about boot images.
|
||||
|
@ -609,11 +607,11 @@ Project history as far as known to me:
|
|||
- Mon Jan 17 2011 we go for release 1.0.0. This does not indicate a
|
||||
technological overhaul but shall emphasize the maturity of the software.
|
||||
libisofs-1.0.0 fixes a bug about the length of ECMA-119 directory names and
|
||||
is ready to store untranslated ECMA-119 names (violating the specs).
|
||||
libburn-1.0.0.pl00 is now willing to create stdio-drive files with
|
||||
rw-permissions for all, if umask really asks for it. cdrskin now refuses
|
||||
to burn if the foreseeable size exceeds media capacity
|
||||
libisoburn-1.0.0.pl00 can now create an ISO 9660:1999 directory tree,
|
||||
is ready to allow untranslated ECMA-119 names (violating the specs).
|
||||
libburn-1.0.0.pl00 allows umask to create stdio-drive files with
|
||||
rw-permissions for all. cdrskin now refuses to burn if the foreseeable size
|
||||
exceeds media capacity
|
||||
libisoburn-1.0.0.pl00 allows to create an ISO 9660:1999 directory tree,
|
||||
improved the emulation fidelity of command -as mkisofs, lowered the default
|
||||
abort threshold for xorriso batch mode, and increased that threshold for
|
||||
xorriso dialog mode.
|
||||
|
@ -645,7 +643,7 @@ Project history as far as known to me:
|
|||
|
||||
- Sat Jun 18 2011 release 1.1.0:
|
||||
The consumption of stack memory was reduced. Statical program analysis found
|
||||
some rarely occurring memory leaks. Several small bugs were fixed.
|
||||
some rarely occuring memory leaks. Several small bugs were fixed.
|
||||
The suffix .plXY was dropped from tarball names of libburn and libisoburn.
|
||||
|
||||
- Mon Jun 20 2011 patch release libburn-1.1.0.pl01:
|
||||
|
@ -682,10 +680,10 @@ Project history as far as known to me:
|
|||
- Mon Apr 02 2012 release 1.2.2:
|
||||
The handling of intentional deviations from ECMA-119 specifications has
|
||||
been improved in libisofs. libisoburn and xorriso now make use of these
|
||||
improvements. Some rarely occurring bugs have been fixed.
|
||||
improvements. Some rarely occuring bugs have been fixed.
|
||||
|
||||
- Fri Jul 20 2012 release 1.2.4:
|
||||
libburn and libisofs got some rarely occurring bugs fixed. libisofs learned
|
||||
libburn and libisofs got some rarely occuring bugs fixed. libisofs learned
|
||||
to produce HFS+ metadata and Apple Partition Map. The capabilities of
|
||||
isohybrid options --efi and --mac have been implemented (GPT and APM).
|
||||
|
||||
|
@ -696,7 +694,7 @@ Project history as far as known to me:
|
|||
xorriso-tcltk
|
||||
|
||||
- Mon Mar 18 2013 release 1.2.8:
|
||||
Some rarely occurring bugs were fixed in libisofs and libburn. libburn's
|
||||
Some rarely occuring bugs were fixed in libisofs and libburn. libburn's
|
||||
handling of incomplete sessions has been improved. xorriso's mkisofs
|
||||
emulation learned to set El Torito section id strings.
|
||||
|
||||
|
@ -711,7 +709,7 @@ Project history as far as known to me:
|
|||
Regression introduced by version 1.2.8.
|
||||
|
||||
- Fri Aug 07 2013 release 1.3.2:
|
||||
cdrskin has acquired the capability to copy audio tracks to .wav files.
|
||||
cdrskin has aquired the capability to copy audio tracks to .wav files.
|
||||
It can extract CD-TEXT in a form that is readable for humans and for
|
||||
cdrskin itself. Several small bugs were fixed in xorriso. Its capabilities
|
||||
to serve frontend programs in dialog mode have been improved.
|
||||
|
@ -720,107 +718,25 @@ Project history as far as known to me:
|
|||
A long standing hidden bug was fixed, which affected inspection of
|
||||
unformatted DVD+RW.
|
||||
xorriso now by default puts EL Torito boot images to low block addresses.
|
||||
It can report and set read speeds. Several rarely occurring bugs were fixed.
|
||||
It can report and set read speeds. Several rarely occuring bugs were fixed.
|
||||
|
||||
- Tue Mar 04 2014 release 1.3.6:
|
||||
- Tue Mar 04 2014 release 1.3.6
|
||||
libburn learned to operate optical drives and media on NetBSD. libisofs got
|
||||
a bug fix about HFS+ and enhancements about character set conversion.
|
||||
Minor bugs were fixed in libisoburn. xorriso can now find files with names
|
||||
which cannot be represented unchanged in ECMA-119, Joliet, or HFS+.
|
||||
|
||||
- Sat Jun 28 2014 release 1.3.8:
|
||||
- Sat Jun 28 2014 release 1.3.8
|
||||
libburn got several bugs fixed. libisofs offers new API calls for inspection
|
||||
of boot sectors in ISO 9660 filesystems. xorriso improved its support for
|
||||
NetBSD, offers new features with command -find, and a command to extract
|
||||
ISO 9660 file content onto standard output or into filter processes.
|
||||
|
||||
- Sun May 17 2015 release 1.4.0:
|
||||
- Sun May 17 2015 release 1.4.0
|
||||
This release is mainly about bug fixes and a new feature of xorriso to
|
||||
propose commands or as_mkisofs options which can reproduce the boot
|
||||
equipment of the loaded ISO filesystem.
|
||||
|
||||
- Sat Nov 28 2015 release 1.4.2:
|
||||
libburn got some bugs fixed and learned to inquire the drive serial number.
|
||||
libisofs now sorts data file content by ECMA-119 file names for better
|
||||
reproducability of ISO content. Rock Ridge filenames may be restricted to
|
||||
lengths between 64 and 255 bytes. If needed, a qualified truncation happens.
|
||||
xorriso now can replay boot settings when modifying ISO filesystems.
|
||||
In order to avoid clogging of concurrent Linux SG_IO, xorriso got command
|
||||
-modesty_on_drive to enable an old workaround from IDE master/slave days.
|
||||
The source code underwent a scan by Coverity. About 150 code changes
|
||||
resulted, but no easy-to-trigger bugs were found.
|
||||
|
||||
- Fri Jan 29 2016 patch release libburn-1.4.2.pl01:
|
||||
cdrskin did not work with "-" (stdin) as input.
|
||||
Regression introduced by version 1.4.2.
|
||||
|
||||
- Fri Jul 01 2016 release 1.4.4:
|
||||
The capability to use Linux /dev/sg was revived in order to circumvent the
|
||||
sr_mutex lock which hampers concurrent use of optical drives via SG_IO.
|
||||
libisofs now can use appended partitions by El Torito, avoiding the need
|
||||
for duplicate EFI System Partition images.
|
||||
Several bugs have been fixed.
|
||||
|
||||
- Fri Sep 16 2016 release 1.4.6:
|
||||
libburn now operates optical drives on OpenBSD. libisofs makes pseudo-random
|
||||
id generation reproducible by relating it to the volume date.
|
||||
xorriso interprets environment variable SOURCE_DATE_EPOCH of
|
||||
reproducible-builds.org to prepare a default setting which leads to identical
|
||||
ISO images on identical input and identical constant options.
|
||||
Several moderately embarrassing bugs have been fixed.
|
||||
|
||||
- Tue Sep 12 2017 release 1.4.8:
|
||||
libburn now refuses to write to SRM+POW formatted BD-R, because it would
|
||||
spoil them. libisofs got several bugs fixed and offers new API calls to
|
||||
support new xorriso features. libisoburn and xorriso offer more detail
|
||||
control with particular boot sector types. New bugs and a regression from
|
||||
version 1.4.4 were fixed.
|
||||
|
||||
- Sat Sep 15 2018 release 1.5.0
|
||||
libisofs now can record all xattr namespaces, user defined padding was moved
|
||||
after appended partitions. libisoburn and xorriso make use of the new xattr
|
||||
capability of libisofs.
|
||||
All three libraries got some rarely triggered bugs fixed.
|
||||
|
||||
- Sat Oct 26 2019 release 1.5.2
|
||||
The libraries are now ready for building out-of-source. libisofs got minor
|
||||
API extensions. libburn got a bug fixed which spoiled burn runs on
|
||||
some MATSHITA laptop drives. It is now able to list all features which
|
||||
the drive announces. xorriso can now set GPT type GUIDs with appended
|
||||
partitions and the ISO partition.
|
||||
All three libraries got some rarely triggered bugs fixed.
|
||||
|
||||
- Mon Nov 25 2019 patch release 1.5.2.pl01
|
||||
cdrskin did not properly burn multiple tracks. Track 1 was slow and burning
|
||||
stalled before track 2. Regression introduced by 1.5.0.
|
||||
|
||||
- Sat Jan 30 2021 , 07 Feb 2021 release 1.5.4
|
||||
libburn offers new opportunities to influence drive speed.
|
||||
libisofs got a bug fixed which under medium rare circumstances spoiled
|
||||
zisofs production. libisofs switched to usage of libjte-2.0.0. Further it
|
||||
can now write and read zisofs2 format, which enables compression of files
|
||||
>= 4 GiB. When reading Joliet file trees, the names get stripped of their
|
||||
version numbers by default. After loading metadata, libisofs can now tell
|
||||
which directory tree was loaded and whether Rock Ridge is used.
|
||||
libisoburn and xorriso make use of these new features.
|
||||
xorriso can put out the data stream of -check_media to standard output. It
|
||||
can restore files with many zero bytes as sparse files and it is able to
|
||||
extract recognized boot images into data files on hard disk.
|
||||
A new script xorriso-dd-target helps to put an ISO image onto an USB stick
|
||||
without endangering valuable hard disk content.
|
||||
Several rarely triggered bugs were fixed.
|
||||
|
||||
- Wed Jun 07 2023 release 1.5.6
|
||||
libburn can overburn CD media, i.e. write more data than the drive announced
|
||||
as medium capacity.
|
||||
libisofs can assess many of the features which were in effect when a
|
||||
given ISO 9660 filesystem was created. A safety limit was introduced not
|
||||
to exceed the limit of Linux which is imposed on the number of SUSP CE
|
||||
entries which is good for about 60 KiB of AAIP data. Some rarely occuring
|
||||
bugs were fixed in libisofs.
|
||||
libisoburn and xorriso expose the new library features to the user and
|
||||
got some minor improvements. Many minor bugs were fixed.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
|
138
acinclude.m4
138
acinclude.m4
|
@ -16,7 +16,6 @@ AC_DEFUN([TARGET_SHIZZLE],
|
|||
|
||||
AC_MSG_CHECKING([target operating system])
|
||||
|
||||
libburn_check_libcam=
|
||||
LIBBURNIA_LDCONFIG_CMD="echo 'No ldconfig run performed. If needed, configure manually for:'"
|
||||
|
||||
case $target in
|
||||
|
@ -30,10 +29,9 @@ AC_DEFUN([TARGET_SHIZZLE],
|
|||
LIBBURN_ARCH_LIBS=-lcam
|
||||
LIBBURNIA_PKGCONFDIR=$(echo "$libdir" | sed 's/\/lib$/\/libdata/')/pkgconfig
|
||||
;;
|
||||
*-kfreebsd*-gnu*)
|
||||
kfreebsd*-gnu)
|
||||
ARCH=freebsd
|
||||
LIBBURN_ARCH_LIBS=-lcam
|
||||
libburn_check_libcam=yes
|
||||
;;
|
||||
*-solaris*)
|
||||
ARCH=solaris
|
||||
|
@ -45,12 +43,8 @@ AC_DEFUN([TARGET_SHIZZLE],
|
|||
# AC_ERROR([You are attempting to compile for an unsupported platform])
|
||||
;;
|
||||
esac
|
||||
AC_MSG_RESULT([$ARCH])
|
||||
|
||||
if test x"$libburn_check_libcam" = xyes
|
||||
then
|
||||
LIBBURNIA_CHECK_LIBCAM
|
||||
fi
|
||||
AC_MSG_RESULT([$ARCH])
|
||||
])
|
||||
|
||||
|
||||
|
@ -59,17 +53,15 @@ dnl It tests whether -Wl,--version-script=... works with the compiler
|
|||
AC_DEFUN([LIBBURN_ASSERT_VERS_LIBS],
|
||||
[
|
||||
libburnia_save_LDFLAGS="$LDFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,--version-script=$srcdir/libburn/libburn.ver"
|
||||
LDFLAGS="$LDFLAGS -Wl,--version-script=libburn/libburn.ver"
|
||||
AC_TRY_LINK([#include <stdio.h>], [printf("Hello\n");],
|
||||
[vers_libs_test="yes"], [vers_libs_test="no"])
|
||||
if test x$vers_libs_test = xyes
|
||||
if test x$vers_libs_test = xno
|
||||
then
|
||||
LIBLDFLAGS="-Wl,--version-script=$srcdir/libburn/libburn.ver"
|
||||
LDFLAGS="$libburnia_save_LDFLAGS"
|
||||
fi
|
||||
LDFLAGS="$libburnia_save_LDFLAGS"
|
||||
AC_SUBST(LIBLDFLAGS)
|
||||
])
|
||||
|
||||
|
||||
|
||||
dnl LIBBURNIA_SET_PKGCONFIG determines the install directory for the *.pc file.
|
||||
dnl Important: Must be performed _after_ TARGET_SHIZZLE
|
||||
|
@ -121,121 +113,3 @@ dnl For debugging only
|
|||
|
||||
])
|
||||
|
||||
dnl LIBBURNIA_CHECK_ARCH_LIBS is by Thomas Schmitt, libburnia project
|
||||
dnl It tests whether the OS dependent libraries are available.
|
||||
dnl With libisoburn they are needed only for the case that indirect linking
|
||||
dnl does not work. So it is worth a try to omit them.
|
||||
dnl $1 = "mandatory" or "optional" define the action if test linking fails.
|
||||
dnl "silent" is like "optional" but without message.
|
||||
AC_DEFUN([LIBBURNIA_CHECK_ARCH_LIBS],
|
||||
[
|
||||
libburnia_save_LIBS="$LIBS"
|
||||
if test "x$LIBBURN_ARCH_LIBS" = x
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
LIBS="$LIBS $LIBBURN_ARCH_LIBS"
|
||||
AC_TRY_LINK([#include <stdio.h>], [printf("Hello\n");],
|
||||
[archlibs_test="yes"], [archlibs_test="no"])
|
||||
LIBS="$libburnia_save_LIBS"
|
||||
if test x$archlibs_test = xno
|
||||
then
|
||||
if test x"$1" = xmandatory
|
||||
then
|
||||
echo >&2
|
||||
echo "FATAL: Test linking with mandatory library options failed: $LIBBURN_ARCH_LIBS" >&2
|
||||
echo >&2
|
||||
(exit 1); exit 1;
|
||||
else
|
||||
if test x"$1" = xoptional
|
||||
then
|
||||
echo "disabled linking with $LIBBURN_ARCH_LIBS (because not found)"
|
||||
fi
|
||||
LIBBURN_ARCH_LIBS=""
|
||||
fi
|
||||
else
|
||||
if test x"$1" = xsilent
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "enabled linking with $LIBBURN_ARCH_LIBS"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_CHECK_LINUX_SCSI is by Thomas Schmitt, libburnia project
|
||||
dnl
|
||||
AC_DEFUN([LIBBURNIA_CHECK_LINUX_SCSI],
|
||||
[
|
||||
dnl Check whether it is a Linux without scsi/scsi.h
|
||||
libburn_scsi_disabled=
|
||||
if test x"$ARCH" = xlinux
|
||||
then
|
||||
AH_TEMPLATE([Libburn_use_sg_dummY],
|
||||
[Define to compile without OS specific SCSI features])
|
||||
AC_MSG_CHECKING([for missing scsi/scsi.h on Linux])
|
||||
AC_TRY_COMPILE([
|
||||
#ifdef __linux
|
||||
#include <scsi/scsi.h>
|
||||
#endif
|
||||
],
|
||||
[;],
|
||||
[AC_MSG_RESULT([no])],
|
||||
[AC_DEFINE([Libburn_use_sg_dummY], [yes])
|
||||
libburn_scsi_disabled=yes
|
||||
AC_MSG_RESULT([yes])]
|
||||
)
|
||||
fi
|
||||
if test x"$libburn_scsi_disabled" = xyes
|
||||
then
|
||||
echo "disabled operation of optical drives via SCSI"
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_CHECK_LIBCAM is by Thomas Schmitt, libburnia project
|
||||
dnl
|
||||
AC_DEFUN([LIBBURNIA_CHECK_LIBCAM],
|
||||
[
|
||||
dnl Check whether libcam is requested for FreeBSD kernel but missing
|
||||
libburn_scsi_disabled=
|
||||
if test x"$LIBBURN_ARCH_LIBS" = x"-lcam"
|
||||
then
|
||||
AH_TEMPLATE([Libburn_use_sg_dummY],
|
||||
[Define to compile without OS specific SCSI features])
|
||||
AC_MSG_CHECKING([for missing libcam for SCSI on FreeBSD kernel])
|
||||
dnl If libcam is not available, LIBBURN_ARCH_LIBS will be made empty
|
||||
LIBBURNIA_CHECK_ARCH_LIBS(silent)
|
||||
if test x"$LIBBURN_ARCH_LIBS" = x
|
||||
then
|
||||
AC_DEFINE([Libburn_use_sg_dummY], [yes])
|
||||
libburn_scsi_disabled=yes
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
fi
|
||||
if test x"$LIBBURN_ARCH_LIBS" = x"-lcam"
|
||||
then
|
||||
AC_MSG_CHECKING([for missing libcam headers])
|
||||
AC_TRY_COMPILE([
|
||||
#include <stdio.h>
|
||||
#include <camlib.h>
|
||||
#include <cam/scsi/scsi_message.h>
|
||||
#include <cam/scsi/scsi_pass.h>
|
||||
],
|
||||
[;],
|
||||
[AC_MSG_RESULT([no])],
|
||||
[AC_DEFINE([Libburn_use_sg_dummY], [yes])
|
||||
libburn_scsi_disabled=yes
|
||||
AC_MSG_RESULT([yes])]
|
||||
)
|
||||
fi
|
||||
if test x"$libburn_scsi_disabled" = xyes
|
||||
then
|
||||
echo "disabled operation of optical drives via SCSI"
|
||||
fi
|
||||
])
|
||||
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
|
||||
Integrated sub project of libburnia-project.org but also published via:
|
||||
http://scdbackup.sourceforge.net/cdrskin_eng.html
|
||||
http://scdbackup.sourceforge.net/cdrskin-1.5.7.tar.gz
|
||||
http://scdbackup.sourceforge.net/cdrskin-1.4.0.tar.gz
|
||||
|
||||
Copyright (C) 2006-2023 Thomas Schmitt, provided under GPL version 2 or later.
|
||||
Copyright (C) 2006-2015 Thomas Schmitt, provided under GPL version 2 or later.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
@ -15,7 +15,7 @@ most of the libburn features from the command line.
|
|||
|
||||
Currently it is fully supported on GNU/Linux with kernels >= 2.4, on FreeBSD,
|
||||
on OpenSolaris, and on NetBSD.
|
||||
IDE drives under Linux 2.4 need kernel module ide-scsi.
|
||||
IDE drives under Linux 2.4. need kernel module ide-scsi.
|
||||
ATA and SATA drives under FreeBSD need kernel module atapicam.
|
||||
On other X/Open compliant systems there will only be emulated drives, but no
|
||||
direct MMC operation on real CD/DVD/BD drives.
|
||||
|
@ -26,10 +26,10 @@ By using this software you agree to the disclaimer at the end of this text
|
|||
|
||||
Compilation, First Glimpse, Installation
|
||||
|
||||
Obtain cdrskin-1.5.7.tar.gz, take it to a directory of your choice and do:
|
||||
Obtain cdrskin-1.4.0.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf cdrskin-1.5.7.tar.gz
|
||||
cd cdrskin-1.5.7
|
||||
tar xzf cdrskin-1.4.0.tar.gz
|
||||
cd cdrskin-1.4.0
|
||||
|
||||
Within that directory execute:
|
||||
|
||||
|
@ -206,7 +206,7 @@ See output of command
|
|||
If you have use cases for them, please report your wishes and expectations.
|
||||
|
||||
On the other hand, the capability of multi-session and of writing streams
|
||||
of unpredicted length surpass the current DVD capabilities of cdrecord.
|
||||
of unpredicted lenght surpass the current DVD capabilities of cdrecord.
|
||||
|
||||
|
||||
Inspiration and Standard
|
||||
|
@ -357,7 +357,7 @@ but leaves the media in "intermediate" state. In the first session of writing
|
|||
one may only write sequentially to such a DVD. After that, it gets random
|
||||
addressable by cdrskin. DVD-ROM drives might show ill behavior with them.
|
||||
|
||||
blank=format_overwrite_full uses preferably "Full Format" (type 00h).
|
||||
blank=format_overwrite_full uses preferrably "Full Format" (type 00h).
|
||||
This formatting lasts as long as writing a full DVD. It includes writing of
|
||||
lead-out which is said to be good for DVD ROM compatibility.
|
||||
|
||||
|
@ -428,9 +428,6 @@ It can also be enabled at configure time by
|
|||
Alternatively the transport of SCSI commands can be done via libcdio-0.83.
|
||||
You may install it and re-run libburn's ./configure with option
|
||||
--enable-libcdio
|
||||
Add option
|
||||
-use_libcdio
|
||||
to your run of cdrskin/compile_cdrskin.sh .
|
||||
|
||||
You may get a (super fat) statically linked binary by :
|
||||
cdrskin/compile_cdrskin.sh -static
|
||||
|
@ -526,7 +523,7 @@ Run cdrskin by
|
|||
The following settings will make pfexec keep original UID and EUID and prevent
|
||||
most superuser powers. Be aware that you still can manipulate all device files
|
||||
if you have the file permissions for that.
|
||||
Full root privileges for cdrskin can then be acquired only by command su.
|
||||
Full root privileges for cdrskin can then be aquired only by command su.
|
||||
|
||||
Edit /etc/security/exec_attr and add this line to the other "Media Backup"
|
||||
lines:
|
||||
|
@ -563,7 +560,7 @@ are the cause. Any mistake of the burn program is supposed to be caught
|
|||
by the drive's firmware and to lead to mere misburns.
|
||||
The worst mishaps which hit the author imposed the need to reboot the
|
||||
system because of drives gnawing endlessly on ill media. Permanent hardware
|
||||
damage did not occur in 13 years of development. But one never knows ...
|
||||
damage did not occur in 3.5 years of development. But one never knows ...
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
@ -591,7 +588,7 @@ contributions in a due way.
|
|||
Based on and sub project of:
|
||||
libburnia-project.org
|
||||
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-2023 Mario Danic, Thomas Schmitt
|
||||
Copyright (C) 2006-2014 Mario Danic, Thomas Schmitt
|
||||
|
||||
libburnia-project.org is inspired by and in other components still containing
|
||||
parts of
|
||||
|
|
|
@ -18,7 +18,7 @@ set -x
|
|||
# Both binaries are static in respect to libburn.
|
||||
#
|
||||
# The script is to be run in the directory above the toplevel
|
||||
# directory of libburn (or cdrskin) development.
|
||||
# directory of libburn resp. cdrskin development.
|
||||
#
|
||||
|
||||
# The top level directory in the SVN snapshot is named
|
||||
|
@ -38,7 +38,7 @@ original="./libburn_svn_release.tgz"
|
|||
# My changes are in $changes , mainly in $changes/cdrskin
|
||||
changes="./libburn-release"
|
||||
|
||||
skin_release="1.5.6"
|
||||
skin_release="1.4.0"
|
||||
patch_level=""
|
||||
# patch_level=".pl00"
|
||||
skin_rev="$skin_release""$patch_level"
|
||||
|
@ -60,8 +60,7 @@ man_to_html_cmd="./cdrskin/convert_man_to_html.sh"
|
|||
man_page_html="cdrskin/man_1_cdrskin.html"
|
||||
|
||||
# bintarget_dynamic="cdrskin_${skin_rev}-x86-suse9_0"
|
||||
# bintarget_dynamic="cdrskin_${skin_rev}-amd64-suse10_2"
|
||||
bintarget_dynamic="cdrskin_${skin_rev}-amd64-debian8_0"
|
||||
bintarget_dynamic="cdrskin_${skin_rev}-amd64-suse10_2"
|
||||
bintarget_static="$bintarget_dynamic"-static
|
||||
|
||||
if test -d "$changes"
|
||||
|
@ -229,7 +228,6 @@ tar czf "$cdrskin_tarball" "$target"
|
|||
"$compile_cmd" $compile_static_opts -O2 -do_strip
|
||||
cp "$compile_result" "../$bintarget_static"
|
||||
fi
|
||||
( cd cdrskin ; cc -g -Wall -o unite_html_b_line unite_html_b_line.c )
|
||||
"$man_to_html_cmd"
|
||||
mv "$man_page_html" ..
|
||||
)
|
|
@ -18,7 +18,7 @@ set -x
|
|||
# Both binaries are static in respect to libburn.
|
||||
#
|
||||
# The script is to be run in the directory above the toplevel
|
||||
# directory of libburn (or cdrskin) development.
|
||||
# directory of libburn resp. cdrskin development.
|
||||
#
|
||||
|
||||
# The top level directory in the SVN snapshot is named
|
||||
|
@ -38,7 +38,7 @@ original="./libburn_svn.tgz"
|
|||
# My changes are in $changes , mainly in $changes/cdrskin
|
||||
changes="./libburn-develop"
|
||||
|
||||
skin_release="1.5.7"
|
||||
skin_release="1.4.1"
|
||||
patch_level=""
|
||||
skin_rev="$skin_release""$patch_level"
|
||||
|
||||
|
@ -58,8 +58,7 @@ compile_result="cdrskin/cdrskin"
|
|||
man_to_html_cmd="./cdrskin/convert_man_to_html.sh"
|
||||
man_page_html="cdrskin/man_1_cdrskin.html"
|
||||
|
||||
# bintarget_dynamic="cdrskin_${skin_rev}-amd64-suse10_2"
|
||||
bintarget_dynamic="cdrskin_${skin_rev}-amd64-debian8_0"
|
||||
bintarget_dynamic="cdrskin_${skin_rev}-amd64-suse10_2"
|
||||
bintarget_static="$bintarget_dynamic"-static
|
||||
|
||||
if test -d "$changes"
|
||||
|
@ -229,8 +228,6 @@ tar czf "$cdrskin_tarball" "$target"
|
|||
fi
|
||||
# "$compile_cmd" -libburn_svn -O2 -do_diet -do_strip
|
||||
# cp "$compile_result" "../$bintarget_dynamic"_diet
|
||||
|
||||
( cd cdrskin ; cc -g -Wall -o unite_html_b_line unite_html_b_line.c )
|
||||
"$man_to_html_cmd"
|
||||
mv "$man_page_html" ..
|
||||
)
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
cdrfifo.c , Copyright 2006 - 2016 Thomas Schmitt <scdbackup@gmx.net>
|
||||
cdrfifo.c , Copyright 2006 Thomas Schmitt <scdbackup@gmx.net>
|
||||
|
||||
A fd-to-fd or fd-to-memory fifo to be used within cdrskin or independently.
|
||||
By chaining of fifo objects, several fifos can be run simultaneously
|
||||
|
@ -26,22 +26,8 @@
|
|||
#include <sys/select.h>
|
||||
|
||||
#ifndef Cdrfifo_standalonE
|
||||
/* for burn_os_alloc_buffer() */
|
||||
/* <<< until release of 0.7.4 : for Libburn_has_open_trac_srC */
|
||||
#include "../libburn/libburn.h"
|
||||
|
||||
/* ts B91124:
|
||||
DISABLED, because this spoils multi-track burning by slowing down first
|
||||
track and stalling before the second track begins. Obviously a problem
|
||||
with chained input and waiting for full O_DRIECT suitable read chunks.
|
||||
DO NOT ENABLE before the wait code in this source file is fixed.
|
||||
That long, ./configure option --enable-track-src-odirect must not
|
||||
get into effect in libburn. NO -DLibburn_read_o_direcT either.
|
||||
|
||||
For extra safety, O_DIRECT has been banned in libburn/sg-linux.c too.
|
||||
|
||||
# def ine Libburn_has_open_trac_srC 1
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
#include "cdrfifo.h"
|
||||
|
@ -121,9 +107,6 @@ struct CdrfifO {
|
|||
/* index of currently active (i.e. reading) follow-up */
|
||||
int follow_up_fd_idx;
|
||||
|
||||
/* short read encountered, take subsequent errno 22 with O_DIRECT as EOF */
|
||||
int o_direct_was_short;
|
||||
|
||||
|
||||
/* (simultaneous) peer chaining */
|
||||
struct CdrfifO *next;
|
||||
|
@ -194,7 +177,6 @@ int Cdrfifo_new(struct CdrfifO **ff, int source_fd, int dest_fd,
|
|||
}
|
||||
o->follow_up_fd_counter= 0;
|
||||
o->follow_up_fd_idx= -1;
|
||||
o->o_direct_was_short= 0;
|
||||
o->next= o->prev= NULL;
|
||||
o->chain_idx= 0;
|
||||
|
||||
|
@ -714,17 +696,8 @@ after_write:;
|
|||
else if(can_read < Cdrfifo_o_direct_chunK)
|
||||
can_read= -1;
|
||||
ret= 0;
|
||||
if(can_read>0) {
|
||||
if(can_read>0)
|
||||
ret= read(o->source_fd,o->buffer+o->write_idx,can_read);
|
||||
if(ret > 0) {
|
||||
if(ret < can_read) {
|
||||
/* Probably EOF. Prepare for errno = 22 in the next read. */
|
||||
o->o_direct_was_short= 1;
|
||||
} else {
|
||||
o->o_direct_was_short= 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(can_read < 0) {
|
||||
/* waiting for a full Cdrfifo_o_direct_chunK to fit */
|
||||
if(can_write <= 0 && o->dest_fd >= 0) {
|
||||
|
@ -758,8 +731,6 @@ after_write:;
|
|||
#endif /* ! Libburn_has_open_trac_srC */
|
||||
|
||||
if(ret==-1) {
|
||||
if(o->o_direct_was_short && errno == 22)
|
||||
goto have_eof;
|
||||
|
||||
/* >>> handle input error */;
|
||||
fprintf(stderr,"\ncdrfifo %d: on read: errno=%d , \"%s\"\n",
|
||||
|
@ -768,7 +739,6 @@ after_write:;
|
|||
|
||||
o->source_fd= -1;
|
||||
} else if(ret==0) { /* eof */
|
||||
have_eof:;
|
||||
/* activate eventual follow-up source fd */
|
||||
if(Cdrfifo_debuG || (flag&1))
|
||||
fprintf(stderr,"\ncdrfifo %d: on read(%d,buffer,%d): eof\n",
|
||||
|
@ -829,7 +799,7 @@ ex:;
|
|||
/** Check for pending data at the fifo's source file descriptor and wether the
|
||||
fifo is ready to take them. Simultaneously check the buffer for existing
|
||||
data and the destination fd for readiness to accept some. If so, a small
|
||||
chunk of data is transferred to and/or from the fifo.
|
||||
chunk of data is transfered to and/or from the fifo.
|
||||
This is done for the given fifo object and all members of its next-chain.
|
||||
The check and transactions are repeated until a given timespan has elapsed.
|
||||
libburn applications call this function in the burn loop instead of sleep().
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
/*
|
||||
cdrfifo.c , Copyright 2006 - 2016 Thomas Schmitt <scdbackup@gmx.net>
|
||||
cdrfifo.c , Copyright 2006 Thomas Schmitt <scdbackup@gmx.net>
|
||||
|
||||
A fd-to-fd or fd-to-memory fifo to be used within cdrskin or independently.
|
||||
By chaining of fifo objects, several fifos can be run simultaneously
|
||||
|
@ -118,7 +118,7 @@ int Cdrfifo_get_cdr_counters(struct CdrfifO *o,
|
|||
int flag);
|
||||
|
||||
/** Inquire the eventually detected size of an eventual ISO-9660 file system
|
||||
@return 0=no ISO size detected, 1=size_in_bytes is valid
|
||||
@return 0=no ISO resp. size detected, 1=size_in_bytes is valid
|
||||
*/
|
||||
int Cdrfifo_get_iso_fs_size(struct CdrfifO *o, double *size_in_bytes,int flag);
|
||||
|
||||
|
@ -136,7 +136,7 @@ int Cdrfifo_adopt_iso_fs_descr(struct CdrfifO *o, char **pt, int flag);
|
|||
/** Check for pending data at the fifo's source file descriptor and wether the
|
||||
fifo is ready to take them. Simultaneously check the buffer for existing
|
||||
data and the destination fd for readiness to accept some. If so, a small
|
||||
chunk of data is transferred to and/or from the fifo.
|
||||
chunk of data is transfered to and/or from the fifo.
|
||||
This is done for the given fifo object and all members of its next-chain.
|
||||
The check and transactions are repeated until a given timespan has elapsed.
|
||||
libburn applications call this function in the burn loop instead of sleep().
|
||||
|
|
|
@ -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 "Version 1.5.7, Jun 07, 2023"
|
||||
.TH CDRSKIN 1 "Version 1.4.0, May 17, 2015"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
|
@ -103,15 +103,15 @@ This information is 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
|
||||
and by music CD players. With DVD and BD there is only type data.
|
||||
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
|
||||
data, unless the track source is a file with suffix ".wav" or ".au" and has a
|
||||
header part which identifies it as MS-WAVE or SUN Audio with suitable
|
||||
header part which identifies it as MS-WAVE resp. SUN Audio with suitable
|
||||
parameters. Such files are burned as audio tracks by default.
|
||||
.PP
|
||||
While audio tracks just contain a given time span of acoustic vibrations,
|
||||
data tracks may have an arbitrary meaning. Nevertheless, ISO-9660 filesystems
|
||||
data tracks may have an arbitray meaning. Nevertheless, ISO-9660 filesystems
|
||||
are established as a format which can represent a tree of directories and
|
||||
files on all major operating systems. Such filesystem images can be
|
||||
produced by programs mkisofs or genisoimage or xorriso.
|
||||
|
@ -128,10 +128,10 @@ the archivers afio and star. Not suitable seems GNU tar.
|
|||
.br
|
||||
In general there are two approaches for writing media:
|
||||
.br
|
||||
A permissive mode selected by option
|
||||
A permissive mode depicted by option
|
||||
.B -tao
|
||||
which needs no predicted track size and can use
|
||||
multi-session capabilities if offered by drive and medium.
|
||||
which needs no predicted track size and allows to make use of
|
||||
eventual multi-session capabilities.
|
||||
.br
|
||||
A more restrictive mode
|
||||
.B -sao
|
||||
|
@ -156,8 +156,8 @@ read-only. Closing is done automatically unless option
|
|||
is given which keeps the media appendable.
|
||||
.br
|
||||
Write mode
|
||||
-tao is able to use track sources of unpredictable length (like stdin) and
|
||||
to write further sessions to appendable media.
|
||||
-tao allows to use track sources of unpredictable length (like stdin) and
|
||||
allows to write further sessions to appendable media.
|
||||
-sao produces audio sessions with seamless tracks but needs predicted track
|
||||
sizes and cannot append sessions to media.
|
||||
.br
|
||||
|
@ -185,8 +185,7 @@ Used DVD-RW get into blank sequential state by option
|
|||
With DVD-R[W] two write modes may be available:
|
||||
.br
|
||||
Mode DAO has many restrictions. It does not work with
|
||||
appendable media, cannot do -multi and writes only a single track.
|
||||
The size of the
|
||||
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
|
||||
.B tsize=
|
||||
|
@ -203,8 +202,8 @@ 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
|
||||
.B -tao
|
||||
as it resembles much CD TAO by accepting track sources of
|
||||
unpredicted length and being able to keep media appendable by option
|
||||
as it resembles much CD TAO by allowing track sources of
|
||||
unpredicted length and to keep media appendable by option
|
||||
.B -multi . It does not work with DVD-R DL and minimally blanked DVD-RW.
|
||||
The only restriction towards CD-R[W] is the lack of support for -audio tracks.
|
||||
Multiple tracks per session are permissible.
|
||||
|
@ -215,7 +214,7 @@ with DVD+R[/DL] or BD-R.
|
|||
.br
|
||||
Quite deliberately write mode -sao insists in the tradition of a predicted
|
||||
track size and blank media, whereas -tao writes the tracks open ended and
|
||||
can be applied to appendable media.
|
||||
allows appendable media.
|
||||
.br
|
||||
BD-R may be formatted before first use to enable the Defect Management which
|
||||
might catch and repair some bad spots at the expense of slow speed
|
||||
|
@ -238,7 +237,7 @@ of option
|
|||
.B --grow_overwriteable_iso .
|
||||
Without this option or without an ISO-9660 filesystem image present
|
||||
on media, -toc does not return information about the media content and
|
||||
media get treated as blank regardless whether they hold data or not.
|
||||
media get treated as blank regardless wether they hold data or not.
|
||||
.br
|
||||
Currently there is no difference between -sao and -tao. If ever, then -tao
|
||||
will be the mode which preserves the current behavior.
|
||||
|
@ -320,7 +319,7 @@ redirected to stderr and the stream data of a burn run will appear on stdout.
|
|||
.br
|
||||
Not good for terminals ! Redirect it.
|
||||
.br
|
||||
Pseudo-drives support -dummy. Their reply with --tell_media_space can be utopic.
|
||||
Pseudo-drives allow -dummy. Their reply with --tell_media_space can be utopic.
|
||||
-dummy burn runs touch the file but do not modify its data content.
|
||||
.br
|
||||
Note: --allow_emulated_drives is restricted to stdio:/dev/null if cdrskin
|
||||
|
@ -361,7 +360,7 @@ 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
|
||||
".wav" are examined whether they have a header in MS-WAVE format confirming
|
||||
".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.
|
||||
.br
|
||||
|
@ -427,7 +426,7 @@ Format a DVD-RW to "Restricted Overwrite". The user should bring some patience.
|
|||
.TP
|
||||
format_overwrite_quickest
|
||||
Like format_overwrite without creating a 128 MiB trailblazer session.
|
||||
Leads to "intermediate" state which only supports sequential write
|
||||
Leads to "intermediate" state which only allows sequential write
|
||||
beginning from address 0.
|
||||
The "intermediate" state ends after the first session of writing data.
|
||||
.TP
|
||||
|
@ -446,7 +445,7 @@ format_defectmgt
|
|||
Format DVD-RAM or BD to reserve the default amount of spare blocks for
|
||||
defect management.
|
||||
.br
|
||||
The following format_defectmgt_* enable the user to submit wishes which
|
||||
The following format_defectmgt_* allow to submit user wishes which
|
||||
nevertheless have to match one of the available formats. These formats are
|
||||
offered by the drive after examining the media.
|
||||
.TP
|
||||
|
@ -482,7 +481,7 @@ Unformatted blank BD-R will be left unformatted.
|
|||
format_defectmgt_payload_<size>
|
||||
Format DVD-RAM or BD. The text after "format_defectmgt_payload_" gives a
|
||||
number of bytes, eventually with suffixes "s", "k", "m". The largest number
|
||||
of spare blocks will be chosen which enables at least the given payload size.
|
||||
of spare blocks will be chosen which allows at least the given payload size.
|
||||
.TP
|
||||
format_by_index_<number>
|
||||
Format DVD-RW, DVD+RW, DVD-RAM or BD.
|
||||
|
@ -532,7 +531,6 @@ to mark the end of the range of an eventual option -audio or -xa1.
|
|||
.br
|
||||
Options -mode2, -xa, and -xa2 get mapped to -data, not using the desired CD
|
||||
sector formats and thus not taking advantage of eventual higher payload.
|
||||
.TP
|
||||
.BI \-xa1
|
||||
Subsequent tracks are data tracks with input suitable for CD-ROM XA mode 2
|
||||
form 1. This differs from -data input by 8 additional header bytes per block.
|
||||
|
@ -573,14 +571,9 @@ Eject the disc after work is done.
|
|||
.TP
|
||||
.BI \-force
|
||||
Assume that the user knows better in situations when cdrskin or libburn are
|
||||
refusing because of concerns about drive or media state.
|
||||
.br
|
||||
.B Caution:
|
||||
Use option -force only when in urgent need.
|
||||
.br
|
||||
This option enables the attempt to blank
|
||||
insecure about drive or media state. This includes the attempt to blank
|
||||
media which are classified as unknown or unsuitable, and the attempt to use
|
||||
write modes of which libburn believes they are not supported by the drive.
|
||||
write modes which libburn believes they are not supported by the drive.
|
||||
.br
|
||||
Another application is to enforce blanking or re-formatting of media
|
||||
which appear to be in the desired blank or format state already.
|
||||
|
@ -589,22 +582,10 @@ This option enables a burn run with option -dummy even if libburn believes
|
|||
that drive and media will not simulate the write mode but will write for real.
|
||||
.br
|
||||
It enables a burn run where cdrskin expects to exceed the available media
|
||||
capacity. This is known as "overburn" and might succeed on CD media with
|
||||
write type SAO.
|
||||
.B Too much overburning
|
||||
might be
|
||||
.B harmful to the medium
|
||||
and might
|
||||
.B make the drive unusable
|
||||
(hopefully only until it gets powered off and on). The man page of cdrecord
|
||||
mentions 88 seconds = 6600 blocks as halfways safe amount over the official
|
||||
medium capacity. The assessment of track sizes by libburn will be wrong if
|
||||
the written size reaches or exceeds 90 minutes = 405000 sectors. The overall
|
||||
medium size assessment by the Linux kernel is supposed to yield roughly the
|
||||
written size, but you should test this yourself with every overburnt medium.
|
||||
capacity.
|
||||
.br
|
||||
First consider to use a medium with more capacity rather than trying to
|
||||
overburn a CD.
|
||||
.B Caution:
|
||||
Use this only when in urgent need.
|
||||
.TP
|
||||
.BI \-format
|
||||
Same as blank=format_overwrite_full -force but restricted to DVD+RW.
|
||||
|
@ -636,8 +617,7 @@ modesty_on_drive=1:min_percent=75:max_percent=95
|
|||
The name of this cdrecord option stems from the "Immed" bit which can make some
|
||||
long running drive commands asynchronous and thus eases the load on some
|
||||
wiring hardware types. Regardless of option -immed, cdrskin uses asynchronous
|
||||
commands where possible and appropriate. To really disable asynchronous command
|
||||
execution, use option use_immed_bit=off .
|
||||
commands where possible and appropriate.
|
||||
.TP
|
||||
.BI index= list
|
||||
Set a comma separated list of index start address numbers for the next track.
|
||||
|
@ -828,7 +808,7 @@ means -nocopy surely without -scms.
|
|||
.TP
|
||||
.BI speed= number
|
||||
Set speed of drive. With data CD, 1x speed corresponds to a throughput of
|
||||
153,600 bytes/second. With DVD, 1x = 1,385,000 bytes/second.
|
||||
150,000 bytes/second. With DVD, 1x = 1,385,000 bytes/second.
|
||||
With BD 1x = 4,495,625 bytes/second.
|
||||
It is not an error to set a speed higher than is suitable for drive
|
||||
and media. One should stay within a realistic speed range, though.
|
||||
|
@ -852,7 +832,7 @@ This mode also applies pro-forma to overwriteable media
|
|||
Mode -tao can be used with track sources of unpredictable size, like standard
|
||||
input or named pipes. It is also the only mode that can be used for writing
|
||||
to appendable media which already hold data. With unformatted DVD-R[W] it is
|
||||
the only mode which can keep media appendable by option -multi.
|
||||
the only mode which allows -multi.
|
||||
.br
|
||||
Mode -tao is not usable for minimally blanked DVD-RW and for DVD-R DL.
|
||||
.TP
|
||||
|
@ -947,9 +927,9 @@ startup files. Level 3 is for debugging and useful mainly in conjunction with
|
|||
somebody who had a look into the program sourcecode.
|
||||
.TP
|
||||
.BI \-V
|
||||
Enable logging of SCSI commands to stderr. This is helpful for expert
|
||||
examination of the interaction between libburn and the drive.
|
||||
The commands are specified in SCSI-3 standards SPC, SBC, MMC.
|
||||
Enable logging of SCSI commands to stderr. This allows expert examination
|
||||
of the interaction between libburn and the drive. The commands are specified
|
||||
in SCSI-3 standards SPC, SBC, MMC.
|
||||
.TP
|
||||
.BI \-waiti
|
||||
Wait until input data is available at stdin or EOF occurs at stdin.
|
||||
|
@ -1086,7 +1066,7 @@ padded up to the necessary size by zeros. Size -1 revokes direct writing
|
|||
and switches back to normal session oriented writing.
|
||||
.br
|
||||
Both, write_start_address and direct_write_amount size must be aligned to a
|
||||
media dependent transaction size. With DVD-RAM, BD-RE, DVD+RW this is 2k, with
|
||||
media dependend transaction size. With DVD-RAM, BD-RE, DVD+RW this is 2k, with
|
||||
overwriteable DVD-RW it is 32k.
|
||||
.TP
|
||||
.BI dvd_obs= default|32k|64k
|
||||
|
@ -1104,11 +1084,11 @@ This directory has to already exist, but none of the track files may exist.
|
|||
This option will rather fail than overwrite an existing file.
|
||||
.br
|
||||
By default all tracks of the CD are extracted to files with names
|
||||
NN.wav, where NN is the track number from 01 to at most 99.
|
||||
trackNN.wav, where NN is the track number from 01 to at most 99.
|
||||
.TP
|
||||
.BI extract_basename= name
|
||||
Set a filename prefix which shall be used by extract_audio_to= instead of the
|
||||
empty default name prefix.
|
||||
Set a filename which shall be used by extract_audio_to= instead of the default
|
||||
name "track".
|
||||
.TP
|
||||
.BI --extract_dap
|
||||
Enable Digital Audio Play flaw obscuring mechanisms
|
||||
|
@ -1159,7 +1139,7 @@ of bytes is read. This option may be helpful to bring the average throughput
|
|||
near to the maximum throughput of a drive. A large fs= and a small
|
||||
fifo_start_at= combine a quick burn start and a large savings buffer to
|
||||
compensate for temporary lack of source data. At the beginning of burning,
|
||||
the software protection against buffer underrun is as weak as the size of
|
||||
the software protection against buffer underun is as weak as the size of
|
||||
fifo_start_at= . So it is best if the drive offers hardware protection which
|
||||
is enabled automatically if not driveropts=noburnfree is given.
|
||||
.TP
|
||||
|
@ -1335,8 +1315,8 @@ and eventually override the list of other speed offers.
|
|||
.br
|
||||
Only if the drive reports contradicting speed information there will appear
|
||||
"Write speed 0" or "Write speed-1", which tell the outcome of speed selection
|
||||
by options speed=0 or speed=-1, if it deviates from "Write speed L"
|
||||
or "Write speed H", respectively.
|
||||
by options speed=0 resp. speed=-1, if it deviates from "Write speed L"
|
||||
resp. "Write speed H".
|
||||
.TP
|
||||
.BI \--long_toc
|
||||
Like option -toc but marking each session start by a line "first: X last: Y"
|
||||
|
@ -1392,8 +1372,8 @@ source cannot deliver a size prediction and no tsize= was specified and an
|
|||
exact track size prediction is demanded by the write mode.
|
||||
.br
|
||||
This was the fallback from bad old times when cdrskin was unable to burn
|
||||
in mode -tao . It came back with minimally blanked DVD-RW, which cannot do
|
||||
Incremental Streaming (-tao), and with explicitly selected write mode -sao
|
||||
in mode -tao . It came back with minimally blanked DVD-RW which allow no
|
||||
Incremental Streaming (-tao) resp. with explicitly selected write mode -sao
|
||||
for best DVD-ROM compatibility.
|
||||
.br
|
||||
If the track source delivers less bytes than announced then the missing ones
|
||||
|
@ -1403,7 +1383,7 @@ will be filled with zeros.
|
|||
Prepare a recording session, do not perform it but rather inquire the
|
||||
maximum number of 2048 byte data blocks which may be written in
|
||||
the current state of media with the prepared setup. So this option disables
|
||||
recording of data. It does not disable blanking, though, and will measure space
|
||||
recording of data. It does allow blanking, though, and will measure space
|
||||
afterwards.
|
||||
.br
|
||||
It is not mandatory to give track sources but their nature may influence
|
||||
|
@ -1424,7 +1404,7 @@ and print its content in the human readable format that is described
|
|||
with option input_sheet_v07t=.
|
||||
.br
|
||||
The program run ends immediately thereafter.
|
||||
No drive scan will happen and no drive will be acquired.
|
||||
No drive scan will happen and no drive will be aquired.
|
||||
.br
|
||||
To avoid the cdrskin start message in the output, run:
|
||||
cdrskin textfile_to_v07t=cdtext.dat | grep -v '^cdrskin'
|
||||
|
@ -1438,52 +1418,6 @@ or BD-RE byte_offset must be aligned to 2 kiB blocks, but better is 32 kiB.
|
|||
With DVD-RW 32 kiB alignment is mandatory.
|
||||
.br
|
||||
Other media are not suitable for this option yet.
|
||||
.TP
|
||||
.BI modesty_on_drive= <mode>[:parameter=<value>[:parameter=<value>...]]
|
||||
Mode 1 keeps the program from trying to write to the burner drive while its
|
||||
buffer is in danger to be filled by more than parameter "max_percent".
|
||||
If this filling is exceeded then the program will wait until the filling
|
||||
is at most the value of parameter "min_percent".
|
||||
.br
|
||||
Percentages are permissible in the range of 25 to 100.
|
||||
.br
|
||||
This can ease the load on operating system and drive controller and thus help
|
||||
with achieving better input bandwidth if disk and burner are not on independent
|
||||
controllers (like hda and hdb). Unsufficient input bandwidth is indicated by
|
||||
output "(fifo xy%)" of option -v if xy is lower than 90 for some time.
|
||||
modesty_on_drive= might hamper output bandwidth and cause buffer underruns.
|
||||
.br
|
||||
A new use case is to work around the poor simultaneous performance of multiple
|
||||
burn runs on Linux kernel 3.16 and alike. Here it is not about giving the
|
||||
hard disk enough time to fill the fifo, but about keeping ioctl(SG_IO) from
|
||||
blocking for a longer time and thus blocking all other burn runs.
|
||||
.br
|
||||
To have max_percent larger than the burner's best actual
|
||||
buffer fill has the same effect as min_percent==max_percent. Some burners
|
||||
do not use their full buffer with all media types. Watch output "[buf xy%]"
|
||||
of option -v to get an impression of the actual buffer usage. Some burners
|
||||
are not suitable because they report buffer fill with granularity too large
|
||||
in size or time, or because they go to full speed only when their buffer is
|
||||
full.
|
||||
.br
|
||||
If a write attempt is delayed, the program will wait for a number of
|
||||
microseconds which is given by parameter "min_usec" before inquiring the buffer
|
||||
again. If more retries occur, this waiting time between inquiries increases
|
||||
up to the value of parameter "max_usec".
|
||||
.br
|
||||
If the delay lasts longer than the number of seconds given by parameter
|
||||
"timeout_sec", then mode 1 is set 0 and normal burning goes on.
|
||||
.br
|
||||
Mode 0 disables this feature. Mode -1 keeps it unchanged. Default is:
|
||||
.br
|
||||
0:min_percent=65:max_percent=95:timeout_sec=120:
|
||||
min_usec=10000:max_usec=100000
|
||||
.br
|
||||
The defaults of cdrskin are good for IDE problems. With concurrent Linux SG_IO
|
||||
problems on modern hardware, higher min_percent and lower usec might yield
|
||||
better buffer fills while still avoiding the problem:
|
||||
.br
|
||||
min_percent=90:max_percent=95:min_usec=5000:max_usec=25000
|
||||
.PP
|
||||
Alphabetical list of options which are only intended for very special
|
||||
situations and not for normal use:
|
||||
|
@ -1546,13 +1480,13 @@ fcntl(2).
|
|||
.TP
|
||||
.BI \--drive_not_o_excl
|
||||
Linux specific: Do not ask the operating system to prevent opening busy drives.
|
||||
Whether this leads to senseful behavior depends on operating system and kernel.
|
||||
Wether this leads to senseful behavior depends on operating system and kernel.
|
||||
.TP
|
||||
.BI drive_scsi_dev_family= sr | scd | sg
|
||||
Linux specific: Select a SCSI device file family to be scanned for by
|
||||
options --devices, --device_links and -scanbus.
|
||||
Normally this is /dev/sgN on kernel versions < 2.6 and /dev/srN
|
||||
on kernels >= 2.6 . This option explicitly overrides that default
|
||||
on kernels >= 2.6 . This option allows to explicitly 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
|
||||
|
@ -1563,7 +1497,7 @@ Linux specific:
|
|||
Try to exclusively reserve device files /dev/srN, /dev/scdM, /dev/sgK of drives.
|
||||
This would be helpful to protect against collisions with program growisofs.
|
||||
Regrettably on Linux kernel 2.4 with ide-scsi emulation this seems not to
|
||||
work. Whether it becomes helpful with new Linux systems has to be evaluated.
|
||||
work. Wether it becomes helpful with new Linux systems has to be evaluated.
|
||||
.TP
|
||||
.BI \--fifo_disable
|
||||
Disable fifo despite any fs=.
|
||||
|
@ -1598,45 +1532,29 @@ Try to ignore any signals rather than to abort the program. This is not a
|
|||
very good idea. You might end up waiting a very long time for cdrskin
|
||||
to finish.
|
||||
.TP
|
||||
.BI \--list_features
|
||||
List the SCSI/MMC features which were obtained from the drive when it was
|
||||
last acquired or re-assessed. Although this is better readable than the
|
||||
raw reply to SCSI command GET CONFIGURATION, the MMC specification text
|
||||
is still needed for interpreting it.
|
||||
.BI modesty_on_drive= <mode>[:min_percent=<num>][:max_percent=<num>]
|
||||
Mode 1 keeps the program from trying to write to the burner drive while its
|
||||
buffer is in danger to be filled by more than max_percent. If this filling is
|
||||
exceeded then the program will wait until the filling is at most min_percent.
|
||||
.br
|
||||
The list consists of line groups of the form
|
||||
This can ease the load on operating system and drive controller and thus help
|
||||
with achieving better input bandwidth if disk and burner are not on independent
|
||||
controllers (like hda and hdb). Unsufficient input bandwidth is indicated by
|
||||
output "(fifo xy%)" of option -v if xy is lower than 90 for some time.
|
||||
modesty_on_drive= might hamper output bandwidth and cause buffer underruns.
|
||||
.br
|
||||
Code +/- : Name : Version,P/N
|
||||
To have max_percent larger than the burner's best actual
|
||||
buffer fill has the same effect as min_percent==max_percent. Some burners
|
||||
do not use their full buffer with all media types. Watch output "[buf xy%]"
|
||||
of option -v to get an impression of the actual buffer usage. Some burners
|
||||
are not suitable because they report buffer fill with granularity too large
|
||||
in size or time.
|
||||
.br
|
||||
Raw feature data bytes as hex numbers
|
||||
Mode 0 disables this feature. Mode -1 keeps it unchanged. Default is:
|
||||
.br
|
||||
Parsed info as Name=Value pairs
|
||||
modesty_on_drive=0:min_percent=65:max_percent=95
|
||||
.br
|
||||
The headline is the only one which has no blank at its start.
|
||||
Code is given as 16 bit hex number.
|
||||
.br
|
||||
"+" marks a currently offered feature. "-" marks those which may be offered
|
||||
under different circumstances.
|
||||
.br
|
||||
Name is the feature name as listed in MMC specs.
|
||||
.br
|
||||
"P" marks persistent features. "N" marks non-persistent features.
|
||||
.br
|
||||
The Raw data can occupy more than one line. No "=" occurs in such lines.
|
||||
If no raw data are present, one line with some blanks is listed instead.
|
||||
.br
|
||||
The Parsed info shows some extracted field values with names which resemble
|
||||
the names used in the MMC description of the particular feature. Parsed info
|
||||
lines contain at least one Name=Value pair. More than one line is possible.
|
||||
If no parsed info is produced, one line with some blanks is listed instead.
|
||||
.br
|
||||
Example:
|
||||
.br
|
||||
0107 - : Real Time Streaming : 4,N
|
||||
.br
|
||||
1f 00 00 00
|
||||
.br
|
||||
RBCB=1 , SCS=1 , MP2A=1 , WSPD=1 , SW=1
|
||||
Percentages are permissible in the range of 25 to 100.
|
||||
.TP
|
||||
.BI \--no_abort_handler
|
||||
On signals exit even if the drive is in busy state. This is not a very good
|
||||
|
@ -1657,27 +1575,16 @@ addresses which are not listed with cdrskin --devices but nevertheless point
|
|||
to a usable drive. (Like /dev/sg0 using the same SCSI address as /dev/sr0.)
|
||||
.TP
|
||||
.BI \--obs_pad
|
||||
Pad the data of the last write operation of a DVD-R[W] DAO session, or BD-R
|
||||
session, or stdio: pseudo-drive session up to the full size of an output chunk.
|
||||
Pad the data of last write operation of a DVD-R[W] DAO session or
|
||||
stdio: pseudo-drive up to the full size of an output chunk.
|
||||
This padding has to be applied automatically to the other DVD and BD media
|
||||
types, where it causes e.g. ISO images to have trailing unclaimed blocks.
|
||||
Whether it is applied automatically to BD-R depends on option
|
||||
--bdr_obs_exempt.
|
||||
.br
|
||||
Use this option if there is the suspicion that DVD-R[W] DAO or BD-R sessions
|
||||
abort with your kernel and/or DVD drive, if their size is not a multiple of
|
||||
16 blocks.
|
||||
Use this option if there is the suspicion that DAO sessions abort with
|
||||
your kernel and/or DVD drive, if their size is not a multiple of 16 blocks.
|
||||
.br
|
||||
This option may also get enabled at compile time of libburn.
|
||||
.TP
|
||||
.BI \--bdr_obs_exempt
|
||||
Exempt BD-R media from automatic unconditional transaction end padding,
|
||||
provided that this padding is not requested by --obs_pad and that
|
||||
no stream_recording is requested.
|
||||
.br
|
||||
This is a new feature introduced with version 1.5.6. It might become default
|
||||
in later versions.
|
||||
.TP
|
||||
.BI \--old_pseudo_scsi_adr
|
||||
Linux specific:
|
||||
Use and report literal Bus,Target,Lun addresses rather than real SCSI and
|
||||
|
@ -1695,26 +1602,16 @@ This setting affects only CD SAO write runs.
|
|||
.BI sao_pregap= off|number
|
||||
Define whether a pre-gap shall be written before the track and how many
|
||||
sectors this pre-gap shall have. A pre-gap is written in the range of track
|
||||
index 0 and contains zeros. No bytes from the track source
|
||||
index 0 and contains zeros resp. silence. No bytes from the track source
|
||||
will be read for writing the pre-gap.
|
||||
.br
|
||||
This setting affects only CD SAO write runs.
|
||||
.br
|
||||
The first track automatically gets a pre-gap of at least 150 sectors. Its
|
||||
size can only be enlarged by this call.
|
||||
.TP
|
||||
.BI use_immed_bit= on|off|default
|
||||
Control whether several long lasting SCSI commands shall be executed with the
|
||||
Immed bit, which makes the commands end early while the drive operation is
|
||||
still going on. cdrskin then inquires progress indication until the drive
|
||||
reports to be ready again. If this feature is turned off, then blanking and
|
||||
formatting will show no progress indication.
|
||||
.br
|
||||
It may depend on the operating system whether use_immed_bit= is set to "off"
|
||||
by default.
|
||||
.TP
|
||||
.BI --xa1-ignore
|
||||
Silently interpret option -xa1 as -data. This may be necessary if a frontend
|
||||
Silently interpret option -xa1 as -data. This may be necessary if a frontent
|
||||
does not prepare -xa1 block headers but insists in using option -xa1.
|
||||
.SH EXAMPLES
|
||||
.SS
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -39,8 +39,8 @@ About any CD, DVD, or BD recorder produced in the recent ten years.
|
|||
<BR>
|
||||
<A HREF="http://libburnia-project.org">libburn</A>
|
||||
supports recorders which are compliant to standards MMC-1 for CD and
|
||||
MMC-5 for DVD or BD. Linux, FreeBSD, Solaris, and NetBSD can communicate
|
||||
with drives connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
|
||||
MMC-5 for DVD or BD. Linux, FreeBSD, Solaris, and NetBSD allow to access drives
|
||||
connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
|
||||
<BR>
|
||||
</P>
|
||||
|
||||
|
@ -67,7 +67,7 @@ with drives connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
|
|||
GPL software included:<BR>
|
||||
</H2>
|
||||
<DL>
|
||||
<DT>libburn-1.5.6</DT>
|
||||
<DT>libburn-1.4.0</DT>
|
||||
<DD>(founded by Derek Foreman and Ben Jansens,
|
||||
developed and maintained since August 2006 by
|
||||
Thomas Schmitt from team of libburnia-project.org)
|
||||
|
@ -109,7 +109,7 @@ DVD-R DL, which both support no -multi.
|
|||
<DD>#<KBD> cdrskin -scanbus</KBD></DD>
|
||||
<DD>#<KBD> cdrskin dev=ATA -scanbus</KBD></DD>
|
||||
<DD>#<KBD> cdrskin --devices</KBD></DD>
|
||||
<DT>Being superuser avoids permission problems with /dev/srN and /dev/hdX .
|
||||
<DT>Being superuser avoids permission problems with /dev/srN resp. /dev/hdX .
|
||||
</DT>
|
||||
<DT>Ordinary users should then get granted access to the /dev files
|
||||
as listed by option --devices. Linux, FreeBSD, and NetBSD demand rw-permission.
|
||||
|
@ -202,15 +202,15 @@ Standalone ISO 9660 multi-session CD/DVD/BD tool
|
|||
<P>
|
||||
<DL>
|
||||
<DT>Download as source code (see README):</DT>
|
||||
<DD><A HREF="cdrskin-1.5.6.tar.gz">cdrskin-1.5.6.tar.gz</A>
|
||||
(1075 KB).
|
||||
<DD><A HREF="cdrskin-1.4.0.tar.gz">cdrskin-1.4.0.tar.gz</A>
|
||||
(975 KB).
|
||||
</DD>
|
||||
<DD><A HREF="cdrskin-1.5.6.tar.gz.sig">cdrskin-1.5.6.tar.gz.sig</A></DD>
|
||||
<DD><A HREF="cdrskin-1.4.0.tar.gz.sig">cdrskin-1.4.0.tar.gz.sig</A></DD>
|
||||
<DD>
|
||||
(detached GPG signature for verification by
|
||||
<KBD>gpg --verify cdrskin-1.5.6.tar.gz.sig cdrskin-1.5.6.tar.gz</KBD>
|
||||
<KBD>gpg --verify cdrskin-1.4.0.tar.gz.sig cdrskin-1.4.0.tar.gz</KBD>
|
||||
<BR>
|
||||
after <KBD>gpg --keyserver keyserver.ubuntu.com --recv-keys ABC0A854</KBD>).
|
||||
after <KBD>gpg --keyserver keys.gnupg.net --recv-keys ABC0A854</KBD>).
|
||||
</DD>
|
||||
<DD>
|
||||
The cdrskin tarballs are source code identical with libburn releases
|
||||
|
@ -247,8 +247,8 @@ cdrskin_0.4.2.pl00-x86-suse9_0-static.tar.gz</A>, (310 KB), -static compiled,
|
|||
</DL>
|
||||
<DL><DT>Contact:</DT>
|
||||
<DD>Thomas Schmitt, <A HREF="mailto:scdbackup@gmx.net">scdbackup@gmx.net</A></DD>
|
||||
<DD>GNU xorriso mailing list, where cdrskin and libburn are on topic, too:
|
||||
<A HREF="mailto:bug-xorriso@gnu.org">bug-xorriso@gnu.org</A></DD>
|
||||
<DD>libburn development mailing list,
|
||||
<A HREF="mailto:libburn-hackers@pykix.org">libburn-hackers@pykix.org</A></DD>
|
||||
</DL>
|
||||
<DL><DT>License:</DT>
|
||||
<DD><A HREF="COPYING_cdrskin">GPL</A>, an <A HREF="http://www.opensource.org/">Open Source</A> approved license</DD>
|
||||
|
@ -259,35 +259,38 @@ cdrskin_0.4.2.pl00-x86-suse9_0-static.tar.gz</A>, (310 KB), -static compiled,
|
|||
<HR>
|
||||
|
||||
<P>
|
||||
Enhancements towards previous stable version cdrskin-1.5.4:
|
||||
Enhancements towards previous stable version cdrskin-1.3.8:
|
||||
<UL>
|
||||
<LI>New cdrskin option --bdr_obs_exempt</LI>
|
||||
<LI>Officially enabled overburning on CD media</LI>
|
||||
<LI>none</LI>
|
||||
<!--
|
||||
<LI>none</LI>
|
||||
-->
|
||||
</UL>
|
||||
|
||||
Bug fixes towards cdrskin-1.5.4:
|
||||
Bug fixes towards cdrskin-1.3.8:
|
||||
<UL>
|
||||
<LI>Overburning with cdrskin option -force ended by a libburn error</LI>
|
||||
</UL>
|
||||
<LI>Double free with cdrskin -vvv. Introduced with rev 5065, version 1.3.1</LI>
|
||||
<LI>Wrong read access to memory. Reported by valgrind of lian jianfei.</LI>
|
||||
<!--
|
||||
<LI>none</LI>
|
||||
-->
|
||||
</UL>
|
||||
|
||||
<HR>
|
||||
|
||||
<P>
|
||||
<DL>
|
||||
<DT><H3>Development snapshot, version 1.5.7 :</H3></DT>
|
||||
<DD>Enhancements towards current stable version 1.5.6:
|
||||
<DT><H3>Development snapshot, version 1.4.1 :</H3></DT>
|
||||
<DD>Enhancements towards current stable version 1.4.0:
|
||||
<UL>
|
||||
<LI>none yet</LI>
|
||||
<!--
|
||||
<LI>none yet</LI>
|
||||
-->
|
||||
</UL>
|
||||
Bug fixes towards cdrskin-1.5.6:
|
||||
</DD>
|
||||
|
||||
<DD>Bug fixes towards cdrskin-1.4.0:
|
||||
<UL>
|
||||
<LI>none yet</LI>
|
||||
<!--
|
||||
|
@ -297,15 +300,14 @@ Bug fixes towards cdrskin-1.5.6:
|
|||
</DD>
|
||||
|
||||
<DD> </DD>
|
||||
<DD><A HREF="README_cdrskin_devel">README 1.5.7</A>
|
||||
<DD><A HREF="cdrskin__help_devel">cdrskin-1.5.7 --help</A></DD>
|
||||
<DD><A HREF="cdrskin_help_devel">cdrskin-1.5.7 -help</A></DD>
|
||||
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.5.7)</A></DD>
|
||||
<DD><A HREF="README_cdrskin_devel">README 1.4.1</A>
|
||||
<DD><A HREF="cdrskin__help_devel">cdrskin-1.4.1 --help</A></DD>
|
||||
<DD><A HREF="cdrskin_help_devel">cdrskin-1.4.1 -help</A></DD>
|
||||
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.4.1)</A></DD>
|
||||
<DD> </DD>
|
||||
<DT>Maintainers of cdrskin unstable packages please use git of
|
||||
<DT>Maintainers of cdrskin unstable packages please use SVN of
|
||||
<A HREF="http://libburnia-project.org"> libburnia-project.org</A></DT>
|
||||
<DD>Download: <KBD>
|
||||
<B>git clone https://dev.lovelyhq.com/libburnia/libburn.git</B>
|
||||
<DD>Download: <KBD><B>svn co http://svn.libburnia-project.org/libburn/trunk libburn</B>
|
||||
</KBD></DD>
|
||||
<DD>Build: <KBD><B>cd libburn ; ./bootstrap ; ./configure --prefix /usr ; make ; cdrskin/compile_cdrskin.sh</B>
|
||||
</KBD></DD>
|
||||
|
@ -321,8 +323,8 @@ admins with full system sovereignty.</DT>
|
|||
<A HREF="README_cdrskin_devel">upcoming README</A> ):
|
||||
</DD>
|
||||
<DD>
|
||||
<A HREF="cdrskin-1.5.7.tar.gz">cdrskin-1.5.7.tar.gz</A>
|
||||
(1075 KB).
|
||||
<A HREF="cdrskin-1.4.1.tar.gz">cdrskin-1.4.1.tar.gz</A>
|
||||
(975 KB).
|
||||
</DD>
|
||||
|
||||
<!-- This is not offered any more since spring 2008
|
||||
|
@ -472,7 +474,7 @@ cdrecord but not vice versa.
|
|||
<BR>
|
||||
<BR>
|
||||
I was a long time user of cdrecord and it worked fine for me.
|
||||
Especially i do appreciate its write mode -tao which can pipe arbitrary
|
||||
Especially i do appreciate its write mode -tao which allows to pipe arbitrary
|
||||
data on CD and CD-RW via stdin. cdrecord is reliable, versatile and well
|
||||
maintained. So for me - there would be no problem with using it for
|
||||
burning CDs.
|
||||
|
@ -497,7 +499,7 @@ opportunity is the goal of a cdrecord compatibility wrapper.
|
|||
<BR>
|
||||
<BR>
|
||||
It is very important to me that this project is not perceived as hostile
|
||||
towards Joerg Schilling and his work.
|
||||
towards Joerg Schilling and his ongoing work.
|
||||
I owe him much. For cdrecord, for mkisofs, for star. Chapeau.
|
||||
<BR>
|
||||
</P>
|
||||
|
|
|
@ -1 +1 @@
|
|||
#define Cdrskin_timestamP "2024.04.27.162735"
|
||||
#define Cdrskin_timestamP "2015.05.17.110001"
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,14 +1,14 @@
|
|||
#!/bin/sh
|
||||
|
||||
# compile_cdrskin.sh
|
||||
# Copyright 2005 - 2023 Thomas Schmitt, scdbackup@gmx.net, GPL v2 or later
|
||||
# to be executed within ./libburn-* or./cdrskin-*
|
||||
# Copyright 2005 - 2015 Thomas Schmitt, scdbackup@gmx.net, GPL v2 or later
|
||||
# to be executed within ./libburn-* resp ./cdrskin-*
|
||||
|
||||
debug_opts="-O2"
|
||||
def_opts=
|
||||
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
|
||||
fifo_opts=""
|
||||
libvers="-DCdrskin_libburn_1_5_6"
|
||||
libvers="-DCdrskin_libburn_1_4_0"
|
||||
|
||||
# To be used if Makefile.am uses libburn_libburn_la_CFLAGS
|
||||
# burn="libburn/libburn_libburn_la-"
|
||||
|
@ -41,15 +41,15 @@ do
|
|||
elif test "$i" = "-compile_dewav"
|
||||
then
|
||||
compile_dewav=1
|
||||
elif test "$i" = "-libburn_1_5_6"
|
||||
elif test "$i" = "-libburn_1_4_0"
|
||||
then
|
||||
libvers="-DCdrskin_libburn_1_5_6"
|
||||
libvers="-DCdrskin_libburn_1_4_0"
|
||||
libdax_audioxtr_o="$burn"libdax_audioxtr.o
|
||||
libdax_msgs_o="$burn"libdax_msgs.o
|
||||
cleanup_src_or_obj="$burn"cleanup.o
|
||||
elif test "$i" = "-libburn_svn"
|
||||
then
|
||||
libvers="-DCdrskin_libburn_1_5_7"
|
||||
libvers="-DCdrskin_libburn_1_4_1"
|
||||
libdax_audioxtr_o="$burn"libdax_audioxtr.o
|
||||
libdax_msgs_o="$burn"libdax_msgs.o
|
||||
cleanup_src_or_obj="$burn"cleanup.o
|
||||
|
@ -99,8 +99,8 @@ do
|
|||
echo "Options:"
|
||||
echo " -compile_cdrfifo compile program cdrskin/cdrfifo."
|
||||
echo " -compile_dewav compile program test/dewav without libburn."
|
||||
echo " -libburn_1_5_6 set macro to match libburn-1.5.6"
|
||||
echo " -libburn_svn set macro to match current libburn git."
|
||||
echo " -libburn_1_4_0 set macro to match libburn-1.4.0"
|
||||
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."
|
||||
echo " -do_not_compile_cdrskin omit compilation of cdrskin/cdrskin."
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/sh
|
||||
|
||||
#
|
||||
# convert_man_to_html.sh - ts A61214 , B50802
|
||||
# convert_man_to_html.sh - ts A61214
|
||||
#
|
||||
# Generates a HTML version of man page cdrskin.1
|
||||
#
|
||||
|
@ -38,25 +38,24 @@ then
|
|||
|
||||
sed \
|
||||
-e 's/<meta name="generator" content="groff -Thtml, see www.gnu.org">/<meta name="generator" content="groff -Thtml, via man -H, via cdrskin\/convert_man_to_html.sh">/' \
|
||||
-e 's/<meta name="Content-Style" content="text\/css">/<meta name="Content-Style" content="text\/css"><META NAME="description" CONTENT="man page of cdrskin"><META NAME="keywords" CONTENT="man cdrskin, manual, cdrskin, CD-RW, CD-R, DVD-R, DVD-RW, DVD+R, DVD+RW, BD-R, BD-RE, burning, cdrecord, compatible"><META NAME="robots" CONTENT="follow">/' \
|
||||
-e 's/<meta name="Content-Style" content="text\/css">/<meta name="Content-Style" content="text\/css"><META NAME="description" CONTENT="man page of cdrskin"><META NAME="keywords" CONTENT="man cdrskin, manual, cdrskin, CD, CD-RW, CD-R, burning, cdrecord, compatible"><META NAME="robots" CONTENT="follow">/' \
|
||||
-e 's/<title>CDRSKIN<\/title>/<title>man 1 cdrskin<\/title>/' \
|
||||
-e 's/<h1 align=center>CDRSKIN<\/h1>/<h1 align=center>man 1 cdrskin<\/h1>/' \
|
||||
-e 's/<body>/<body BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>/' \
|
||||
-e 's/<b>Overview of features:<\/b>/<b>Overview of features:<\/b><BR>/' \
|
||||
-e 's/<b>General information paragraphs:<\/b>/<b>General information paragraphs:<\/b><BR>/' \
|
||||
-e 's/<b>Track recording model:<\/b>/\ <BR><b>Track recording model:<\/b><BR>/' \
|
||||
-e 's/<b>Overview of features:<\/b>/\ <BR><b>Overview of features:<\/b>/' \
|
||||
-e 's/<b>General information paragraphs:<\/b>/\ <BR><b>General information paragraphs:<\/b>/' \
|
||||
-e 's/<b>Track recording model:<\/b>/\ <BR><b>Track recording model:<\/b>/' \
|
||||
-e 's/^In general there are two types of tracks: data and audio./\ <BR>In general there are two types of tracks: data and audio./' \
|
||||
-e 's/^While audio tracks just contain a given/\ <BR>While audio tracks just contain a given/' \
|
||||
-e 's/<b>Write mode selection:<\/b>/<b>Write mode selection:<\/b><BR>/' \
|
||||
-e 's/<b>Recordable CD Media:<\/b>/<b>Recordable CD Media:<\/b><BR>/' \
|
||||
-e 's/<b>Overwriteable DVD or BD Media:<\/b>/<b>Overwriteable DVD or BD Media:<\/b><BR>/' \
|
||||
-e 's/<b>Sequentially Recordable DVD or BD Media:<\/b>/<b>Sequentially Recordable DVD or BD Media:<\/b><BR>/' \
|
||||
-e 's/<b>Write mode selection:<\/b>/\ <BR><b>Write mode selection:<\/b>/' \
|
||||
-e 's/<b>Recordable CD Media:<\/b>/\ <BR><b>Recordable CD Media:<\/b>/' \
|
||||
-e 's/<b>Overwriteable DVD Media:<\/b>/\ <BR><b>Overwriteable DVD Media:<\/b>/' \
|
||||
-e 's/<b>Sequentially Recordable DVD Media:<\/b>/\ <BR><b>Sequentially Recordable DVD Media:<\/b>/' \
|
||||
-e 's/^The write modes for DVD+R/\ <BR>The write modes for DVD+R/' \
|
||||
-e 's/<b>Drive preparation and addressing:<\/b>/<b>Drive preparation and addressing:<\/b><BR>/' \
|
||||
-e 's/<b>Drive preparation and addressing:<\/b>/\ <BR><b>Drive preparation and addressing:<\/b>/' \
|
||||
-e 's/^If you only got one CD capable drive/\ <BR>If you only got one CD capable drive/' \
|
||||
-e 's/<b>Emulated drives:<\/b>/<b>Emulated drives:<\/b><BR>/' \
|
||||
-e 's/for normal use: <b><br>/for normal use: <b><br><BR>/' \
|
||||
-e 's/original cdrecord by Joerg Schilling:<\/p>/original cdrecord by Joerg Schilling:<\/p><BR>/' \
|
||||
-e 's/<b>Emulated drives:<\/b>/\ <BR><b>Emulated drives:<\/b>/' \
|
||||
-e 's/^Alphabetical list of options/\ <BR>Alphabetical list of options/' \
|
||||
-e 's/<\/body>/<BR><HR><FONT SIZE=-1><CENTER>(HTML generated from '"$manpage"'.1 on '"$(date)"' by '$(basename "$0")' )<\/CENTER><\/FONT><\/body>/' \
|
||||
-e 's/See section FILES/See section <A HREF="#FILES">FILES<\/A>/' \
|
||||
-e 's/See section EXAMPLES/See section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \
|
||||
|
@ -71,10 +70,8 @@ then
|
|||
|
||||
else
|
||||
|
||||
# export BROWSER='cp "%s" '"$raw_html"
|
||||
export BROWSER=$(pwd)/'cdrskin/unite_html_b_line "%s" '"$raw_html"
|
||||
export BROWSER='cp "%s" '"$raw_html"
|
||||
man -H "$manpage"
|
||||
# cp "$raw_html" /tmp/x.html
|
||||
"$0" -work_as_filter "$raw_html"
|
||||
rm "$raw_html"
|
||||
rm "$man_dir"/man1
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Create version timestamp cdrskin/cdrskin_timestamp.h
|
||||
# to be executed within ./libburn-* or ./cdrskin-*
|
||||
# to be executed within ./libburn-* resp ./cdrskin-*
|
||||
|
||||
timestamp="$(date -u '+%Y.%m.%d.%H%M%S')"
|
||||
echo "Version timestamp : $timestamp"
|
||||
|
|
|
@ -1,124 +0,0 @@
|
|||
|
||||
/*
|
||||
( cd cdrskin ; cc -g -Wall -o unite_html_b_line unite_html_b_line.c )
|
||||
*/
|
||||
/*
|
||||
Specialized converter for the output of man -H,
|
||||
which unites lines where the line end is between <b> and </b>.
|
||||
|
||||
Copyright 2015 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
int unite_lines(char *buffer, int *b_open, int *b_state, int flag)
|
||||
{
|
||||
char *cpt;
|
||||
int last_was_nl= 0;
|
||||
|
||||
for(cpt= buffer; *cpt != 0; cpt++) {
|
||||
if(*b_open) {
|
||||
if(*b_state == 0 && *cpt == '<') {
|
||||
*b_state= 1;
|
||||
} else if(*b_state == 1) {
|
||||
if(*cpt == '/')
|
||||
*b_state= 2;
|
||||
else
|
||||
*b_state= 0;
|
||||
} else if(*b_state == 2) {
|
||||
if(*cpt == 'b' || *cpt == 'B')
|
||||
*b_state= 3;
|
||||
else
|
||||
*b_state= 0;
|
||||
} else if(*b_state == 3) {
|
||||
if(*cpt == '>')
|
||||
*b_open= 0;
|
||||
*b_state= 0;
|
||||
}
|
||||
} else {
|
||||
if(*b_state == 0 && *cpt == '<') {
|
||||
*b_state= 1;
|
||||
} else if(*b_state == 1) {
|
||||
if(*cpt == 'b' || *cpt == 'B')
|
||||
*b_state= 2;
|
||||
else
|
||||
*b_state= 0;
|
||||
} else if(*b_state == 2) {
|
||||
if(*cpt == '>')
|
||||
*b_open= 1;
|
||||
*b_state= 0;
|
||||
}
|
||||
}
|
||||
last_was_nl= (*cpt == '\n');
|
||||
}
|
||||
if(*b_open && last_was_nl) {
|
||||
/* replace newline */
|
||||
*(cpt - 1)= ' ';
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
FILE *fpin, *fpout;
|
||||
char buffer[4096], *respt;
|
||||
int ret, b_open= 0, b_state= 0;
|
||||
|
||||
if(argc != 3) {
|
||||
fprintf(stderr, "usage: %s input_path output_path\n", argv[0]);
|
||||
return(1);
|
||||
}
|
||||
if(strcmp(argv[1], "-") == 0) {
|
||||
fpin= stdin;
|
||||
} else {
|
||||
fpin= fopen(argv[1], "rb");
|
||||
if(fpin == 0) {
|
||||
fprintf(stderr, "Error with input file '%s' : %s\n",
|
||||
argv[1], strerror(errno));
|
||||
return(2);
|
||||
}
|
||||
}
|
||||
if(strcmp(argv[2], "-") == 0) {
|
||||
fpout= stdout;
|
||||
} else {
|
||||
fpout= fopen(argv[2], "wb");
|
||||
if(fpout == 0) {
|
||||
fprintf(stderr, "Error with output file '%s' : %s\n",
|
||||
argv[2], strerror(errno));
|
||||
return(3);
|
||||
}
|
||||
}
|
||||
while(1) {
|
||||
respt= fgets(buffer, sizeof(buffer), fpin);
|
||||
if(respt == NULL)
|
||||
break;
|
||||
ret= unite_lines(buffer, &b_open, &b_state, 0);
|
||||
if(ret <= 0)
|
||||
break;
|
||||
ret= fputs(buffer, fpout);
|
||||
if(ret < 0) {
|
||||
fprintf(stderr, "Error writing to output file '%s' : %s\n",
|
||||
argv[2], strerror(errno));
|
||||
return(4);
|
||||
}
|
||||
}
|
||||
if(fpin != stdin)
|
||||
fclose(fpin);
|
||||
if(fpout != stdout)
|
||||
fclose(stdout);
|
||||
return(0);
|
||||
}
|
||||
|
|
@ -23,6 +23,11 @@ About libburn API for burning CD, DVD, and BD: http://api.libburnia-project.org
|
|||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
For yet unsupported media types see the advice to use dvd+rw-tools at
|
||||
the end of this text.
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
About the command line options of cdrskin:
|
||||
|
||||
They are described in detail in [http://scdbackup.sourceforge.net/man_1_cdrskin_devel.html#OPTIONS section OPTIONS] of
|
||||
|
@ -56,7 +61,7 @@ Some are of general user interest, though:
|
|||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
--devices can be used by the sysadmin to scan the system for possible drives
|
||||
--devices allows the sysadmin to scan the system for possible drives
|
||||
and displays their detected properties.
|
||||
The drives are listed one per line, with fields:
|
||||
libburn-drive-number, sysadmin-device-file, permissions, vendor, type
|
||||
|
@ -85,7 +90,7 @@ Option blank= offers several specialized blanking and formatting types,
|
|||
which one may use for particular purposes on DVD-RW, DVD-RAM and BD-RE.
|
||||
(See also below: blank=format_overwrite)
|
||||
The drive offers a list of possible formats by cdrskin option --list_formats.
|
||||
One should acquire MMC background information before making use of them.
|
||||
One should aquire MMC background information before making use of them.
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
|
@ -167,7 +172,7 @@ media with a single session and track on it. blank= invalidates ISO images.
|
|||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
assert_write_lba=<lba> ensures that the start block address which
|
||||
assert_write_lba=<lba> allows to ensure that the start block address which
|
||||
was used with the formatter program (e.g. mkisofs -C) matches the start block
|
||||
address which will be used by the upcoming burn.
|
||||
|
||||
|
@ -215,7 +220,7 @@ With a very fat fs=# buffer (128 MB for 12x CD is not unrealistic) this
|
|||
can cause a big delay until burning finally starts and takes its due time.
|
||||
|
||||
fifo_start_at=<num> makes cdrskin start burning after the given number of bytes
|
||||
is read rather than waiting for the FIFO to be completely full or the data
|
||||
is read rather than waiting for the FIFO to be completely full resp. the data
|
||||
stream to end. It risks a few drive buffer underruns at the beginning of burn
|
||||
- but modern drives stand this.
|
||||
|
||||
|
@ -263,7 +268,7 @@ would be the appropriate translation:
|
|||
{{{
|
||||
dev_translation=+0,0,0+/dev/hdc
|
||||
}}}
|
||||
The "+" character is a separator to be chosen by you.
|
||||
The "+" character is a separator to be choosen by you.
|
||||
Currently i am not aware of the need to choose any other than "+"
|
||||
unless you get playful with custom translations like
|
||||
{{{
|
||||
|
|
52
configure.ac
52
configure.ac
|
@ -1,4 +1,4 @@
|
|||
AC_INIT([libburn], [1.5.7], [http://libburnia-project.org])
|
||||
AC_INIT([libburn], [1.4.0], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
dnl AC_CONFIG_HEADER([config.h])
|
||||
|
||||
|
@ -106,14 +106,6 @@ dnl 1.3.4 = libburn.so.4.87.0
|
|||
dnl 1.3.6 = libburn.so.4.89.0
|
||||
dnl 1.3.8 = libburn.so.4.91.0
|
||||
dnl 1.4.0 = libburn.so.4.93.0
|
||||
dnl 1.4.2 = libburn.so.4.95.0
|
||||
dnl 1.4.4 = libburn.so.4.97.0
|
||||
dnl 1.4.6 = libburn.so.4.99.0
|
||||
dnl 1.4.8 = libburn.so.4.101.0
|
||||
dnl 1.5.0 = libburn.so.4.103.0
|
||||
dnl 1.5.2 = libburn.so.4.105.0
|
||||
dnl 1.5.4 = libburn.so.4.107.0
|
||||
dnl 1.5.6 = libburn.so.4.109.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.
|
||||
|
@ -138,8 +130,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=1
|
||||
BURN_MINOR_VERSION=5
|
||||
BURN_MICRO_VERSION=7
|
||||
BURN_MINOR_VERSION=4
|
||||
BURN_MICRO_VERSION=0
|
||||
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
|
||||
|
||||
AC_SUBST(BURN_MAJOR_VERSION)
|
||||
|
@ -150,14 +142,14 @@ AC_SUBST(BURN_VERSION)
|
|||
dnl Libtool versioning
|
||||
LT_RELEASE=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
|
||||
dnl
|
||||
dnl ### This is the release version libburn-1.5.6
|
||||
dnl ### This is the release version libburn-1.4.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 LT_CURRENT++, LT_AGE++ has not yet happened.
|
||||
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile.
|
||||
dnl
|
||||
dnl SONAME = 114 - 110 = 4 . Linux library name = libburn.so.4.110.0
|
||||
LT_CURRENT=114
|
||||
LT_AGE=110
|
||||
dnl SONAME = 97 - 93 = 4 . Linux library name = libburn.so.4.93.0
|
||||
LT_CURRENT=97
|
||||
LT_AGE=93
|
||||
LT_REVISION=0
|
||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||
|
||||
|
@ -176,12 +168,12 @@ AC_SUBST(BURN_BINARY_AGE)
|
|||
AC_PREFIX_DEFAULT([/usr/local])
|
||||
test "$prefix" = "NONE" && prefix=$ac_default_prefix
|
||||
|
||||
dnl ts B90405 : Disabled on advise of Ross Burton
|
||||
dnl AM_MAINTAINER_MODE
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
AM_PROG_CC_C_O
|
||||
AC_C_CONST
|
||||
AC_C_INLINE
|
||||
AC_C_BIGENDIAN
|
||||
|
||||
dnl Large file support
|
||||
AC_SYS_LARGEFILE
|
||||
|
@ -193,7 +185,7 @@ fi
|
|||
|
||||
AC_PROG_LIBTOOL
|
||||
AC_SUBST(LIBTOOL_DEPS)
|
||||
# LIBTOOL="$LIBTOOL --silent"
|
||||
LIBTOOL="$LIBTOOL --silent"
|
||||
|
||||
AC_PROG_INSTALL
|
||||
|
||||
|
@ -219,12 +211,11 @@ CFLAGS="$STATVFS_DEF $CFLAGS"
|
|||
|
||||
dnl ts A91122
|
||||
AC_ARG_ENABLE(track-src-odirect,
|
||||
[ --enable-track-src-odirect Banned for now: (Enable use of O_DIRECT with track input, default=no)],
|
||||
[ --enable-track-src-odirect Enable use of O_DIRECT with track input, default=no],
|
||||
, enable_track_src_odirect=no)
|
||||
if test x$enable_track_src_odirect = xyes; then
|
||||
# LIBBURN_O_DIRECT_DEF="-DLibburn_read_o_direcT"
|
||||
# echo "enabled use of O_DIRECT with track input"
|
||||
echo "REFUSED to enable use of O_DIRECT with track input because of cdrskin multi-track bug"
|
||||
LIBBURN_O_DIRECT_DEF="-DLibburn_read_o_direcT"
|
||||
echo "enabled use of O_DIRECT with track input"
|
||||
else
|
||||
LIBBURN_O_DIRECT_DEF=
|
||||
echo "disabled use of O_DIRECT with track input"
|
||||
|
@ -248,14 +239,14 @@ CFLAGS="$LIBBURN_DVD_OBS_64K $CFLAGS"
|
|||
|
||||
dnl ts B20413
|
||||
AC_ARG_ENABLE(dvd-obs-pad,
|
||||
[ --enable-dvd-obs-pad pad DVD DAO sessions to 32 or 64 KB, default=no],
|
||||
[ --enable-dvd-obs-pad pad DVD DAO sessions to 32 resp. 64 KB, default=no],
|
||||
, enable_dvd_obs_pad=no)
|
||||
if test x$enable_dvd_obs_pad = xyes; then
|
||||
LIBBURN_DVD_OBS_PAD="-DLibburn_dvd_always_obs_paD"
|
||||
echo "enabled padding of DVD DAO sessions to 32 or 64 KB"
|
||||
echo "enabled padding of DVD DAO sessions to 32 resp. 64 KB"
|
||||
else
|
||||
LIBBURN_DVD_OBS_64K=
|
||||
echo "disabled padding of DVD DAO sessions to 32 or 64 KB"
|
||||
echo "disabled padding of DVD DAO sessions to 32 resp. 64 KB"
|
||||
fi
|
||||
CFLAGS="$LIBBURN_DVD_OBS_PAD $CFLAGS"
|
||||
|
||||
|
@ -304,10 +295,6 @@ else
|
|||
fi
|
||||
fi
|
||||
|
||||
dnl ts B70127
|
||||
# There are Linuxes with no public generic SCSI interface
|
||||
LIBBURNIA_CHECK_LINUX_SCSI
|
||||
|
||||
dnl ts B00704
|
||||
# Library versioning normally serves a complex purpose.
|
||||
# Since libburn obeys strict ABI backward compatibility, it needs only the
|
||||
|
@ -329,9 +316,6 @@ else
|
|||
echo "disabled strict symbol encapsulation"
|
||||
fi
|
||||
|
||||
# Check for system dependent mandatory libraries (LIBBURN_ARCH_LIBS)
|
||||
LIBBURNIA_CHECK_ARCH_LIBS(mandatory)
|
||||
|
||||
AC_ARG_ENABLE(ldconfig-at-install,
|
||||
[ --enable-ldconfig-at-install On GNU/Linux run ldconfig, default=yes],
|
||||
, ldconfig_at_install=yes)
|
||||
|
|
|
@ -195,7 +195,7 @@ as it is limited to 64 kB - 2.)
|
|||
|
||||
If a text of a track (pack types 0x80 to 0x85 and 0x8e) repeats identically
|
||||
for the next track, then it may be represented by a TAB character (ASCII 9)
|
||||
for single byte texts, and two TAB characters for double byte texts.
|
||||
for single byte texts, resp. two TAB characters for double byte texts.
|
||||
(This should be used because 256 * 12 bytes is few space for 99 tracks.)
|
||||
|
||||
The two binary bytes of pack type 0x87 are written to the first 0x87 pack of
|
||||
|
|
|
@ -11,7 +11,7 @@ For now this means CD-R, CD-RW, DVD-RAM, DVD+RW, DVD+R, DVD+R/DL, DVD-RW,
|
|||
DVD-R, DVD-R/DL, BD-R, BD-RE.
|
||||
|
||||
Our scope is currently Linux 2.4 and 2.6, FreeBSD, OpenSolaris, or NetBSD.
|
||||
For ports to other systems we would need : login on a development machine or
|
||||
For ports to other systems we would need : login on a development machine resp.
|
||||
an OS that is installable on an AMD 64-bit PC, advise from a system person
|
||||
about the equivalent of Linux sg or FreeBSD CAM, volunteers for testing of
|
||||
realistic use cases.
|
||||
|
@ -52,7 +52,7 @@ and execute
|
|||
|
||||
- make
|
||||
|
||||
To make the libraries accessible for running and developing applications
|
||||
To make the libraries accessible for running resp. developing applications
|
||||
|
||||
- make install
|
||||
|
||||
|
|
|
@ -618,7 +618,7 @@ BG Format 3 indicates fully formatted media.
|
|||
|
||||
DVD-RW reaches this state either by Format Type 00h (or 10h) with maximum
|
||||
size given as Number Of Blocks, or by writing sequentially until the disc is
|
||||
completely full into an intermediate session opened by format 15h or 13h.
|
||||
completely full into an intermediate session opened by format 15h resp. 13h.
|
||||
(mmc5r03c.pdf, 6.5 FORMAT UNIT, 6.5.4.2.1, 6.5.4.2.10, 6.5.4.2.8)
|
||||
A fully formatted DVD-RW can be recognized by 23h READ FORMAT CAPACITIES. The
|
||||
Descriptor Type of the Current/Maximum Capacity Descriptor is 10b ("Formatted
|
||||
|
@ -647,7 +647,7 @@ In the reply, BG Format 0 indicates unformatted media (or unsuitable media).
|
|||
(mmc5r03c.pdf 6.22.3.1.13)
|
||||
|
||||
Formatting has to be started by command 04h FORMAT UNIT, Format Type 26h.
|
||||
Different from other format types, 26h is allowed to send a fantasy size of
|
||||
Different from other format types, 26h allows to send a fantasy size of
|
||||
0xffffffff blocks and does not require the caller to know the exact maximum
|
||||
size offered with that format.
|
||||
(mmc5r03c.pdf, 6.5 FORMAT UNIT, 6.5.4.2.14 Format Type = 26h)
|
||||
|
@ -744,7 +744,7 @@ Elsewise the media is in Intermediate state. See below.
|
|||
A partly formatted DVD-RW can be recognized by 23h READ FORMAT CAPACITIES. The
|
||||
Descriptor Type of the Current/Maximum Capacity Descriptor is 10b ("Formatted
|
||||
Media") and the Number Of Blocks with formats 00h, 10h or 15h is larger than the
|
||||
currently formatted size, or more than 0 blocks are offered with Format
|
||||
currently formatted size, resp. more than 0 blocks are offered with Format
|
||||
Types 13h or 11h.
|
||||
(mmc5r03c.pdf, 6.24.3.2.1, 6.24.3.3)
|
||||
|
||||
|
@ -753,7 +753,7 @@ be unnecessary to do any further formatting.
|
|||
But in order to make the DVD-RW surely accept its maximum number of bytes,
|
||||
partial formatting may be expanded by command 04h FORMAT UNIT, Format Type 13h,
|
||||
which is supposed to be offered by the drive in this state. This brings the
|
||||
session again into Intermediate state and thus enables expansion by sequential
|
||||
session again into Intermediate state and thus allows expansion by sequential
|
||||
writing. As with Format Type 15h it is ok to set Number Of Blocks to 0, so that
|
||||
no fixed size formatting work is done and writing can begin soon after.
|
||||
(mmc5r03c.pdf, 6.5.4.2.8 Format Type = 13h)
|
||||
|
@ -803,8 +803,8 @@ Two format types are relevant for DVD-RAM : 00h and 01h.
|
|||
00h offers the default size format and usually a maximum payload size format.
|
||||
Even with that maximum size payload there is hardware defect management.
|
||||
(mmc5r03c.pdf 6.5.4.2.1.2)
|
||||
01h can convert payload capacity into spare blocks for defect management.
|
||||
There is no way to increase payload capacity by format 01h.
|
||||
01h allows to convert payload capacity into spare blocks for defect
|
||||
managment. There is no way to increase payload capacity by format 01h.
|
||||
(mmc5r03c.pdf 6.5.4.2.2.1)
|
||||
|
||||
With BD-RE there are three format types : 00h, 30h and 31h.
|
||||
|
@ -895,8 +895,7 @@ The term "superblock" shall depict the first 64 KiB after the sbsector address.
|
|||
|
||||
ISO 9660 multi-session depends on typical TOC information in two ways:
|
||||
It needs the superblock address MSC1 of the most recently recorded session and
|
||||
it needs the Next Writeable Address NWA for which to prepare the address
|
||||
offset.
|
||||
it needs the Next Writeable Address NWA for which to prepare the adress offset.
|
||||
|
||||
The following is learned from growisofs and from ECMA-119:
|
||||
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-119.pdf
|
||||
|
@ -979,10 +978,10 @@ DVD-RW Sequential Recording 0014h
|
|||
DVD-R/DL Sequential Recording 0015h (can only do single-session)
|
||||
|
||||
There are two approaches for writing to sequential DVD-R[W]: DAO and
|
||||
Incremental. Not all media and drives offer Incremental which can do
|
||||
Incremental. Not all media and drives offer Incremental which allows
|
||||
multi-session as with CD media and does not demand a predicted track size.
|
||||
DAO seems to be the older method. It can only write one single session and
|
||||
track, and it demands an exactly predicted track size.
|
||||
DAO seems to be the older method. It allows only one single session and
|
||||
track and it demands an exactly predicted track size.
|
||||
|
||||
- About overwriteable, blank, appendable and finalized DVD-R[W] media
|
||||
- Incremental writing
|
||||
|
@ -1026,7 +1025,7 @@ brings back this feature.
|
|||
-------------------------------------------------------------------------------
|
||||
Incremental writing :
|
||||
|
||||
Incremental writing can produce multi-session DVDs. It is indicated
|
||||
Incremental writing allows to produce multi-session DVDs. It is indicated
|
||||
by feature 0021h being marked current in the reply of 46h GET CONFIGURATION.
|
||||
growisofs inquires 0021h by setting Starting Feature Number to 0x21 and
|
||||
Allocation Length to 16 in order to get only this one. The feature descriptor
|
||||
|
@ -1043,8 +1042,8 @@ which are returned by ACh.
|
|||
|
||||
growisofs fetches a mode page 05h template by MODE SENSE and inserts its own
|
||||
parameters. It sets Multi-session to 11b, unless dvd_compat is nonzero.
|
||||
libburn composes its mode page 05h from zero and enables the application
|
||||
to control Multi-Session.
|
||||
libburn composes its mode page 05h from zero and allows control of
|
||||
Multi-Session by the application.
|
||||
BUFE Buffer Underrun protection 0=off, 1=on
|
||||
LS_V Link size valid 1=true
|
||||
Test Write -dummy mode for writing 0=off, 1=on
|
||||
|
@ -1457,7 +1456,7 @@ eventually RRM) chosen by the format sub-type:
|
|||
10b = (RRM)
|
||||
(mmc5r03c.pdf 6.5.4.2.1.6)
|
||||
|
||||
Format type 32h uses the same sub-types but can allocate non-default
|
||||
Format type 32h uses the same sub-types but allows to allocate non-default
|
||||
amounts of spares. Similar to BD-RE format 31h, three format descriptors are
|
||||
offered: #1: default size, #2: maximum spare area, #3: minimal spare.
|
||||
The size may be chosen within that range.
|
||||
|
|
|
@ -280,7 +280,7 @@ There are two classes of device specific suffixes:
|
|||
If a lockfile does not exist and cannot be created then this shall not keep
|
||||
a program from working on a device. But if a lockfile exists and if permissions
|
||||
or locking state do not allow to obtain a lock of the appropirate type, then
|
||||
this shall prevent any opening of device file in question and shall cause
|
||||
this shall prevent any opening of device file in question resp. shall cause
|
||||
immediate close(2) of an already opened device file.
|
||||
|
||||
The vulnerable programs shall not start their operation before they locked a
|
||||
|
@ -346,7 +346,7 @@ which keeps it from being the solution to all known legitimate use cases.
|
|||
The attempt has failed to compose a waterproof locking mechanism from means of
|
||||
POSIX, FHS and from hardly documented Linux open(O_EXCL) on device files.
|
||||
The resulting mechanisms would need about 1000 lines of code and still do
|
||||
not close all gaps and cover the well motivated use cases.
|
||||
not close all gaps resp. cover the well motivated use cases.
|
||||
This attempt you see above: DDLP-A and DDLP-B.
|
||||
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ PROJECT_LOGO =
|
|||
# If a relative path is entered, it will be relative to the location
|
||||
# where doxygen was started. If left blank the current directory will be used.
|
||||
|
||||
OUTPUT_DIRECTORY =
|
||||
OUTPUT_DIRECTORY = @abs_top_builddir@
|
||||
|
||||
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
|
||||
# 4096 sub-directories (in 2 levels) under the output directory of each output
|
||||
|
@ -963,7 +963,7 @@ HTML_COLORSTYLE_GAMMA = 80
|
|||
# page will contain the date and time when the page was generated. Setting
|
||||
# this to NO can help when comparing the output of multiple runs.
|
||||
|
||||
HTML_TIMESTAMP = NO
|
||||
HTML_TIMESTAMP = YES
|
||||
|
||||
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
|
||||
# documentation will contain sections that can be hidden and shown after the
|
||||
|
@ -1477,6 +1477,18 @@ GENERATE_XML = NO
|
|||
|
||||
XML_OUTPUT = xml
|
||||
|
||||
# The XML_SCHEMA tag can be used to specify an XML schema,
|
||||
# which can be used by a validating XML parser to check the
|
||||
# syntax of the XML files.
|
||||
|
||||
XML_SCHEMA =
|
||||
|
||||
# The XML_DTD tag can be used to specify an XML DTD,
|
||||
# which can be used by a validating XML parser to check the
|
||||
# syntax of the XML files.
|
||||
|
||||
XML_DTD =
|
||||
|
||||
# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
|
||||
# dump the program listings (including syntax highlighting
|
||||
# and cross-referencing information) to the XML output. Note that
|
||||
|
|
|
@ -34,7 +34,7 @@ CD-ROM media (0x08) cannot be inquired by command 43h READ TOC/PMA/ATIP.
|
|||
in 6.26.3.6 Response Format 0100b: ATIP.
|
||||
The minute, second, and frame number of lead-in can be read from byte 4 to 6
|
||||
of the ATIP descriptor. The lead-out bytes are at position 8 to 10. The ATIP
|
||||
descriptor is preceded by a four byte header.
|
||||
descriptor is preceeded by a four byte header.
|
||||
|
||||
I could not find out yet whether (lead-in,lead-out) is mandatorily unique for
|
||||
each particular media product.
|
||||
|
@ -176,7 +176,7 @@ BD-R and BD-RE:
|
|||
printf (" Media ID: %6.6s/%-3.3s\n",di+4+100,di+4+106);
|
||||
= MMC-5 6.23.3.3.1 Format Code 00h: Disc Information (DI)
|
||||
Table 288 says that Media Type Code (byte 1 of CDB) for BD media is 1.
|
||||
Table 446 says that Disc Information is preceded by 4 bytes of header.
|
||||
Table 446 says that Disc Information is preceeded by 4 bytes of header.
|
||||
Table 448 says that bytes 0 to 1 are Disc Information Identifier "DI".
|
||||
that bytes 8 to 10 are Disc Type Identifier
|
||||
BDO for BD-ROM, BDW for BD-RE,
|
||||
|
@ -1036,9 +1036,6 @@ MEI T02 Panasonic Corporation 1-4X HTL 12cm [Blu]
|
|||
MEI 00V001 MATSUSHITA EI 2X [Hij]
|
||||
MEI 00V002 MATSUSHITA EI 4X [Hij]
|
||||
|
||||
"Millenniata Inc."
|
||||
MILLENMR MR1 Verbatim M-DISC 4x 25 GB (user reported)
|
||||
|
||||
"Mitsubishi Kagaku Media Co."
|
||||
MKM 001 MKM 6X [Hij]
|
||||
MKM 003 MKM 8X [Hij]
|
||||
|
@ -1080,7 +1077,6 @@ OTCBRE 001 Optodisc Technology Corporation 1-2X HTL 25GB (12cm) [Blu]
|
|||
"Moser Baer India Limited"
|
||||
PHILIP R02 Moser Baer India Ltd 1-2X HTL 25GB [Blu]
|
||||
PHILIP R04 Moser Baer India Ltd 1-4X HTL 25GB [Blu]
|
||||
PHILIPR0 R04 TDK 4x 25 GB (own buy)
|
||||
PHILIP W02 Moser Baer India Ltd 1-2X HTL 25GB [Blu]
|
||||
|
||||
"Philips"
|
||||
|
|
|
@ -1,84 +0,0 @@
|
|||
|
||||
Sound extraction for CD-DA burning from .WAV audio file format
|
||||
|
||||
Using information and text snippets
|
||||
from https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
|
||||
in may 2013. The link is now dead. An apparent copy of the page
|
||||
is 2017 at: http://soundfile.sapp.org/doc/WaveFormat/
|
||||
from https://en.wikipedia.org/wiki/WAV
|
||||
|
||||
For libburnia-project.org by Thomas Schmitt <scdbackup@gmx.net>
|
||||
December 2017
|
||||
|
||||
|
||||
The WAVE file format is an application of the Microsoft RIFF container format
|
||||
for multimedia files. A RIFF file consists of Chunks which contain Subchunks.
|
||||
The Chunks form a linked list within the file, the Subchunks form a linked
|
||||
list inside their Chunk.
|
||||
All numbers are stored in little-endian byte order.
|
||||
|
||||
A .WAV file consists at least of one Chunk with id "RIFF", which contains
|
||||
one Subchunk with id "fmt " and one with id "data":
|
||||
|
||||
Offset Size Name Description
|
||||
|
||||
0 4 ChunkID Contains the letters "RIFF"
|
||||
4 4 ChunkSize The size of the rest of the chunk following
|
||||
this field. I.e. the two fields ChunkID and
|
||||
ChunkSize are not included in this count.
|
||||
8 4 Format Contains the letters "WAVE"
|
||||
|
||||
|
||||
The "fmt " subchunk describes the sound data's format:
|
||||
|
||||
Offset Size Name Description
|
||||
|
||||
0 4 Subchunk1ID Contains the letters "fmt "
|
||||
|
||||
4 4 Subchunk1Size The size of the rest of the Subchunk following
|
||||
this field. I.e. Subchunk1ID and Subchunk1Size
|
||||
are not included in this count.
|
||||
8 2 AudioFormat PCM = 1 (i.e. Linear quantization)
|
||||
Values other than 1 indicate some
|
||||
form of compression.
|
||||
10 2 NumChannels Mono = 1, Stereo = 2, etc.
|
||||
12 4 SampleRate 8000, 44100, etc.
|
||||
16 4 ByteRate == SampleRate * NumChannels * BitsPerSample/8
|
||||
20 2 BlockAlign == NumChannels * BitsPerSample/8
|
||||
The number of bytes for one sample including
|
||||
all channels.
|
||||
22 2 BitsPerSample 8 bits = 8, 16 bits = 16, etc.
|
||||
More data may follow in this Subchunk if AudioFormat is not PCM.
|
||||
|
||||
|
||||
The "data" subchunk contains the size of the data and the actual sound:
|
||||
|
||||
Offset Size Name Description
|
||||
|
||||
0 4 Subchunk2ID Contains the letters "data"
|
||||
|
||||
4 4 Subchunk2Size == NumSamples * NumChannels * BitsPerSample/8
|
||||
The number of audio data bytes.
|
||||
8 * Data The audio data bytes.
|
||||
|
||||
|
||||
CD-DA prescribes these "fmt " parameters:
|
||||
AudioFormat == 1
|
||||
SampleRate == 44100
|
||||
BitsPerSample == 16
|
||||
NumChannels == 2 (stereo)
|
||||
(little-endian byte order)
|
||||
|
||||
If matching parameters are given in the .WAV file, one can directly use the
|
||||
data bytes of Subchunk "data" as payload for burning a CD-DA track.
|
||||
|
||||
|
||||
Above simple form can be expanded by other Chunks or Subchunks of Chunk "RIFF".
|
||||
A .wav file appeared which beared a Subchunk "LIST" inside Chunk "RIFF".
|
||||
Wikipedia mentions Chunks "INFO", "CSET", "JUNK", "PAD ".
|
||||
|
||||
Therefore one should expect such Chunks before Chunk "RIFF" and Subchunks
|
||||
other than "fmt " and "data" inside the "RIFF" Chunk.
|
||||
Multiple Chunks "RIFF" and Subchunks "fmt " or "data" per file have not been
|
||||
seen yet. They would make extraction more cumbersome.
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -122,44 +122,6 @@ struct w_list
|
|||
|
||||
static struct w_list *workers = NULL;
|
||||
|
||||
static void *fifo_worker_func(struct w_list *w);
|
||||
|
||||
|
||||
int burn_async_manage_lock(int mode)
|
||||
{
|
||||
int ret;
|
||||
|
||||
static pthread_mutex_t access_lock;
|
||||
static int mutex_initialized = 0;
|
||||
static int mutex_locked = 0;
|
||||
|
||||
if (mode == BURN_ASYNC_LOCK_INIT) {
|
||||
if (mutex_initialized)
|
||||
return 2;
|
||||
ret = pthread_mutex_init(&access_lock, NULL);
|
||||
if (ret != 0)
|
||||
return 0;
|
||||
mutex_initialized = 1;
|
||||
return 1;
|
||||
}
|
||||
if (!mutex_initialized)
|
||||
return 0;
|
||||
if (mode == BURN_ASYNC_LOCK_OBTAIN) {
|
||||
ret = pthread_mutex_lock(&access_lock);
|
||||
if (ret != 0)
|
||||
return 0;
|
||||
mutex_locked = 1;
|
||||
} else if (mode == BURN_ASYNC_LOCK_RELEASE) {
|
||||
if (!mutex_locked)
|
||||
return 2;
|
||||
ret = pthread_mutex_unlock(&access_lock);
|
||||
if (ret != 0)
|
||||
return 0;
|
||||
mutex_locked = 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static struct w_list *find_worker(struct burn_drive *d)
|
||||
{
|
||||
|
@ -187,8 +149,9 @@ static void add_worker(int w_type, struct burn_drive *d,
|
|||
a->drive = d;
|
||||
|
||||
a->u = *data;
|
||||
|
||||
burn_async_manage_lock(BURN_ASYNC_LOCK_INIT);
|
||||
/*
|
||||
memcpy(&(a->u), data, sizeof(union w_list_data));
|
||||
*/
|
||||
|
||||
/* insert at front of the list */
|
||||
a->next = workers;
|
||||
|
@ -199,7 +162,6 @@ static void add_worker(int w_type, struct burn_drive *d,
|
|||
d->busy = BURN_DRIVE_SPAWNING;
|
||||
|
||||
#ifdef Libburn_create_detached_threadS
|
||||
|
||||
/* ts A71019 :
|
||||
Trying to start the threads detached to get rid of the zombies
|
||||
which do neither react on pthread_join() nor on pthread_detach().
|
||||
|
@ -207,12 +169,12 @@ static void add_worker(int w_type, struct burn_drive *d,
|
|||
pthread_attr_init(&attr);
|
||||
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
|
||||
attr_pt= &attr;
|
||||
|
||||
#endif /* Libburn_create_detached_threadS */
|
||||
|
||||
/* Worker specific locks are to be released early by the worker */
|
||||
if (f == (WorkerFunc) fifo_worker_func)
|
||||
burn_async_manage_lock(BURN_ASYNC_LOCK_OBTAIN);
|
||||
/*
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00020158,
|
||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_LOW,
|
||||
"add_worker(): Creating detached thread.", 0, 0);
|
||||
*/
|
||||
#endif
|
||||
|
||||
if (pthread_create(&a->thread, attr_pt, f, a)) {
|
||||
free(a);
|
||||
|
@ -279,7 +241,7 @@ static void *scan_worker_func(struct w_list *w)
|
|||
}
|
||||
|
||||
static void reset_progress(struct burn_drive *d, int sessions, int tracks,
|
||||
int indices, off_t sectors, int flag)
|
||||
int indices, int sectors, int flag)
|
||||
{
|
||||
/* reset the progress indicator */
|
||||
d->progress.session = 0;
|
||||
|
@ -309,7 +271,7 @@ int burn_drive_scan(struct burn_drive_info *drives[], unsigned int *n_drives)
|
|||
return -1;
|
||||
}
|
||||
|
||||
/* cannot be anything working! */
|
||||
/* cant be anything working! */
|
||||
|
||||
/* ts A61006 */
|
||||
/* a ssert(!(workers && workers->drive)); */
|
||||
|
@ -412,14 +374,14 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
|
|||
return;
|
||||
}
|
||||
|
||||
reset_progress(drive, 1, 1, 1, (off_t) 0x10000, 0);
|
||||
reset_progress(drive, 1, 1, 1, 0x10000, 0);
|
||||
|
||||
/* A70103 : will be set to 0 by burn_disc_erase_sync() */
|
||||
drive->cancel = 1;
|
||||
|
||||
/* ts A70103 moved up from burn_disc_erase_sync() */
|
||||
/* ts A60825 : allow on parole to blank appendable CDs */
|
||||
/* ts A70131 : allow blanking of overwritable DVD-RW (profile 0x13) */
|
||||
/* ts A70131 : allow blanking of overwriteable DVD-RW (profile 0x13) */
|
||||
/* ts A70216 : allow blanking of CD-RW or DVD-RW in any regular state
|
||||
and of any kind of full media */
|
||||
/* ts A70909 : the willingness to burn any BURN_DISC_FULL media is
|
||||
|
@ -494,7 +456,7 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag)
|
|||
int ok = 0, ret;
|
||||
char msg[40];
|
||||
|
||||
reset_progress(drive, 1, 1, 1, (off_t) 0x10000, 0);
|
||||
reset_progress(drive, 1, 1, 1, 0x10000, 0);
|
||||
|
||||
if ((SCAN_GOING()) || find_worker(drive) != NULL) {
|
||||
libdax_msgs_submit(libdax_messenger, drive->global_index,
|
||||
|
@ -652,7 +614,7 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
|||
}
|
||||
|
||||
reset_progress(d, disc->sessions, disc->session[0]->tracks,
|
||||
disc->session[0]->track[0]->indices, (off_t) 0, 0);
|
||||
disc->session[0]->track[0]->indices, 0, 0);
|
||||
|
||||
/* For the next lines any return indicates failure */
|
||||
d->cancel = 1;
|
||||
|
@ -742,6 +704,7 @@ ex:;
|
|||
|
||||
static void *fifo_worker_func(struct w_list *w)
|
||||
{
|
||||
int old;
|
||||
|
||||
#define Libburn_protect_fifo_threaD 1
|
||||
|
||||
|
@ -755,6 +718,10 @@ static void *fifo_worker_func(struct w_list *w)
|
|||
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());
|
||||
|
||||
|
@ -797,19 +764,18 @@ int burn_fifo_abort(struct burn_source_fifo *fs, int flag)
|
|||
int ret;
|
||||
pthread_t pt;
|
||||
|
||||
burn_async_manage_lock(BURN_ASYNC_LOCK_OBTAIN);
|
||||
if (fs->thread_is_valid <= 0 || fs->thread_handle == NULL)
|
||||
return(2);
|
||||
|
||||
if (fs->thread_is_valid <= 0 || fs->thread_handle == NULL) {
|
||||
burn_async_manage_lock(BURN_ASYNC_LOCK_RELEASE);
|
||||
return 2;
|
||||
}
|
||||
pt = *((pthread_t *) fs->thread_handle);
|
||||
|
||||
burn_async_manage_lock(BURN_ASYNC_LOCK_RELEASE);
|
||||
|
||||
fs->do_abort = 1;
|
||||
ret = pthread_join(pt, NULL);
|
||||
#ifdef NIX
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
|
||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Aborting running burn_source_fifo thread", 0, 0);
|
||||
#endif /* NIX */
|
||||
|
||||
pt= *((pthread_t *) fs->thread_handle);
|
||||
remove_worker(pt);
|
||||
ret = pthread_cancel(pt);
|
||||
return (ret == 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 - 2017 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifndef BURN__ASYNC_H
|
||||
#define BURN__ASYNC_H
|
||||
|
||||
|
@ -19,10 +14,5 @@ int burn_fifo_start(struct burn_source *source, int flag);
|
|||
/* To abort a running fifo thread before the fifo object gets deleted */
|
||||
int burn_fifo_abort(struct burn_source_fifo *fs, int flag);
|
||||
|
||||
/* ts B70126 */
|
||||
#define BURN_ASYNC_LOCK_RELEASE 0
|
||||
#define BURN_ASYNC_LOCK_OBTAIN 1
|
||||
#define BURN_ASYNC_LOCK_INIT 2
|
||||
int burn_async_manage_lock(int mode);
|
||||
|
||||
#endif /* BURN__ASYNC_H */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
/* Copyright (c) 2011 - 2016 Thomas Schmitt <scdbackup@gmx.net>
|
||||
/* Copyright (c) 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -77,7 +77,7 @@ int burn_create_new_pack(int pack_type, int track_no, int double_byte,
|
|||
|
||||
|
||||
/* Plain implementation of polynomial division on a Galois field, where
|
||||
addition and subtraction both are binary exor. Euclidean algorithm.
|
||||
addition and subtraction both are binary exor. Euclidian algorithm.
|
||||
Divisor is x^16 + x^12 + x^5 + 1 = 0x11021.
|
||||
*/
|
||||
static int crc_11021(unsigned char *data, int count, int flag)
|
||||
|
@ -1085,7 +1085,6 @@ int burn_cdtext_from_packfile(char *path, unsigned char **text_packs,
|
|||
|
||||
BURN_ALLOC_MEM(msg, char, 4096);
|
||||
|
||||
*text_packs = NULL;
|
||||
if (stat(path, &stbuf) == -1) {
|
||||
cannot_open:;
|
||||
sprintf(msg, "Cannot open CD-TEXT pack file '%.4000s'", path);
|
||||
|
@ -1137,14 +1136,7 @@ cannot_read:;
|
|||
path);
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x0002018b,
|
||||
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
burn_printify(msg), 0, 0);
|
||||
ret = 0; goto ex;
|
||||
} if (*num_packs <= 0) {
|
||||
strcpy(msg,
|
||||
"CD-Text pack file contains no complete text pack");
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x000201aa,
|
||||
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
burn_printify(msg), 0, 0);
|
||||
burn_printify(msg), errno, 0);
|
||||
ret = 0; goto ex;
|
||||
}
|
||||
|
||||
|
@ -1259,7 +1251,7 @@ static int collect_payload(unsigned char *text_packs, int num_packs,
|
|||
break;
|
||||
memcpy(*payload + *payload_count, pack + 4, 12);
|
||||
*payload_count += 12;
|
||||
if (pack[3] & 128)
|
||||
if (pack[4] & 128)
|
||||
double_byte = 1;
|
||||
}
|
||||
(*payload)[*payload_count] = 0;
|
||||
|
@ -1620,7 +1612,7 @@ static int burn_make_v07t(unsigned char *text_packs, int num_packs,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Obtain first_tno and last_tno from type 0x8f if present. */
|
||||
/* Obtain first_tno and last_tno from type 0x88 if present. */
|
||||
if (first_tno <= 0) {
|
||||
if (pack[5] > 0 && pack[5] + pack[6] < 100 &&
|
||||
pack[5] <= pack[6]) {
|
||||
|
@ -1647,21 +1639,6 @@ static int burn_make_v07t(unsigned char *text_packs, int num_packs,
|
|||
/* Report content */
|
||||
result_size = 0;
|
||||
for (block = 0; block < 8; block++) {
|
||||
/* Obtain character code, reject unknown ones */
|
||||
ret = search_pack(text_packs, num_packs, 0, 0x8f, block,
|
||||
&pack, &pack_no, 0);
|
||||
if (ret > 0)
|
||||
*char_code = pack[4];
|
||||
if (*char_code != 0x00 && *char_code != 0x01 &&
|
||||
*char_code != 0x80) {
|
||||
sprintf(msg,
|
||||
"CD-TEXT block %d with unknown character code %2.2x",
|
||||
block, (unsigned int) *char_code);
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x0002019f,
|
||||
LIBDAX_MSGS_SEV_FAILURE,
|
||||
LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
ret = report_block(text_packs, num_packs, block,
|
||||
first_tno, last_tno, *char_code,
|
||||
result, result_size, flag & 1);
|
||||
|
@ -1671,7 +1648,16 @@ static int burn_make_v07t(unsigned char *text_packs, int num_packs,
|
|||
continue;
|
||||
result_size = ret;
|
||||
}
|
||||
|
||||
#ifdef NIX
|
||||
if (flag & 1)
|
||||
return result_size;
|
||||
return (int) strlen((char *) result);
|
||||
#else /* NIX */
|
||||
|
||||
return result_size;
|
||||
|
||||
#endif /* ! NIX */
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
of two elements "GF(2)". If bytes 0 .. M are given, then bit n of byte m
|
||||
is mapped to the coefficient of x exponent (n + ((M - m) * 8) + 16).
|
||||
I.e. they translate the bits into a polynomial with the highest bit
|
||||
becoming the coefficient of the highest power of x. Then this polynomial
|
||||
becomming the coefficient of the highest power of x. Then this polynomial
|
||||
is multiplied by (x exp 16).
|
||||
|
||||
The set of all such polynomials forms a commutative ring. Its addition
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
-DDDLPA_C_STANDALONE -o ddlpa ddlpa.c
|
||||
|
||||
The system macros enable 64-bit off_t and open(2) flag O_LARGEFILE, which
|
||||
are not absolutely necessary but explicitly take into respect that
|
||||
are not absolutely necessary but explicitely take into respect that
|
||||
our devices can offer more than 2 GB of addressable data.
|
||||
|
||||
Run test program:
|
||||
|
|
477
libburn/drive.c
477
libburn/drive.c
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -58,9 +58,6 @@
|
|||
/* A90815 : for mmc_obtain_profile_name() */
|
||||
#include "mmc.h"
|
||||
|
||||
/* B60730 : for Libburn_do_no_immed_defaulT */
|
||||
#include "os.h"
|
||||
|
||||
#include "libdax_msgs.h"
|
||||
extern struct libdax_msgs *libdax_messenger;
|
||||
|
||||
|
@ -91,18 +88,7 @@ int burn_setup_drive(struct burn_drive *d, char *fname)
|
|||
d->do_stream_recording = 0;
|
||||
d->stream_recording_start= 0;
|
||||
d->role_5_nwa = 0;
|
||||
|
||||
#ifdef Libburn_do_no_immed_defaulT
|
||||
d->do_no_immed = Libburn_do_no_immed_defaulT;
|
||||
#else
|
||||
d->do_no_immed = 0;
|
||||
#endif
|
||||
|
||||
d->features = NULL;
|
||||
d->drive_serial_number = NULL;
|
||||
d->drive_serial_number_len = -1;
|
||||
d->media_serial_number = NULL;
|
||||
d->media_serial_number_len = -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -128,10 +114,6 @@ void burn_drive_free_subs(struct burn_drive *d)
|
|||
close (d->stdio_fd);
|
||||
d->stdio_fd = -1;
|
||||
burn_feature_descr_free(&(d->features), 0);
|
||||
BURN_FREE_MEM(d->drive_serial_number);
|
||||
BURN_FREE_MEM(d->media_serial_number);
|
||||
d->drive_serial_number = d->media_serial_number = NULL;
|
||||
d->drive_serial_number_len = d->media_serial_number_len = 0;
|
||||
sg_dispose_drive(d, 0);
|
||||
}
|
||||
|
||||
|
@ -191,7 +173,7 @@ int burn_drive_is_released(struct burn_drive *d)
|
|||
/* ts A60906 */
|
||||
/** Inquires drive status in respect to degree of app usage.
|
||||
@param return -2 = drive is forgotten
|
||||
-1 = drive is closed (i.e. released explicitly)
|
||||
-1 = drive is closed (i.e. released explicitely)
|
||||
0 = drive is open, not grabbed (after scan, before 1st grab)
|
||||
1 = drive is grabbed but BURN_DRIVE_IDLE
|
||||
2 = drive is grabbed, synchronous read/write interrupted
|
||||
|
@ -287,7 +269,7 @@ int burn_drive_inquire_media(struct burn_drive *d)
|
|||
|
||||
/* ts A61020 : d->status was set to BURN_DISC_BLANK as pure guess */
|
||||
|
||||
/* ts A71128 : run read_disc_info() for any recognizable profile */
|
||||
/* ts A71128 : run read_disc_info() for any recognizeable profile */
|
||||
if (d->current_profile > 0 || d->current_is_guessed_profile ||
|
||||
(d->mdata->p2a_valid > 0 &&
|
||||
(d->mdata->cdr_write || d->mdata->cdrw_write ||
|
||||
|
@ -375,8 +357,8 @@ static int burn_drive__is_rdwr(char *fname, int *stat_ret,
|
|||
else if (is_rdwr)
|
||||
ret = burn_os_stdio_capacity(fname, 0, &read_size);
|
||||
if (ret <= 0 ||
|
||||
read_size >= BURN_DRIVE_MAX_BYTES)
|
||||
read_size = BURN_DRIVE_MAX_BYTES;
|
||||
read_size / (off_t) 2048 >= (off_t) 0x7ffffff0)
|
||||
read_size = (off_t) 0x7ffffff0 * (off_t) 2048;
|
||||
}
|
||||
|
||||
if (is_rdwr && fd >= 0) {
|
||||
|
@ -429,7 +411,6 @@ int burn_drive_grab_stdio(struct burn_drive *d, int flag)
|
|||
/* despite its name : last valid address, not size */
|
||||
d->media_read_capacity =
|
||||
read_size / 2048 - !(read_size % 2048);
|
||||
d->mr_capacity_trusted = 1;
|
||||
if ((stat_ret == -1 || is_rdwr) && d->devname[0]) {
|
||||
ret = burn_os_stdio_capacity(d->devname, 0, &size);
|
||||
if (ret > 0)
|
||||
|
@ -451,10 +432,10 @@ int burn_drive_grab_stdio(struct burn_drive *d, int flag)
|
|||
if (stat_ret != -1 && S_ISREG(stbuf.st_mode) &&
|
||||
stbuf.st_size > 0) {
|
||||
d->status = BURN_DISC_APPENDABLE;
|
||||
if (stbuf.st_size >= BURN_DRIVE_MAX_BYTES) {
|
||||
if (stbuf.st_size / (off_t) 2048
|
||||
>= 0x7ffffff0) {
|
||||
d->status = BURN_DISC_FULL;
|
||||
d->role_5_nwa = (off_t) BURN_DRIVE_MAX_BYTES /
|
||||
(off_t) 2048;
|
||||
d->role_5_nwa = 0x7ffffff0;
|
||||
} else
|
||||
d->role_5_nwa = stbuf.st_size / 2048 +
|
||||
!!(stbuf.st_size % 2048);
|
||||
|
@ -556,9 +537,6 @@ struct burn_drive *burn_drive_register(struct burn_drive *d)
|
|||
d->thread_pid = 0;
|
||||
d->thread_pid_valid = 0;
|
||||
memset(&(d->thread_tid), 0, sizeof(d->thread_tid));
|
||||
d->medium_state_changed = 0;
|
||||
d->set_streaming_exact_bit = 0;
|
||||
d->set_streaming_err = 0;
|
||||
d->toc_entries = 0;
|
||||
d->toc_entry = NULL;
|
||||
d->disc = NULL;
|
||||
|
@ -726,14 +704,6 @@ int burn_drive_release_fl(struct burn_drive *d, int flag)
|
|||
}
|
||||
|
||||
d->needs_sync_cache = 0; /* just to be sure */
|
||||
|
||||
if (d->drive_serial_number != NULL)
|
||||
BURN_FREE_MEM(d->drive_serial_number);
|
||||
if (d->media_serial_number != NULL)
|
||||
BURN_FREE_MEM(d->media_serial_number);
|
||||
d->drive_serial_number = d->media_serial_number = NULL;
|
||||
d->drive_serial_number_len = d->media_serial_number_len = 0;
|
||||
|
||||
d->released = 1;
|
||||
|
||||
/* ts A61125 : outsourced model aspects */
|
||||
|
@ -886,7 +856,6 @@ void burn_disc_erase_sync(struct burn_drive *d, int fast)
|
|||
d->progress.sector = 0;
|
||||
#endif /* Libburn_reset_progress_asynC */
|
||||
|
||||
d->medium_state_changed = 1;
|
||||
d->erase(d, fast);
|
||||
d->busy = BURN_DRIVE_ERASING;
|
||||
|
||||
|
@ -902,12 +871,6 @@ void burn_disc_erase_sync(struct burn_drive *d, int fast)
|
|||
#else /* Libburn_old_progress_looP */
|
||||
|
||||
while (1) {
|
||||
|
||||
/* >>> ??? ts B60730 : abort if user interrupts ?
|
||||
if (d->cancel)
|
||||
break;
|
||||
*/
|
||||
|
||||
ret = d->get_erase_progress(d);
|
||||
if (ret == -2 || ret > 0)
|
||||
break;
|
||||
|
@ -916,12 +879,6 @@ void burn_disc_erase_sync(struct burn_drive *d, int fast)
|
|||
sleep(1);
|
||||
}
|
||||
while (1) {
|
||||
|
||||
/* >>> ??? ts B60730 : abort if user interrupts ?
|
||||
if (d->cancel)
|
||||
break;
|
||||
*/
|
||||
|
||||
ret = d->get_erase_progress(d);
|
||||
if(ret == -2)
|
||||
break;
|
||||
|
@ -938,7 +895,7 @@ void burn_disc_erase_sync(struct burn_drive *d, int fast)
|
|||
|
||||
/* ts A61125 : update media state records */
|
||||
burn_drive_mark_unready(d, 0);
|
||||
if (d->drive_role == 1 && !d->cancel)
|
||||
if (d->drive_role == 1)
|
||||
burn_drive_inquire_media(d);
|
||||
d->busy = BURN_DRIVE_IDLE;
|
||||
if (was_error)
|
||||
|
@ -976,7 +933,6 @@ void burn_disc_format_sync(struct burn_drive *d, off_t size, int flag)
|
|||
stages = 1 + ((flag & 1) && size > 1024 * 1024);
|
||||
d->cancel = 0;
|
||||
d->busy = BURN_DRIVE_FORMATTING;
|
||||
d->medium_state_changed = 1;
|
||||
|
||||
ret = d->format_unit(d, size, flag & 0xfff6); /* forward bits */
|
||||
if (ret <= 0)
|
||||
|
@ -1136,13 +1092,12 @@ int burn_disc_erasable(struct burn_drive *d)
|
|||
{
|
||||
return d->erasable;
|
||||
}
|
||||
|
||||
|
||||
void burn_drive_get_status_sig_handling(void)
|
||||
enum burn_drive_status burn_drive_get_status(struct burn_drive *d,
|
||||
struct burn_progress *p)
|
||||
{
|
||||
/* --- Part of asynchronous signal handling --- */
|
||||
/* The frequently used call burn_drive_get_status*() may be used
|
||||
to react on messages from the libburn built-in signal handler.
|
||||
/* This frequently used call may be used to react on messages from
|
||||
the libburn built-in signal handler.
|
||||
*/
|
||||
|
||||
/* ts B00225 :
|
||||
|
@ -1166,112 +1121,24 @@ void burn_drive_get_status_sig_handling(void)
|
|||
}
|
||||
|
||||
/* --- End of asynchronous signal handling --- */
|
||||
}
|
||||
|
||||
|
||||
enum burn_drive_status burn_drive_get_status(struct burn_drive *d,
|
||||
struct burn_progress *p)
|
||||
{
|
||||
burn_drive_get_status_sig_handling();
|
||||
|
||||
if (p != NULL) {
|
||||
memcpy(p, &(d->progress), sizeof(struct burn_progress));
|
||||
/* TODO: add mutex */
|
||||
|
||||
p->sessions = d->progress.sessions;
|
||||
p->session = d->progress.session;
|
||||
p->tracks = d->progress.tracks;
|
||||
p->track = d->progress.track;
|
||||
p->indices = d->progress.indices;
|
||||
p->index = d->progress.index;
|
||||
if(d->progress.start_sector < 0x80000000)
|
||||
p->start_sector = d->progress.start_sector;
|
||||
else
|
||||
p->start_sector = 0x7fffffff;
|
||||
if(d->progress.sectors < 0x80000000)
|
||||
p->sectors = d->progress.sectors;
|
||||
else
|
||||
p->sectors = 0x7fffffff;
|
||||
if(d->progress.sector < 0x80000000)
|
||||
p->sector = d->progress.sector;
|
||||
else
|
||||
p->sector = 0x7fffffff;
|
||||
if(d->progress.buffer_capacity < 0x100000000)
|
||||
p->buffer_capacity = d->progress.buffer_capacity;
|
||||
else
|
||||
p->buffer_capacity = 0xffffffff;
|
||||
if(d->progress.buffer_available < 0x100000000)
|
||||
p->buffer_available = d->progress.buffer_available;
|
||||
else
|
||||
p->buffer_available = 0xffffffff;
|
||||
p->buffered_bytes = d->progress.buffered_bytes;
|
||||
if(d->progress.buffer_min_fill < 0x100000000)
|
||||
p->buffer_min_fill = d->progress.buffer_min_fill;
|
||||
else
|
||||
p->buffer_min_fill = 0xffffffff;
|
||||
}
|
||||
return d->busy;
|
||||
}
|
||||
|
||||
|
||||
enum burn_drive_status burn_drive_get_status_v2(struct burn_drive *d,
|
||||
struct burn_progress_v2 *p)
|
||||
{
|
||||
burn_drive_get_status_sig_handling();
|
||||
if (p != NULL) {
|
||||
/* TODO: add mutex */
|
||||
|
||||
memcpy(p, &(d->progress), sizeof(struct burn_progress_v2));
|
||||
}
|
||||
return d->busy;
|
||||
}
|
||||
|
||||
|
||||
int burn_drive_set_stream_recording(struct burn_drive *d, int recmode,
|
||||
int start, int flag)
|
||||
{
|
||||
#ifndef Libburn_force_stream_recordinG
|
||||
struct burn_feature_descr *descr;
|
||||
#endif
|
||||
|
||||
if (recmode == 1) {
|
||||
|
||||
#ifdef Libburn_force_stream_recordinG
|
||||
|
||||
if (recmode == 1)
|
||||
d->do_stream_recording = 1;
|
||||
|
||||
#else /* Libburn_force_stream_recordinG */
|
||||
|
||||
else if (recmode == -1)
|
||||
d->do_stream_recording = 0;
|
||||
if (burn_drive_has_feature(d, 0x107, &descr, 0)) {
|
||||
if ((descr->data[0] & 1) && (descr->flags & 1))
|
||||
d->do_stream_recording = 1;
|
||||
}
|
||||
if (!d->do_stream_recording) {
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x000201ac,
|
||||
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Drive currently does not offer Stream Recording",
|
||||
0, 0);
|
||||
} else if (d->current_profile != 0x12 &&
|
||||
d->current_profile != 0x41 &&
|
||||
d->current_profile != 0x43) {
|
||||
d->do_stream_recording = 0;
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x000201ad,
|
||||
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Stream Recording suppressed due to medium type",
|
||||
0, 0);
|
||||
}
|
||||
|
||||
#endif /* ! Libburn_force_stream_recordinG */
|
||||
|
||||
} else if (recmode == -1) {
|
||||
d->do_stream_recording = 0;
|
||||
}
|
||||
if (d->do_stream_recording)
|
||||
d->stream_recording_start = start;
|
||||
else
|
||||
d->stream_recording_start = 0;
|
||||
d->stream_recording_start = start;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
@ -1383,7 +1250,7 @@ static int drive_getcaps(struct burn_drive *d, struct burn_drive_info *out)
|
|||
|
||||
/* ts A91112 */
|
||||
/* Set default block types. The call d->probe_write_modes() is quite
|
||||
obtrusive. It may be performed explicitly by new API call
|
||||
obtrusive. It may be performed explicitely by new API call
|
||||
burn_drive_probe_cd_write_modes().
|
||||
*/
|
||||
if (out->write_dvdram || out->write_dvdr ||
|
||||
|
@ -1482,7 +1349,7 @@ int burn_drive_scan_sync(struct burn_drive_info *drives[],
|
|||
|
||||
*n_drives = 0;
|
||||
|
||||
/* ts A70907 : whether to scan from scratch or to extend */
|
||||
/* ts A70907 : wether to scan from scratch or to extend */
|
||||
for (i = 0; i < (int) sizeof(scanned); i++)
|
||||
scanned[i] = 0;
|
||||
if (flag & 1) {
|
||||
|
@ -1615,7 +1482,7 @@ void burn_drive_info_free(struct burn_drive_info drive_infos[])
|
|||
|
||||
/* ts A60904 : This looks a bit weird. [ts A70907 : not any more]
|
||||
burn_drive_info is not the manager of burn_drive but only its
|
||||
spokesperson. To my knowledge drive_infos from burn_drive_scan()
|
||||
spokesperson. To my knowlege drive_infos from burn_drive_scan()
|
||||
are not memorized globally. */
|
||||
free((void *) drive_infos);
|
||||
|
||||
|
@ -1623,7 +1490,7 @@ void burn_drive_info_free(struct burn_drive_info drive_infos[])
|
|||
/* ts A70903 : THIS IS WRONG ! (disabled now)
|
||||
It endangers multi drive usage.
|
||||
This call is not entitled to delete all drives, only the
|
||||
ones of the array which it receives a parameter.
|
||||
ones of the array which it recieves a parmeter.
|
||||
|
||||
Problem: It was unclear how many items are listed in drive_infos
|
||||
Solution: Added a end marker element to any burn_drive_info array
|
||||
|
@ -1652,22 +1519,6 @@ void burn_drive_set_speed(struct burn_drive *d, int r, int w)
|
|||
d->set_speed(d, r, w);
|
||||
}
|
||||
|
||||
int burn_drive_set_speed_exact(struct burn_drive *d, int r, int w)
|
||||
{
|
||||
int sose;
|
||||
|
||||
d->nominal_write_speed = w;
|
||||
if(d->drive_role != 1)
|
||||
return 0;
|
||||
sose = d->silent_on_scsi_error;
|
||||
d->silent_on_scsi_error = 3;
|
||||
d->set_streaming_err = 0;
|
||||
d->set_streaming_exact_bit = 1;
|
||||
d->set_speed(d, r, w);
|
||||
d->silent_on_scsi_error = sose;
|
||||
d->set_streaming_exact_bit = 0;
|
||||
return !d->set_streaming_err;
|
||||
}
|
||||
|
||||
/* ts A70711 API function */
|
||||
int burn_drive_set_buffer_waiting(struct burn_drive *d, int enable,
|
||||
|
@ -1697,20 +1548,6 @@ int burn_drive_set_buffer_waiting(struct burn_drive *d, int enable,
|
|||
}
|
||||
|
||||
|
||||
int burn_drive_reset_simulate(struct burn_drive *d, int simulate)
|
||||
{
|
||||
if (d->busy != BURN_DRIVE_IDLE) {
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index, 0x00020140,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Drive is busy on attempt to write random access",0,0);
|
||||
return 0;
|
||||
}
|
||||
d->do_simulate = !!simulate;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int burn_msf_to_sectors(int m, int s, int f)
|
||||
{
|
||||
return (m * 60 + s) * 75 + f;
|
||||
|
@ -1833,7 +1670,8 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
|
|||
{
|
||||
int ret = -1, role = 0, fd;
|
||||
int is_rdwr = 0, stat_ret = -1;
|
||||
off_t size = BURN_DRIVE_MAX_BYTES;
|
||||
/* divided by 512 it needs to fit into a signed long integer */
|
||||
off_t size = ((off_t) (512 * 1024 * 1024 - 1) * (off_t) 2048);
|
||||
off_t read_size = -1;
|
||||
struct burn_drive *d= NULL, *regd_d;
|
||||
struct stat stbuf;
|
||||
|
@ -1909,11 +1747,10 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
|
|||
(burn_drive_role_4_allowed & 8)) {
|
||||
d->status = BURN_DISC_APPENDABLE;
|
||||
d->block_types[BURN_WRITE_SAO] = 0;
|
||||
if (stbuf.st_size > BURN_DRIVE_MAX_BYTES) {
|
||||
if (stbuf.st_size / (off_t) 2048
|
||||
>= 0x7ffffff0) {
|
||||
d->status = BURN_DISC_FULL;
|
||||
d->role_5_nwa =
|
||||
(off_t) BURN_DRIVE_MAX_BYTES /
|
||||
(off_t) 2048; ;
|
||||
d->role_5_nwa = 0x7ffffff0;
|
||||
} else
|
||||
d->role_5_nwa = stbuf.st_size / 2048 +
|
||||
!!(stbuf.st_size % 2048);
|
||||
|
@ -1929,12 +1766,10 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
|
|||
strcpy(d->current_profile_text,"stdio file");
|
||||
d->current_is_cd_profile = 0;
|
||||
d->current_is_supported_profile = 1;
|
||||
if (read_size >= 0) {
|
||||
if (read_size >= 0)
|
||||
/* despite its name : last valid address, not size */
|
||||
d->media_read_capacity =
|
||||
read_size / 2048 - !(read_size % 2048);
|
||||
d->mr_capacity_trusted = 1;
|
||||
}
|
||||
burn_drive_set_media_capacity_remaining(d, size);
|
||||
} else
|
||||
d->current_profile = 0; /* Drives return this if empty */
|
||||
|
@ -1979,7 +1814,7 @@ ex:;
|
|||
|
||||
|
||||
/* ts A60823 */
|
||||
/** Acquire a drive with known persistent address.
|
||||
/** Aquire a drive with known persistent address.
|
||||
*/
|
||||
int burn_drive_scan_and_grab(struct burn_drive_info *drive_infos[], char* adr,
|
||||
int load)
|
||||
|
@ -1987,7 +1822,7 @@ int burn_drive_scan_and_grab(struct burn_drive_info *drive_infos[], char* adr,
|
|||
unsigned int n_drives;
|
||||
int ret, i;
|
||||
|
||||
/* check whether drive address is already registered */
|
||||
/* check wether drive adress is already registered */
|
||||
for (i = 0; i <= drivetop; i++)
|
||||
if (drive_array[i].global_index >= 0)
|
||||
if (strcmp(drive_array[i].devname, adr) == 0)
|
||||
|
@ -2046,15 +1881,14 @@ int burn_drive_adr_debug_msg(char *fmt, char *arg)
|
|||
int ret;
|
||||
char *msg = NULL, *msgpt;
|
||||
|
||||
BURN_ALLOC_MEM(msg, char, 4096);
|
||||
msgpt = msg;
|
||||
if(arg != NULL)
|
||||
sprintf(msg, fmt, arg);
|
||||
else
|
||||
msgpt = fmt;
|
||||
if(libdax_messenger == NULL)
|
||||
return 0;
|
||||
if(arg != NULL) {
|
||||
BURN_ALLOC_MEM(msg, char, 4096);
|
||||
msgpt = msg;
|
||||
sprintf(msg, fmt, arg);
|
||||
} else {
|
||||
msgpt = fmt;
|
||||
}
|
||||
ret = libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
|
||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
|
||||
msgpt, 0, 0);
|
||||
|
@ -2092,7 +1926,7 @@ int burn_drive_get_adr(struct burn_drive_info *drive_info, char adr[])
|
|||
|
||||
|
||||
/* ts A60922 ticket 33 */
|
||||
/** Evaluate whether the given address would be enumerated by libburn */
|
||||
/** Evaluate wether the given address would be enumerated by libburn */
|
||||
int burn_drive_is_enumerable_adr(char *adr)
|
||||
{
|
||||
return sg_is_enumerable_adr(adr);
|
||||
|
@ -2326,12 +2160,12 @@ int burn_drive_find_scsi_equiv(char *path, char adr[])
|
|||
burn_drive_adr_debug_msg(msg, NULL);
|
||||
return 0;
|
||||
}
|
||||
sprintf(msg, "burn_drive_find_scsi_equiv( %s ) : %d,%d,%d,%d,%d",
|
||||
sprintf(msg, "burn_drive_find_scsi_equiv( %s ) : (%d),%d,%d,%d,%d",
|
||||
path, bus_no, host_no, channel_no, target_no, lun_no);
|
||||
burn_drive_adr_debug_msg(msg, NULL);
|
||||
|
||||
ret= burn_drive_convert_scsi_adr(bus_no, host_no, channel_no,
|
||||
target_no, lun_no, adr);
|
||||
ret= burn_drive_convert_scsi_adr(-1, host_no, channel_no, target_no,
|
||||
lun_no, adr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2693,10 +2527,10 @@ int burn_disc_read_atip(struct burn_drive *d)
|
|||
}
|
||||
|
||||
/* ts A61110 : new API function */
|
||||
int burn_disc_track_lba_nwa_v2(struct burn_drive *d, struct burn_write_opts *o,
|
||||
int trackno, off_t *lba, off_t *nwa)
|
||||
int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
|
||||
int trackno, int *lba, int *nwa)
|
||||
{
|
||||
int ret, int_lba, int_nwa;
|
||||
int ret;
|
||||
|
||||
if (burn_drive_is_released(d)) {
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
|
@ -2724,38 +2558,11 @@ int burn_disc_track_lba_nwa_v2(struct burn_drive *d, struct burn_write_opts *o,
|
|||
return 0;
|
||||
if (o != NULL)
|
||||
d->send_write_parameters(d, NULL, -1, o);
|
||||
ret = d->get_nwa(d, trackno, &int_lba, &int_nwa);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
*lba = int_lba;
|
||||
*nwa = int_nwa;
|
||||
ret = d->get_nwa(d, trackno, lba, nwa);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* ts A61110 / C40302 : API */
|
||||
int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
|
||||
int trackno, int *lba, int *nwa)
|
||||
{
|
||||
int ret;
|
||||
off_t off_lba, off_nwa;
|
||||
|
||||
ret = burn_disc_track_lba_nwa_v2(d, o, trackno, &off_lba, &off_nwa);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
if (off_lba > 0x7fffffff)
|
||||
*lba = 0x7fffffff;
|
||||
else
|
||||
*lba = off_lba;
|
||||
if (off_nwa > 0x7fffffff) {
|
||||
*nwa = 0x7fffffff;
|
||||
return 0;
|
||||
} else {
|
||||
*nwa = off_nwa;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* ts A70131 : new API function */
|
||||
int burn_disc_get_msc1(struct burn_drive *d, int *start)
|
||||
{
|
||||
|
@ -2805,7 +2612,7 @@ off_t burn_disc_available_space(struct burn_drive *d,
|
|||
if (ret != 1)
|
||||
bytes = d->media_capacity_remaining;
|
||||
if (bytes <= 0)
|
||||
bytes = BURN_DRIVE_MAX_BYTES;
|
||||
bytes = (off_t) (512 * 1024 * 1024 - 1) * (off_t) 2048;
|
||||
if (bytes != d->media_capacity_remaining)
|
||||
burn_drive_set_media_capacity_remaining(d, bytes);
|
||||
} else {
|
||||
|
@ -3058,7 +2865,7 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
|
|||
size = d->media_capacity_remaining;
|
||||
burn_os_stdio_capacity(d->devname, 0, &size);
|
||||
burn_drive_set_media_capacity_remaining(d, size);
|
||||
o->start_range_high = d->media_capacity_remaining - 2048;
|
||||
o->start_range_high = d->media_capacity_remaining;
|
||||
o->start_alignment = 2048; /* imposting a drive, not a file */
|
||||
o->might_do_sao = 4;
|
||||
o->might_do_tao = 2;
|
||||
|
@ -3073,7 +2880,7 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
|
|||
|
||||
/* >>> start_range_low = file size rounded to 2048 */;
|
||||
|
||||
o->start_range_high = d->media_capacity_remaining - 2048;
|
||||
o->start_range_high = d->media_capacity_remaining;
|
||||
o->start_alignment = 2048; /* imposting a drive, not a file */
|
||||
if (s == BURN_DISC_APPENDABLE) {
|
||||
if (wt == BURN_WRITE_SAO || wt == BURN_WRITE_RAW)
|
||||
|
@ -3148,13 +2955,13 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
|
|||
d->current_profile == 0x1a ||
|
||||
d->current_profile == 0x43
|
||||
) {
|
||||
/* DVD-RAM, overwritable DVD-RW, DVD+RW, BD-RE */
|
||||
/* DVD-RAM, overwriteable DVD-RW, DVD+RW, BD-RE */
|
||||
o->start_adr = 1;
|
||||
ret = burn_disc_get_formats(d, &status, &size, &dummy,
|
||||
&num_formats);
|
||||
if (ret == 1) {
|
||||
if (status == BURN_FORMAT_IS_FORMATTED)
|
||||
o->start_range_high = size - 2048;
|
||||
o->start_range_high = size;
|
||||
if (d->current_profile == 0x13) {
|
||||
o->start_alignment = 32 * 1024;
|
||||
for (i = 0; i < num_formats; i++) {
|
||||
|
@ -3390,7 +3197,7 @@ int burn_drive_equals_adr(struct burn_drive *d1, char *adr2_in, int role2)
|
|||
if (stat_ret1 == -1 || stat_ret2 == -1) {
|
||||
if (stat_ret1 != -1 || stat_ret2 != -1)
|
||||
{ret = 0; goto ex;}
|
||||
/* one address existing, one not */
|
||||
/* one adress existing, one not */
|
||||
|
||||
/* Two non-existing file objects */
|
||||
|
||||
|
@ -3407,7 +3214,7 @@ int burn_drive_equals_adr(struct burn_drive *d1, char *adr2_in, int role2)
|
|||
/* one dir existing, one not */
|
||||
|
||||
/* Both directories exist. The basenames are equal.
|
||||
So the addresses are equal if the directories are
|
||||
So the adresses are equal if the directories are
|
||||
equal.*/
|
||||
}
|
||||
if (stbuf1.st_ino == stbuf2.st_ino &&
|
||||
|
@ -3488,39 +3295,21 @@ int burn_drive_find_by_thread_pid(struct burn_drive **d, pid_t pid,
|
|||
*/
|
||||
int burn_drive_set_media_capacity_remaining(struct burn_drive *d, off_t value)
|
||||
{
|
||||
if (value > BURN_DRIVE_MAX_BYTES)
|
||||
value = BURN_DRIVE_MAX_BYTES;
|
||||
if (value / (off_t) 2048 > (off_t) 0x7ffffff0)
|
||||
value = ((off_t) 0x7ffffff0) * (off_t) 2048;
|
||||
d->media_capacity_remaining = value;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* ts C40303 : API */
|
||||
int burn_get_read_capacity_v2(struct burn_drive *d, off_t *capacity, int flag)
|
||||
{
|
||||
*capacity = d->media_read_capacity +
|
||||
(d->media_read_capacity != 0x7fffffffffffffff);
|
||||
return (d->media_read_capacity != 0x7fffffffffffffff);
|
||||
}
|
||||
|
||||
/* ts A81215 : API */
|
||||
int burn_get_read_capacity(struct burn_drive *d, int *capacity, int flag)
|
||||
{
|
||||
int ret;
|
||||
off_t cap;
|
||||
|
||||
ret= burn_get_read_capacity_v2(d, &cap, flag);
|
||||
if (cap < -0x7fffffff) {
|
||||
*capacity = -0x7fffffff;
|
||||
ret = 0;
|
||||
} else if (cap > 0x7fffffff) {
|
||||
*capacity = 0x7fffffff;
|
||||
ret = 0;
|
||||
} else {
|
||||
*capacity = cap;
|
||||
}
|
||||
return ret;
|
||||
*capacity = d->media_read_capacity + 1;
|
||||
return (d->media_read_capacity != 0x7fffffff);
|
||||
}
|
||||
|
||||
|
||||
/* ts A90903 : API */
|
||||
int burn_disc_get_media_id(struct burn_drive *d,
|
||||
char **product_id, char **media_code1, char **media_code2,
|
||||
|
@ -3548,7 +3337,7 @@ int burn_disc_get_media_id(struct burn_drive *d,
|
|||
bit3= disc_app_code valid
|
||||
bit4= Disc is unrestricted (URU bit)
|
||||
bit5= Disc is nominally erasable (Erasable bit)
|
||||
This will be set with overwritable media which
|
||||
This will be set with overwriteable media which
|
||||
libburn normally considers to be unerasable blank.
|
||||
*/
|
||||
int burn_disc_get_cd_info(struct burn_drive *d, char disc_type[80],
|
||||
|
@ -3643,7 +3432,7 @@ int burn_feature_descr_new(struct burn_feature_descr **new,
|
|||
*new = NULL;
|
||||
if (descr_len < 4)
|
||||
return 0;
|
||||
(*new) = o = calloc(1, sizeof(struct burn_feature_descr));
|
||||
(*new) = o = calloc(1, sizeof(struct burn_speed_descriptor));
|
||||
if (o == NULL)
|
||||
return -1;
|
||||
o->feature_code = (descr[0] << 8) | descr[1];
|
||||
|
@ -3701,155 +3490,3 @@ int burn_drive_has_feature(struct burn_drive *d, int feature_code,
|
|||
}
|
||||
|
||||
|
||||
/* ts B51016 API */
|
||||
int burn_drive_get_serial_no(struct burn_drive *d, char **sno, int *sno_len)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (*sno != NULL)
|
||||
BURN_FREE_MEM(*sno);
|
||||
if (d->drive_serial_number_len > 0)
|
||||
*sno_len = d->drive_serial_number_len;
|
||||
else
|
||||
*sno_len = 0;
|
||||
BURN_ALLOC_MEM(*sno, char, *sno_len + 1);
|
||||
if (d->drive_serial_number_len > 0)
|
||||
memcpy(*sno, d->drive_serial_number, *sno_len);
|
||||
(*sno)[*sno_len] = 0;
|
||||
ret = 1;
|
||||
ex:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* ts B51016 API */
|
||||
int burn_drive_get_media_sno(struct burn_drive *d, char **sno, int *sno_len)
|
||||
{
|
||||
int ret;
|
||||
|
||||
#ifdef Libburn_enable_scsi_cmd_ABh
|
||||
struct burn_feature_descr *feat;
|
||||
#endif
|
||||
|
||||
if (*sno != NULL)
|
||||
BURN_FREE_MEM(*sno);
|
||||
*sno = NULL;
|
||||
|
||||
if (d->media_serial_number_len == -1) {
|
||||
|
||||
#ifdef Libburn_enable_scsi_cmd_ABh
|
||||
|
||||
if (burn_drive_has_feature(d, 0x109, &feat, 0))
|
||||
|
||||
#ifndef Libburn_enable_scsi_cmd_ABh_pretend_currenT
|
||||
if (feat->flags & 1) /* current */
|
||||
#endif
|
||||
|
||||
spc_read_media_serial_number(d);
|
||||
|
||||
#else
|
||||
;
|
||||
|
||||
#endif /* ! Libburn_enable_scsi_cmd_ABh */
|
||||
|
||||
}
|
||||
|
||||
if (d->media_serial_number_len > 0)
|
||||
*sno_len = d->media_serial_number_len;
|
||||
else
|
||||
*sno_len = 0;
|
||||
BURN_ALLOC_MEM(*sno, char, *sno_len + 1);
|
||||
if (*sno_len > 0)
|
||||
memcpy(*sno, d->media_serial_number, *sno_len);
|
||||
(*sno)[*sno_len] = 0;
|
||||
ret = 1;
|
||||
ex:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int burn_drive_get_bd_r_pow(struct burn_drive *d)
|
||||
{
|
||||
struct burn_feature_descr *feature;
|
||||
|
||||
if (d->current_profile == 0x41)
|
||||
if (burn_drive_has_feature(d, 0x38, &feature, 0) == 1)
|
||||
if (feature->flags & 1)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int burn_drive_set_immed(struct burn_drive *drive, int enable)
|
||||
{
|
||||
drive->do_no_immed = !enable;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int burn_drive_get_immed(struct burn_drive *drive)
|
||||
{
|
||||
return !drive->do_no_immed;
|
||||
}
|
||||
|
||||
|
||||
/* ts B90412 , API */
|
||||
int burn_drive_get_feature(struct burn_drive *d, unsigned int feature_code,
|
||||
unsigned char *flags,
|
||||
unsigned char *additional_length,
|
||||
unsigned char **feature_data,
|
||||
char **feature_text)
|
||||
{
|
||||
int ret, i;
|
||||
struct burn_feature_descr *descr;
|
||||
|
||||
*flags = 0;
|
||||
*additional_length = 0;
|
||||
*feature_data = NULL;
|
||||
if (feature_text != NULL)
|
||||
*feature_text = NULL;
|
||||
if (!burn_drive_has_feature(d, feature_code, &descr, 0))
|
||||
return 0;
|
||||
*flags = descr->flags;
|
||||
*additional_length = descr->data_lenght;
|
||||
if (*additional_length > 0)
|
||||
BURN_ALLOC_MEM(*feature_data, unsigned char,
|
||||
*additional_length);
|
||||
for (i = 0; i < *additional_length; i++)
|
||||
(*feature_data)[i] = descr->data[i];
|
||||
|
||||
if (feature_text != NULL) {
|
||||
ret = burn_make_feature_text(d, feature_code, *flags,
|
||||
*additional_length, *feature_data,
|
||||
feature_text, 0);
|
||||
} else {
|
||||
ret = 1;
|
||||
}
|
||||
ex:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* ts B90412 , API */
|
||||
void burn_drive_get_feature_codes(struct burn_drive *d,
|
||||
int *count, unsigned int **feature_codes)
|
||||
{
|
||||
struct burn_feature_descr *o;
|
||||
int to_alloc;
|
||||
|
||||
*count = 0;
|
||||
*feature_codes = NULL;
|
||||
for (o = d->features; o != NULL; o = o->next)
|
||||
(*count)++;
|
||||
if (*count == 0)
|
||||
return;
|
||||
to_alloc = *count;
|
||||
*count = 0;
|
||||
BURN_ALLOC_MEM_VOID(*feature_codes, unsigned int, to_alloc);
|
||||
for (o = d->features; o != NULL; o = o->next) {
|
||||
(*feature_codes)[*count] = o->feature_code;
|
||||
(*count)++;
|
||||
}
|
||||
ex:;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -170,12 +170,4 @@ int burn_drive_has_feature(struct burn_drive *d, int feature_code,
|
|||
|
||||
int burn_drive_grab_stdio(struct burn_drive *d, int flag);
|
||||
|
||||
/* ts C10213 */
|
||||
/* The size of limitless or oversized devices as pseudo drives */
|
||||
/* Do not lightheartedly change this value because of its meaning to
|
||||
burn_drive.media_read_capacity in libburn/transport.h
|
||||
64 TiB = 2 exp 46 = 2 exp 35 blocks
|
||||
*/
|
||||
#define BURN_DRIVE_MAX_BYTES ((off_t) (0x800000000) * (off_t) 2048)
|
||||
|
||||
#endif /* __DRIVE */
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
-------------------------------------------------------------------------
|
||||
|
||||
|
||||
RSPC , P- and Q-Parity
|
||||
RSPC resp. P- and Q-Parity
|
||||
|
||||
ECMA-130 Annex A prescribes to compute the parity bytes for P-columns and
|
||||
Q-diagonals by RSPC based on a Galois Field GF(2^8) with enumerating
|
||||
|
@ -75,12 +75,12 @@
|
|||
>>> See correctness reservation below.
|
||||
|
||||
Algebra on Galois fields is the same as on Rational Numbers.
|
||||
But arithmetics on its polynomials differ from usual integer arithmetics
|
||||
on binary numbers.
|
||||
But arithmetics is defined by operations on polynomials rather than the
|
||||
usual integer arithmetics on binary numbers.
|
||||
Addition and subtraction are identical with the binary exor operator.
|
||||
Multiplication and division would demand polynomial division, e.g. by the
|
||||
euclidean algorithm. The computing path over logarithms and powers follows
|
||||
algebra and reduces the arithmetic task to table lookups, additions
|
||||
euclidian algorithm. The computing path over logarithms and powers follows
|
||||
algebra and allows to reduce the arithmetic task to table lookups, additions
|
||||
modulo 255, and exor operations. Note that the logarithms are natural
|
||||
numbers, not polynomials. They get added or subtracted by the usual addition
|
||||
(not by exor) and their polynomial power depends on their value modulo 255.
|
||||
|
@ -245,7 +245,7 @@ static unsigned char gflog[256] = {
|
|||
#ifdef Libburn_use_h_matriceS
|
||||
|
||||
/* On my AMD 2x64 bit 3000 MHz processor h[i] costs about 7 % more time
|
||||
than using gfpow[25-i] and gfpow[44-1]. I blame this on the more
|
||||
than using gfpow[25-i] resp. gfpow[44-1]. I blame this on the more
|
||||
condensed data representation which slightly increases the rate of cache
|
||||
hits.
|
||||
Nevertheless this effect is very likely depending on the exact cache
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2017 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -43,7 +43,7 @@ an unreadable disc */
|
|||
|
||||
|
||||
/* This is a generic OS oriented function wrapper which compensates
|
||||
shortcomings of read() in respect to a guaranteed amount of return data.
|
||||
shortcommings of read() in respect to a guaranteed amount of return data.
|
||||
See man 2 read , paragraph "RETURN VALUE".
|
||||
*/
|
||||
static int read_full_buffer(int fd, unsigned char *buffer, int size)
|
||||
|
@ -331,31 +331,8 @@ static int fifo_set_size(struct burn_source *source, off_t size)
|
|||
static void fifo_free(struct burn_source *source)
|
||||
{
|
||||
struct burn_source_fifo *fs = source->data;
|
||||
int wait_count;
|
||||
static int wait_max = 30, wait_usleep = 100000;
|
||||
|
||||
burn_fifo_abort(fs, 0);
|
||||
for (wait_count = 0; wait_count <= wait_max; wait_count++) {
|
||||
if (fs->thread_is_valid <= 0)
|
||||
break;
|
||||
if (wait_count < wait_max)
|
||||
usleep(wait_usleep);
|
||||
}
|
||||
if (wait_count > wait_max) {
|
||||
/* The shoveler thread might still be active. If so, it would
|
||||
use invalid or inappropriate memory if the fifo would be
|
||||
disposed now. A memory and resource leak is the better
|
||||
option here.
|
||||
*/
|
||||
libdax_msgs_submit(libdax_messenger, -1,
|
||||
0x000201ab,
|
||||
LIBDAX_MSGS_SEV_WARNING,
|
||||
LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Leaving burn_source_fifo object undisposed because it is possibly stuck but alive",
|
||||
0, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (fs->inp != NULL)
|
||||
burn_source_free(fs->inp);
|
||||
|
||||
|
@ -379,20 +356,13 @@ int burn_fifo_source_shoveller(struct burn_source *source, int flag)
|
|||
fs->thread_pid = getpid();
|
||||
fs->thread_is_valid = 1;
|
||||
|
||||
/* Lock was obtained by async.c:add_worker() */
|
||||
burn_async_manage_lock(BURN_ASYNC_LOCK_RELEASE);
|
||||
|
||||
bufsize = fs->chunksize * fs->chunks;
|
||||
while (!fs->end_of_consumption) {
|
||||
if (fs->do_abort)
|
||||
goto emergency_exit;
|
||||
|
||||
/* wait for enough buffer space available */
|
||||
wpos = fs->buf_writepos;
|
||||
counted = 0;
|
||||
while (1) {
|
||||
if (fs->do_abort)
|
||||
goto emergency_exit;
|
||||
rpos = fs->buf_readpos;
|
||||
diff = rpos - wpos;
|
||||
trans_end = 0;
|
||||
|
@ -435,8 +405,6 @@ int burn_fifo_source_shoveller(struct burn_source *source, int flag)
|
|||
}
|
||||
|
||||
/* Obtain next chunk */
|
||||
if (fs->do_abort)
|
||||
goto emergency_exit;
|
||||
if (fs->inp->read != NULL)
|
||||
ret = fs->inp->read(fs->inp,
|
||||
(unsigned char *) bufpt, fs->inp_read_size);
|
||||
|
@ -462,8 +430,6 @@ int burn_fifo_source_shoveller(struct burn_source *source, int flag)
|
|||
fs->put_counter++;
|
||||
|
||||
/* activate read chunk */
|
||||
if (fs->do_abort)
|
||||
goto emergency_exit;
|
||||
if (ret > fs->inp_read_size)
|
||||
/* beware of ill custom burn_source */
|
||||
ret = fs->inp_read_size;
|
||||
|
@ -497,11 +463,8 @@ int burn_fifo_source_shoveller(struct burn_source *source, int flag)
|
|||
fs->end_of_input = 1;
|
||||
|
||||
/* wait for end of reading by consumer */;
|
||||
while (fs->buf_readpos != fs->buf_writepos && !fs->end_of_consumption) {
|
||||
if (fs->do_abort)
|
||||
goto emergency_exit;
|
||||
fifo_sleep(0);
|
||||
}
|
||||
while (fs->buf_readpos != fs->buf_writepos && !fs->end_of_consumption)
|
||||
fifo_sleep(0);
|
||||
|
||||
/* destroy ring buffer */;
|
||||
if (!fs->end_of_consumption)
|
||||
|
@ -518,11 +481,8 @@ int burn_fifo_source_shoveller(struct burn_source *source, int flag)
|
|||
((size_t) fs->chunksize) * (size_t) fs->chunks, 0);
|
||||
fs->buf = NULL;
|
||||
|
||||
emergency_exit:;
|
||||
burn_async_manage_lock(BURN_ASYNC_LOCK_OBTAIN);
|
||||
fs->thread_handle= NULL;
|
||||
fs->thread_is_valid = 0;
|
||||
burn_async_manage_lock(BURN_ASYNC_LOCK_RELEASE);
|
||||
return (fs->input_error == 0);
|
||||
}
|
||||
|
||||
|
@ -564,7 +524,6 @@ struct burn_source *burn_fifo_source_new(struct burn_source *inp,
|
|||
fs->thread_handle = NULL;
|
||||
fs->thread_pid = 0;
|
||||
fs->thread_is_valid = 0;
|
||||
fs->do_abort = 0;
|
||||
fs->inp = NULL; /* set later */
|
||||
if (flag & 1)
|
||||
fs->inp_read_size = 32 * 1024;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2017 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -27,8 +27,8 @@ struct burn_source_fifo {
|
|||
/* The fifo stays inactive and unequipped with eventual resources
|
||||
until its read() method is called for the first time.
|
||||
Only then burn_fifo_start() gets called, allocates the complete
|
||||
resources, starts a thread with burn_fifo_source_shoveller()
|
||||
which shovels data and finally destroys the resources.
|
||||
resources, starts a thread with burn_fifo_source_shuffler()
|
||||
which shuffles data and finally destroys the resources.
|
||||
This late start is to stay modest in case of multiple tracks
|
||||
in one disc.
|
||||
*/
|
||||
|
@ -38,9 +38,6 @@ struct burn_source_fifo {
|
|||
int thread_pid;
|
||||
int thread_is_valid;
|
||||
|
||||
/* The shoveller aborts if this is 1. Resource leaks are possible. */
|
||||
volatile int do_abort;
|
||||
|
||||
/* the burn_source for which this fifo is acting as proxy */
|
||||
struct burn_source *inp;
|
||||
int inp_read_size;
|
||||
|
@ -88,7 +85,7 @@ struct burn_source_offst {
|
|||
int size_adjustable;
|
||||
|
||||
/* for set_size/get_size */
|
||||
off_t nominal_size;
|
||||
int nominal_size;
|
||||
|
||||
/* To help offst_free() */
|
||||
struct burn_source *next;
|
||||
|
|
|
@ -52,7 +52,7 @@ double lib_start_time;
|
|||
*/
|
||||
int burn_sg_open_o_excl = 1;
|
||||
|
||||
/* ts A70403 : GNU/Linux: whether to use fcntl(,F_SETLK,)
|
||||
/* ts A70403 : GNU/Linux: wether to use fcntl(,F_SETLK,)
|
||||
after open() of device files */
|
||||
int burn_sg_fcntl_f_setlk = 1;
|
||||
|
||||
|
@ -71,7 +71,7 @@ int burn_sg_use_family = 0;
|
|||
has been thoroughly tested. */
|
||||
int burn_sg_open_o_nonblock = 1;
|
||||
|
||||
/* whether to take a busy drive as an error */
|
||||
/* wether to take a busy drive as an error */
|
||||
/* Caution: this is implemented by a rough hack and eventually leads
|
||||
to unconditional abort of the process */
|
||||
int burn_sg_open_abort_busy = 0;
|
||||
|
@ -98,7 +98,7 @@ int burn_builtin_signal_action = 0; /* burn_set_signal_handling() */
|
|||
volatile int burn_builtin_triggered_action = 0; /* burn_is_aborting() */
|
||||
|
||||
|
||||
/* ts A70223 : whether implemented untested profiles are supported */
|
||||
/* ts A70223 : wether implemented untested profiles are supported */
|
||||
int burn_support_untested_profiles = 0;
|
||||
|
||||
/* ts A91111 :
|
||||
|
@ -112,7 +112,7 @@ int burn_sg_log_scsi = 0;
|
|||
|
||||
/* ts B10312 :
|
||||
Whether to map random-access readonly files to drive role 4.
|
||||
Else it is role 2 overwritable drive
|
||||
Else it is role 2 overwriteable drive
|
||||
*/
|
||||
int burn_drive_role_4_allowed = 0;
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ extern int burn_running;
|
|||
|
||||
extern double lib_start_time;
|
||||
|
||||
/** Indicator for burn_drive_get_status() whether a signal hit parts of the
|
||||
/** Indicator for burn_drive_get_status() wether a signal hit parts of the
|
||||
thread team.
|
||||
0= all works well ,
|
||||
1 to 5 = waiting for eventual signal on control thread
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -50,17 +50,11 @@ burn_drive_extract_audio_track;
|
|||
burn_drive_free_speedlist;
|
||||
burn_drive_get_adr;
|
||||
burn_drive_get_all_profiles;
|
||||
burn_drive_get_bd_r_pow;
|
||||
burn_drive_get_best_speed;
|
||||
burn_drive_get_disc;
|
||||
burn_drive_get_drive_role;
|
||||
burn_drive_get_feature;
|
||||
burn_drive_get_feature_codes;
|
||||
burn_drive_get_immed;
|
||||
burn_drive_get_media_sno;
|
||||
burn_drive_get_min_write_speed;
|
||||
burn_drive_get_read_speed;
|
||||
burn_drive_get_serial_no;
|
||||
burn_drive_get_speedlist;
|
||||
burn_drive_get_start_end_lba;
|
||||
burn_drive_get_status;
|
||||
|
@ -74,13 +68,10 @@ burn_drive_obtain_scsi_adr;
|
|||
burn_drive_probe_cd_write_modes;
|
||||
burn_drive_re_assess;
|
||||
burn_drive_release;
|
||||
burn_drive_reset_simulate;
|
||||
burn_drive_scan;
|
||||
burn_drive_scan_and_grab;
|
||||
burn_drive_set_buffer_waiting;
|
||||
burn_drive_set_immed;
|
||||
burn_drive_set_speed;
|
||||
burn_drive_set_speed_exact;
|
||||
burn_drive_set_stream_recording;
|
||||
burn_drive_snooze;
|
||||
burn_drive_was_feat21_failure;
|
||||
|
@ -108,7 +99,6 @@ burn_msf_to_sectors;
|
|||
burn_msgs_obtain;
|
||||
burn_msgs_set_severities;
|
||||
burn_msgs_submit;
|
||||
burn_nominal_slowdown;
|
||||
burn_obtain_profile_name;
|
||||
burn_offst_source_new;
|
||||
burn_os_alloc_buffer;
|
||||
|
@ -186,7 +176,6 @@ burn_write_opts_auto_write_type;
|
|||
burn_write_opts_free;
|
||||
burn_write_opts_get_drive;
|
||||
burn_write_opts_new;
|
||||
burn_write_opts_set_bdr_obs_exempt;
|
||||
burn_write_opts_set_dvd_obs;
|
||||
burn_write_opts_set_fail21h_sev;
|
||||
burn_write_opts_set_fillup;
|
||||
|
@ -213,13 +202,3 @@ libdax_audioxtr_new;
|
|||
libdax_audioxtr_read;
|
||||
local: *;
|
||||
};
|
||||
|
||||
LIBBURN4_1.5.8 {
|
||||
burn_disc_get_sectors_v2;
|
||||
burn_disc_track_lba_nwa_v2;
|
||||
burn_drive_get_status_v2;
|
||||
burn_get_read_capacity_v2;
|
||||
burn_session_get_sectors_v2;
|
||||
burn_track_get_sectors_v2;
|
||||
} LIBBURN4;
|
||||
|
||||
|
|
|
@ -55,7 +55,6 @@ int libdax_audioxtr_new(struct libdax_audioxtr **xtr, char *path, int flag)
|
|||
o->bits_per_sample= 0;
|
||||
o->msb_first= 0;
|
||||
|
||||
o->wav_data_location= 44;
|
||||
o->wav_subchunk2_size= 0;
|
||||
|
||||
o->au_data_location= 0;
|
||||
|
@ -122,123 +121,47 @@ static int libdax_audioxtr_open(struct libdax_audioxtr *o, int flag)
|
|||
return(1);
|
||||
}
|
||||
|
||||
/* @param flag: bit0= sequential file, skip by reading data
|
||||
*/
|
||||
static int libdax_audioxtr_skip(struct libdax_audioxtr *o,
|
||||
off_t *old_pos,
|
||||
off_t pos, int flag)
|
||||
{
|
||||
int ret;
|
||||
size_t to_read;
|
||||
static char buf[256]; /* Thread safe because the content does not matter */
|
||||
|
||||
if((flag & 1) || o->fd == 0) { /* stdin */
|
||||
while(pos - *old_pos > 0) {
|
||||
to_read= pos - *old_pos;
|
||||
if(to_read > sizeof(buf))
|
||||
to_read= sizeof(buf);
|
||||
ret= read(o->fd, buf, to_read);
|
||||
if(ret < (int) to_read)
|
||||
return(0);
|
||||
*old_pos+= to_read;
|
||||
}
|
||||
} else {
|
||||
ret= lseek(o->fd, pos, SEEK_SET);
|
||||
if(ret == -1)
|
||||
return(0);
|
||||
*old_pos= pos;
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int libdax_audioxtr_identify_wav(struct libdax_audioxtr *o, int flag)
|
||||
{
|
||||
int ret, fmt_seen= 0, data_seen= 0;
|
||||
off_t pos= 0, old_pos= 0, riff_end= 0;
|
||||
char buf[16];
|
||||
unsigned char *ubuf;
|
||||
int ret;
|
||||
char buf[45];
|
||||
|
||||
/* check whether this is a MS WAVE file .wav */
|
||||
/* info used: http://ccrma.stanford.edu/courses/422/projects/WaveFormat/
|
||||
https://en.wikipedia.org/wiki/WAV
|
||||
see summary in: doc/waveformat.txt
|
||||
*/
|
||||
ubuf= (unsigned char *) buf;
|
||||
/* check wether this is a MS WAVE file .wav */
|
||||
/* info used: http://ccrma.stanford.edu/courses/422/projects/WaveFormat/ */
|
||||
|
||||
/* Look for ChunkID "RIFF" , tolerate other known chunks */
|
||||
while(1) {
|
||||
ret= libdax_audioxtr_skip(o, &old_pos, pos, 0);
|
||||
if(ret <= 0)
|
||||
if(o->fd!=0) {
|
||||
ret= lseek(o->fd,0,SEEK_SET);
|
||||
if(ret==-1)
|
||||
return(0);
|
||||
ret= read(o->fd, buf, 8);
|
||||
if(ret < 8)
|
||||
return(0);
|
||||
old_pos+= 8;
|
||||
pos= old_pos + libdax_audioxtr_to_int(o, ubuf + 4, 4, 0);
|
||||
if(pos > 0xffffffff || pos - old_pos < 4) /* Too large or no Format word */
|
||||
return(0);
|
||||
if(strncmp(buf, "RIFF", 4) == 0)
|
||||
break;
|
||||
/* Wikipedia mentions these known ChunkId values */
|
||||
if(strncmp(buf, "INFO", 4) == 0 ||
|
||||
strncmp(buf, "CSET", 4) == 0 ||
|
||||
strncmp(buf, "JUNK", 4) == 0 ||
|
||||
strncmp(buf, "PAD ", 4) == 0)
|
||||
continue;
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* Read RIFF Format header */
|
||||
ret= read(o->fd, buf, 4);
|
||||
if(ret < 4)
|
||||
ret= read(o->fd, buf, 44);
|
||||
if(ret<44)
|
||||
return(0);
|
||||
old_pos+= 4;
|
||||
if(strncmp(buf, "WAVE", 4) != 0) /* Format */
|
||||
buf[44]= 0; /* as stopper for any string operations */
|
||||
|
||||
if(strncmp(buf,"RIFF",4)!=0) /* ChunkID */
|
||||
return(0);
|
||||
if(strncmp(buf+8,"WAVE",4)!=0) /* Format */
|
||||
return(0);
|
||||
if(strncmp(buf+12,"fmt ",4)!=0) /* Subchunk1ID */
|
||||
return(0);
|
||||
if(buf[16]!=16 || buf[17]!=0 || buf[18]!=0 || buf[19]!=0) /* Subchunk1Size */
|
||||
return(0);
|
||||
if(buf[20]!=1 || buf[21]!=0) /* AudioFormat must be 1 (Linear quantization) */
|
||||
return(0);
|
||||
riff_end= pos;
|
||||
|
||||
/* Look for SubchunkID "fmt " and "data" */
|
||||
pos= old_pos;
|
||||
while(old_pos < riff_end) {
|
||||
ret= libdax_audioxtr_skip(o, &old_pos, pos, 0);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
ret= read(o->fd, buf, 8);
|
||||
if(ret < 8)
|
||||
return(0);
|
||||
old_pos= pos + 8;
|
||||
pos= old_pos + libdax_audioxtr_to_int(o, ubuf + 4, 4, 0); /* SubchunkSize */
|
||||
|
||||
if(strncmp(buf,"fmt ", 4) == 0) {
|
||||
if(pos - old_pos < 16)
|
||||
return(0);
|
||||
ret= read(o->fd, buf, 16);
|
||||
if(ret < 16)
|
||||
return(0);
|
||||
old_pos+= 16;
|
||||
if(buf[0]!=1 || buf[1]!=0) /* AudioFormat (1 = Linear quantization) */
|
||||
return(0);
|
||||
o->msb_first= 0;
|
||||
o->num_channels= libdax_audioxtr_to_int(o, ubuf + 2 , 2, 0);
|
||||
o->sample_rate= libdax_audioxtr_to_int(o, ubuf + 4, 4, 0);
|
||||
o->bits_per_sample= libdax_audioxtr_to_int(o, ubuf + 14, 2, 0);
|
||||
sprintf(o->fmt_info,
|
||||
".wav , num_channels=%d , sample_rate=%d , bits_per_sample=%d",
|
||||
o->num_channels, o->sample_rate, o->bits_per_sample);
|
||||
fmt_seen= 1;
|
||||
|
||||
} else if(strncmp(buf,"data", 4) == 0) {
|
||||
o->wav_data_location= old_pos;
|
||||
o->wav_subchunk2_size= pos - old_pos;
|
||||
o->data_size= o->wav_subchunk2_size;
|
||||
data_seen= 1;
|
||||
}
|
||||
if(fmt_seen && data_seen) {
|
||||
strcpy(o->fmt,".wav");
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
strcpy(o->fmt,".wav");
|
||||
o->msb_first= 0;
|
||||
o->num_channels= libdax_audioxtr_to_int(o,(unsigned char *) buf+22,2,0);
|
||||
o->sample_rate= libdax_audioxtr_to_int(o,(unsigned char *) buf+24,4,0);
|
||||
o->bits_per_sample= libdax_audioxtr_to_int(o,(unsigned char *)buf+34,2,0);
|
||||
sprintf(o->fmt_info,
|
||||
".wav , num_channels=%d , sample_rate=%d , bits_per_sample=%d",
|
||||
o->num_channels,o->sample_rate,o->bits_per_sample);
|
||||
o->wav_subchunk2_size= libdax_audioxtr_to_int(o,(unsigned char *)buf+40,4,0);
|
||||
o->data_size= o->wav_subchunk2_size;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -247,7 +170,7 @@ static int libdax_audioxtr_identify_au(struct libdax_audioxtr *o, int flag)
|
|||
int ret,encoding;
|
||||
char buf[24];
|
||||
|
||||
/* Check whether this is a Sun Audio, .au file */
|
||||
/* Check wether this is a Sun Audio, .au file */
|
||||
/* info used: http://ccrma.stanford.edu/courses/422/projects/WaveFormat/ */
|
||||
|
||||
if(o->fd!=0) {
|
||||
|
@ -285,6 +208,10 @@ static int libdax_audioxtr_identify_au(struct libdax_audioxtr *o, int flag)
|
|||
sprintf(o->fmt_info,
|
||||
".au , num_channels=%d , sample_rate=%d , bits_per_sample=%d",
|
||||
o->num_channels,o->sample_rate,o->bits_per_sample);
|
||||
|
||||
/* <<< for testing only */;
|
||||
return(1);
|
||||
|
||||
return(o->bits_per_sample>0); /* Audio format must be linear PCM */
|
||||
}
|
||||
|
||||
|
@ -333,7 +260,7 @@ static int libdax_audioxtr_init_reading(struct libdax_audioxtr *o, int flag)
|
|||
|
||||
o->extract_count= 0;
|
||||
if(strcmp(o->fmt,".wav")==0)
|
||||
ret= lseek(o->fd, o->wav_data_location, SEEK_SET);
|
||||
ret= lseek(o->fd,44,SEEK_SET);
|
||||
else if(strcmp(o->fmt,".au")==0)
|
||||
ret= lseek(o->fd,o->au_data_location,SEEK_SET);
|
||||
else
|
||||
|
|
|
@ -38,7 +38,7 @@ struct libdax_audioxtr;
|
|||
/* Calls from applications (to be forwarded by libdax/libburn) */
|
||||
|
||||
|
||||
/** Open an audio file, check whether suitable, create extractor object.
|
||||
/** Open an audio file, check wether suitable, create extractor object.
|
||||
@param xtr Opaque handle to extractor. Gets attached extractor object.
|
||||
@param path Address of the audio file to extract. "-" is stdin (but might
|
||||
be not suitable for all futurely supported formats).
|
||||
|
@ -176,10 +176,7 @@ struct libdax_audioxtr {
|
|||
/* Format dependent parameters */
|
||||
|
||||
/* MS WAVE Format */
|
||||
/* see description in: doc/waveformat.txt */
|
||||
|
||||
/* Offset to "data" subchunk */
|
||||
unsigned int wav_data_location;
|
||||
/* info used: http://ccrma.stanford.edu/courses/422/projects/WaveFormat/ */
|
||||
|
||||
/* == NumSamples * NumChannels * BitsPerSample/8
|
||||
This is the number of bytes in the data. */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
/* libdax_msgs
|
||||
Message handling facility of libdax.
|
||||
Copyright (C) 2006 - 2016 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
Copyright (C) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -34,13 +34,14 @@ static int libdax_msgs_item_new(struct libdax_msgs_item **item,
|
|||
int ret;
|
||||
struct libdax_msgs_item *o;
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
|
||||
(*item)= o=
|
||||
(struct libdax_msgs_item *) calloc(1, sizeof(struct libdax_msgs_item));
|
||||
if(o==NULL)
|
||||
return(-1);
|
||||
o->timestamp= 0.0;
|
||||
ret= gettimeofday(&tv, NULL);
|
||||
ret= gettimeofday(&tv,&tz);
|
||||
if(ret==0)
|
||||
o->timestamp= tv.tv_sec+0.000001*tv.tv_usec;
|
||||
o->process_id= getpid();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
/* libdax_msgs
|
||||
Message handling facility of libburn and libisofs.
|
||||
Copyright (C) 2006-2021 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
Copyright (C) 2006-2011 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -266,9 +266,8 @@ int libdax_msgs_new(struct libdax_msgs **m, int flag);
|
|||
|
||||
/** Destroy a message handling facility and all its eventual messages.
|
||||
The submitted pointer gets set to NULL.
|
||||
Actually only the last destroy call of all official references to the
|
||||
object will really dispose it. All others just decrement the reference
|
||||
counter.
|
||||
Actually only the last destroy call of all offical references to the object
|
||||
will really dispose it. All others just decrement the reference counter.
|
||||
Call this function only with official reference pointers obtained by
|
||||
libdax_msgs_new() or libdax_msgs_refer(), and only once per such pointer.
|
||||
@param flag Bitfield for control purposes (unused yet, submit 0)
|
||||
|
@ -425,7 +424,7 @@ Range "elmom" : 0x00010000 to 0x0001ffff
|
|||
------------------------------------------------------------------------------
|
||||
Range "scdbackup" : 0x00020000 to 0x0002ffff
|
||||
|
||||
Accessing and defending drives:
|
||||
Acessing and defending drives:
|
||||
|
||||
0x00020001 (SORRY,LOW) = Cannot open busy device
|
||||
0x00020002 (SORRY,HIGH) = Encountered error when closing drive
|
||||
|
@ -555,7 +554,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
|||
0x0002016e (DEBUG,HIGH) = MODE SENSE page 2A too short
|
||||
0x0002016f (DEBUG,HIGH) = Unable to grab scanned drive
|
||||
0x00020170 (NOTE,HIGH) = Closing open session before writing new one
|
||||
0x00020171 (NOTE,HIGH) = Closing BD-R with accidentally open session
|
||||
0x00020171 (NOTE,HIGH) = Closing BD-R with accidently open session
|
||||
0x00020172 (SORRY,HIGH) = Read start address larger than number of readable blocks
|
||||
0x00020173 (FAILURE,HIGH) = Drive tells NWA smaller than last written address
|
||||
0x00020174 (SORRY,HIGH) = Fifo alignment does not allow desired read size
|
||||
|
@ -580,7 +579,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
|||
0x00020187 (NOTE,HIGH) = Track not marked as damaged. No action taken.
|
||||
0x00020188 (FAILURE,HIGH) = Cannot close damaged track on given media type
|
||||
0x00020189 (FATAL,HIGH) = Drive is already grabbed by libburn
|
||||
0x0002018a (SORRY,HIGH) = Timeout exceeded. Retry canceled.
|
||||
0x0002018a (SORRY,HIGH) = Timeout exceeded. Retry cancled.
|
||||
0x0002018b (FAILURE,HIGH) = Too many CD-TEXT packs
|
||||
0x0002018c (FAILURE,HIGH) = CD-TEXT pack type out of range
|
||||
0x0002018d (FAILURE,HIGH) = CD-TEXT block number out of range
|
||||
|
@ -611,12 +610,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
|||
0x000201a6 (FATAL,HIGH) = Lost connection to drive
|
||||
0x000201a7 (FAILURE,HIGH) = SCSI command yielded host problem
|
||||
0x000201a8 (FAILURE,HIGH) = SCSI command yielded driver problem
|
||||
0x000201a9 (FAILURE,HIGH) = Implausible length from GET CONFIGURATION
|
||||
0x000201aa (FAILURE,HIGH) = No CD-TEXT packs in file
|
||||
0x000201ab (WARN,HIGH) = Leaving burn_source_fifo object undisposed
|
||||
0x000201ac (NOTE,HIGH) = Drive currently does not offer Stream Recording
|
||||
0x000201ad (NOTE,HIGH) = WRITE commands have been repeated
|
||||
0x000201ae (FAILURE,HIGH) = Track size exceeds 4 TiB - 32 KiB
|
||||
0x000201a9 (FAILURE,HIGH) = Implausible lenght from GET CONFIGURATION
|
||||
|
||||
|
||||
libdax_audioxtr:
|
||||
|
@ -647,11 +641,11 @@ Range "vreixo" : 0x00030000 to 0x0003ffff
|
|||
0x0003ffbc (FAILURE,HIGH) = Image already bootable
|
||||
0x0003ffbb (FAILURE,HIGH) = Trying to use an invalid file as boot image
|
||||
0x0003ff80 (FAILURE,HIGH) = Error on file operation
|
||||
0x0003ff7f (FAILURE,HIGH) = Trying to open an already opened file
|
||||
0x0003ff7f (FAILURE,HIGH) = Trying to open an already openned file
|
||||
0x0003ff7e (FAILURE,HIGH) = Access to file is not allowed
|
||||
0x0003ff7d (FAILURE,HIGH) = Incorrect path to file
|
||||
0x0003ff7c (FAILURE,HIGH) = The file does not exist in the filesystem
|
||||
0x0003ff7b (FAILURE,HIGH) = Trying to read or close a file not opened
|
||||
0x0003ff7b (FAILURE,HIGH) = Trying to read or close a file not openned
|
||||
0x0003ff7a (FAILURE,HIGH) = Directory used where no dir is expected
|
||||
0x0003ff79 (FAILURE,HIGH) = File read error
|
||||
0x0003ff78 (FAILURE,HIGH) = Not dir used where a dir is expected
|
||||
|
@ -702,7 +696,7 @@ X 0x00030203 (HINT,MEDIUM) = Unsupported El-Torito feature
|
|||
X 0x00030204 (SORRY,HIGH) = Invalid file to be an El-Torito image
|
||||
X 0x00030205 (WARNING,MEDIUM)= Cannot properly patch isolinux image
|
||||
X 0x00030206 (WARNING,MEDIUM)= Copying El-Torito from a previous image without
|
||||
X enough info about it
|
||||
X enought info about it
|
||||
X 0x00030301 (NOTE,MEDIUM) = Unsupported file type for Joliet tree
|
||||
|
||||
|
||||
|
|
912
libburn/mmc.c
912
libburn/mmc.c
File diff suppressed because it is too large
Load Diff
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -27,7 +27,7 @@ void mmc_close_disc(struct burn_write_opts *o);
|
|||
|
||||
void mmc_close(struct burn_drive *, int session, int track);
|
||||
void mmc_get_event(struct burn_drive *);
|
||||
int mmc_write(struct burn_drive *, off_t start, struct buffer *buf);
|
||||
int mmc_write(struct burn_drive *, int start, struct buffer *buf);
|
||||
void mmc_write_12(struct burn_drive *d, int start, struct buffer *buf);
|
||||
void mmc_sync_cache(struct burn_drive *);
|
||||
void mmc_load(struct burn_drive *);
|
||||
|
@ -78,8 +78,6 @@ int mmc_compose_mode_page_5(struct burn_drive *d,
|
|||
|
||||
/* ts A70201 */
|
||||
int mmc_four_char_to_int(unsigned char *data);
|
||||
/* ts C40226 */
|
||||
unsigned int mmc_four_char_to_uint(unsigned char *data);
|
||||
|
||||
/* ts A70201 :
|
||||
Common track info fetcher for mmc_get_nwa() and mmc_fake_toc()
|
||||
|
@ -87,7 +85,7 @@ unsigned int mmc_four_char_to_uint(unsigned char *data);
|
|||
int mmc_read_track_info(struct burn_drive *d, int trackno, struct buffer *buf,
|
||||
int alloc_len);
|
||||
|
||||
/* ts A70812 : return 0 = ok , return BE_CANCELLED = error occurred */
|
||||
/* ts A70812 : return 0 = ok , return BE_CANCELLED = error occured */
|
||||
int mmc_read_10(struct burn_drive *d, int start, int amount,
|
||||
struct buffer *buf);
|
||||
|
||||
|
@ -132,12 +130,6 @@ int mmc_get_leadin_text(struct burn_drive *d,
|
|||
/* ts B40107 */
|
||||
int mmc_get_performance(struct burn_drive *d, int descr_type, int flag);
|
||||
|
||||
/* ts B90414 */
|
||||
int burn_make_feature_text(struct burn_drive *d, unsigned int feature_code,
|
||||
unsigned char flags,
|
||||
unsigned char additional_length,
|
||||
unsigned char *feature_data,
|
||||
char **text, int flag);
|
||||
|
||||
#ifdef Libburn_develop_quality_scaN
|
||||
/* B21108 ts */
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2017 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -55,7 +55,6 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive)
|
|||
opts->obs_pad = 0;
|
||||
#endif
|
||||
|
||||
opts->bdr_obs_exempt = 0;
|
||||
opts->start_byte = -1;
|
||||
opts->fill_up_media = 0;
|
||||
opts->force_is_set = 0;
|
||||
|
@ -90,22 +89,12 @@ int burn_write_opts_clone(struct burn_write_opts *from,
|
|||
return 1;
|
||||
*to = calloc(1, sizeof(struct burn_write_opts));
|
||||
if (*to == NULL) {
|
||||
out_of_mem:;
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00000003,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Out of virtual memory", 0, 0);
|
||||
return -1;
|
||||
}
|
||||
memcpy(*to, from, sizeof(struct burn_write_opts));
|
||||
(*to)->text_packs = NULL;
|
||||
(*to)->num_text_packs = 0;
|
||||
if (from->text_packs != NULL && from->num_text_packs > 0) {
|
||||
(*to)->text_packs = calloc(1, from->num_text_packs * 18);
|
||||
if ((*to)->text_packs == NULL)
|
||||
goto out_of_mem;
|
||||
memcpy((*to)->text_packs, from->text_packs,
|
||||
from->num_text_packs * 18);
|
||||
}
|
||||
(*to)->refcount= 1;
|
||||
return 1;
|
||||
}
|
||||
|
@ -289,12 +278,10 @@ int burn_write_opts_set_leadin_text(struct burn_write_opts *opts,
|
|||
if (num_packs > 0) {
|
||||
memcpy(pack_buffer, text_packs, num_packs * 18);
|
||||
opts->text_packs = pack_buffer;
|
||||
pack_buffer = NULL;
|
||||
}
|
||||
opts->num_text_packs = num_packs;
|
||||
ret = 1;
|
||||
ex:;
|
||||
BURN_FREE_MEM(pack_buffer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -324,11 +311,6 @@ enum burn_write_types burn_write_opts_auto_write_type(
|
|||
|
||||
reasons[0] = 0;
|
||||
|
||||
if (burn_drive_get_bd_r_pow(d)) {
|
||||
strcat(reasons,
|
||||
"MEDIA: unsuitable BD-R Pseudo Overwrite formatting, ");
|
||||
return BURN_WRITE_NONE;
|
||||
}
|
||||
if (d->status != BURN_DISC_BLANK &&
|
||||
d->status != BURN_DISC_APPENDABLE){
|
||||
if (d->status == BURN_DISC_FULL)
|
||||
|
@ -536,25 +518,17 @@ void burn_write_opts_set_obs_pad(struct burn_write_opts *opts, int pad)
|
|||
}
|
||||
|
||||
|
||||
/* ts C10909: API */
|
||||
void burn_write_opts_set_bdr_obs_exempt(struct burn_write_opts *opts,
|
||||
int value)
|
||||
{
|
||||
opts->bdr_obs_exempt = !!value;
|
||||
}
|
||||
|
||||
|
||||
/* ts A91115: API */
|
||||
void burn_write_opts_set_stdio_fsync(struct burn_write_opts *opts, int rhythm)
|
||||
void burn_write_opts_set_stdio_fsync(struct burn_write_opts *opts, int rythm)
|
||||
{
|
||||
if (rhythm == -1)
|
||||
if (rythm == -1)
|
||||
opts->stdio_fsync_size = -1; /* never */
|
||||
else if (rhythm == 0)
|
||||
else if (rythm == 0)
|
||||
opts->stdio_fsync_size = Libburn_stdio_fsync_limiT;
|
||||
else if (rhythm == 1)
|
||||
else if (rythm == 1)
|
||||
opts->stdio_fsync_size = 0; /* only at end of writing */
|
||||
else if (rhythm >= 32)
|
||||
opts->stdio_fsync_size = rhythm;
|
||||
else if (rythm >= 32)
|
||||
opts->stdio_fsync_size = rythm;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -46,17 +46,14 @@ struct burn_write_opts
|
|||
2 indicates burn_write_opts_set_obs_pad(,1)
|
||||
*/
|
||||
|
||||
/* 1= do not apply obs_pad=1 to BD-R if not stream recording. */
|
||||
int bdr_obs_exempt;
|
||||
|
||||
/* ts A61222 : Start address for media which offer a choice */
|
||||
/* ts A61222 : Start address for media which allow a choice */
|
||||
off_t start_byte;
|
||||
|
||||
/* ts A70213 : Whether to fill up the available space on media */
|
||||
/* ts A70213 : Wether to fill up the available space on media */
|
||||
int fill_up_media;
|
||||
|
||||
/* ts A70303 : Whether to override conformance checks:
|
||||
- the check whether CD write+block type is supported by the drive
|
||||
/* ts A70303 : Wether to override conformance checks:
|
||||
- the check wether CD write+block type is supported by the drive
|
||||
*/
|
||||
int force_is_set;
|
||||
|
||||
|
@ -145,7 +142,7 @@ struct burn_read_opts
|
|||
|
||||
/* ts B21119 */
|
||||
/* >>> Needs API access */
|
||||
/** Whether to set DAP bit which allows the drive to apply
|
||||
/** Whether to set DAP bit which allows drive to apply
|
||||
"flaw obscuring mechanisms like audio data mute and interpolate"
|
||||
*/
|
||||
unsigned int dap_bit;
|
||||
|
|
|
@ -2,14 +2,14 @@
|
|||
/* os-netbsd.h
|
||||
Operating system specific libburn definitions and declarations. Included
|
||||
by os.h in case of compilation for
|
||||
NetBSD 6 or OpenBSD 5.9
|
||||
NetBSD 6
|
||||
with MMC transport adapter sg-netbsd.c
|
||||
>>> for OpenBSD too ?
|
||||
|
||||
Copyright (C) 2010 - 2016 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2010 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
provided under GPLv2+
|
||||
|
||||
Derived 2014 from libburn/os-solaris.c
|
||||
Adapted 2016 to OpenBSD by help of SASANO Takayoshi <uaa@mx5.nisiq.net>
|
||||
*/
|
||||
|
||||
|
||||
|
@ -33,33 +33,6 @@
|
|||
/* The number of above list items */
|
||||
#define BURN_OS_SIGNAL_COUNT 20
|
||||
|
||||
#ifdef __OpenBSD__
|
||||
|
||||
/** To list all signals which shall surely not be caught */
|
||||
#define BURN_OS_NON_SIGNAL_MACRO_LIST \
|
||||
SIGKILL, SIGURG, SIGSTOP, SIGTSTP, SIGCONT, \
|
||||
SIGCHLD, SIGTTIN, SIGTTOU, SIGIO, SIGWINCH, \
|
||||
SIGINFO
|
||||
|
||||
/* The number of above list items */
|
||||
#define BURN_OS_NON_SIGNAL_COUNT 11
|
||||
|
||||
/* ts B60730 */
|
||||
/* Either OpenBSD or SASANO Takayoshi's LG BH14NS48 throw 2,0,0
|
||||
on Immed bit with BLANK and SYNCHRONIZE CACHE.
|
||||
Until it is clear that the drive is to blame, the OpenBSD default is
|
||||
not to use Immed.
|
||||
|
||||
This may be overridden at ./configure time by
|
||||
export CFLAGS
|
||||
CFLAGS="$CFLAGS -DLibburn_do_no_immed_defaulT=0"
|
||||
*/
|
||||
#ifndef Libburn_do_no_immed_defaulT
|
||||
#define Libburn_do_no_immed_defaulT 1
|
||||
#endif
|
||||
|
||||
#else /* __OpenBSD__ */
|
||||
|
||||
/** To list all signals which shall surely not be caught */
|
||||
#define BURN_OS_NON_SIGNAL_MACRO_LIST \
|
||||
SIGKILL, SIGURG, SIGSTOP, SIGTSTP, SIGCONT, \
|
||||
|
@ -69,7 +42,6 @@
|
|||
/* The number of above list items */
|
||||
#define BURN_OS_NON_SIGNAL_COUNT 12
|
||||
|
||||
#endif /* ! __OpenBSD__ */
|
||||
|
||||
/* The maximum size for a (SCSI) i/o transaction */
|
||||
/* Important : MUST be at least 32768 ! */
|
||||
|
|
23
libburn/os.h
23
libburn/os.h
|
@ -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 - 2016 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
Copyright (C) 2009 - 2014 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
provided under GPLv2+
|
||||
*/
|
||||
|
||||
|
@ -14,6 +14,13 @@
|
|||
Operating system case distinction
|
||||
*/
|
||||
|
||||
|
||||
/* <<< Until it is known whether this adapter would work on OpenBSD too */
|
||||
#ifdef __NetBSD__
|
||||
#define Libburn_use_sg_netbsD
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef Libburn_use_sg_dummY
|
||||
|
||||
|
||||
|
@ -30,21 +37,14 @@
|
|||
|
||||
|
||||
#else
|
||||
#ifdef __NetBSD__
|
||||
#ifdef Libburn_use_sg_netbsD
|
||||
/* To become: # ifdef __NetBSD__ */
|
||||
|
||||
|
||||
/* -------------------------- NetBSD with SCIOCCOMMAND --------------------- */
|
||||
#include "os-netbsd.h"
|
||||
|
||||
|
||||
#else
|
||||
#ifdef __OpenBSD__
|
||||
|
||||
|
||||
/* -------------------------- OpenBSD with SCIOCCOMMAND -------------------- */
|
||||
#include "os-netbsd.h"
|
||||
|
||||
|
||||
#else
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
|
@ -88,8 +88,7 @@
|
|||
#endif /* ! __linux */
|
||||
#endif /* ! __FreeBSD__kernel__ */
|
||||
#endif /* ! __FreeBSD__ */
|
||||
#endif /* ! __OpenBSD__ */
|
||||
#endif /* ! __NetBSD__ */
|
||||
#endif /* ! Libburn_use_sg_netbsD */
|
||||
#endif /* ! Libburn_use_libcdiO */
|
||||
#endif /* ! Libburn_use_sg_dummY */
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -286,7 +286,7 @@ void burn_packet_process(struct burn_drive *d, unsigned char *data,
|
|||
*//* write(o->datafd, data, 2352); */
|
||||
}
|
||||
|
||||
/* so yeah, when you uncomment these, make them write zeros instead of crap
|
||||
/* so yeah, when you uncomment these, make them write zeros insted of crap
|
||||
static void write_empty_sector(int fd)
|
||||
{
|
||||
static char sec[2352], initialized = 0;
|
||||
|
@ -492,13 +492,13 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
|
|||
msg, 0, 0);
|
||||
{ret = 0; goto ex;}
|
||||
}
|
||||
if (d->media_read_capacity != 0x7fffffffffffffff &&
|
||||
byte_address >= (d->media_read_capacity + 1) * (off_t) 2048) {
|
||||
if (d->media_read_capacity != 0x7fffffff && byte_address >=
|
||||
((off_t) d->media_read_capacity + (off_t) 1) * (off_t) 2048) {
|
||||
if (!(flag & 2)) {
|
||||
sprintf(msg,
|
||||
"Read start address %.fs larger than number of readable blocks %.f",
|
||||
(double) (byte_address / 2048 + !!(byte_address % 2048)),
|
||||
(double) (d->media_read_capacity + 1));
|
||||
"Read start address %ds larger than number of readable blocks %d",
|
||||
(int) (byte_address / 2048 + !!(byte_address % 2048)),
|
||||
d->media_read_capacity);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x00020172, (flag & 32) ?
|
||||
LIBDAX_MSGS_SEV_DEBUG : LIBDAX_MSGS_SEV_SORRY,
|
||||
|
|
|
@ -114,15 +114,12 @@ int sbc_start_unit_flag(struct burn_drive *d, int flag)
|
|||
|
||||
scsi_init_command(c, SBC_START_UNIT, sizeof(SBC_START_UNIT));
|
||||
c->retry = 1;
|
||||
if (d->do_no_immed && (flag & 1))
|
||||
c->timeout = 1800 * 1000;
|
||||
else
|
||||
c->opcode[1] |= (flag & 1); /* ts A70918 : Immed */
|
||||
c->opcode[1] |= (flag & 1); /* ts A70918 : Immed */
|
||||
c->dir = NO_TRANSFER;
|
||||
d->issue_command(d, c);
|
||||
if (c->error)
|
||||
return 0;
|
||||
if (d->do_no_immed || !(flag & 1))
|
||||
if (!(flag & 1))
|
||||
return 1;
|
||||
/* ts A70918 : asynchronous */
|
||||
ret = spc_wait_unit_attention(d, 1800, "START UNIT", 0);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2021 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -193,9 +193,7 @@ static void get_bytes(struct burn_track *track, int count, unsigned char *data)
|
|||
off_t missing, inp_block_size, track_blocks;
|
||||
|
||||
inp_block_size = burn_sector_length(track->mode);
|
||||
track_blocks = burn_track_get_sectors_2_v2(track, 1);
|
||||
if (track_blocks < 0)
|
||||
track_blocks = 0;
|
||||
track_blocks = burn_track_get_sectors_2(track, 1);
|
||||
missing = track_blocks * inp_block_size - track->sourcecount;
|
||||
sprintf(msg,
|
||||
"Premature end of input encountered. Missing: %.f bytes",
|
||||
|
@ -355,7 +353,7 @@ static int convert_data(struct burn_write_opts *o, struct burn_track *track,
|
|||
|
||||
/* ts A61010 */
|
||||
/* a ssert(outlen >= inlen); */
|
||||
if (outlen < inlen || outlen < 0 || inlen < 0)
|
||||
if (outlen < inlen)
|
||||
return 0;
|
||||
|
||||
if ((outmode & BURN_MODE_BITS) == (inmode & BURN_MODE_BITS)) {
|
||||
|
@ -914,7 +912,7 @@ void process_q(struct burn_drive *d, unsigned char *q)
|
|||
}
|
||||
break;
|
||||
case 2:
|
||||
/* XXX do not ignore these */
|
||||
/* XXX dont ignore these */
|
||||
break;
|
||||
case 3:
|
||||
/* burn_print(12, "ISRC data in mode 3 q\n");*/
|
||||
|
@ -925,7 +923,7 @@ void process_q(struct burn_drive *d, unsigned char *q)
|
|||
break;
|
||||
default:
|
||||
|
||||
/* ts A61009 : if reactivated then without Assert */
|
||||
/* ts A61009 : if reactivated then witout Assert */
|
||||
a ssert(0);
|
||||
}
|
||||
}
|
||||
|
@ -933,7 +931,7 @@ void process_q(struct burn_drive *d, unsigned char *q)
|
|||
|
||||
/* this needs more info. subs in the data? control/adr? */
|
||||
|
||||
/* ts A61119 : One should not use unofficial compiler extensions.
|
||||
/* ts A61119 : One should not use inofficial compiler extensions.
|
||||
>>> Some day this function needs to be implemented. At least for now
|
||||
the result does not match the "mode" of cdrecord -toc.
|
||||
*/
|
||||
|
|
|
@ -85,7 +85,7 @@ int sg_initialize(char msg[1024], int flag)
|
|||
|
||||
|
||||
/** Performs global finalization of the SCSI transport adapter and eventually
|
||||
needed operating system facilities. Releases globally acquired resources.
|
||||
needed operating system facilities. Releases globally aquired resources.
|
||||
@param flag unused yet, submit 0
|
||||
@return 1 = success, <=0 = failure
|
||||
*/
|
||||
|
@ -144,9 +144,9 @@ int scsi_enumerate_drives(void)
|
|||
}
|
||||
|
||||
|
||||
/** Tells whether libburn has the given drive in use or exclusively reserved.
|
||||
/** Tells wether libburn has the given drive in use or exclusively reserved.
|
||||
If it is "open" then libburn will eventually call sg_release() on it when
|
||||
it is time to give up usage and reservation.
|
||||
it is time to give up usage resp. reservation.
|
||||
*/
|
||||
/** Published as burn_drive.drive_is_open() */
|
||||
int sg_drive_is_open(struct burn_drive * d)
|
||||
|
@ -180,7 +180,7 @@ int sg_release(struct burn_drive *d)
|
|||
}
|
||||
|
||||
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates whether
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates wether
|
||||
the command succeeded or shall be retried or finally failed.
|
||||
Returned SCSI errors shall not lead to a return value indicating failure.
|
||||
The callers get notified by c->error. An SCSI failure which leads not to
|
||||
|
@ -213,7 +213,7 @@ int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no,
|
|||
}
|
||||
|
||||
|
||||
/** Tells whether a text is a persistent address as listed by the enumeration
|
||||
/** Tells wether a text is a persistent address as listed by the enumeration
|
||||
functions.
|
||||
*/
|
||||
int sg_is_enumerable_adr(char *adr)
|
||||
|
@ -223,7 +223,7 @@ int sg_is_enumerable_adr(char *adr)
|
|||
|
||||
|
||||
/* Return 1 if the given path leads to a regular file or a device that can be
|
||||
fseeked, read, and possibly written with 2 kB granularity.
|
||||
seeked, read, and possibly written with 2 kB granularity.
|
||||
*/
|
||||
int burn_os_is_2k_seekrw(char *path, int flag)
|
||||
{
|
||||
|
|
|
@ -47,8 +47,8 @@ sg_initialize() performs global initialization of the SCSI transport
|
|||
facilities. Checks for compatibility of supporting
|
||||
software components.
|
||||
|
||||
sg_shutdown() performs global finalizations and releases globally
|
||||
acquired resources.
|
||||
sg_shutdown() performs global finalizations and releases golbally
|
||||
aquired resources.
|
||||
|
||||
sg_give_next_adr() iterates over the set of potentially useful drive
|
||||
address strings.
|
||||
|
@ -57,10 +57,10 @@ scsi_enumerate_drives() brings all available, not-whitelist-banned, and
|
|||
accessible drives into libburn's list of drives.
|
||||
|
||||
sg_dispose_drive() finalizes adapter specifics of struct burn_drive
|
||||
on destruction. Releases resources which were acquired
|
||||
on destruction. Releases resources which were aquired
|
||||
underneath scsi_enumerate_drives().
|
||||
|
||||
sg_drive_is_open() tells whether libburn has the given drive in use.
|
||||
sg_drive_is_open() tells wether libburn has the given drive in use.
|
||||
|
||||
sg_grab() opens the drive for SCSI commands and ensures
|
||||
undisturbed access.
|
||||
|
@ -68,7 +68,7 @@ sg_grab() opens the drive for SCSI commands and ensures
|
|||
sg_release() closes a drive opened by sg_grab()
|
||||
|
||||
sg_issue_command() sends a SCSI command to the drive, receives reply,
|
||||
and evaluates whether the command succeeded or shall
|
||||
and evaluates wether the command succeeded or shall
|
||||
be retried or finally failed.
|
||||
|
||||
sg_obtain_scsi_adr() tries to obtain SCSI address parameters.
|
||||
|
@ -81,7 +81,7 @@ burn_os_is_2k_seekrw() tells whether the given path leads to a file object
|
|||
|
||||
burn_os_stdio_capacity() estimates the emulated media space of stdio-drives.
|
||||
|
||||
burn_os_open_track_src() opens a disk file in a way that offers best
|
||||
burn_os_open_track_src() opens a disk file in a way that allows best
|
||||
throughput with file reading and/or SCSI write command
|
||||
transmission.
|
||||
|
||||
|
@ -307,7 +307,7 @@ int sg_initialize(char msg[1024], int flag)
|
|||
|
||||
|
||||
/** Performs global finalization of the SCSI transport adapter and eventually
|
||||
needed operating system facilities. Releases globally acquired resources.
|
||||
needed operating system facilities. Releases globally aquired resources.
|
||||
@param flag unused yet, submit 0
|
||||
@return 1 = success, <=0 = failure
|
||||
*/
|
||||
|
@ -444,9 +444,9 @@ int scsi_enumerate_drives(void)
|
|||
}
|
||||
|
||||
|
||||
/** Tells whether libburn has the given drive in use or exclusively reserved.
|
||||
/** Tells wether libburn has the given drive in use or exclusively reserved.
|
||||
If it is "open" then libburn will eventually call sg_release() on it when
|
||||
it is time to give up usage and reservation.
|
||||
it is time to give up usage resp. reservation.
|
||||
*/
|
||||
/** Published as burn_drive.drive_is_open() */
|
||||
int sg_drive_is_open(struct burn_drive * d)
|
||||
|
@ -485,7 +485,7 @@ int sg_grab(struct burn_drive *d)
|
|||
}
|
||||
|
||||
|
||||
/** PORTING: Is mainly about the call to sg_close_drive() and whether it
|
||||
/** PORTING: Is mainly about the call to sg_close_drive() and wether it
|
||||
implements the demanded functionality.
|
||||
*/
|
||||
/** Gives up the drive for SCSI commands and releases eventual access locks.
|
||||
|
@ -500,7 +500,7 @@ int sg_release(struct burn_drive *d)
|
|||
}
|
||||
|
||||
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates whether
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates wether
|
||||
the command succeeded or shall be retried or finally failed.
|
||||
Returned SCSI errors shall not lead to a return value indicating failure.
|
||||
The callers get notified by c->error. An SCSI failure which leads not to
|
||||
|
@ -567,9 +567,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
ccb->csio.dxfer_len = 0;
|
||||
}
|
||||
|
||||
/* ts B90523 : Record effective transfer length request for debugging*/
|
||||
c->dxfer_len = ccb->csio.dxfer_len;
|
||||
|
||||
do {
|
||||
memset(&ccb->csio.sense_data, 0, sizeof(ccb->csio.sense_data));
|
||||
err = cam_send_ccb(d->cam, ccb);
|
||||
|
@ -588,7 +585,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
}
|
||||
/* XXX */
|
||||
memcpy(c->sense, &ccb->csio.sense_data, ccb->csio.sense_len);
|
||||
c->sense_len = ccb->csio.sense_len;
|
||||
if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
|
||||
if (!c->retry) {
|
||||
c->error = 1;
|
||||
|
@ -607,8 +603,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
} else {
|
||||
done = 1;
|
||||
}
|
||||
if (!done)
|
||||
spc_register_retry(c);
|
||||
} while (!done);
|
||||
cam_freeccb(ccb);
|
||||
return 1;
|
||||
|
@ -647,7 +641,7 @@ int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no,
|
|||
}
|
||||
|
||||
|
||||
/** Tells whether a text is a persistent address as listed by the enumeration
|
||||
/** Tells wether a text is a persistent address as listed by the enumeration
|
||||
functions.
|
||||
*/
|
||||
int sg_is_enumerable_adr(char* adr)
|
||||
|
|
|
@ -128,7 +128,7 @@ int sg_initialize(char msg[1024], int flag)
|
|||
|
||||
/* ts A91227 */
|
||||
/** Performs global finalization of the SCSI transport adapter and eventually
|
||||
needed operating system facilities. Releases globally acquired resources.
|
||||
needed operating system facilities. Releases globally aquired resources.
|
||||
@param flag unused yet, submit 0
|
||||
@return 1 = success, <=0 = failure
|
||||
*/
|
||||
|
@ -441,11 +441,6 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
|||
struct burn_drive *t;
|
||||
struct burn_drive out;
|
||||
|
||||
/* Initialize pointers to managed memory */
|
||||
out.devname = NULL;
|
||||
out.idata = NULL;
|
||||
out.mdata = NULL;
|
||||
|
||||
/* ts A60923 */
|
||||
out.bus_no = bus_no;
|
||||
out.host = host_no;
|
||||
|
@ -454,8 +449,6 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
|||
out.lun = lun_no;
|
||||
|
||||
out.devname = strdup(fname);
|
||||
if (out.devname == NULL)
|
||||
goto could_not_allocate;
|
||||
|
||||
out.cam = NULL;
|
||||
out.lock_fd = -1;
|
||||
|
@ -500,19 +493,9 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
|||
out.idata->valid = 0;
|
||||
out.mdata = calloc(1, sizeof(struct scsi_mode_data));
|
||||
if (out.idata == NULL || out.mdata == NULL) {
|
||||
could_not_allocate:;
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00020108,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Could not allocate new drive object", 0, 0);
|
||||
if (out.devname != NULL)
|
||||
free(out.devname);
|
||||
out.devname = NULL;
|
||||
if (out.idata != NULL)
|
||||
free(out.idata);
|
||||
out.idata = NULL;
|
||||
if (out.mdata != NULL)
|
||||
free(out.mdata);
|
||||
out.mdata = NULL;
|
||||
return;
|
||||
}
|
||||
out.mdata->p2a_valid = 0;
|
||||
|
@ -873,9 +856,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
ccb->csio.dxfer_len = 0;
|
||||
}
|
||||
|
||||
/* ts B90523 : Record effective transfer length request for debugging*/
|
||||
c->dxfer_len = ccb->csio.dxfer_len;
|
||||
|
||||
start_time = time(NULL);
|
||||
for (i = 0; !done; i++) {
|
||||
|
||||
|
@ -988,8 +968,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
timeout_ms, i, !!ignore_error);
|
||||
if (d->cancel)
|
||||
done = 1;
|
||||
if (!done)
|
||||
spc_register_retry(c);
|
||||
} while (!done);
|
||||
ret = 1;
|
||||
ex:;
|
||||
|
@ -1000,7 +978,7 @@ ex:;
|
|||
|
||||
/* ts B00115 */
|
||||
/* Return 1 if the given path leads to a regular file or a device that can be
|
||||
fseeked, read and eventually written with 2 kB granularity.
|
||||
seeked, read and eventually written with 2 kB granularity.
|
||||
*/
|
||||
int burn_os_is_2k_seekrw(char *path, int flag)
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/*
|
||||
Copyright (c) 2009 - 2016 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2009 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -44,8 +44,8 @@ sg_initialize() performs global initialization of the SCSI transport
|
|||
facilities. Checks for compatibility of supporting
|
||||
software components.
|
||||
|
||||
sg_shutdown() performs global finalizations and releases globally
|
||||
acquired resources.
|
||||
sg_shutdown() performs global finalizations and releases golbally
|
||||
aquired resources.
|
||||
|
||||
sg_give_next_adr() iterates over the set of potentially useful drive
|
||||
address strings.
|
||||
|
@ -54,10 +54,10 @@ scsi_enumerate_drives() brings all available, not-whitelist-banned, and
|
|||
accessible drives into libburn's list of drives.
|
||||
|
||||
sg_dispose_drive() finalizes adapter specifics of struct burn_drive
|
||||
on destruction. Releases resources which were acquired
|
||||
on destruction. Releases resources which were aquired
|
||||
underneath scsi_enumerate_drives().
|
||||
|
||||
sg_drive_is_open() tells whether libburn has the given drive in use.
|
||||
sg_drive_is_open() tells wether libburn has the given drive in use.
|
||||
|
||||
sg_grab() opens the drive for SCSI commands and ensures
|
||||
undisturbed access.
|
||||
|
@ -65,7 +65,7 @@ sg_grab() opens the drive for SCSI commands and ensures
|
|||
sg_release() closes a drive opened by sg_grab()
|
||||
|
||||
sg_issue_command() sends a SCSI command to the drive, receives reply,
|
||||
and evaluates whether the command succeeded or shall
|
||||
and evaluates wether the command succeeded or shall
|
||||
be retried or finally failed.
|
||||
|
||||
sg_obtain_scsi_adr() tries to obtain SCSI address parameters.
|
||||
|
@ -78,7 +78,7 @@ burn_os_is_2k_seekrw() tells whether the given path leads to a file object
|
|||
|
||||
burn_os_stdio_capacity() estimates the emulated media space of stdio-drives.
|
||||
|
||||
burn_os_open_track_src() opens a disk file in a way that offers best
|
||||
burn_os_open_track_src() opens a disk file in a way that allows best
|
||||
throughput with file reading and/or SCSI write command
|
||||
transmission.
|
||||
|
||||
|
@ -395,7 +395,7 @@ int sg_initialize(char msg[1024], int flag)
|
|||
|
||||
|
||||
/** Performs global finalization of the SCSI transport adapter and eventually
|
||||
needed operating system facilities. Releases globally acquired resources.
|
||||
needed operating system facilities. Releases globally aquired resources.
|
||||
@param flag unused yet, submit 0
|
||||
@return 1 = success, <=0 = failure
|
||||
*/
|
||||
|
@ -529,7 +529,7 @@ ex:;
|
|||
|
||||
/** Tells whether libburn has the given drive in use or exclusively reserved.
|
||||
If it is "open" then libburn will eventually call sg_release() on it when
|
||||
it is time to give up usage and reservation.
|
||||
it is time to give up usage resp. reservation.
|
||||
*/
|
||||
/** Published as burn_drive.drive_is_open() */
|
||||
int sg_drive_is_open(struct burn_drive * d)
|
||||
|
@ -609,7 +609,7 @@ int sg_release(struct burn_drive *d)
|
|||
}
|
||||
|
||||
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates whether
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates wether
|
||||
the command succeeded or shall be retried or finally failed.
|
||||
Returned SCSI errors shall not lead to a return value indicating failure.
|
||||
The callers get notified by c->error. An SCSI failure which leads not to
|
||||
|
@ -665,9 +665,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
e_direction = SCSI_MMC_DATA_NONE;
|
||||
}
|
||||
|
||||
/* ts B90523 : Record effective transfer length request for debugging*/
|
||||
c->dxfer_len = dxfer_len;
|
||||
|
||||
/* retry-loop */
|
||||
start_time = time(NULL);
|
||||
if (c->timeout > 0)
|
||||
|
@ -731,8 +728,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
start_time, timeout_ms, i, 0);
|
||||
if (d->cancel)
|
||||
done = 1;
|
||||
if (!done)
|
||||
spc_register_retry(c);
|
||||
|
||||
} /* end of retry-loop */
|
||||
|
||||
|
@ -768,7 +763,7 @@ int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no,
|
|||
}
|
||||
|
||||
|
||||
/** Tells whether a text is a persistent address as listed by the enumeration
|
||||
/** Tells wether a text is a persistent address as listed by the enumeration
|
||||
functions.
|
||||
*/
|
||||
int sg_is_enumerable_adr(char* adr)
|
||||
|
@ -845,7 +840,7 @@ static int freebsd_is_2k_seekrw(char *path, int flag)
|
|||
|
||||
|
||||
/* Return 1 if the given path leads to a regular file or a device that can be
|
||||
fseeked, read, and possibly written with 2 kB granularity.
|
||||
seeked, read, and possibly written with 2 kB granularity.
|
||||
*/
|
||||
int burn_os_is_2k_seekrw(char *path, int flag)
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2020 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -50,8 +50,8 @@ sg_initialize() performs global initialization of the SCSI transport
|
|||
facilities. Checks for compatibility of supporting
|
||||
software components.
|
||||
|
||||
sg_shutdown() performs global finalizations and releases globally
|
||||
acquired resources.
|
||||
sg_shutdown() performs global finalizations and releases golbally
|
||||
aquired resources.
|
||||
|
||||
sg_give_next_adr() iterates over the set of potentially useful drive
|
||||
address strings.
|
||||
|
@ -60,10 +60,10 @@ scsi_enumerate_drives() brings all available, not-whitelist-banned, and
|
|||
accessible drives into libburn's list of drives.
|
||||
|
||||
sg_dispose_drive() finalizes adapter specifics of struct burn_drive
|
||||
on destruction. Releases resources which were acquired
|
||||
on destruction. Releases resources which were aquired
|
||||
underneath scsi_enumerate_drives().
|
||||
|
||||
sg_drive_is_open() tells whether libburn has the given drive in use.
|
||||
sg_drive_is_open() tells wether libburn has the given drive in use.
|
||||
|
||||
sg_grab() opens the drive for SCSI commands and ensures
|
||||
undisturbed access.
|
||||
|
@ -71,7 +71,7 @@ sg_grab() opens the drive for SCSI commands and ensures
|
|||
sg_release() closes a drive opened by sg_grab()
|
||||
|
||||
sg_issue_command() sends a SCSI command to the drive, receives reply,
|
||||
and evaluates whether the command succeeded or shall
|
||||
and evaluates wether the command succeeded or shall
|
||||
be retried or finally failed.
|
||||
|
||||
sg_obtain_scsi_adr() tries to obtain SCSI address parameters.
|
||||
|
@ -84,7 +84,7 @@ burn_os_is_2k_seekrw() tells whether the given path leads to a file object
|
|||
|
||||
burn_os_stdio_capacity() estimates the emulated media space of stdio-drives.
|
||||
|
||||
burn_os_open_track_src() opens a disk file in a way that offers best
|
||||
burn_os_open_track_src() opens a disk file in a way that allows best
|
||||
throughput with file reading and/or SCSI write command
|
||||
transmission.
|
||||
|
||||
|
@ -111,15 +111,6 @@ Hint: You should also look into sg-freebsd-port.c, which is a younger and
|
|||
|
||||
/** PORTING : ------- OS dependent headers and definitions ------ */
|
||||
|
||||
#ifdef Libburn_read_o_direcT
|
||||
/* ts B91124:
|
||||
DISABLED, because this spoils multi-track burning of cdrskin by a hard to
|
||||
fix bug in cdrskin/cdrfifo.c
|
||||
DO NOT ENABLE before the wait code in that source file is fixed.
|
||||
*/
|
||||
#undef Libburn_read_o_direcT
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef Libburn_read_o_direcT
|
||||
# ifndef _GNU_SOURCE
|
||||
|
@ -210,7 +201,7 @@ static int linux_sg_auto_family = 1;
|
|||
|
||||
/* Set this to 1 in order to accept any TYPE_* (see scsi/scsi.h) */
|
||||
/* But try with 0 first. There is hope via CDROM_DRIVE_STATUS. */
|
||||
/* !!! DO NOT SET TO 1 UNLESS YOU PROTECTED ALL INDISPENSABLE DEVICES
|
||||
/* !!! DO NOT SET TO 1 UNLESS YOU PROTECTED ALL INDISPENSIBLE DEVICES
|
||||
chmod -rw !!! */
|
||||
static int linux_sg_accept_any_type = 0;
|
||||
|
||||
|
@ -225,7 +216,15 @@ static char linux_ata_device_family[80] = {"/dev/hd%c"};
|
|||
|
||||
/* Set this to 1 in order to get on stderr messages from ata_enumerate()
|
||||
*/
|
||||
static int linux_ata_enumerate_verbose = 0;
|
||||
static int linux_ata_enumerate_verbous = 0;
|
||||
|
||||
|
||||
/* The waiting time before eventually retrying a failed SCSI command.
|
||||
Before each retry wait Libburn_sg_linux_retry_incR longer than with
|
||||
the previous one.
|
||||
*/
|
||||
#define Libburn_sg_linux_retry_usleeP 100000
|
||||
#define Libburn_sg_linux_retry_incR 100000
|
||||
|
||||
|
||||
/** PORTING : ------ libburn portable headers and definitions ----- */
|
||||
|
@ -296,7 +295,7 @@ int mmc_function_spy(struct burn_drive *d, char * text);
|
|||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
/* ts A70413 */
|
||||
/* This finds out whether the software is running on kernel >= 2.6
|
||||
/* This finds out wether the software is running on kernel >= 2.6
|
||||
*/
|
||||
static void sg_evaluate_kernel(void)
|
||||
{
|
||||
|
@ -314,7 +313,7 @@ static void sg_evaluate_kernel(void)
|
|||
|
||||
|
||||
/* ts A70314 */
|
||||
/* This installs the device file family if one was chosen explicitly
|
||||
/* This installs the device file family if one was chosen explicitely
|
||||
by burn_preset_device_open()
|
||||
*/
|
||||
static void sg_select_device_family(void)
|
||||
|
@ -383,33 +382,21 @@ static int sg_exchange_scd_for_sr(char *fname, int flag)
|
|||
/* This is an early stage version of scsi_log_cmd.
|
||||
>>> It will become obsolete when the /tmp file handler is moved into
|
||||
>>> scsi_log_command().
|
||||
@param flag bit0= data direction is FROM_DRIVE
|
||||
*/
|
||||
static int sgio_log_cmd(unsigned char *cmd, int cmd_len, FILE *fp_in, int flag)
|
||||
{
|
||||
FILE *fp = fp_in;
|
||||
int ret = 0;
|
||||
int data_dir = NO_TRANSFER;
|
||||
|
||||
if (flag & 1)
|
||||
data_dir = FROM_DRIVE;
|
||||
int ret;
|
||||
|
||||
/* >>> ts B11110 : move this into scsi_log_command() */
|
||||
if (fp == NULL && (burn_sg_log_scsi & 1)) {
|
||||
fp= fopen("/tmp/libburn_sg_command_log", "a");
|
||||
if (fp != NULL)
|
||||
fprintf(fp,
|
||||
"\n=========================================\n");
|
||||
fprintf(fp, "\n=========================================\n");
|
||||
}
|
||||
|
||||
if (fp != NULL)
|
||||
ret = scsi_log_command(cmd, cmd_len, data_dir, NULL, 0,
|
||||
fp, flag);
|
||||
ret = scsi_log_command(cmd, cmd_len, NO_TRANSFER, NULL, 0, fp, flag);
|
||||
if (fp_in == NULL && fp != NULL)
|
||||
fclose(fp);
|
||||
if (fp == stderr || !(burn_sg_log_scsi & 2))
|
||||
return ret;
|
||||
ret = scsi_log_command(cmd, cmd_len, data_dir, NULL, 0, stderr, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -481,7 +468,7 @@ static int sgio_inquiry_cd_drive(int fd, char *fname)
|
|||
s.dxfer_len = 36;
|
||||
s.usr_ptr = NULL;
|
||||
|
||||
sgio_log_cmd(s.cmdp, s.cmd_len, NULL, 1);
|
||||
sgio_log_cmd(s.cmdp, s.cmd_len, NULL, 0);
|
||||
|
||||
c_start_time = burn_get_time(0);
|
||||
ret = ioctl(fd, SG_IO, &s);
|
||||
|
@ -667,7 +654,7 @@ ex:;
|
|||
So libburn will by default use open(O_EXCL) first and afterwards
|
||||
as second assertion will use fcntl(F_SETLK). One lock more should not harm.
|
||||
*/
|
||||
static int sg_fcntl_lock(int *fd, char *fd_name, int l_type, int verbose)
|
||||
static int sg_fcntl_lock(int *fd, char *fd_name, int l_type, int verbous)
|
||||
{
|
||||
struct flock lockthing;
|
||||
char msg[81];
|
||||
|
@ -688,7 +675,7 @@ static int sg_fcntl_lock(int *fd, char *fd_name, int l_type, int verbose)
|
|||
|
||||
ret = fcntl(*fd, F_SETLK, &lockthing);
|
||||
if (ret == -1) {
|
||||
if (verbose) {
|
||||
if (verbous) {
|
||||
sprintf(msg, "Device busy. Failed to fcntl-lock '%s'",
|
||||
fd_name);
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00020008,
|
||||
|
@ -820,88 +807,6 @@ static int sg_release_siblings(int sibling_fds[],
|
|||
}
|
||||
|
||||
|
||||
/* ts C00806 */
|
||||
/** Urges the operating system to re-assess drive and medium state
|
||||
*/
|
||||
static int sg_os_revalidate_disc(struct burn_drive *d)
|
||||
{
|
||||
|
||||
#ifdef Libburn_use_linux_ioctl_simul_changE
|
||||
|
||||
/* <<< only for compiler tests */
|
||||
#ifndef CDROM_SIMUL_CHANGE
|
||||
/* # def ine CDROM_SIMUL_CHANGE 0x5332 */
|
||||
#endif
|
||||
|
||||
#ifdef CDROM_SIMUL_CHANGE
|
||||
|
||||
int fd, ret;
|
||||
long old_blocks, new_blocks;
|
||||
char *msg = NULL;
|
||||
|
||||
BURN_ALLOC_MEM(msg, char, 161);
|
||||
|
||||
ret = ioctl(d->fd, BLKGETSIZE, &old_blocks);
|
||||
if (ret == -1)
|
||||
old_blocks = -1;
|
||||
|
||||
/* Schedule a simulated medium change event.
|
||||
Although the implemented ioctl cannot fail, the kernel might be too
|
||||
old to know it and then throw errors like ENOTTY.
|
||||
*/
|
||||
ret = ioctl(d->fd, CDROM_SIMUL_CHANGE, 0);
|
||||
if (ret == -1) {
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x02, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"ioctl(CDROM_SIMUL_CHANGE) failed", errno, 0);
|
||||
ret = 0; goto ex;
|
||||
}
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x02, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"ioctl(CDROM_SIMUL_CHANGE) was performed", 0, 0);
|
||||
/* Try to trigger actual device assessment by a open(2) call */
|
||||
fd = open(d->devname, O_RDONLY | O_NDELAY);
|
||||
if (fd == -1) {
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x02, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Failed to open device file after ioctl(CDROM_SIMUL_CHANGE)",
|
||||
errno, 0);
|
||||
ret = 0; goto ex;
|
||||
}
|
||||
close(fd);
|
||||
ret = ioctl(d->fd, BLKGETSIZE, &new_blocks);
|
||||
if (ret == -1) {
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x02, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"BLKGETSIZE failed after ioctl(CDROM_SIMUL_CHANGE)",
|
||||
errno, 0);
|
||||
} else if (old_blocks != new_blocks) {
|
||||
sprintf(msg,
|
||||
"BLKGETSIZE indicates size change from %ld to %ld blocks",
|
||||
old_blocks , new_blocks);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x02, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
}
|
||||
ex:
|
||||
BURN_FREE_MEM(msg);
|
||||
return ret;
|
||||
|
||||
#else /* CDROM_SIMUL_CHANGE */
|
||||
|
||||
return 0;
|
||||
|
||||
#endif /* ! CDROM_SIMUL_CHANGE */
|
||||
|
||||
#else /* Libburn_use_linux_ioctl_simul_changE */
|
||||
|
||||
return 0;
|
||||
|
||||
#endif /* ! Libburn_use_linux_ioctl_simul_changE */
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* ts A60926 */
|
||||
static int sg_close_drive(struct burn_drive *d)
|
||||
{
|
||||
|
@ -911,9 +816,6 @@ static int sg_close_drive(struct burn_drive *d)
|
|||
return 0;
|
||||
sg_release_siblings(d->sibling_fds, d->sibling_fnames,
|
||||
&(d->sibling_count));
|
||||
if(d->medium_state_changed > 0)
|
||||
sg_os_revalidate_disc(d);
|
||||
d->medium_state_changed = -1;
|
||||
ret = sg_close_drive_fd(d->devname, d->global_index, &(d->fd), 0);
|
||||
return ret;
|
||||
}
|
||||
|
@ -1021,7 +923,7 @@ static int is_ata_drive(char *fname, int fd_in)
|
|||
else
|
||||
fd = sg_open_drive_fd(fname, 1);
|
||||
if (fd == -1) {
|
||||
if (linux_ata_enumerate_verbose)
|
||||
if (linux_ata_enumerate_verbous)
|
||||
fprintf(stderr,"open failed, errno=%d '%s'\n",
|
||||
errno, strerror(errno));
|
||||
return 0;
|
||||
|
@ -1032,7 +934,7 @@ static int is_ata_drive(char *fname, int fd_in)
|
|||
|
||||
/* not atapi */
|
||||
if (!(tm.config & 0x8000) || (tm.config & 0x4000)) {
|
||||
if (linux_ata_enumerate_verbose)
|
||||
if (linux_ata_enumerate_verbous)
|
||||
fprintf(stderr, "not marked as ATAPI\n");
|
||||
if (fd_in < 0)
|
||||
sg_close_drive_fd(fname, -1, &fd, 0);
|
||||
|
@ -1042,7 +944,7 @@ static int is_ata_drive(char *fname, int fd_in)
|
|||
/* if SG_IO fails on an atapi device, we should stop trying to
|
||||
use hd* devices */
|
||||
if (sgio_test(fd) == -1) {
|
||||
if (linux_ata_enumerate_verbose)
|
||||
if (linux_ata_enumerate_verbous)
|
||||
fprintf(stderr,
|
||||
"FATAL: sgio_test() failed: errno=%d '%s'\n",
|
||||
errno, strerror(errno));
|
||||
|
@ -1053,7 +955,7 @@ static int is_ata_drive(char *fname, int fd_in)
|
|||
if (fd_in >= 0)
|
||||
return 1;
|
||||
if (sg_close_drive_fd(fname, -1, &fd, 1) <= 0) {
|
||||
if (linux_ata_enumerate_verbose)
|
||||
if (linux_ata_enumerate_verbous)
|
||||
fprintf(stderr,
|
||||
"cannot close properly, errno=%d '%s'\n",
|
||||
errno, strerror(errno));
|
||||
|
@ -1143,18 +1045,22 @@ static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
|
|||
{ret = 0; goto ex;}
|
||||
}
|
||||
|
||||
/* ts A61211 : employ a more general ioctl */
|
||||
/* ts B11001 : re-use fd */
|
||||
/* ts B80902 : call unconditionally because host_no differs
|
||||
between SG_GET_SCSI_ID and SCSI_IOCTL_GET_IDLUN
|
||||
*/
|
||||
ret = sg_obtain_scsi_adr_fd(fname, fd, bus_no, host_no,
|
||||
channel_no, target_no, lun_no);
|
||||
if (ret <= 0) {
|
||||
if (linux_sg_enumerate_debug)
|
||||
fprintf(stderr,
|
||||
"sg_obtain_scsi_adr_fd() failed\n");
|
||||
{ret = 0; goto ex;}
|
||||
if (sid_ret == -1 || sid.scsi_id < 0) {
|
||||
/* ts A61211 : employ a more general ioctl */
|
||||
/* ts B11001 : re-use fd */
|
||||
ret = sg_obtain_scsi_adr_fd(fname, fd, bus_no, host_no,
|
||||
channel_no, target_no, lun_no);
|
||||
if (ret>0) {
|
||||
sid.host_no = *host_no;
|
||||
sid.channel = *channel_no;
|
||||
sid.scsi_id = *target_no;
|
||||
sid.lun = *lun_no;
|
||||
} else {
|
||||
if (linux_sg_enumerate_debug)
|
||||
fprintf(stderr,
|
||||
"sg_obtain_scsi_adr_fd() failed\n");
|
||||
{ret = 0; goto ex;}
|
||||
}
|
||||
}
|
||||
|
||||
/* ts A60927 : trying to do locking with growisofs */
|
||||
|
@ -1174,6 +1080,16 @@ static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
|
|||
sg_release_siblings(sibling_fds, sibling_fnames,
|
||||
&sibling_count);
|
||||
}
|
||||
#ifdef SCSI_IOCTL_GET_BUS_NUMBER
|
||||
if(*bus_no == -1)
|
||||
*bus_no = 1000 * (sid.host_no + 1) + sid.channel;
|
||||
#else
|
||||
*bus_no = sid.host_no;
|
||||
#endif
|
||||
*host_no= sid.host_no;
|
||||
*channel_no= sid.channel;
|
||||
*target_no= sid.scsi_id;
|
||||
*lun_no= sid.lun;
|
||||
ret = 1;
|
||||
ex:;
|
||||
if (fd_in < 0 && fd >= 0) {
|
||||
|
@ -1199,7 +1115,7 @@ static int sg_open_for_enumeration(char *fname, int flag)
|
|||
|
||||
fd = sg_open_drive_fd(fname, 1 + (flag & 1));
|
||||
if (fd < 0) {
|
||||
if (linux_sg_enumerate_debug || linux_ata_enumerate_verbose)
|
||||
if (linux_sg_enumerate_debug || linux_ata_enumerate_verbous)
|
||||
fprintf(stderr, "open failed, errno=%d '%s'\n",
|
||||
errno, strerror(errno));
|
||||
return -1;
|
||||
|
@ -1215,7 +1131,7 @@ static void ata_enumerate(void)
|
|||
int ret, i, fd = -1;
|
||||
char fname[10];
|
||||
|
||||
if (linux_ata_enumerate_verbose)
|
||||
if (linux_ata_enumerate_verbous)
|
||||
fprintf(stderr, "libburn_debug: linux_ata_device_family = %s\n",
|
||||
linux_ata_device_family);
|
||||
|
||||
|
@ -1224,12 +1140,12 @@ static void ata_enumerate(void)
|
|||
|
||||
for (i = 0; i < 26; i++) {
|
||||
sprintf(fname, linux_ata_device_family, 'a' + i);
|
||||
if (linux_ata_enumerate_verbose)
|
||||
if (linux_ata_enumerate_verbous)
|
||||
fprintf(stderr, "libburn_debug: %s : ", fname);
|
||||
|
||||
/* ts A51221 */
|
||||
if (burn_drive_is_banned(fname)) {
|
||||
if (linux_ata_enumerate_verbose)
|
||||
if (linux_ata_enumerate_verbous)
|
||||
fprintf(stderr, "not in whitelist\n");
|
||||
continue;
|
||||
}
|
||||
|
@ -1241,7 +1157,7 @@ static void ata_enumerate(void)
|
|||
break;
|
||||
if (ret == 0)
|
||||
continue;
|
||||
if (linux_ata_enumerate_verbose)
|
||||
if (linux_ata_enumerate_verbous)
|
||||
fprintf(stderr, "accepting as drive without SCSI address\n");
|
||||
enumerate_common(fname, fd, -1, -1, -1, -1, -1);
|
||||
}
|
||||
|
@ -1505,7 +1421,7 @@ static int add_proc_info_drives(int flag)
|
|||
char **list= NULL;
|
||||
|
||||
if (burn_sg_use_family != 0)
|
||||
return(1); /* Looking only for sr , scd , sg */
|
||||
return(1); /* Looking only for sr resp. scd resp. sg */
|
||||
|
||||
ret = proc_sys_dev_cdrom_info(&list, &list_count, 0);
|
||||
if (ret <= 0)
|
||||
|
@ -1614,7 +1530,7 @@ int sg_initialize(char msg[1024], int flag)
|
|||
|
||||
|
||||
/** Performs global finalization of the SCSI transport adapter and eventually
|
||||
needed operating system facilities. Releases globally acquired resources.
|
||||
needed operating system facilities. Releases globally aquired resources.
|
||||
@param flag unused yet, submit 0
|
||||
@return 1 = success, <=0 = failure
|
||||
*/
|
||||
|
@ -1708,8 +1624,6 @@ next_ata:;
|
|||
|
||||
next_proc_info:;
|
||||
baseno += ata_limit;
|
||||
if (burn_sg_use_family != 0) /* Only with default enumeration */
|
||||
return 0;
|
||||
for (i = 0; i < idx->info_count; i++) {
|
||||
if ((idx->info_list)[i][0] == 0)
|
||||
continue;
|
||||
|
@ -1745,7 +1659,7 @@ return_1_pre_proc:;
|
|||
and accessability. If burn activities are prone to external interference
|
||||
on your system it is also necessary to obtain exclusive access locks on
|
||||
the drives.
|
||||
Hand over each accepted drive to enumerate_common() or its replacement
|
||||
Hand over each accepted drive to enumerate_common() resp. its replacement
|
||||
within your port.
|
||||
|
||||
See FreeBSD port sketch sg-freebsd-port.c for such an implementation.
|
||||
|
@ -1769,9 +1683,9 @@ int scsi_enumerate_drives(void)
|
|||
}
|
||||
|
||||
|
||||
/** Tells whether libburn has the given drive in use or exclusively reserved.
|
||||
/** Tells wether libburn has the given drive in use or exclusively reserved.
|
||||
If it is "open" then libburn will eventually call sg_release() on it when
|
||||
it is time to give up usage and reservation.
|
||||
it is time to give up usage resp. reservation.
|
||||
*/
|
||||
/** Published as burn_drive.drive_is_open() */
|
||||
int sg_drive_is_open(struct burn_drive * d)
|
||||
|
@ -1824,7 +1738,7 @@ int sg_grab(struct burn_drive *d)
|
|||
/* ts A60813 - A60822
|
||||
After enumeration the drive fd is probably still open.
|
||||
-1337 is the initial value of burn_drive.fd and the value after
|
||||
release of drive. Unclear why not the official error return
|
||||
relase of drive. Unclear why not the official error return
|
||||
value -1 of open(2) war used. */
|
||||
if(! burn_drive_is_open(d)) {
|
||||
char msg[120];
|
||||
|
@ -1949,7 +1863,7 @@ drive_is_in_use:;
|
|||
}
|
||||
|
||||
|
||||
/** PORTING: Is mainly about the call to sg_close_drive() and whether it
|
||||
/** PORTING: Is mainly about the call to sg_close_drive() and wether it
|
||||
implements the demanded functionality.
|
||||
*/
|
||||
/** Gives up the drive for SCSI commands and releases eventual access locks.
|
||||
|
@ -2047,15 +1961,9 @@ static int evaluate_transport_success(struct burn_drive *d, struct command *c,
|
|||
(unsigned int) host_status, host_problem);
|
||||
sev = LIBDAX_MSGS_SEV_FAILURE;
|
||||
if (do_retry && !give_up_drive)
|
||||
sev = LIBDAX_MSGS_SEV_NOTE;
|
||||
sev = LIBDAX_MSGS_SEV_DEBUG;
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x000201a7, sev, LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0);
|
||||
strcpy(msg, "Command: ");
|
||||
if (spc_human_readable_cmd(c, msg + strlen(msg),
|
||||
160 - strlen(msg), 0) > 0)
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x000201a7, sev, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
sprintf(msg, "--- SG_IO: host_status= 0x%x %s",
|
||||
(unsigned int) host_status, host_problem);
|
||||
scsi_log_message(d, fp, msg, 0);
|
||||
|
@ -2098,7 +2006,7 @@ static int evaluate_transport_success(struct burn_drive *d, struct command *c,
|
|||
give_up_drive= 1;
|
||||
break; case 0x80:
|
||||
driver_sugg = "SG_ERR_SUGGEST_SENSE";
|
||||
break; default:
|
||||
default:
|
||||
driver_sugg = "(unknown driver_status suggestion)";
|
||||
}
|
||||
if ((driver_status & 0xf7) != Libburn_sg_driver_oK) {
|
||||
|
@ -2109,15 +2017,9 @@ static int evaluate_transport_success(struct burn_drive *d, struct command *c,
|
|||
driver_problem, driver_sugg);
|
||||
sev = LIBDAX_MSGS_SEV_FAILURE;
|
||||
if (do_retry && !give_up_drive)
|
||||
sev = LIBDAX_MSGS_SEV_NOTE;
|
||||
sev = LIBDAX_MSGS_SEV_DEBUG;
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x000201a8, sev, LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0);
|
||||
strcpy(msg, "Command: ");
|
||||
if (spc_human_readable_cmd(c, msg + strlen(msg),
|
||||
160 - strlen(msg), 0) > 0)
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x000201a8, sev, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
sprintf(msg, "--- SG_IO: driver_status= 0x%x %s / %s",
|
||||
(unsigned int) driver_status,
|
||||
driver_problem, driver_sugg);
|
||||
|
@ -2147,7 +2049,7 @@ static void react_on_drive_loss(struct burn_drive *d, struct command *c,
|
|||
scsi_log_message(d, fp, "--- SG_IO: Gave up connection to drive", 0);
|
||||
}
|
||||
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates whether
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates wether
|
||||
the command succeeded or shall be retried or finally failed.
|
||||
Returned SCSI errors shall not lead to a return value indicating failure.
|
||||
The callers get notified by c->error. An SCSI failure which leads not to
|
||||
|
@ -2277,9 +2179,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
}
|
||||
s.usr_ptr = c;
|
||||
|
||||
/* ts B90523 : Record effective transfer length request for debugging*/
|
||||
c->dxfer_len = s.dxfer_len;
|
||||
|
||||
start_time = time(NULL);
|
||||
for(i = 0; !done; i++) {
|
||||
|
||||
|
@ -2316,19 +2215,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
(unsigned int) s.host_status,
|
||||
(unsigned int) s.driver_status);
|
||||
scsi_log_message(d, fp, msg, 0);
|
||||
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index, 0x0002010c,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
sprintf(msg, "Attempted command: ");
|
||||
spc_human_readable_cmd(c, msg + strlen(msg),
|
||||
160 - strlen(msg), 0);
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index, 0x0002010c,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
|
||||
react_on_drive_loss(d, c, fp);
|
||||
{ret = -1; goto ex;}
|
||||
}
|
||||
|
@ -2347,13 +2233,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
if (d->cancel)
|
||||
break;
|
||||
/* if ! done : loop for retry */;
|
||||
if (!done) {
|
||||
spc_register_retry(c);
|
||||
if (burn_sg_log_scsi & 3) {
|
||||
scsi_log_text("+++ Repeating command", fp, 0);
|
||||
scsi_log_cmd(c, fp, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ret = 1;
|
||||
|
@ -2378,7 +2257,7 @@ static int sg_obtain_scsi_adr_fd(char *path, int fd_in,
|
|||
};
|
||||
struct my_scsi_idlun idlun;
|
||||
|
||||
/* valgrind called idlun uninitialized because it is blind for ioctl */
|
||||
/* valgrind called idlun unitialized because it is blind for ioctl */
|
||||
idlun.x = 0;
|
||||
idlun.host_unique_id = 0;
|
||||
|
||||
|
@ -2447,7 +2326,7 @@ int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no,
|
|||
|
||||
|
||||
/* ts A60922 ticket 33 : called from drive.c */
|
||||
/** Tells whether a text is a persistent address as listed by the enumeration
|
||||
/** Tells wether a text is a persistent address as listed by the enumeration
|
||||
functions.
|
||||
*/
|
||||
int sg_is_enumerable_adr(char *adr)
|
||||
|
@ -2478,7 +2357,7 @@ ex:;
|
|||
|
||||
/* ts B00115 */
|
||||
/* Return 1 if the given path leads to a regular file or a device that can be
|
||||
fseeked, read, and possibly written with 2 kB granularity.
|
||||
seeked, read, and possibly written with 2 kB granularity.
|
||||
*/
|
||||
int burn_os_is_2k_seekrw(char *path, int flag)
|
||||
{
|
||||
|
@ -2516,6 +2395,7 @@ int burn_os_stdio_capacity(char *path, off_t write_start, off_t *bytes)
|
|||
|
||||
BURN_ALLOC_MEM(testpath, char, 4096);
|
||||
testpath[0] = 0;
|
||||
blocks = *bytes / 512;
|
||||
if (stat(path, &stbuf) == -1) {
|
||||
strcpy(testpath, path);
|
||||
cpt = strrchr(testpath, '/');
|
||||
|
|
|
@ -1,15 +1,13 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/*
|
||||
Copyright (c) 2010 - 2016 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2010 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
Derived 2014 from libburn/sg-solaris.c with information learned from
|
||||
dvd+rw-tools, http://fxr.watson.org/fxr/source/sys/scsiio.h?v=NETBSD,
|
||||
http://netbsd.gw.com/cgi-bin/man-cgi?scsi+4+NetBSD-current,
|
||||
and experiments made by Freddy Fisker.
|
||||
Adapted 2016 to OpenBSD by help of SASANO Takayoshi <uaa@mx5.nisiq.net>.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
@ -19,7 +17,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: NetBSD 6, ioctl SCIOCCOMMAND
|
||||
OpenBSD 5.9, ioctl SCIOCCOMMAND
|
||||
>>> ??? for OpenBSD too ?
|
||||
|
||||
PORTING:
|
||||
|
||||
|
@ -51,8 +49,8 @@ sg_initialize() performs global initialization of the SCSI transport
|
|||
facilities. Checks for compatibility of supporting
|
||||
software components.
|
||||
|
||||
sg_shutdown() performs global finalizations and releases globally
|
||||
acquired resources.
|
||||
sg_shutdown() performs global finalizations and releases golbally
|
||||
aquired resources.
|
||||
|
||||
sg_give_next_adr() iterates over the set of potentially useful drive
|
||||
address strings.
|
||||
|
@ -61,10 +59,10 @@ scsi_enumerate_drives() brings all available, not-whitelist-banned, and
|
|||
accessible drives into libburn's list of drives.
|
||||
|
||||
sg_dispose_drive() finalizes adapter specifics of struct burn_drive
|
||||
on destruction. Releases resources which were acquired
|
||||
on destruction. Releases resources which were aquired
|
||||
underneath scsi_enumerate_drives().
|
||||
|
||||
sg_drive_is_open() tells whether libburn has the given drive in use.
|
||||
sg_drive_is_open() tells wether libburn has the given drive in use.
|
||||
|
||||
sg_grab() opens the drive for SCSI commands and ensures
|
||||
undisturbed access.
|
||||
|
@ -72,7 +70,7 @@ sg_grab() opens the drive for SCSI commands and ensures
|
|||
sg_release() closes a drive opened by sg_grab()
|
||||
|
||||
sg_issue_command() sends a SCSI command to the drive, receives reply,
|
||||
and evaluates whether the command succeeded or shall
|
||||
and evaluates wether the command succeeded or shall
|
||||
be retried or finally failed.
|
||||
|
||||
sg_obtain_scsi_adr() tries to obtain SCSI address parameters.
|
||||
|
@ -85,7 +83,7 @@ burn_os_is_2k_seekrw() tells whether the given path leads to a file object
|
|||
|
||||
burn_os_stdio_capacity() estimates the emulated media space of stdio-drives.
|
||||
|
||||
burn_os_open_track_src() opens a disk file in a way that offers best
|
||||
burn_os_open_track_src() opens a disk file in a way that allows best
|
||||
throughput with file reading and/or SCSI write command
|
||||
transmission.
|
||||
|
||||
|
@ -212,7 +210,7 @@ static void enumerate_common(char *fname,
|
|||
|
||||
/* PORTING: ------------------- non portable part --------------- */
|
||||
|
||||
/* Transport adapter is NetBSD/OpenBSD ioctl SCIOCCOMMAND */
|
||||
/* Transport adapter is NetBSD SCIOCCOMMAND */
|
||||
/* Adapter specific handles and data */
|
||||
|
||||
out.fd = -1;
|
||||
|
@ -314,11 +312,7 @@ static int guess_size_by_seek_set(int fd, off_t *bytes, int flag)
|
|||
*/
|
||||
int sg_id_string(char msg[1024], int flag)
|
||||
{
|
||||
#ifdef __OpenBSD__
|
||||
sprintf(msg, "internal OpenBSD SCIOCCOMMAND adapter sg-netbsd");
|
||||
#else
|
||||
sprintf(msg, "internal NetBSD SCIOCCOMMAND adapter sg-netbsd");
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -337,7 +331,7 @@ int sg_initialize(char msg[1024], int flag)
|
|||
|
||||
|
||||
/** Performs global finalization of the SCSI transport adapter and eventually
|
||||
needed operating system facilities. Releases globally acquired resources.
|
||||
needed operating system facilities. Releases globally aquired resources.
|
||||
@param flag unused yet, submit 0
|
||||
@return 1 = success, <=0 = failure
|
||||
*/
|
||||
|
@ -429,7 +423,7 @@ ex:;
|
|||
|
||||
/** Tells whether libburn has the given drive in use or exclusively reserved.
|
||||
If it is "open" then libburn will eventually call sg_release() on it when
|
||||
it is time to give up usage and reservation.
|
||||
it is time to give up usage resp. reservation.
|
||||
*/
|
||||
/** Published as burn_drive.drive_is_open() */
|
||||
int sg_drive_is_open(struct burn_drive * d)
|
||||
|
@ -525,7 +519,7 @@ int sg_release(struct burn_drive *d)
|
|||
}
|
||||
|
||||
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates whether
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates wether
|
||||
the command succeeded or shall be retried or finally failed.
|
||||
Returned SCSI errors shall not lead to a return value indicating failure.
|
||||
The callers get notified by c->error. An SCSI failure which leads not to
|
||||
|
@ -587,9 +581,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
req.datalen = 0;
|
||||
}
|
||||
|
||||
/* ts B90523 : Record effective transfer length request for debugging*/
|
||||
c->dxfer_len = req.datalen;
|
||||
|
||||
/* retry-loop */
|
||||
start_time = time(NULL);
|
||||
for(i = 0; !done; i++) {
|
||||
|
@ -671,8 +662,6 @@ if (c->opcode[0] == 0x5a) {
|
|||
start_time, timeout_ms, i, 0);
|
||||
if (d->cancel)
|
||||
done = 1;
|
||||
if (!done)
|
||||
spc_register_retry(c);
|
||||
} /* end of retry-loop */
|
||||
|
||||
return 1;
|
||||
|
@ -698,21 +687,10 @@ int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no,
|
|||
{ret = 0; goto ex;}
|
||||
if (addr.type != TYPE_SCSI)
|
||||
{ret = 0; goto ex;}
|
||||
|
||||
#ifdef __OpenBSD__
|
||||
|
||||
*bus_no = *host_no = addr.scbus;
|
||||
*target_no = addr.target;
|
||||
*lun_no = addr.lun;
|
||||
|
||||
#else /* __OpenBSD__ */
|
||||
|
||||
*bus_no = *host_no = addr.addr.scsi.scbus;
|
||||
*channel_no = 0;
|
||||
*target_no = addr.addr.scsi.target;
|
||||
*lun_no = addr.addr.scsi.lun;
|
||||
|
||||
#endif /* ! __OpenBSD__ */
|
||||
|
||||
ret = 1;
|
||||
ex:;
|
||||
if (fd != -1)
|
||||
|
@ -721,7 +699,7 @@ ex:;
|
|||
}
|
||||
|
||||
|
||||
/** Tells whether a text is a persistent address as listed by the enumeration
|
||||
/** Tells wether a text is a persistent address as listed by the enumeration
|
||||
functions.
|
||||
*/
|
||||
int sg_is_enumerable_adr(char* adr)
|
||||
|
@ -746,7 +724,7 @@ int sg_is_enumerable_adr(char* adr)
|
|||
|
||||
|
||||
/* Return 1 if the given path leads to a regular file or a device that can be
|
||||
fseeked, read, and possibly written with 2 kB granularity.
|
||||
seeked, read, and possibly written with 2 kB granularity.
|
||||
*/
|
||||
int burn_os_is_2k_seekrw(char *path, int flag)
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/*
|
||||
Copyright (c) 2010 - 2016 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2010 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -44,8 +44,8 @@ sg_initialize() performs global initialization of the SCSI transport
|
|||
facilities. Checks for compatibility of supporting
|
||||
software components.
|
||||
|
||||
sg_shutdown() performs global finalizations and releases globally
|
||||
acquired resources.
|
||||
sg_shutdown() performs global finalizations and releases golbally
|
||||
aquired resources.
|
||||
|
||||
sg_give_next_adr() iterates over the set of potentially useful drive
|
||||
address strings.
|
||||
|
@ -54,10 +54,10 @@ scsi_enumerate_drives() brings all available, not-whitelist-banned, and
|
|||
accessible drives into libburn's list of drives.
|
||||
|
||||
sg_dispose_drive() finalizes adapter specifics of struct burn_drive
|
||||
on destruction. Releases resources which were acquired
|
||||
on destruction. Releases resources which were aquired
|
||||
underneath scsi_enumerate_drives().
|
||||
|
||||
sg_drive_is_open() tells whether libburn has the given drive in use.
|
||||
sg_drive_is_open() tells wether libburn has the given drive in use.
|
||||
|
||||
sg_grab() opens the drive for SCSI commands and ensures
|
||||
undisturbed access.
|
||||
|
@ -65,7 +65,7 @@ sg_grab() opens the drive for SCSI commands and ensures
|
|||
sg_release() closes a drive opened by sg_grab()
|
||||
|
||||
sg_issue_command() sends a SCSI command to the drive, receives reply,
|
||||
and evaluates whether the command succeeded or shall
|
||||
and evaluates wether the command succeeded or shall
|
||||
be retried or finally failed.
|
||||
|
||||
sg_obtain_scsi_adr() tries to obtain SCSI address parameters.
|
||||
|
@ -78,7 +78,7 @@ burn_os_is_2k_seekrw() tells whether the given path leads to a file object
|
|||
|
||||
burn_os_stdio_capacity() estimates the emulated media space of stdio-drives.
|
||||
|
||||
burn_os_open_track_src() opens a disk file in a way that offers best
|
||||
burn_os_open_track_src() opens a disk file in a way that allows best
|
||||
throughput with file reading and/or SCSI write command
|
||||
transmission.
|
||||
|
||||
|
@ -497,7 +497,7 @@ int sg_initialize(char msg[1024], int flag)
|
|||
|
||||
|
||||
/** Performs global finalization of the SCSI transport adapter and eventually
|
||||
needed operating system facilities. Releases globally acquired resources.
|
||||
needed operating system facilities. Releases globally aquired resources.
|
||||
@param flag unused yet, submit 0
|
||||
@return 1 = success, <=0 = failure
|
||||
*/
|
||||
|
@ -590,7 +590,7 @@ ex:;
|
|||
|
||||
/** Tells whether libburn has the given drive in use or exclusively reserved.
|
||||
If it is "open" then libburn will eventually call sg_release() on it when
|
||||
it is time to give up usage and reservation.
|
||||
it is time to give up usage resp. reservation.
|
||||
*/
|
||||
/** Published as burn_drive.drive_is_open() */
|
||||
int sg_drive_is_open(struct burn_drive * d)
|
||||
|
@ -690,7 +690,7 @@ int sg_release(struct burn_drive *d)
|
|||
}
|
||||
|
||||
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates whether
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates wether
|
||||
the command succeeded or shall be retried or finally failed.
|
||||
Returned SCSI errors shall not lead to a return value indicating failure.
|
||||
The callers get notified by c->error. An SCSI failure which leads not to
|
||||
|
@ -754,9 +754,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
cgc.uscsi_rqlen = sizeof(c->sense);
|
||||
cgc.uscsi_rqbuf = (caddr_t) c->sense;
|
||||
|
||||
/* ts B90523 : Record effective transfer length request for debugging*/
|
||||
c->dxfer_len = cgc.uscsi_buflen;
|
||||
|
||||
/* retry-loop */
|
||||
start_time = time(NULL);
|
||||
for(i = 0; !done; i++) {
|
||||
|
@ -802,8 +799,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||
start_time, timeout_ms, i, 0);
|
||||
if (d->cancel)
|
||||
done = 1;
|
||||
if (!done)
|
||||
spc_register_retry(c);
|
||||
|
||||
} /* end of retry-loop */
|
||||
|
||||
|
@ -837,7 +832,7 @@ int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no,
|
|||
}
|
||||
|
||||
|
||||
/** Tells whether a text is a persistent address as listed by the enumeration
|
||||
/** Tells wether a text is a persistent address as listed by the enumeration
|
||||
functions.
|
||||
*/
|
||||
|
||||
|
@ -886,7 +881,7 @@ int sg_is_enumerable_adr(char* adr)
|
|||
|
||||
|
||||
/* Return 1 if the given path leads to a regular file or a device that can be
|
||||
fseeked, read, and possibly written with 2 kB granularity.
|
||||
seeked, read, and possibly written with 2 kB granularity.
|
||||
*/
|
||||
int burn_os_is_2k_seekrw(char *path, int flag)
|
||||
{
|
||||
|
|
19
libburn/sg.c
19
libburn/sg.c
|
@ -1,7 +1,7 @@
|
|||
|
||||
/* sg.c
|
||||
Switcher for operating system dependent transport level modules of libburn.
|
||||
Copyright (C) 2009 - 2016 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
Copyright (C) 2009 - 2014 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
provided under GPLv2+
|
||||
*/
|
||||
|
||||
|
@ -11,6 +11,12 @@
|
|||
#endif
|
||||
|
||||
|
||||
/* <<< Until it is known whether this adapter would work on OpenBSD too */
|
||||
#ifdef __NetBSD__
|
||||
#define Libburn_use_sg_netbsD
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef Libburn_use_sg_dummY
|
||||
|
||||
#include "sg-dummy.c"
|
||||
|
@ -21,12 +27,8 @@
|
|||
#include "sg-libcdio.c"
|
||||
|
||||
#else
|
||||
#ifdef __NetBSD__
|
||||
|
||||
#include "sg-netbsd.c"
|
||||
|
||||
#else
|
||||
#ifdef __OpenBSD__
|
||||
#ifdef Libburn_use_sg_netbsD
|
||||
/* To become: # ifdef __NetBSD__ */
|
||||
|
||||
#include "sg-netbsd.c"
|
||||
|
||||
|
@ -86,8 +88,7 @@ static int intentional_compiler_warning(void)
|
|||
#endif /* ! __linux */
|
||||
#endif /* ! __FreeBSD_kernel__ */
|
||||
#endif /* ! __FreeBSD__ */
|
||||
#endif /* ! __OpenBSD__ */
|
||||
#endif /* ! __NetBSD__ */
|
||||
#endif /* ! Libburn_use_sg_netbsD */
|
||||
#endif /* ! Libburn_use_libcdiO */
|
||||
#endif /* ! Libburn_use_sg_dummY */
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@ int sg_initialize(char msg[1024], int flag);
|
|||
|
||||
/* ts A91227 */
|
||||
/** Performs global finalization of the SCSI transport adapter and eventually
|
||||
needed operating system facilities. Releases globally acquired resources.
|
||||
needed operating system facilities. Releases globally aquired resources.
|
||||
@param flag unused yet, submit 0
|
||||
@return 1 = success, <=0 = failure
|
||||
*/
|
||||
|
|
310
libburn/spc.c
310
libburn/spc.c
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2019 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -59,10 +59,6 @@ static unsigned char SPC_MODE_SELECT[] = { 0x55, 16, 0, 0, 0, 0, 0, 0, 0, 0 };
|
|||
static unsigned char SPC_REQUEST_SENSE[] = { 0x03, 0, 0, 0, 18, 0 };
|
||||
static unsigned char SPC_TEST_UNIT_READY[] = { 0x00, 0, 0, 0, 0, 0 };
|
||||
|
||||
#ifdef Libburn_enable_scsi_cmd_ABh
|
||||
static unsigned char SPC_READ_MEDIA_SERIAL_NUMBER[] =
|
||||
{ 0xAB, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
#endif
|
||||
|
||||
/* ts A70519 : An initializer for the abstract SCSI command structure */
|
||||
int scsi_init_command(struct command *c, unsigned char *opcode, int oplen)
|
||||
|
@ -75,16 +71,10 @@ int scsi_init_command(struct command *c, unsigned char *opcode, int oplen)
|
|||
c->dir = NO_TRANSFER;
|
||||
c->dxfer_len = -1;
|
||||
memset(c->sense, 0, sizeof(c->sense));
|
||||
c->sense_len = 0;
|
||||
c->error = 0;
|
||||
c->retry = 0;
|
||||
c->page = NULL;
|
||||
c->timeout = Libburn_scsi_default_timeouT;
|
||||
c->start_time = c->end_time = 0.0;
|
||||
c->retry_count = 0;
|
||||
c->last_retry_key = 0;
|
||||
c->last_retry_asc = 0;
|
||||
c->last_retry_ascq = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -134,7 +124,7 @@ int spc_test_unit_ready_r(struct burn_drive *d, int *key, int *asc, int *ascq,
|
|||
((c->sense[2] & 0x0f) == 0 || (c->sense[2] & 0x0f) == 2) &&
|
||||
(c->sense[15] & 0x80))
|
||||
*progress = (c->sense[16] << 8) + c->sense[17];
|
||||
return (*key == 0);
|
||||
return (key == 0);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -159,20 +149,14 @@ int spc_wait_unit_attention(struct burn_drive *d, int max_sec, char *cmd_text,
|
|||
int i, ret = 1, key = 0, asc = 0, ascq = 0, clueless_start = 0;
|
||||
static double tests_per_second = 2.0;
|
||||
int sleep_usecs, loop_limit, clueless_timeout, progress;
|
||||
char *msg = NULL, *cmd_name = NULL, *cmd_cpt;
|
||||
char *msg = NULL;
|
||||
unsigned char sense[14];
|
||||
|
||||
BURN_ALLOC_MEM(msg, char, 320);
|
||||
BURN_ALLOC_MEM(cmd_name, char, 320);
|
||||
clueless_timeout = 5 * tests_per_second + 1;
|
||||
loop_limit = max_sec * tests_per_second + 1;
|
||||
sleep_usecs = 1000000 / tests_per_second;
|
||||
|
||||
strcpy(cmd_name, cmd_text);
|
||||
cmd_cpt = strchr(cmd_name, ':');
|
||||
if (cmd_cpt != NULL)
|
||||
*cmd_cpt = 0;
|
||||
|
||||
if (!(flag & 1))
|
||||
usleep(sleep_usecs);
|
||||
|
||||
|
@ -195,14 +179,14 @@ int spc_wait_unit_attention(struct burn_drive *d, int max_sec, char *cmd_text,
|
|||
*/
|
||||
break;
|
||||
}
|
||||
if (key == 0x6 && asc == 0x28)
|
||||
/* medium change notice or alike = try again */
|
||||
if (key == 0x6 && asc == 0x28 && ascq == 0x00)
|
||||
/* media change notice = try again */
|
||||
goto slumber;
|
||||
|
||||
handle_error:;
|
||||
/* ts A90213 */
|
||||
sprintf(msg,
|
||||
"Asynchronous SCSI error on %s: ", cmd_name);
|
||||
"Asynchronous SCSI error on %s: ", cmd_text);
|
||||
sense[0] = 0x70; /* Fixed format sense data */
|
||||
sense[2] = key;
|
||||
sense[12] = asc;
|
||||
|
@ -213,14 +197,6 @@ handle_error:;
|
|||
0x0002014d,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
if (cmd_cpt != NULL) {
|
||||
sprintf(msg, "Attempted SCSI CDB: %s",
|
||||
cmd_cpt + 1);
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index, 0x0002014d,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
}
|
||||
d->cancel = 1;
|
||||
break;
|
||||
} else if (ascq == 0x00) { /* CAUSE NOT REPORTABLE */
|
||||
|
@ -234,16 +210,6 @@ handle_error:;
|
|||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Ended clueless NOT READY cycle",
|
||||
0, 0);
|
||||
if (cmd_cpt != NULL) {
|
||||
sprintf(msg, "Attempted SCSI CDB: %s",
|
||||
cmd_cpt + 1);
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index,
|
||||
0x00000002,
|
||||
LIBDAX_MSGS_SEV_DEBUG,
|
||||
LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
}
|
||||
ret = 1; /* medium not present = ok */
|
||||
break;
|
||||
}
|
||||
|
@ -255,7 +221,7 @@ slumber:;
|
|||
}
|
||||
if (ret <= 0 || !(flag & 2)) {
|
||||
sprintf(msg, "Async %s %s after %d.%d seconds",
|
||||
cmd_name, (ret > 0 ? "succeeded" : "failed"),
|
||||
cmd_text, (ret > 0 ? "succeeded" : "failed"),
|
||||
i / 10, i % 10);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x00020150, LIBDAX_MSGS_SEV_DEBUG,
|
||||
|
@ -266,19 +232,12 @@ slumber:;
|
|||
{ret = (ret > 0); goto ex;}
|
||||
|
||||
sprintf(msg, "Timeout (%d s) with asynchronous SCSI command %s\n",
|
||||
max_sec, cmd_name);
|
||||
max_sec, cmd_text);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002014f,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0);
|
||||
if (cmd_cpt != NULL) {
|
||||
sprintf(msg, "Attempted SCSI CDB: %s", cmd_cpt + 1);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x0002014f, LIBDAX_MSGS_SEV_SORRY,
|
||||
LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0);
|
||||
}
|
||||
ret = 0;
|
||||
ex:;
|
||||
BURN_FREE_MEM(msg);
|
||||
BURN_FREE_MEM(cmd_name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -932,109 +891,6 @@ ex:;
|
|||
BURN_FREE_MEM(c);
|
||||
}
|
||||
|
||||
|
||||
#ifdef Libburn_enable_scsi_cmd_ABh
|
||||
|
||||
/* At least on Linux kernel 3.16 the command ABh causes EFAULT if not sent
|
||||
from the superuser.
|
||||
For a test it may be replaced by a dummy 28h READ12 on block 0.
|
||||
This causes no EFAULT although it sets the wrong dxfer_len 4 rather
|
||||
than 2048. So it is indeed a permission problem and not bad alignment.
|
||||
*/
|
||||
|
||||
/* ts B51016 */
|
||||
int spc_read_media_serial_number_al(struct burn_drive *d, int *alloc_len)
|
||||
{
|
||||
struct buffer *buf = NULL;
|
||||
struct command *c = NULL;
|
||||
unsigned char *data;
|
||||
int ret;
|
||||
|
||||
if (*alloc_len < 4)
|
||||
{ret = 0; goto ex;}
|
||||
|
||||
BURN_ALLOC_MEM(buf, struct buffer, 1);
|
||||
BURN_ALLOC_MEM(c, struct command, 1);
|
||||
if (mmc_function_spy(d, "spc_read_media_serial_number") <= 0)
|
||||
{ret = 0; goto ex;}
|
||||
/*
|
||||
#de fine Spc_read_media_serial_number_dummY yes
|
||||
*/
|
||||
#ifdef Spc_read_media_serial_number_dummY
|
||||
|
||||
{
|
||||
static unsigned char MMC_READ_12[] =
|
||||
{ 0x28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 };
|
||||
|
||||
scsi_init_command(c, MMC_READ_12, sizeof(MMC_READ_12));
|
||||
c->dxfer_len = *alloc_len;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
scsi_init_command(c, SPC_READ_MEDIA_SERIAL_NUMBER,
|
||||
sizeof(SPC_READ_MEDIA_SERIAL_NUMBER));
|
||||
c->dxfer_len = *alloc_len;
|
||||
/* (Will not accept more than 32 KB anyway) */
|
||||
c->opcode[8] = (c->dxfer_len >> 8) & 0xff;
|
||||
c->opcode[9] = c->dxfer_len & 0xff;
|
||||
|
||||
#endif /* ! Spc_read_media_serial_number_dummY */
|
||||
|
||||
c->retry = 1;
|
||||
c->page = buf;
|
||||
memset(c->page->data, 0, *alloc_len);
|
||||
c->page->bytes = 0;
|
||||
c->page->sectors = 0;
|
||||
|
||||
c->dir = FROM_DRIVE;
|
||||
d->issue_command(d, c);
|
||||
|
||||
if (c->error)
|
||||
{ret = 0; goto ex;}
|
||||
|
||||
data = c->page->data;
|
||||
|
||||
#ifdef Spc_read_media_serial_number_dummY
|
||||
d->media_serial_number_len = 0;
|
||||
#else
|
||||
d->media_serial_number_len =
|
||||
(data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[7];
|
||||
#endif
|
||||
|
||||
if (*alloc_len >= d->media_serial_number_len + 4) {
|
||||
if (d->media_serial_number != NULL)
|
||||
BURN_FREE_MEM(d->media_serial_number);
|
||||
BURN_ALLOC_MEM(d->media_serial_number, char,
|
||||
d->media_serial_number_len + 1);
|
||||
if (d->media_serial_number_len > 0)
|
||||
memcpy(d->media_serial_number, data + 4,
|
||||
d->media_serial_number_len);
|
||||
d->media_serial_number[d->media_serial_number_len] = 0;
|
||||
}
|
||||
|
||||
*alloc_len = d->media_serial_number_len + 4;
|
||||
ret = 1;
|
||||
ex:;
|
||||
BURN_FREE_MEM(c);
|
||||
BURN_FREE_MEM(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int spc_read_media_serial_number(struct burn_drive *d)
|
||||
{
|
||||
int alloc_len = 4, ret;
|
||||
|
||||
ret = spc_read_media_serial_number_al(d, &alloc_len);
|
||||
if (alloc_len > 4 && alloc_len <= 0x8000 && ret > 0)
|
||||
ret = spc_read_media_serial_number_al(d, &alloc_len);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* Libburn_enable_scsi_cmd_ABh */
|
||||
|
||||
|
||||
void spc_getcaps(struct burn_drive *d)
|
||||
{
|
||||
if (mmc_function_spy(d, "getcaps") <= 0)
|
||||
|
@ -1056,7 +912,7 @@ void spc_probe_write_modes(struct burn_drive *d)
|
|||
struct buffer *buf = NULL;
|
||||
int try_write_type = 1;
|
||||
int try_block_type = 0;
|
||||
int key, asc, ascq, usable_write_type = -1, usable_block_type = -1;
|
||||
int key, asc, ascq, useable_write_type = -1, useable_block_type = -1;
|
||||
int last_try = 0;
|
||||
struct command *c = NULL;
|
||||
|
||||
|
@ -1071,11 +927,11 @@ void spc_probe_write_modes(struct burn_drive *d)
|
|||
while (try_write_type != 5) {
|
||||
/* ts A70213 */
|
||||
if (try_write_type == 4) {
|
||||
/* Pseudo write type NONE . Set a usable write mode */
|
||||
if (usable_write_type == -1)
|
||||
/* Pseudo write type NONE . Set a useable write mode */
|
||||
if (useable_write_type == -1)
|
||||
break;
|
||||
try_write_type = usable_write_type;
|
||||
try_block_type = usable_block_type;
|
||||
try_write_type = useable_write_type;
|
||||
try_block_type = useable_block_type;
|
||||
last_try= 1;
|
||||
}
|
||||
|
||||
|
@ -1118,12 +974,12 @@ void spc_probe_write_modes(struct burn_drive *d)
|
|||
1 << try_block_type;
|
||||
|
||||
/* ts A70213 */
|
||||
if ((usable_write_type < 0 && try_write_type > 0) ||
|
||||
if ((useable_write_type < 0 && try_write_type > 0) ||
|
||||
(try_write_type == 1 && try_block_type == 8)) {
|
||||
/* Packet is not supported yet.
|
||||
Prefer TAO MODE_1. */
|
||||
usable_write_type = try_write_type;
|
||||
usable_block_type = try_block_type;
|
||||
useable_write_type = try_write_type;
|
||||
useable_block_type = try_block_type;
|
||||
}
|
||||
}
|
||||
switch (try_block_type) {
|
||||
|
@ -1446,28 +1302,21 @@ enum response scsi_error_msg(struct burn_drive *d, unsigned char *sense,
|
|||
case 0x28:
|
||||
if (*ascq == 0)
|
||||
sprintf(msg, "Medium may have changed");
|
||||
else if (*ascq == 1)
|
||||
sprintf(msg, "Import or export element accessed");
|
||||
else if (*ascq == 2)
|
||||
sprintf(msg, "Format layer may have changed");
|
||||
else if (*ascq == 3)
|
||||
sprintf(msg,
|
||||
"Import/export element accessed, medium changed");
|
||||
else if (*key == 6)
|
||||
sprintf(msg, "Unknown ASCQ with drive event ASC 28");
|
||||
else
|
||||
break;
|
||||
goto return_retry;
|
||||
case 0x29:
|
||||
if (*ascq == 0)
|
||||
sprintf(msg,
|
||||
"Power on, reset, or bus device reset occurred");
|
||||
"Power on, reset, or bus device reset occured");
|
||||
else if (*ascq == 1)
|
||||
sprintf(msg, "Power on occurred");
|
||||
sprintf(msg, "Power on occured");
|
||||
else if (*ascq == 2)
|
||||
sprintf(msg, "Bus reset occurred");
|
||||
sprintf(msg, "Bus reset occured");
|
||||
else if (*ascq == 3)
|
||||
sprintf(msg, "Bus device reset function occurred");
|
||||
sprintf(msg, "Bus device reset function occured");
|
||||
else if (*ascq == 4)
|
||||
sprintf(msg, "Device internal reset");
|
||||
else
|
||||
|
@ -1503,16 +1352,6 @@ enum response scsi_error_msg(struct burn_drive *d, unsigned char *sense,
|
|||
"Cannot format medium, incompatible medium");
|
||||
else if (*ascq == 7)
|
||||
sprintf(msg, "Cleaning failure");
|
||||
else if (*ascq == 8)
|
||||
sprintf(msg,
|
||||
"Cannot write, application code mismatch");
|
||||
else if (*ascq == 9)
|
||||
sprintf(msg, "Current session not fixated for append");
|
||||
else if (*ascq == 10)
|
||||
sprintf(msg, "Medium not formatted");
|
||||
else if (*ascq == 11)
|
||||
sprintf(msg,
|
||||
"Cannot write medium, unsupported medium version");
|
||||
else
|
||||
break;
|
||||
goto return_fail;
|
||||
|
@ -1588,28 +1427,6 @@ enum response scsi_error_msg(struct burn_drive *d, unsigned char *sense,
|
|||
else
|
||||
break;
|
||||
goto return_fail;
|
||||
case 0x6F:
|
||||
if (*ascq == 0)
|
||||
sprintf(msg, "Copy protection key exchange failure – Authentication failure");
|
||||
else if (*ascq == 1)
|
||||
sprintf(msg, "Copy protection key exchange failure – Key not present");
|
||||
else if (*ascq == 2)
|
||||
sprintf(msg, "Copy protection key exchange failure – Key not established");
|
||||
else if (*ascq == 3)
|
||||
sprintf(msg, "Read of scrambled sector without authentication");
|
||||
else if (*ascq == 4)
|
||||
sprintf(msg, "Media region code is mismatched to logical unit region");
|
||||
else if (*ascq == 5)
|
||||
sprintf(msg, "Logical unit region must be permanent / Region reset count error");
|
||||
else if (*ascq == 6)
|
||||
sprintf(msg, "Insufficient block count for binding nonce recording");
|
||||
else if (*ascq == 7)
|
||||
sprintf(msg, "Conflict in binding nonce recording");
|
||||
else if (*ascq == 8)
|
||||
sprintf(msg, "Insufficient permission");
|
||||
else
|
||||
break;
|
||||
goto return_fail;
|
||||
case 0x72:
|
||||
if (*ascq == 0)
|
||||
sprintf(msg, "Session fixation error");
|
||||
|
@ -1737,8 +1554,6 @@ static char *scsi_command_name(unsigned int c, int flag)
|
|||
return "BLANK";
|
||||
case 0xaa:
|
||||
return "WRITE(12)";
|
||||
case 0xab:
|
||||
return "READ MEDIA SERIAL NUMBER";
|
||||
case 0xac:
|
||||
return "GET PERFORMANCE";
|
||||
case 0xad:
|
||||
|
@ -1764,67 +1579,6 @@ static char *scsi_command_name(unsigned int c, int flag)
|
|||
}
|
||||
|
||||
|
||||
/* ts B90206: Avoid publishing more inner API functions which begin by scsi_ */
|
||||
char *spc_command_name(unsigned int c, int flag)
|
||||
{
|
||||
return(scsi_command_name(c, flag));
|
||||
}
|
||||
|
||||
|
||||
/* ts B90616 */
|
||||
void spc_register_retry(struct command *c)
|
||||
{
|
||||
c->retry_count++;
|
||||
spc_decode_sense(c->sense, c->sense_len, &c->last_retry_key,
|
||||
&c->last_retry_asc, &c->last_retry_ascq);
|
||||
}
|
||||
|
||||
|
||||
/* ts B90511 */
|
||||
/* @param flag bit0= do not prepend command name
|
||||
bit1= do not append dxfer_len
|
||||
*/
|
||||
int spc_human_readable_cmd(struct command *c, char *msg, int msg_max, int flag)
|
||||
{
|
||||
int j, l, lname;
|
||||
|
||||
if ((flag & 1) && c->retry_count <= 0) {
|
||||
msg[0] = 0;
|
||||
} else {
|
||||
if (msg_max < 60)
|
||||
return -1;
|
||||
strcpy(msg, spc_command_name( (unsigned int) c->opcode[0], 0));
|
||||
if (c->retry_count > 0) {
|
||||
sprintf(msg + strlen(msg), " #%d", c->retry_count + 1);
|
||||
if (c->last_retry_key > 0)
|
||||
sprintf(msg + strlen(msg), ",[%X %2.2X %2.2X]",
|
||||
c->last_retry_key, c->last_retry_asc,
|
||||
c->last_retry_ascq);
|
||||
}
|
||||
strcat(msg, " : ");
|
||||
}
|
||||
lname = l = strlen(msg);
|
||||
for (j = 0; j < 16 && j < c->oplen; j++) {
|
||||
if (l > msg_max - 3) {
|
||||
if (msg_max - 4 >= lname) {
|
||||
l = msg_max - 4;
|
||||
sprintf(msg + strlen(msg), "... ");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
sprintf(msg + l, "%2.2x ", c->opcode[j]);
|
||||
l += 3;
|
||||
}
|
||||
if (c->dir != NO_TRANSFER && c->page != NULL && !(flag & 2)) {
|
||||
if (l > msg_max - 24)
|
||||
return 0;
|
||||
sprintf(msg + l, " : dxfer_len= %d", c->dxfer_len);
|
||||
l = strlen(msg);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* ts A61030 - A61115 */
|
||||
/* @param flag bit0= do report conditions which are considered not an error
|
||||
bit1= report with severity FAILURE rather than DEBUG
|
||||
|
@ -1862,16 +1616,7 @@ int scsi_notify_error(struct burn_drive *d, struct command *c,
|
|||
ret = libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002010f,
|
||||
(flag & 2) && d->silent_on_scsi_error != 3 ?
|
||||
LIBDAX_MSGS_SEV_FAILURE : LIBDAX_MSGS_SEV_DEBUG,
|
||||
LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0);
|
||||
strcpy(msg, "CDB= ");
|
||||
if (spc_human_readable_cmd(c, msg + strlen(msg), 320 - strlen(msg), 1)
|
||||
> 0) {
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x0002010f,
|
||||
(flag & 2) && d->silent_on_scsi_error != 3 ?
|
||||
LIBDAX_MSGS_SEV_FAILURE : LIBDAX_MSGS_SEV_DEBUG,
|
||||
LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0);
|
||||
}
|
||||
LIBDAX_MSGS_PRIO_HIGH, msg,0,0);
|
||||
ex:;
|
||||
BURN_FREE_MEM(msg);
|
||||
BURN_FREE_MEM(scsi_msg);
|
||||
|
@ -1899,12 +1644,12 @@ int scsi_show_command(unsigned char *opcode, int oplen, int dir,
|
|||
if (flag & 1)
|
||||
return 1;
|
||||
if (opcode[0] == 0x2A) { /* WRITE 10 */
|
||||
if ((flag & 2) && oplen > 8)
|
||||
if (flag & 2)
|
||||
fprintf(fp, "%d -> %d\n",
|
||||
(opcode[7] << 8) | opcode[8],
|
||||
mmc_four_char_to_int(opcode + 2));
|
||||
} else if (opcode[0] == 0xAA) { /* WRITE 12 */
|
||||
if ((flag & 2) && oplen > 9)
|
||||
if (flag & 2)
|
||||
fprintf(fp, "%d -> %d\n",
|
||||
mmc_four_char_to_int(opcode + 6),
|
||||
mmc_four_char_to_int(opcode + 2));
|
||||
|
@ -2118,8 +1863,6 @@ int scsi_eval_cmd_outcome(struct burn_drive *d, struct command *c, void *fp,
|
|||
if (burn_sg_log_scsi & 3)
|
||||
scsi_log_err(d, c, fp, sense, sense_len,
|
||||
(sense_len > 0) | (flag & 2));
|
||||
if (sense == c->sense)
|
||||
c->sense_len = sense_len;
|
||||
if (sense_len <= 0)
|
||||
{done = 1; goto ex;}
|
||||
|
||||
|
@ -2151,13 +1894,6 @@ int scsi_eval_cmd_outcome(struct burn_drive *d, struct command *c, void *fp,
|
|||
0x0002018a,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
strcpy(msg, "Command: ");
|
||||
if (spc_human_readable_cmd(c, msg + strlen(msg),
|
||||
320 - strlen(msg), 0) > 0)
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index, 0x0002018a,
|
||||
LIBDAX_MSGS_SEV_SORRY,
|
||||
LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0);
|
||||
goto err_ex;
|
||||
}
|
||||
if (d->cancel)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2019 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -23,11 +23,6 @@ void spc_sense_write_params(struct burn_drive *);
|
|||
void spc_select_write_params(struct burn_drive *,
|
||||
struct burn_session *, int,
|
||||
const struct burn_write_opts *);
|
||||
|
||||
#ifdef Libburn_enable_scsi_cmd_ABh
|
||||
int spc_read_media_serial_number(struct burn_drive *d);
|
||||
#endif
|
||||
|
||||
void spc_probe_write_modes(struct burn_drive *);
|
||||
void spc_request_sense(struct burn_drive *d, struct buffer *buf);
|
||||
int spc_block_type(enum burn_block_types b);
|
||||
|
@ -114,16 +109,6 @@ int scsi_log_message(struct burn_drive *d, void *fp, char * msg, int flag);
|
|||
int spc_decode_sense(unsigned char *sense, int senselen,
|
||||
int *key, int *asc, int *ascq);
|
||||
|
||||
/* ts B90206 */
|
||||
char *spc_command_name(unsigned int c, int flag);
|
||||
|
||||
/* ts B90511 */
|
||||
int spc_human_readable_cmd(struct command *c, char *msg, int msg_max,
|
||||
int flag);
|
||||
|
||||
/* ts B90616 */
|
||||
void spc_register_retry(struct command *c);
|
||||
|
||||
/* ts B00808 */
|
||||
/** Evaluates outcome of a single SCSI command, eventually logs sense data,
|
||||
and issues DEBUG error message in case the command is evaluated as done.
|
||||
|
@ -166,23 +151,17 @@ int spc_confirm_cd_drive(struct burn_drive *d, int flag);
|
|||
/* RESERVE TRACK */
|
||||
#define Libburn_mmc_reserve_timeouT 200000
|
||||
|
||||
/* CLOSE TRACK/SESSION with Immed bit */
|
||||
/* CLOSE TRACK/SESSION (with Immed bit) */
|
||||
#define Libburn_mmc_close_timeouT 200000
|
||||
/* CLOSE TRACK/SESSION without Immed bit */
|
||||
#define Libburn_mmc_close_noim_timeouT 3600000
|
||||
|
||||
/* BLANK , FORMAT UNIT with Immed bit */
|
||||
/* BLANK , FORMAT UNIT (with Immed bit) */
|
||||
#define Libburn_mmc_blank_timeouT 200000
|
||||
/* BLANK , FORMAT UNIT without Immed bit */
|
||||
#define Libburn_mmc_blank_noim_timeouT 18000000
|
||||
|
||||
/* SEND OPC INFORMATION */
|
||||
#define Libburn_mmc_opc_timeouT 200000
|
||||
|
||||
/* MMC_SYNC_CACHE with Immed bit */
|
||||
/* MMC_SYNC_CACHE */
|
||||
#define Libburn_mmc_sync_timeouT 200000
|
||||
/* MMC_SYNC_CACHE without Immed bit */
|
||||
#define Libburn_mmc_sync_noim_timeouT 3600000
|
||||
|
||||
/* START STOP UNIT with Start bit and Load bit set */
|
||||
#define Libburn_mmc_load_timeouT 300000
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2021 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -34,7 +34,6 @@
|
|||
#include "util.h"
|
||||
#include "transport.h"
|
||||
#include "mmc.h"
|
||||
#include "drive.h"
|
||||
|
||||
#include "libdax_msgs.h"
|
||||
extern struct libdax_msgs *libdax_messenger;
|
||||
|
@ -320,8 +319,8 @@ void burn_structure_print_track(struct burn_track *t)
|
|||
{
|
||||
char msg[80];
|
||||
|
||||
sprintf(msg, " track size %.f sectors",
|
||||
(double) burn_track_get_sectors_v2(t));
|
||||
sprintf(msg, " track size %d sectors",
|
||||
burn_track_get_sectors(t));
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
|
||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
|
@ -507,14 +506,14 @@ int burn_track_set_postgap_size(struct burn_track *t, int size, int flag)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* ts B20119 / C40302: outsourced from burn_track_get_sectors()
|
||||
/* ts B20119: outsourced from burn_track_get_sectors()
|
||||
@param flag bit0= do not add post-gap
|
||||
*/
|
||||
off_t burn_track_get_sectors_2_v2(struct burn_track *t, int flag)
|
||||
int burn_track_get_sectors_2(struct burn_track *t, int flag)
|
||||
{
|
||||
/* ts A70125 : was int */
|
||||
off_t size = 0, sectors;
|
||||
int seclen;
|
||||
off_t size = 0;
|
||||
int sectors, seclen;
|
||||
|
||||
seclen = burn_sector_length(t->mode);
|
||||
|
||||
|
@ -530,23 +529,9 @@ off_t burn_track_get_sectors_2_v2(struct burn_track *t, int flag)
|
|||
} else if(t->entry != NULL) {
|
||||
/* ts A80808 : all burn_toc_entry of track starts should now
|
||||
have (extensions_valid & 1), even those from CD.
|
||||
ts C40302 : Now there should be long_track_blocks.
|
||||
*/
|
||||
if (t->entry->extensions_valid & 8) {
|
||||
size = t->entry->long_track_blocks * (off_t) 2048;
|
||||
} else if (t->entry->extensions_valid & 1) {
|
||||
if (t->entry->extensions_valid & 1)
|
||||
size = ((off_t) t->entry->track_blocks) * (off_t) 2048;
|
||||
}
|
||||
}
|
||||
if (size > BURN_DRIVE_MAX_BYTES) {
|
||||
char msg[80];
|
||||
|
||||
sprintf(msg, "Track size exceeds limit of %.f bytes",
|
||||
(double) (BURN_DRIVE_MAX_BYTES));
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x000201ae,
|
||||
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
return -1;
|
||||
}
|
||||
sectors = size / seclen;
|
||||
if (size % seclen)
|
||||
|
@ -554,34 +539,14 @@ off_t burn_track_get_sectors_2_v2(struct burn_track *t, int flag)
|
|||
return sectors;
|
||||
}
|
||||
|
||||
int burn_track_get_sectors_2(struct burn_track *t, int flag)
|
||||
{
|
||||
/* ts A70125 : was int */
|
||||
off_t sectors = 0;
|
||||
|
||||
sectors = burn_track_get_sectors_2_v2(t, flag);
|
||||
if (sectors > (off_t) 0x7ffffff0) {
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x000201ae,
|
||||
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Track size exceeds 4 TiB - 32 KiB", 0, 0);
|
||||
return -1;
|
||||
}
|
||||
return (int) sectors;
|
||||
}
|
||||
|
||||
int burn_track_get_sectors(struct burn_track *t)
|
||||
{
|
||||
return burn_track_get_sectors_2(t, 0);
|
||||
}
|
||||
|
||||
/* ts C40302 : API */
|
||||
off_t burn_track_get_sectors_v2(struct burn_track *t)
|
||||
{
|
||||
return burn_track_get_sectors_2_v2(t, 0);
|
||||
}
|
||||
|
||||
/* ts A70125 */
|
||||
int burn_track_set_sectors(struct burn_track *t, off_t sectors)
|
||||
int burn_track_set_sectors(struct burn_track *t, int sectors)
|
||||
{
|
||||
off_t size, seclen;
|
||||
int ret;
|
||||
|
@ -624,29 +589,17 @@ int burn_track_set_fillup(struct burn_track *t, int fill_up_media)
|
|||
*/
|
||||
int burn_track_apply_fillup(struct burn_track *t, off_t max_size, int flag)
|
||||
{
|
||||
int ret = 2;
|
||||
off_t max_sectors, track_sectors;
|
||||
int max_sectors, ret = 2;
|
||||
char msg[80];
|
||||
|
||||
if (t->fill_up_media <= 0)
|
||||
return 2;
|
||||
if (max_size > BURN_DRIVE_MAX_BYTES) {
|
||||
sprintf(msg, "Track size exceeds limit of %.f bytes",
|
||||
(double) (BURN_DRIVE_MAX_BYTES));
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x000201ae,
|
||||
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
max_sectors = max_size / 2048;
|
||||
track_sectors = burn_track_get_sectors_v2(t);
|
||||
if (track_sectors < 0)
|
||||
return 0;
|
||||
if (track_sectors < max_sectors || (flag & 1)) {
|
||||
sprintf(msg,
|
||||
"Setting total track size to %.fs (payload %.fs)\n",
|
||||
(double) max_sectors,
|
||||
(double) (t->source->get_size(t->source) / 2048));
|
||||
if (burn_track_get_sectors(t) < max_sectors || (flag & 1)) {
|
||||
sprintf(msg, "Setting total track size to %ds (payload %ds)\n",
|
||||
max_sectors & 0x7fffffff,
|
||||
(int) ((t->source->get_size(t->source) / 2048)
|
||||
& 0x7fffffff));
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
|
||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
|
||||
msg, 0, 0);
|
||||
|
@ -700,7 +653,7 @@ int burn_track_is_data_done(struct burn_track *t)
|
|||
|
||||
int burn_track_get_shortage(struct burn_track *t)
|
||||
{
|
||||
off_t size;
|
||||
int size;
|
||||
int seclen;
|
||||
|
||||
seclen = burn_sector_length(t->mode);
|
||||
|
@ -712,31 +665,13 @@ int burn_track_get_shortage(struct burn_track *t)
|
|||
|
||||
int burn_session_get_sectors(struct burn_session *s)
|
||||
{
|
||||
int sectors = 0, i, track_sectors;
|
||||
int sectors = 0, i;
|
||||
|
||||
for (i = 0; i < s->tracks; i++) {
|
||||
track_sectors = burn_track_get_sectors(s->track[i]);
|
||||
if (track_sectors < 0)
|
||||
track_sectors = 0;
|
||||
sectors += track_sectors;
|
||||
}
|
||||
for (i = 0; i < s->tracks; i++)
|
||||
sectors += burn_track_get_sectors(s->track[i]);
|
||||
return sectors;
|
||||
}
|
||||
|
||||
/* ts C40302: API */
|
||||
off_t burn_session_get_sectors_v2(struct burn_session *s)
|
||||
{
|
||||
int i;
|
||||
off_t sectors = 0, track_sectors;
|
||||
|
||||
for (i = 0; i < s->tracks; i++) {
|
||||
track_sectors = burn_track_get_sectors_v2(s->track[i]);
|
||||
if (track_sectors < 0)
|
||||
track_sectors = 0;
|
||||
sectors += track_sectors;
|
||||
}
|
||||
return sectors;
|
||||
}
|
||||
|
||||
int burn_disc_get_sectors(struct burn_disc *d)
|
||||
{
|
||||
|
@ -747,17 +682,6 @@ int burn_disc_get_sectors(struct burn_disc *d)
|
|||
return sectors;
|
||||
}
|
||||
|
||||
/* ts C40302: API */
|
||||
off_t burn_disc_get_sectors_v2(struct burn_disc *d)
|
||||
{
|
||||
int i;
|
||||
off_t sectors = 0;
|
||||
|
||||
for (i = 0; i < d->sessions; i++)
|
||||
sectors += burn_session_get_sectors_v2(d->session[i]);
|
||||
return sectors;
|
||||
}
|
||||
|
||||
void burn_track_get_entry(struct burn_track *t, struct burn_toc_entry *entry)
|
||||
{
|
||||
if (t->entry == NULL)
|
||||
|
@ -825,7 +749,7 @@ int burn_session_get_hidefirst(struct burn_session *session)
|
|||
}
|
||||
|
||||
|
||||
/* ts A80808,C40226 : Enhance CD toc to DVD toc with Long block addresses */
|
||||
/* ts A80808 : Enhance CD toc to DVD toc */
|
||||
int burn_disc_cd_toc_extensions(struct burn_drive *drive, int flag)
|
||||
{
|
||||
int sidx= 0, tidx= 0, ret, track_offset, alloc_len = 34;
|
||||
|
@ -893,7 +817,6 @@ int burn_disc_cd_toc_extensions(struct burn_drive *drive, int flag)
|
|||
entry->point_msb = 0;
|
||||
entry->start_lba = burn_msf_to_lba(entry->pmin,
|
||||
entry->psec, entry->pframe);
|
||||
entry->long_start_lba = entry->start_lba;
|
||||
if (tidx > 0) {
|
||||
prev_entry->track_blocks =
|
||||
entry->start_lba
|
||||
|
@ -913,16 +836,13 @@ int burn_disc_cd_toc_extensions(struct burn_drive *drive, int flag)
|
|||
ret < prev_entry->track_blocks - 2))
|
||||
prev_entry->track_blocks = ret;
|
||||
}
|
||||
prev_entry->long_track_blocks =
|
||||
prev_entry->track_blocks;
|
||||
prev_entry->extensions_valid |= 1 | 8;
|
||||
prev_entry->extensions_valid |= 1;
|
||||
}
|
||||
if (tidx == d->session[sidx]->tracks) {
|
||||
entry->session_msb = 0;
|
||||
entry->point_msb = 0;
|
||||
entry->track_blocks = 0;
|
||||
entry->long_track_blocks = entry->track_blocks;
|
||||
entry->extensions_valid |= 1 | 8;
|
||||
entry->extensions_valid |= 1;
|
||||
}
|
||||
prev_entry = entry;
|
||||
}
|
||||
|
@ -1506,7 +1426,7 @@ static int cue_open_audioxtr(char *path, struct burn_cue_file_cursor *crs,
|
|||
|
||||
ret= libdax_audioxtr_new(&xtr, path, 0);
|
||||
if (ret <= 0)
|
||||
goto ex;
|
||||
return ret;
|
||||
libdax_audioxtr_get_id(xtr, &fmt, &fmt_info, &num_channels,
|
||||
&sample_rate, &bits_per_sample, &msb_first, 0);
|
||||
if ((flag & 255) == 1) {
|
||||
|
@ -1727,7 +1647,7 @@ out_of_mem:;
|
|||
if (crs->file_source != NULL) {
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00020192,
|
||||
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"In cue sheet file: Multiple occurrences of FILE",
|
||||
"In cue sheet file: Multiple occurences of FILE",
|
||||
0, 0);
|
||||
ret = 0; goto ex;
|
||||
}
|
||||
|
@ -2226,12 +2146,6 @@ ex:
|
|||
tracks = burn_session_get_tracks(session, &num_tracks);
|
||||
for (i = 0; i < num_tracks; i++)
|
||||
burn_track_free(tracks[i]);
|
||||
if(text_packs != NULL) {
|
||||
if(*text_packs != NULL)
|
||||
free(*text_packs);
|
||||
*text_packs = NULL;
|
||||
*num_packs = 0;
|
||||
}
|
||||
} else {
|
||||
if (fifo != NULL) {
|
||||
*fifo = crs->fifo;
|
||||
|
@ -2241,8 +2155,6 @@ ex:
|
|||
cue_crs_destroy(&crs, 0);
|
||||
BURN_FREE_MEM(line);
|
||||
BURN_FREE_MEM(msg);
|
||||
if (fp != NULL)
|
||||
fclose(fp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ struct burn_track
|
|||
/** 1 means Pad with zeros, 0 means start reading the next track */
|
||||
int pad;
|
||||
|
||||
/* ts A70213 : whether to expand this track to full available media */
|
||||
/* ts A70213 : wether to expand this track to full available media */
|
||||
int fill_up_media;
|
||||
|
||||
/* ts A70218 : a track size to use if it is mandarory to have some */
|
||||
|
@ -137,7 +137,7 @@ struct burn_session
|
|||
unsigned char cdtext_language[8];
|
||||
|
||||
/* ts B11226 */
|
||||
unsigned char mediacatalog[14]; /* overridable by burn_write_opts */
|
||||
unsigned char mediacatalog[14]; /* overrideable by burn_write_opts */
|
||||
};
|
||||
|
||||
struct burn_disc
|
||||
|
@ -160,7 +160,7 @@ int burn_track_is_open_ended(struct burn_track *t);
|
|||
int burn_track_is_data_done(struct burn_track *t);
|
||||
|
||||
/* ts A70125 : sets overall sectors of a track: offset+payload+padding */
|
||||
int burn_track_set_sectors(struct burn_track *t, off_t sectors);
|
||||
int burn_track_set_sectors(struct burn_track *t, int sectors);
|
||||
|
||||
/* ts A70218 : sets the payload size alone */
|
||||
int burn_track_set_size(struct burn_track *t, off_t size);
|
||||
|
@ -185,7 +185,6 @@ void burn_cdtext_free(struct burn_cdtext **cdtext);
|
|||
/* @param flag bit0= do not add post-gap
|
||||
*/
|
||||
int burn_track_get_sectors_2(struct burn_track *t, int flag);
|
||||
off_t burn_track_get_sectors_2_v2(struct burn_track *t, int flag);
|
||||
|
||||
|
||||
#endif /* BURN__STRUCTURE_H */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2014 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -61,7 +61,6 @@ struct command
|
|||
int dir;
|
||||
int dxfer_len;
|
||||
unsigned char sense[128];
|
||||
int sense_len;
|
||||
int error;
|
||||
int retry;
|
||||
struct buffer *page;
|
||||
|
@ -70,10 +69,6 @@ struct command
|
|||
double start_time;
|
||||
double end_time;
|
||||
|
||||
int retry_count;
|
||||
int last_retry_key;
|
||||
int last_retry_asc;
|
||||
int last_retry_ascq;
|
||||
};
|
||||
|
||||
struct burn_scsi_inquiry_data
|
||||
|
@ -258,16 +253,6 @@ struct burn_drive
|
|||
*/
|
||||
int current_feat2fh_byte4;
|
||||
|
||||
/* ts B51016 : Result from feature 108h : Drive Serial Number
|
||||
*/
|
||||
char *drive_serial_number;
|
||||
int drive_serial_number_len;
|
||||
|
||||
/* ts B51016 : Result from command AB READ MEDIA SERIAL NUMBER
|
||||
*/
|
||||
char *media_serial_number;
|
||||
int media_serial_number_len;
|
||||
|
||||
/* ts B10524 : whether the damage bit was set for the future track.
|
||||
bit0= damage bit , bit1= nwa valid bit
|
||||
*/
|
||||
|
@ -277,7 +262,7 @@ struct burn_drive
|
|||
(which could need closing after write) */
|
||||
int needs_close_session;
|
||||
/* ts A71003 : whether a random write operation was done and no
|
||||
synchronize cache has happened yet */
|
||||
synchronize chache has happened yet */
|
||||
int needs_sync_cache;
|
||||
|
||||
/* ts A80412 : whether to use WRITE12 with Streaming bit set
|
||||
|
@ -329,20 +314,18 @@ struct burn_drive
|
|||
int silent_on_scsi_error;
|
||||
|
||||
/* ts B21023 */
|
||||
/* bit0= 5 64 00 occurred with READ10 in mmc_read_10()
|
||||
/* bit0= 5 64 00 occured with READ10 in mmc_read_10()
|
||||
*/
|
||||
int had_particular_error;
|
||||
|
||||
int stdio_fd;
|
||||
|
||||
off_t nwa; /* next writeable address */
|
||||
int nwa; /* next writeable address */
|
||||
int alba; /* absolute lba */
|
||||
int rlba; /* relative lba in section */
|
||||
int start_lba;
|
||||
int end_lba;
|
||||
|
||||
/* ts B61116 */
|
||||
int do_simulate;
|
||||
|
||||
/* ts A70131 : from 51h READ DISC INFORMATION Number of Sessions (-1)*/
|
||||
int complete_sessions;
|
||||
|
@ -371,30 +354,20 @@ struct burn_drive
|
|||
/* ts A70215 : if > 0 : first lba on media that is too high for write*/
|
||||
int media_lba_limit;
|
||||
|
||||
/* ts A81210 / C40303 : Upper limit of readable data size,
|
||||
0x7fffffffffffffff = unknown
|
||||
BURN_DRIVE_MAX_BYTES / 2048 = possibly truncated
|
||||
or unknown stdio size
|
||||
/* ts A81210 : Upper limit of readable data size,
|
||||
0x7fffffff = unknown
|
||||
0x7ffffff0 = 32 bit overflow, or unknown stdio size
|
||||
*/
|
||||
off_t media_read_capacity;
|
||||
int media_read_capacity;
|
||||
|
||||
/* ts B60305 : Whether READ CAPACITY of CD is credible:
|
||||
-1= no READ CAPACITY yet , 0= untrusted READ CAPACITY
|
||||
1= READ CAPACITY confirmed or corrected by other commands
|
||||
*/
|
||||
int mr_capacity_trusted;
|
||||
|
||||
/* ts B10314 / C40302 : Next Writeable Address for drive_role == 5 */
|
||||
off_t role_5_nwa;
|
||||
|
||||
/* ts B60730 */
|
||||
int do_no_immed;
|
||||
/* ts B10314 : Next Writeable Adress for drive_role == 5 */
|
||||
int role_5_nwa;
|
||||
|
||||
int toc_temp;
|
||||
struct burn_disc *disc; /* disc structure */
|
||||
int block_types[4];
|
||||
struct buffer *buffer;
|
||||
struct burn_progress_v2 progress;
|
||||
struct burn_progress progress;
|
||||
|
||||
/* To be used by mmc.c, sbc.c, spc.c for SCSI commands where the struct
|
||||
content surely does not have to persist while another command gets
|
||||
|
@ -437,19 +410,6 @@ struct burn_drive
|
|||
/* ts B00225 */
|
||||
pthread_t thread_tid;
|
||||
|
||||
/* ts B90513 */
|
||||
unsigned int write_retry_count;
|
||||
|
||||
/* ts C00806 */
|
||||
/* 0=no change, 1=change, -1=already urged OS to revalidate medium */
|
||||
int medium_state_changed;
|
||||
|
||||
/* ts C00822 */
|
||||
/* If set, use Exact bit with SET STREAMING and use SET STREAMING
|
||||
even if the medium is a CD.
|
||||
*/
|
||||
int set_streaming_exact_bit;
|
||||
int set_streaming_err;
|
||||
|
||||
/* transport functions */
|
||||
int (*grab) (struct burn_drive *);
|
||||
|
@ -467,7 +427,7 @@ struct burn_drive
|
|||
/* ts A61021 */
|
||||
void (*read_atip) (struct burn_drive *);
|
||||
|
||||
int (*write) (struct burn_drive *, off_t, struct buffer *);
|
||||
int (*write) (struct burn_drive *, int, struct buffer *);
|
||||
void (*read_toc) (struct burn_drive *);
|
||||
void (*lock) (struct burn_drive *);
|
||||
void (*unlock) (struct burn_drive *);
|
||||
|
|
|
@ -177,7 +177,6 @@ char *burn_guess_manufacturer(int prf,
|
|||
{"MCC", 8, "Mitsubishi Chemical Corporation"},
|
||||
{"MCI", 8, "Mitsui Chemicals Inc."},
|
||||
{"MEI", 3, "Panasonic Corporation"},
|
||||
{"MILLEN", 8, "Millenniata Inc."},
|
||||
{"MKM", 3, "Mitsubishi Kagaku Media Co."},
|
||||
{"MMC", 8, "Mitsubishi Kagaku Media Co."},
|
||||
{"MXL", 8, "Hitachi Maxell Ltd."},
|
||||
|
@ -195,8 +194,7 @@ char *burn_guess_manufacturer(int prf,
|
|||
{"RITEK", 5, "Ritek Corp"},
|
||||
{"SONY", 4, "Sony Corporation"},
|
||||
{"TDK", 3, "TDK Corporation"},
|
||||
{"TTG", 3, "TDK Corporation"},
|
||||
{"TTH", 3, "TDK Corporation"},
|
||||
{"TT", 8, "TDK Corporation"},
|
||||
{"TY", 8, "Taiyo Yuden Company Limited"},
|
||||
{"TYG", 3, "Taiyo Yuden Company Limited"},
|
||||
{"UME", 3, "UmeDisc Limited"},
|
||||
|
|
245
libburn/write.c
245
libburn/write.c
|
@ -1,7 +1,7 @@
|
|||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2024 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
@ -226,6 +226,8 @@ int burn_write_track_minsize(struct burn_write_opts *o, struct burn_session *s,
|
|||
0x0002011a,
|
||||
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH, msg,0,0);
|
||||
step = BUFFER_SIZE / 4096; /* shall fit any sector size */
|
||||
if (step <= 0)
|
||||
step = 1;
|
||||
seclen = burn_sector_length(t->mode);
|
||||
if (seclen <= 0)
|
||||
seclen = 2048;
|
||||
|
@ -440,7 +442,7 @@ static int add_isrc_cue(struct cue_sheet *sheet, unsigned char ctladr, int tno,
|
|||
{
|
||||
unsigned char *unit;
|
||||
int i, ret;
|
||||
char text[8 + 21]; /* should suffice for 64 bit oversize */
|
||||
char text[8];
|
||||
|
||||
ret = new_cue(sheet, 2, 0);
|
||||
if (ret <= 0)
|
||||
|
@ -454,9 +456,6 @@ static int add_isrc_cue(struct cue_sheet *sheet, unsigned char ctladr, int tno,
|
|||
unit[5] = isrc->owner[1];
|
||||
unit[6] = isrc->owner[2];
|
||||
sprintf(text, "%-2.2u%-5.5u", (unsigned int) isrc->year, isrc->serial);
|
||||
sprintf(text, "%-2.2u", (unsigned int) isrc->year);
|
||||
sprintf(text + 2, "%-5.5u", isrc->serial);
|
||||
text[7] = 0;
|
||||
unit[7] = text[0];
|
||||
for (i = 1; i < 7; i++)
|
||||
unit[9 + i] = text[i];
|
||||
|
@ -630,13 +629,11 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||
track length.
|
||||
*/
|
||||
track_length = burn_track_get_sectors_2(tar[i], 1);
|
||||
if (track_length < 0)
|
||||
goto failed;
|
||||
if (track_length < 300 && !burn_track_is_open_ended(tar[i])) {
|
||||
track_length = 300;
|
||||
if (!tar[i]->pad)
|
||||
tar[i]->pad = 1;
|
||||
burn_track_set_sectors(tar[i], (off_t) track_length);
|
||||
burn_track_set_sectors(tar[i], track_length);
|
||||
}
|
||||
|
||||
type_to_form(tar[i]->mode, &ctladr, &form);
|
||||
|
@ -725,7 +722,7 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||
runtime += 150;
|
||||
} else if (pform != form) {
|
||||
|
||||
/* ts A70121 : This seems to be the wrong test. Correct would
|
||||
/* ts A70121 : This seems to be thw wrong test. Correct would
|
||||
be to compare tar[]->mode or bit2 of ctladr.
|
||||
*/
|
||||
|
||||
|
@ -794,7 +791,7 @@ XXX this is untested :)
|
|||
rem += burn_track_get_shortage(tar[i]);
|
||||
|
||||
/* ts A61101 : I doubt that linking would yield a
|
||||
desirable effect. With TAO it is
|
||||
desireable effect. With TAO it is
|
||||
counterproductive in any way.
|
||||
*/
|
||||
if (o->write_type == BURN_WRITE_TAO)
|
||||
|
@ -1027,7 +1024,7 @@ static int burn_write_leadin_cdtext(struct burn_write_opts *o,
|
|||
}
|
||||
#endif /* Libburn_debug_cd_texT */
|
||||
|
||||
err = d->write(d, (off_t) write_lba, buf);
|
||||
err = d->write(d, write_lba, buf);
|
||||
if (err == BE_CANCELLED)
|
||||
{ ret = 0; goto ex; }
|
||||
write_lba += sectors;
|
||||
|
@ -1074,10 +1071,10 @@ ex:;
|
|||
}
|
||||
|
||||
|
||||
/* ts A61218 / C40303 : outsourced from burn_write_track() */
|
||||
/* ts A61218 : outsourced from burn_write_track() */
|
||||
int burn_disc_init_track_status(struct burn_write_opts *o,
|
||||
struct burn_session *s, struct burn_track *t,
|
||||
int tnum, off_t sectors)
|
||||
int tnum, int sectors)
|
||||
{
|
||||
struct burn_drive *d = o->drive;
|
||||
|
||||
|
@ -1179,8 +1176,8 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||
|
||||
/* <<< */
|
||||
sprintf(msg,
|
||||
"TAO pre-track %2.2d : get_nwa(%d)=%d, d=%.f , demand=%.f , cap=%.f\n",
|
||||
tnum+1, nwa, ret, (double) d->nwa,
|
||||
"TAO pre-track %2.2d : get_nwa(%d)=%d, d=%d , demand=%.f , cap=%.f\n",
|
||||
tnum+1, nwa, ret, d->nwa,
|
||||
(double) burn_track_get_sectors_2(t, 1) * 2048.0,
|
||||
(double) d->media_capacity_remaining);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
|
@ -1205,11 +1202,9 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||
/* user data */
|
||||
|
||||
sectors = burn_track_get_sectors_2(t, 1);
|
||||
if (sectors < 0)
|
||||
{ ret = 0; goto ex; }
|
||||
open_ended = burn_track_is_open_ended(t);
|
||||
|
||||
burn_disc_init_track_status(o, s, t, tnum, (off_t) sectors);
|
||||
burn_disc_init_track_status(o, s, t, tnum, sectors);
|
||||
|
||||
/* ts A61030 : this cannot happen. tnum is always < s->tracks */
|
||||
if (tnum == s->tracks)
|
||||
|
@ -1358,7 +1353,7 @@ int burn_disc_init_write_status(struct burn_write_opts *o,
|
|||
d->progress.buffer_capacity = 0;
|
||||
d->progress.buffer_available = 0;
|
||||
d->progress.buffered_bytes = 0;
|
||||
d->progress.buffer_min_fill = 0x7fffffffffffffff;
|
||||
d->progress.buffer_min_fill = 0xffffffff;
|
||||
|
||||
/* ts A70711 */
|
||||
d->pessimistic_buffer_free = 0;
|
||||
|
@ -1383,7 +1378,6 @@ int burn_disc_init_write_status(struct burn_write_opts *o,
|
|||
ret = burn_write_opts_clone(o, &(d->write_opts), 0);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
d->write_retry_count = 0;
|
||||
|
||||
d->busy = BURN_DRIVE_WRITING;
|
||||
|
||||
|
@ -1427,7 +1421,7 @@ int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc,
|
|||
enum burn_write_types wt;
|
||||
struct burn_drive *d = o->drive;
|
||||
char *msg = NULL, *reason_pt;
|
||||
int no_media = 0, ret, has_cdtext, is_bd_pow = 0;
|
||||
int no_media = 0, ret, has_cdtext;
|
||||
|
||||
reason_pt= reasons;
|
||||
reasons[0] = 0;
|
||||
|
@ -1505,20 +1499,6 @@ int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc,
|
|||
sequential stdio "drive" */
|
||||
if (o->start_byte >= 0)
|
||||
strcat(reasons, "write start address not supported, ");
|
||||
|
||||
is_bd_pow = burn_drive_get_bd_r_pow(d);
|
||||
if (is_bd_pow && !silent)
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x0002011e,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Unsuitable media detected: BD-R formatted to POW.",
|
||||
0, 0);
|
||||
if (is_bd_pow) {
|
||||
strcat(reasons,
|
||||
"unsuitable media formatting POW detected, ");
|
||||
return 0;
|
||||
}
|
||||
|
||||
} else {
|
||||
unsuitable_profile:;
|
||||
msg = calloc(1, 160);
|
||||
|
@ -1570,8 +1550,8 @@ int burn_disc_open_track_dvd_minus_r(struct burn_write_opts *o,
|
|||
d->send_write_parameters(d, NULL, -1, o);
|
||||
ret = d->get_nwa(d, -1, &lba, &nwa);
|
||||
sprintf(msg,
|
||||
"DVD pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %.f",
|
||||
tnum+1, nwa, ret, (double) d->nwa);
|
||||
"DVD pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d",
|
||||
tnum+1, nwa, ret, d->nwa);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002,
|
||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg,0,0);
|
||||
if (nwa > d->nwa)
|
||||
|
@ -1595,8 +1575,6 @@ int burn_disc_open_track_dvd_minus_r(struct burn_write_opts *o,
|
|||
if (o->write_type == BURN_WRITE_SAO) { /* DAO */
|
||||
size = ((off_t) burn_track_get_sectors_2(s->track[tnum], 1))
|
||||
* (off_t) 2048;
|
||||
if (size < 0)
|
||||
{ret = 0; goto ex;}
|
||||
|
||||
/* Eventually round track size up to write chunk */
|
||||
if (o->obs_pad && (size % o->obs))
|
||||
|
@ -1632,8 +1610,8 @@ int burn_disc_open_track_dvd_plus_r(struct burn_write_opts *o,
|
|||
BURN_ALLOC_MEM(msg, char, 160);
|
||||
ret = d->get_nwa(d, -1, &lba, &nwa);
|
||||
sprintf(msg,
|
||||
"DVD+R pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %.f",
|
||||
tnum+1, nwa, ret, (double) d->nwa);
|
||||
"DVD+R pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d",
|
||||
tnum+1, nwa, ret, d->nwa);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002,
|
||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg,0,0);
|
||||
if (nwa > d->nwa)
|
||||
|
@ -1646,8 +1624,6 @@ int burn_disc_open_track_dvd_plus_r(struct burn_write_opts *o,
|
|||
/* Reserve track */
|
||||
size = ((off_t) burn_track_get_sectors_2(s->track[tnum], 1))
|
||||
* (off_t) 2048;
|
||||
if (size < 0)
|
||||
{ret = 0; goto ex;}
|
||||
if (o->obs_pad) {
|
||||
/* Round track size up to write chunk size */
|
||||
/* o->obs should be 32k or 64k already. But 32k
|
||||
|
@ -1658,6 +1634,16 @@ int burn_disc_open_track_dvd_plus_r(struct burn_write_opts *o,
|
|||
size += (off_t) (o->obs - (size % o->obs));
|
||||
}
|
||||
|
||||
/* <<< Only for now until the first DVD+R succeeded */
|
||||
if (!o->obs_pad) {
|
||||
sprintf(msg, "Program error: encountered DVD+R without chunk padding");
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x00000004,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
{ret = 0; goto ex;}
|
||||
}
|
||||
|
||||
ret = d->reserve_track(d, size);
|
||||
if (ret <= 0) {
|
||||
sprintf(msg, "Cannot reserve track of %.f bytes",
|
||||
|
@ -1704,7 +1690,7 @@ int burn_disc_close_track_dvd_minus_r(struct burn_write_opts *o, int tnum)
|
|||
int burn_disc_finalize_dvd_plus_r(struct burn_write_opts *o)
|
||||
{
|
||||
struct burn_drive *d = o->drive;
|
||||
char msg[40 + 80]; /* filltext + profile */
|
||||
char msg[80];
|
||||
|
||||
sprintf(msg, "Finalizing %s ...",
|
||||
d->current_profile_text);
|
||||
|
@ -1897,14 +1883,11 @@ int burn_dvd_write_track(struct burn_write_opts *o,
|
|||
struct buffer *out = d->buffer;
|
||||
int sectors;
|
||||
int i, open_ended = 0, ret= 0, is_flushed = 0, track_open = 0;
|
||||
off_t first_buf_cap = 0, further_cap = 0, buf_cap_step = 1024;
|
||||
int first_buf_cap = 0, further_cap = 0, buf_cap_step = 1024;
|
||||
|
||||
/* ts A70213 : eventually expand size of track to max */
|
||||
burn_track_apply_fillup(t, d->media_capacity_remaining, 0);
|
||||
|
||||
/* ts C00806 : Consider the track state changed by try to open */
|
||||
d->medium_state_changed = 1;
|
||||
|
||||
if (d->current_profile == 0x11 || d->current_profile == 0x14 ||
|
||||
d->current_profile == 0x15) {
|
||||
/* DVD-R, DVD-RW Sequential, DVD-R/DL Sequential */
|
||||
|
@ -1930,13 +1913,11 @@ int burn_dvd_write_track(struct burn_write_opts *o,
|
|||
track_open = 1;
|
||||
|
||||
sectors = burn_track_get_sectors_2(t, 1);
|
||||
if (sectors < 0)
|
||||
{ret = 0; goto ex;}
|
||||
open_ended = burn_track_is_open_ended(t);
|
||||
|
||||
/* (offset padding is done within sector_data()) */
|
||||
|
||||
burn_disc_init_track_status(o, s, t, tnum, (off_t) sectors);
|
||||
burn_disc_init_track_status(o, s, t, tnum, sectors);
|
||||
for (i = 0; open_ended || i < sectors; i++) {
|
||||
|
||||
/* From time to time inquire drive buffer */
|
||||
|
@ -2100,7 +2081,7 @@ int burn_dvd_write_session(struct burn_write_opts *o,
|
|||
is not readable.
|
||||
|
||||
By default the open session gets closed here before the new
|
||||
session is written. E.g. after writing a small dummy session
|
||||
session is written. E.g. after writing a small dummy seesion
|
||||
number 2 one can read session 1 and write session 3 which
|
||||
points to data of session 1.
|
||||
|
||||
|
@ -2127,7 +2108,7 @@ int burn_dvd_write_session(struct burn_write_opts *o,
|
|||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x00020171,
|
||||
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Closing BD-R with accidentally open session",
|
||||
"Closing BD-R with accidently open session",
|
||||
0, 0);
|
||||
d->close_track_session(d, 3, 0); /* CLOSE SESSION, 110b */
|
||||
d->state_of_last_session = 3; /* mark as complete session */
|
||||
|
@ -2233,8 +2214,7 @@ int burn_disc_setup_dvd_minus_rw(struct burn_write_opts *o,
|
|||
if (o->start_byte >= 0) {
|
||||
d->nwa = o->start_byte / 32768; /* align to 32 kB */
|
||||
|
||||
sprintf(msg, "Write start address is %.f * 32768",
|
||||
(double) d->nwa);
|
||||
sprintf(msg, "Write start address is %d * 32768", d->nwa);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x00020127,
|
||||
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
|
@ -2336,8 +2316,8 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
|
|||
d->nwa = 0;
|
||||
if (o->start_byte >= 0) {
|
||||
d->nwa = o->start_byte / 2048;
|
||||
sprintf(msg, "Write start address is %.f * 2048",
|
||||
(double) d->nwa);
|
||||
sprintf(msg, "Write start address is %d * 2048",
|
||||
d->nwa);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x00020127,
|
||||
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
|
@ -2427,17 +2407,9 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
|
|||
msg, 0, 0);
|
||||
goto early_failure;
|
||||
}
|
||||
/* Unaligned BD-R track end works with various drives and
|
||||
produces exact READ CAPACITY results.
|
||||
Nevertheless stream recording hates unaligned WRITE.
|
||||
With DVD+R it seems that obs_pad is silently applied by the
|
||||
drive if a non-aligned final WRITE is received.
|
||||
*/
|
||||
if (o->obs_pad < 2 &&
|
||||
!(d->current_profile == 0x41 && !d->do_stream_recording &&
|
||||
o->bdr_obs_exempt))
|
||||
/* ??? padding needed ??? cowardly doing it for now */
|
||||
if (o->obs_pad < 2)
|
||||
o->obs_pad = 1; /* fill-up track's last obs buffer */
|
||||
|
||||
if (d->current_profile == 0x41) /* BD-R */
|
||||
o->obs = Libburn_bd_r_obS;
|
||||
if (d->do_stream_recording) {
|
||||
|
@ -2619,8 +2591,6 @@ int burn_stdio_write(int fd, char *buf, int count, struct burn_drive *d,
|
|||
|
||||
if (d->cancel || count <= 0)
|
||||
return 0;
|
||||
if(d->do_simulate)
|
||||
return 1;
|
||||
|
||||
todo = count;
|
||||
done = 0;
|
||||
|
@ -2651,7 +2621,6 @@ fprintf(stderr, "libburn_DEBUG: write(%d, %lX, %d)\n",
|
|||
d->cancel = 1;
|
||||
ret = 0; goto ex;
|
||||
}
|
||||
ret = 1;
|
||||
ex:;
|
||||
BURN_FREE_MEM(msg);
|
||||
return ret;
|
||||
|
@ -2659,7 +2628,7 @@ ex:;
|
|||
|
||||
|
||||
/* ts A70910 : to be used as burn_drive.write(), emulating mmc_write() */
|
||||
int burn_stdio_mmc_write(struct burn_drive *d, off_t start, struct buffer *buf)
|
||||
int burn_stdio_mmc_write(struct burn_drive *d, int start, struct buffer *buf)
|
||||
{
|
||||
int ret;
|
||||
off_t start_byte;
|
||||
|
@ -2702,7 +2671,7 @@ int burn_stdio_mmc_write(struct burn_drive *d, off_t start, struct buffer *buf)
|
|||
|
||||
/* ts A70910 : to be used as burn_drive.write(),
|
||||
emulating mmc_write() with simulated writing. */
|
||||
int burn_stdio_mmc_dummy_write(struct burn_drive *d, off_t start,
|
||||
int burn_stdio_mmc_dummy_write(struct burn_drive *d, int start,
|
||||
struct buffer *buf)
|
||||
{
|
||||
if (d->cancel)
|
||||
|
@ -2729,7 +2698,7 @@ int burn_stdio_sync_cache(int fd, struct burn_drive *d, int flag)
|
|||
"Invalid file descriptor with stdio pseudo-drive",
|
||||
0, 0);
|
||||
d->cancel = 1;
|
||||
ret = 0; goto ex;
|
||||
return 0;
|
||||
}
|
||||
d->needs_sync_cache = 0;
|
||||
do_fsync = 0;
|
||||
|
@ -2757,7 +2726,7 @@ int burn_stdio_sync_cache(int fd, struct burn_drive *d, int flag)
|
|||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, errno, 0);
|
||||
d->cancel = 1;
|
||||
ret = 0; goto ex;
|
||||
return 0;
|
||||
}
|
||||
ret = 1;
|
||||
ex:;
|
||||
|
@ -2774,57 +2743,31 @@ void burn_stdio_mmc_sync_cache(struct burn_drive *d)
|
|||
}
|
||||
|
||||
|
||||
/* ts C00824 : API */
|
||||
/* Enforces nominal write speed */
|
||||
int burn_nominal_slowdown(int kb_per_second, int max_corr,
|
||||
struct timeval *prev_time,
|
||||
int *us_corr, off_t b_since_prev, int flag)
|
||||
/* ts A70912 */
|
||||
/* Enforces eventual nominal write speed.
|
||||
@param flag bit0= initialize *prev_time */
|
||||
int burn_stdio_slowdown(struct burn_drive *d, struct timeval *prev_time,
|
||||
int amount, int flag)
|
||||
{
|
||||
struct timeval tnow;
|
||||
double to_wait, goal, corr;
|
||||
int abs_max_corr;
|
||||
struct timezone dummy_tz;
|
||||
double to_wait;
|
||||
|
||||
if (flag & 1) {
|
||||
gettimeofday(prev_time, NULL);
|
||||
*us_corr = 0;
|
||||
gettimeofday(prev_time, &dummy_tz);
|
||||
return 1;
|
||||
}
|
||||
if (kb_per_second <= 0)
|
||||
if(d->nominal_write_speed <= 0)
|
||||
return 2;
|
||||
|
||||
if (max_corr < -1.0e9 || max_corr > 1.0e9)
|
||||
abs_max_corr = 1000000000;
|
||||
else
|
||||
abs_max_corr = abs(max_corr);
|
||||
gettimeofday(&tnow, NULL);
|
||||
goal = ((double) b_since_prev) / 1000.0 / ((double) kb_per_second) +
|
||||
((double) prev_time->tv_sec) +
|
||||
((double) prev_time->tv_usec) / 1.0e6 +
|
||||
((double) *us_corr) / 1.0e6 ;
|
||||
to_wait = goal - ((double) tnow.tv_sec) -
|
||||
((double) tnow.tv_usec) / 1.0e6;
|
||||
|
||||
/* usleep might be restricted to 999999 microseconds */
|
||||
while (to_wait > 0.0) {
|
||||
if (to_wait >= 0.5) {
|
||||
usleep(500000);
|
||||
to_wait -= 0.5;
|
||||
} else if (to_wait >= 0.00001) {
|
||||
usleep((int) (to_wait * 1000000.0));
|
||||
to_wait = 0.0;
|
||||
} else {
|
||||
to_wait = 0.0;
|
||||
}
|
||||
gettimeofday(&tnow, &dummy_tz);
|
||||
to_wait = ( ((double) amount) / (double) d->nominal_write_speed ) -
|
||||
(double) ( tnow.tv_sec - prev_time->tv_sec ) -
|
||||
(double) ( tnow.tv_usec - prev_time->tv_usec ) / 1.0e6
|
||||
- 0.001; /* best would be 1 / kernel granularity HZ */
|
||||
if (to_wait >= 0.0001) {
|
||||
usleep((int) (to_wait * 1000000.0));
|
||||
}
|
||||
gettimeofday(prev_time, NULL);
|
||||
corr = (goal - ((double) prev_time->tv_sec) -
|
||||
((double) prev_time->tv_usec) / 1.0e6) * 1.0e6;
|
||||
if (corr > abs_max_corr)
|
||||
*us_corr = abs_max_corr;
|
||||
else if (corr < -abs_max_corr)
|
||||
*us_corr = -abs_max_corr;
|
||||
else
|
||||
*us_corr = corr;
|
||||
gettimeofday(prev_time, &dummy_tz);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -2833,20 +2776,17 @@ int burn_nominal_slowdown(int kb_per_second, int max_corr,
|
|||
int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s,
|
||||
int tnum, int flag)
|
||||
{
|
||||
int open_ended, bufsize = 16 * 2048, ret;
|
||||
int open_ended, bufsize = 16 * 2048, ret, sectors;
|
||||
struct burn_track *t = s->track[tnum];
|
||||
struct burn_drive *d = o->drive;
|
||||
char *buf = NULL;
|
||||
int us_corr = 0, max_corr = 250000;
|
||||
off_t prev_sync_sector = 0, sectors, i;
|
||||
int i, prev_sync_sector = 0;
|
||||
struct buffer *out = d->buffer;
|
||||
struct timeval prev_time;
|
||||
|
||||
BURN_ALLOC_MEM(buf, char, bufsize);
|
||||
|
||||
sectors = burn_track_get_sectors_2_v2(t, 1);
|
||||
if (sectors < 0)
|
||||
{ret = 0; goto ex;}
|
||||
sectors = burn_track_get_sectors_2(t, 1);
|
||||
burn_disc_init_track_status(o, s, t, tnum, sectors);
|
||||
open_ended = burn_track_is_open_ended(t);
|
||||
|
||||
|
@ -2857,13 +2797,9 @@ int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||
d->write = burn_stdio_mmc_dummy_write;
|
||||
else
|
||||
d->write = burn_stdio_mmc_write;
|
||||
d->do_simulate = o->simulate;
|
||||
d->sync_cache = burn_stdio_mmc_sync_cache;
|
||||
|
||||
/* initialize */
|
||||
burn_nominal_slowdown(d->nominal_write_speed, max_corr,
|
||||
&prev_time, &us_corr, (off_t) 0, 1);
|
||||
|
||||
burn_stdio_slowdown(d, &prev_time, 0, 1); /* initialize */
|
||||
for (i = 0; open_ended || i < sectors; i++) {
|
||||
/* transact a (CD sized) sector */
|
||||
if (!sector_data(o, t, 0))
|
||||
|
@ -2876,25 +2812,14 @@ int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||
}
|
||||
d->progress.sector++;
|
||||
/* Flush to disk from time to time */
|
||||
if (o->stdio_fsync_size > 0) {
|
||||
if (d->progress.sector - prev_sync_sector >=
|
||||
o->stdio_fsync_size) {
|
||||
if (!o->simulate)
|
||||
burn_stdio_sync_cache(d->stdio_fd, d,
|
||||
1);
|
||||
burn_nominal_slowdown(
|
||||
d->nominal_write_speed, max_corr,
|
||||
&prev_time, &us_corr,
|
||||
(off_t) (d->progress.sector -
|
||||
prev_sync_sector) *
|
||||
(off_t) 2048,
|
||||
0);
|
||||
prev_sync_sector = d->progress.sector;
|
||||
}
|
||||
} else if ((d->progress.sector % 512) == 0) {
|
||||
burn_nominal_slowdown(d->nominal_write_speed, max_corr,
|
||||
&prev_time, &us_corr, (off_t) (512 * 2048), 0);
|
||||
if (d->progress.sector - prev_sync_sector >=
|
||||
o->stdio_fsync_size && o->stdio_fsync_size > 0) {
|
||||
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) */
|
||||
|
@ -2982,7 +2907,7 @@ void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc)
|
|||
struct buffer *buffer_mem = o->drive->buffer;
|
||||
struct burn_session *s;
|
||||
struct burn_track *lt, *t;
|
||||
int first = 1, i, ret, lba, nwa = 0, multi_mem, stream_recording_start;
|
||||
int first = 1, i, ret, lba, nwa = 0, multi_mem;
|
||||
off_t default_size;
|
||||
char msg[80];
|
||||
|
||||
|
@ -2994,13 +2919,12 @@ void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc)
|
|||
/* ts A61224 */
|
||||
burn_disc_init_write_status(o, disc); /* must be done very early */
|
||||
|
||||
/* ts A80412 , A90227 , B90411 */
|
||||
/* ts A80412 , A90227 */
|
||||
d->do_stream_recording = !!o->do_stream_recording;
|
||||
if (o->do_stream_recording >= 16)
|
||||
stream_recording_start = o->do_stream_recording;
|
||||
d->stream_recording_start = o->do_stream_recording;
|
||||
else
|
||||
stream_recording_start = 0;
|
||||
burn_drive_set_stream_recording(d, !!o->do_stream_recording,
|
||||
stream_recording_start, 0);
|
||||
d->stream_recording_start = 0;
|
||||
|
||||
/* ts A91122 : Get buffer suitable for sources made by
|
||||
burn_os_open_track_src() */
|
||||
|
@ -3130,7 +3054,6 @@ return crap. so we send the command, then ignore the result.
|
|||
/* goto fail_wo_sync; */
|
||||
#endif /* Libburn_write_with_function_print_cuE */
|
||||
|
||||
d->medium_state_changed = 1;
|
||||
ret = 1;
|
||||
if (o->write_type == BURN_WRITE_SAO)
|
||||
ret = d->send_cue_sheet(d, sheet);
|
||||
|
@ -3252,14 +3175,6 @@ ex:;
|
|||
burn_write_opts_free(d->write_opts);
|
||||
d->write_opts = NULL;
|
||||
}
|
||||
if (d->write_retry_count > 0) {
|
||||
sprintf(msg, "WRITE command repetition happened %u times",
|
||||
d->write_retry_count);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x000201ad,
|
||||
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3377,9 +3292,7 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
|
|||
rpt += d->buffer->bytes;
|
||||
d->buffer->sectors = chunksize;
|
||||
d->nwa = start;
|
||||
if(d->do_simulate) {
|
||||
err = 0;
|
||||
} else if(d->drive_role == 1) {
|
||||
if(d->drive_role == 1) {
|
||||
err = d->write(d, d->nwa, d->buffer);
|
||||
} else {
|
||||
ret = burn_stdio_write(fd, (char *) d->buffer->data,
|
||||
|
@ -3399,9 +3312,7 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
|
|||
if(d->drive_role == 1)
|
||||
d->needs_sync_cache = 1;
|
||||
if(flag & 1) {
|
||||
if(d->do_simulate) {
|
||||
;
|
||||
} else if(d->drive_role == 1)
|
||||
if(d->drive_role == 1)
|
||||
d->sync_cache(d);
|
||||
else
|
||||
burn_stdio_sync_cache(fd, d, 2);
|
||||
|
|
|
@ -3,8 +3,7 @@
|
|||
Fakes a file in SUN .au format from a raw little-endian PCM audio file
|
||||
(e.g. a file extracted from .wav by test/dewav). The input data are assumed
|
||||
to be 16 bit, stereo, 44100 Hz.
|
||||
Copyright (C) 2006 - 2015 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
|
||||
|
||||
Info used: http://www.opengroup.org/public/pubs/external/auformat.html
|
||||
*/
|
||||
|
@ -48,13 +47,6 @@ int main(int argc, char **argv)
|
|||
exit_value= 1;
|
||||
goto help;
|
||||
}
|
||||
for(i= 1; i<argc; i++) {
|
||||
if(strlen(argv[i]) >= 4096) {
|
||||
fprintf(stderr,"%s: argument at position %d is much too long.\n",
|
||||
argv[0], i);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
for(i= 1; i<argc; i++) {
|
||||
if(strcmp(argv[i],"-o")==0) {
|
||||
if(i>=argc-1) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
/* test/libburner.c , API illustration of burning data or audio tracks to CD */
|
||||
/* Copyright (C) 2005 - 2016 Thomas Schmitt <scdbackup@gmx.net> */
|
||||
/* Copyright (C) 2005 - 2011 Thomas Schmitt <scdbackup@gmx.net> */
|
||||
/* Provided under GPL, see also "License and copyright aspects" at file end */
|
||||
|
||||
|
||||
|
@ -16,25 +16,23 @@
|
|||
to serve the libburnia team as reference application. libburner.c does indeed
|
||||
define the standard way how above three gestures can be implemented and
|
||||
stay upward compatible for a good while.
|
||||
There is another demo program, test/telltoc.c, which inspects drive, media
|
||||
state, and media contents.
|
||||
|
||||
Before you can do anything, you have to initialize libburn by
|
||||
burn_initialize()
|
||||
and provide some signal and abort handling, e.g. by the builtin handler, by
|
||||
burn_set_signal_handling("libburner : ", NULL, 0x0)
|
||||
as it is done in main() at the end of this file.
|
||||
Then you acquire a drive in an appropriate way conforming to the API. The two
|
||||
Then you aquire a drive in an appropriate way conforming to the API. The twoi
|
||||
main 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 acquired drive you can blank a CD-RW or DVD-RW as shown in
|
||||
With that aquired drive you can blank a CD-RW or DVD-RW as shown in
|
||||
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
|
||||
libburner_format()
|
||||
With the acquired drive you can burn to CD, DVD, BD. See
|
||||
With the aquired drive you can burn to CD, DVD, BD. See
|
||||
libburner_payload()
|
||||
|
||||
These three functions switch temporarily to a non-fatal signal handler
|
||||
|
@ -98,12 +96,12 @@ static unsigned int drive_count;
|
|||
finally released */
|
||||
static int drive_is_grabbed = 0;
|
||||
|
||||
/** A number and a text describing the type of media in acquired drive */
|
||||
/** A number and a text describing the type of media in aquired drive */
|
||||
static int current_profile= -1;
|
||||
static char current_profile_name[80]= {""};
|
||||
|
||||
|
||||
/* Some in-advance definitions make possible a more comprehensive ordering
|
||||
/* Some in-advance definitions to allow a more comprehensive ordering
|
||||
of the functions and their explanations in here */
|
||||
int libburner_aquire_by_adr(char *drive_adr);
|
||||
int libburner_aquire_by_driveno(int *drive_no);
|
||||
|
@ -111,7 +109,7 @@ int libburner_aquire_by_driveno(int *drive_no);
|
|||
|
||||
/* ------------------------------- API gestures ---------------------------- */
|
||||
|
||||
/** You need to acquire a drive before burning. The API offers this as one
|
||||
/** You need to aquire a drive before burning. The API offers this as one
|
||||
compact call and alternatively as application controllable gestures of
|
||||
whitelisting, scanning for drives and finally grabbing one of them.
|
||||
|
||||
|
@ -239,14 +237,14 @@ int libburner_aquire_by_driveno(int *driveno)
|
|||
and to restart when the choice has been made. The list of selectable
|
||||
drives should also hold persistent drive addresses as obtained
|
||||
above by burn_drive_get_adr(). By such an address one may use
|
||||
burn_drive_scan_and_grab() to finally acquire exactly one drive.
|
||||
burn_drive_scan_and_grab() to finally aquire exactly one drive.
|
||||
|
||||
A not yet tested shortcut should be to call burn_drive_info_free()
|
||||
and to call either burn_drive_scan() or burn_drive_scan_and_grab()
|
||||
before accessing any drives again.
|
||||
|
||||
In both cases you have to be aware that the desired drive might get
|
||||
acquired in the meantime by another user or libburn process.
|
||||
aquired in the meantime by another user resp. libburn process.
|
||||
*/
|
||||
|
||||
/* We already made our choice via command line. (default is 0)
|
||||
|
@ -435,31 +433,28 @@ int libburner_format(struct burn_drive *drive)
|
|||
|
||||
In case of external signals expect abort handling of an ongoing burn to
|
||||
last up to a minute. Wait the normal burning timespan before any kill -9.
|
||||
|
||||
For simplicity, this function allows memory leaks in case of failure.
|
||||
In apps which do not abort immediately, one should clean up better.
|
||||
*/
|
||||
int libburner_payload(struct burn_drive *drive,
|
||||
char source_adr[][4096], int source_adr_count,
|
||||
int multi, int simulate_burn, int all_tracks_type)
|
||||
{
|
||||
struct burn_source *data_src = NULL, *fifo_src[99];
|
||||
struct burn_disc *target_disc = NULL;
|
||||
struct burn_session *session = NULL;
|
||||
struct burn_write_opts *burn_options = NULL;
|
||||
struct burn_source *data_src, *fifo_src[99];
|
||||
struct burn_disc *target_disc;
|
||||
struct burn_session *session;
|
||||
struct burn_write_opts *burn_options;
|
||||
enum burn_disc_status disc_state;
|
||||
struct burn_track *track, *tracklist[99];
|
||||
struct burn_progress progress;
|
||||
time_t start_time;
|
||||
int last_sector = 0, padding = 0, trackno, unpredicted_size = 0, fd;
|
||||
int fifo_chunksize = 2352, fifo_chunks = 1783; /* ~ 4 MB fifo */
|
||||
int ret;
|
||||
off_t fixed_size;
|
||||
char *adr, reasons[BURN_REASONS_LEN];
|
||||
struct stat stbuf;
|
||||
|
||||
for (trackno = 0 ; trackno < source_adr_count; trackno++) {
|
||||
fifo_src[trackno] = NULL;
|
||||
tracklist[trackno] = NULL;
|
||||
}
|
||||
|
||||
if (all_tracks_type != BURN_AUDIO) {
|
||||
all_tracks_type = BURN_MODE1;
|
||||
/* a padding of 300 kiB helps to avoid the read-ahead bug */
|
||||
|
@ -493,7 +488,7 @@ int libburner_payload(struct burn_drive *drive,
|
|||
|
||||
/* Convert this filedescriptor into a burn_source object */
|
||||
data_src = NULL;
|
||||
if (fd >= 0)
|
||||
if (fd>=0)
|
||||
data_src = burn_fd_source_new(fd, -1, fixed_size);
|
||||
if (data_src == NULL) {
|
||||
fprintf(stderr,
|
||||
|
@ -501,7 +496,7 @@ int libburner_payload(struct burn_drive *drive,
|
|||
if(errno!=0)
|
||||
fprintf(stderr,"(Most recent system error: %s )\n",
|
||||
strerror(errno));
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
/* Install a fifo object on top of that data source object */
|
||||
fifo_src[trackno] = burn_fifo_source_new(data_src,
|
||||
|
@ -509,7 +504,7 @@ int libburner_payload(struct burn_drive *drive,
|
|||
if (fifo_src[trackno] == NULL) {
|
||||
fprintf(stderr,
|
||||
"FATAL: Could not create fifo object of 4 MB\n");
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Use the fifo object as data source for the track */
|
||||
|
@ -517,7 +512,7 @@ int libburner_payload(struct burn_drive *drive,
|
|||
!= BURN_SOURCE_OK) {
|
||||
fprintf(stderr,
|
||||
"FATAL: Cannot attach source object to track object\n");
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
|
||||
burn_session_add_track(session, track, BURN_POS_END);
|
||||
|
@ -525,7 +520,6 @@ int libburner_payload(struct burn_drive *drive,
|
|||
|
||||
/* Give up local reference to the data burn_source object */
|
||||
burn_source_free(data_src);
|
||||
data_src = NULL;
|
||||
|
||||
} /* trackno loop end */
|
||||
|
||||
|
@ -542,7 +536,7 @@ int libburner_payload(struct burn_drive *drive,
|
|||
else
|
||||
fprintf(stderr,
|
||||
"FATAL: Cannot recognize state of drive and media\n");
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
|
||||
burn_options = burn_write_opts_new(drive);
|
||||
|
@ -557,7 +551,7 @@ int libburner_payload(struct burn_drive *drive,
|
|||
reasons, 0) == BURN_WRITE_NONE) {
|
||||
fprintf(stderr, "FATAL: Failed to find a suitable write mode with this media.\n");
|
||||
fprintf(stderr, "Reasons given:\n%s\n", reasons);
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
burn_set_signal_handling("libburner : ", NULL, 0x30);
|
||||
|
||||
|
@ -565,6 +559,7 @@ int libburner_payload(struct burn_drive *drive,
|
|||
start_time = time(0);
|
||||
burn_disc_write(burn_options, target_disc);
|
||||
|
||||
burn_write_opts_free(burn_options);
|
||||
while (burn_drive_get_status(drive, NULL) == BURN_DRIVE_SPAWNING)
|
||||
usleep(100002);
|
||||
while (burn_drive_get_status(drive, &progress) != BURN_DRIVE_IDLE) {
|
||||
|
@ -600,32 +595,21 @@ int libburner_payload(struct burn_drive *drive,
|
|||
}
|
||||
printf("\n");
|
||||
|
||||
for (trackno = 0 ; trackno < source_adr_count; trackno++) {
|
||||
burn_source_free(fifo_src[trackno]);
|
||||
burn_track_free(tracklist[trackno]);
|
||||
}
|
||||
burn_session_free(session);
|
||||
burn_disc_free(target_disc);
|
||||
if (burn_is_aborting(0) > 0)
|
||||
{ret = -1; goto ex;}
|
||||
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 */
|
||||
printf("NOTE: Media left appendable.\n");
|
||||
if (simulate_burn)
|
||||
printf("\n*** Did TRY to SIMULATE burning ***\n\n");
|
||||
ret = 1;
|
||||
ex:;
|
||||
/* Dispose objects */
|
||||
if (burn_options != NULL)
|
||||
burn_write_opts_free(burn_options);
|
||||
for (trackno = 0 ; trackno < source_adr_count; trackno++) {
|
||||
if (fifo_src[trackno] != NULL)
|
||||
burn_source_free(fifo_src[trackno]);
|
||||
if (tracklist[trackno])
|
||||
burn_track_free(tracklist[trackno]);
|
||||
}
|
||||
if (data_src != NULL)
|
||||
burn_source_free(data_src);
|
||||
if (session != NULL)
|
||||
burn_session_free(session);
|
||||
if (target_disc != NULL)
|
||||
burn_disc_free(target_disc);
|
||||
return ret;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -784,7 +768,7 @@ int main(int argc, char **argv)
|
|||
/** Note: driveno might change its value in this call */
|
||||
ret = libburner_aquire_drive(drive_adr, &driveno);
|
||||
if (ret<=0) {
|
||||
fprintf(stderr,"\nFATAL: Failed to acquire drive.\n");
|
||||
fprintf(stderr,"\nFATAL: Failed to aquire drive.\n");
|
||||
{ ret = 34; goto finish_libburn; }
|
||||
}
|
||||
if (ret == 2)
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
static struct burn_drive_info *drives;
|
||||
|
@ -63,7 +62,6 @@ int main()
|
|||
return 1;
|
||||
}
|
||||
|
||||
memset(&newact, 0, sizeof(newact));
|
||||
newact.sa_handler = catch_int;
|
||||
sigaction(SIGINT, &newact, &oldact);
|
||||
for (i = 0; i < (int) n_drives; i++) {
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <libburn/libburn.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i;
|
||||
const char *path;
|
||||
struct burn_track *track;
|
||||
struct burn_disc *disc;
|
||||
struct burn_session *session;
|
||||
struct burn_source *src;
|
||||
|
||||
burn_initialize();
|
||||
burn_msgs_set_severities("NEVER", "ALL", "structest: ");
|
||||
|
||||
disc = burn_disc_create();
|
||||
session = burn_session_create();
|
||||
burn_disc_add_session(disc, session, BURN_POS_END);
|
||||
|
||||
/* Define a source for all of the tracks */
|
||||
path = strdup("/etc/hosts");
|
||||
src = burn_file_source_new(path, NULL);
|
||||
|
||||
/* Add ten tracks to a session */
|
||||
for (i = 0; i < 10; i++) {
|
||||
track = burn_track_create();
|
||||
burn_session_add_track(session, track, 0);
|
||||
if (burn_track_set_source(track, src) != BURN_SOURCE_OK) {
|
||||
printf("problem with the source\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add ten tracks to a session */
|
||||
for (i = 0; i < 10; i++) {
|
||||
track = burn_track_create();
|
||||
burn_session_add_track(session, track, 0);
|
||||
if (burn_track_set_source(track, src) != BURN_SOURCE_OK) {
|
||||
printf("problem with the source\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Delete a session */
|
||||
burn_session_remove_track(session, track);
|
||||
|
||||
burn_structure_print_disc(disc);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
/* test/telltoc.c , API illustration of obtaining media status info */
|
||||
/* Copyright (C) 2006 - 2016 Thomas Schmitt <scdbackup@gmx.net>
|
||||
/* Copyright (C) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL */
|
||||
|
||||
/** Overview
|
||||
|
@ -14,16 +14,15 @@
|
|||
to serve the libburn team as reference application. telltoc.c does indeed
|
||||
define the standard way how above gestures can be implemented and stay upward
|
||||
compatible for a good while.
|
||||
The burn aspects of libburn are demonstrated by program test/libburner.c .
|
||||
|
||||
Before you can do anything, you have to initialize libburn by
|
||||
burn_initialize()
|
||||
as it is done in main() at the end of this file. Then you acquire a
|
||||
as it is done in main() at the end of this file. Then you aquire a
|
||||
drive in an appropriate way conforming to the API. The two main
|
||||
approaches are shown here in application functions:
|
||||
telltoc_aquire_by_adr() demonstrates usage as of cdrecord traditions
|
||||
telltoc_aquire_by_driveno() demonstrates a scan-and-choose approach
|
||||
With that acquired drive you can call
|
||||
With that aquired drive you can call
|
||||
telltoc_media() prints some information about the media in a drive
|
||||
telltoc_toc() prints a table of content (if there is content)
|
||||
telltoc_msinfo() prints parameters for mkisofs option -C
|
||||
|
@ -72,7 +71,7 @@ static unsigned int drive_count;
|
|||
static int drive_is_grabbed = 0;
|
||||
|
||||
|
||||
/* Some in-advance definitions to make possible a more comprehensive ordering
|
||||
/* Some in-advance definitions to allow a more comprehensive ordering
|
||||
of the functions and their explanations in here */
|
||||
int telltoc_aquire_by_adr(char *drive_adr);
|
||||
int telltoc_aquire_by_driveno(int *drive_no, int silent);
|
||||
|
@ -86,7 +85,7 @@ static int cd_is_audio = 0; /* 0 = undecided , -1 = no , 1 = yes */
|
|||
|
||||
/* ------------------------------- API gestures ---------------------------- */
|
||||
|
||||
/** You need to acquire a drive before burning. The API offers this as one
|
||||
/** You need to aquire a drive before burning. The API offers this as one
|
||||
compact call and alternatively as application controllable gestures of
|
||||
whitelisting, scanning for drives and finally grabbing one of them.
|
||||
|
||||
|
@ -128,7 +127,7 @@ int telltoc_aquire_by_adr(char *drive_adr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
fprintf(stderr,"Acquiring drive '%s' ...\n", libburn_drive_adr);
|
||||
fprintf(stderr,"Aquiring drive '%s' ...\n", libburn_drive_adr);
|
||||
ret = burn_drive_scan_and_grab(&drive_list, libburn_drive_adr, 1);
|
||||
|
||||
if (ret <= 0) {
|
||||
|
@ -240,14 +239,12 @@ int telltoc_regrab(struct burn_drive *drive) {
|
|||
|
||||
int telltoc_media(struct burn_drive *drive)
|
||||
{
|
||||
int ret, media_found = 0, profile_no = -1, num_profiles = 0, i;
|
||||
int profiles[64];
|
||||
char is_current_profile[64];
|
||||
int ret, media_found = 0, profile_no = -1;
|
||||
double max_speed = 0.0, min_speed = 0.0, speed_conv;
|
||||
off_t available = 0;
|
||||
enum burn_disc_status s;
|
||||
char profile_name[80], speed_unit[40];
|
||||
struct burn_multi_caps *caps = NULL;
|
||||
struct burn_multi_caps *caps;
|
||||
struct burn_write_opts *o = NULL;
|
||||
|
||||
printf("Media current: ");
|
||||
|
@ -260,32 +257,15 @@ int telltoc_media(struct burn_drive *drive)
|
|||
} else
|
||||
printf("is not recognizable\n");
|
||||
|
||||
/* Determine speed unit before profile_name gets reused */
|
||||
speed_conv = 176.4;
|
||||
strcpy(speed_unit,"176.4 kB/s (CD, data speed 150 KiB/s)");
|
||||
if (strstr(profile_name, "DVD") == profile_name) {
|
||||
speed_conv = 1385.0;
|
||||
strcpy(speed_unit,"1385.0 kB/s (DVD)");
|
||||
} else if (strstr(profile_name, "BD") == profile_name) {
|
||||
speed_conv = 4495.625;
|
||||
strcpy(speed_unit,"4495.625 kB/s (BD)");
|
||||
}
|
||||
|
||||
ret = burn_drive_get_all_profiles(drive, &num_profiles, profiles,
|
||||
is_current_profile);
|
||||
if (ret > 0) {
|
||||
for (i = 0; i < num_profiles; i++) {
|
||||
ret = burn_obtain_profile_name(profiles[i],
|
||||
profile_name);
|
||||
if (ret <= 0)
|
||||
sprintf(profile_name,
|
||||
"Unknown media type 0x%4.4X",
|
||||
(unsigned int) profiles[i]);
|
||||
printf("Drive can do : %s%s\n", profile_name,
|
||||
is_current_profile[i] ? " (current)" : "");
|
||||
}
|
||||
}
|
||||
|
||||
/* >>> libburn does not obtain full profile list yet */
|
||||
|
||||
printf("Media status : ");
|
||||
s = burn_disc_get_status(drive);
|
||||
if (s == BURN_DISC_FULL) {
|
||||
|
@ -316,15 +296,15 @@ int telltoc_media(struct burn_drive *drive)
|
|||
/* Media appears writeable */
|
||||
printf("Write multi : ");
|
||||
printf("%s multi-session , ",
|
||||
caps->multi_session == 1 ? "offers" : "cannot do");
|
||||
caps->multi_session == 1 ? "allows" : "prohibits");
|
||||
if (caps->multi_track)
|
||||
printf("offers multiple tracks\n");
|
||||
printf("allows multiple tracks\n");
|
||||
else
|
||||
printf("offers only single track\n");
|
||||
printf("enforces single track\n");
|
||||
printf("Write start : ");
|
||||
if (caps->start_adr == 1)
|
||||
printf(
|
||||
"offers addresses [%.f , %.f]s , alignment=%.fs\n",
|
||||
"allows addresses [%.f , %.f]s , alignment=%.fs\n",
|
||||
(double) caps->start_range_low / 2048 ,
|
||||
(double) caps->start_range_high / 2048 ,
|
||||
(double) caps->start_alignment / 2048 );
|
||||
|
@ -399,8 +379,6 @@ int telltoc_media(struct burn_drive *drive)
|
|||
}
|
||||
printf("Speed unit 1x: %s\n", speed_unit);
|
||||
|
||||
if (caps != NULL)
|
||||
burn_disc_free_multi_caps(&caps);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -535,8 +513,8 @@ int telltoc_toc(struct burn_drive *drive)
|
|||
cd_is_audio = -1;
|
||||
}
|
||||
|
||||
printf("Media content: session %3d ", session_no+1);
|
||||
printf("track %3d %s lba: %9d %4.2d:%2.2d:%2.2d\n",
|
||||
printf("Media content: session %2d ", session_no+1);
|
||||
printf("track %2d %s lba: %9d %4.2d:%2.2d:%2.2d\n",
|
||||
track_count,
|
||||
(track_is_audio ? "audio" : "data "),
|
||||
lba, pmin, psec, pframe);
|
||||
|
@ -553,8 +531,8 @@ int telltoc_toc(struct burn_drive *drive)
|
|||
pframe = toc_entry.pframe;
|
||||
lba= burn_msf_to_lba(pmin, psec, pframe);
|
||||
}
|
||||
printf("Media content: session %3d ", session_no+1);
|
||||
printf("leadout lba: %9d %4.2d:%2.2d:%2.2d\n",
|
||||
printf("Media content: session %2d ", session_no+1);
|
||||
printf("leadout lba: %9d %4.2d:%2.2d:%2.2d\n",
|
||||
lba, pmin, psec, pframe);
|
||||
last_track_size = lba - last_track_start;
|
||||
telltoc_detect_cd(drive);
|
||||
|
@ -714,16 +692,8 @@ int telltoc_read_and_print(struct burn_drive *drive,
|
|||
print_result:;
|
||||
total_count += data_count;
|
||||
if (encoding == 1) {
|
||||
if (data_count > 0) {
|
||||
ret = fwrite(buf, data_count, 1, raw_fp);
|
||||
if (ret < 1) {
|
||||
fprintf(stderr,
|
||||
"FAILURE: writing to '%s' : %s\n",
|
||||
raw_file, strerror(errno));
|
||||
fclose(raw_fp);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (data_count > 0)
|
||||
fwrite(buf, data_count, 1, raw_fp);
|
||||
} else for (i = 0; i < data_count; i += 16) {
|
||||
if (encoding == 0) {
|
||||
sprintf(line, "%8ds + %4d : ",
|
||||
|
@ -782,8 +752,6 @@ print_result:;
|
|||
start_sector, sector_count,
|
||||
(int) (total_count / (off_t) sector_size));
|
||||
|
||||
if (raw_fp != NULL)
|
||||
fclose(raw_fp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -808,13 +776,6 @@ int telltoc_setup(int argc, char **argv)
|
|||
{
|
||||
int i;
|
||||
|
||||
for (i = 1; i < argc; ++i) {
|
||||
if (strlen(argv[i]) >= 4096) {
|
||||
fprintf(stderr,
|
||||
"Argument at position %d is much too long. (Max 4095)\n", i);
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
for (i = 1; i < argc; ++i) {
|
||||
if (!strcmp(argv[i], "--drive")) {
|
||||
++i;
|
||||
|
@ -856,8 +817,7 @@ int telltoc_setup(int argc, char **argv)
|
|||
sscanf(argv[i-2], "%d", &read_start);
|
||||
sscanf(argv[i-1], "%d", &read_count);
|
||||
print_encoding = 0;
|
||||
if(strncmp(argv[i], "raw:", 4) == 0 ||
|
||||
strncmp(argv[i], "1:", 2) == 0) {
|
||||
if(strncmp(argv[i], "raw:", 4) == 0 || strcmp(argv[i],"1:") == 0) {
|
||||
print_encoding = 1;
|
||||
strcpy(print_raw_file, strchr(argv[i], ':') + 1);
|
||||
if (strcmp(print_raw_file, "-") == 0) {
|
||||
|
@ -1004,6 +964,6 @@ finish_libburn:;
|
|||
}
|
||||
|
||||
/* License and copyright aspects:
|
||||
See test/libburner.c
|
||||
See libburner.c
|
||||
*/
|
||||
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
Mario Danic
|
||||
Thomas Schmitt
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
Joe Neeman
|
||||
Philippe Rouquier
|
||||
Gabriel Craciunescu
|
||||
George Danchev
|
||||
Jean-Francois Wauthy
|
||||
Lorenzo Taylor
|
|
@ -0,0 +1,280 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
|
@ -0,0 +1,18 @@
|
|||
Derek Foreman <derek@signalmarketing.com> and Ben Jansens <xor@orodu.net>
|
||||
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
Mario Danic <mario.danic@gmail.com>, Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-2014 Mario Danic, Thomas Schmitt
|
||||
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 or later
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
@ -0,0 +1,441 @@
|
|||
SVN trunk (to become libburn-1.4.0 or higher)
|
||||
===============================================================================
|
||||
- no novelties yet -
|
||||
|
||||
|
||||
libburn-1.3.8.tar.gz Sat Jun 28 2014
|
||||
===============================================================================
|
||||
* Bug fix: Wrong stack usage caused SIGBUS on sparc when compiled by gcc -O2
|
||||
* Bug fix: Minimum drive buffer fill was measured by cdrskin before the buffer
|
||||
could get full
|
||||
* Bug fix: A failed MMC BLANK command did not cause error indication by libburn
|
||||
* Bug fix: A final fsync(2) was performed with stdio drives, even if not
|
||||
desired
|
||||
|
||||
libburn-1.3.6.pl01.tar.gz Tue Mar 18 2013
|
||||
===============================================================================
|
||||
* Bug fix: CD TAO with multiple tracks could cause a buffer overrun
|
||||
* Bug fix: Compilation warning for unsupported systems mutated into an error
|
||||
|
||||
libburn-1.3.6.tar.gz Tue Mar 04 2013
|
||||
===============================================================================
|
||||
* New system adapter for NetBSD
|
||||
|
||||
libburn-1.3.4.tar.gz Thu Dec 12 2013
|
||||
===============================================================================
|
||||
* Bug fix: Drive error reports were ignored during blanking and formatting
|
||||
* Bug fix: Drive LG BH16NS40 stalls on inspection of unformatted DVD+RW
|
||||
* New API call burn_disc_pretend_full_uncond()
|
||||
|
||||
libburn-1.3.2.tar.gz Wed Aug 07 2013
|
||||
===============================================================================
|
||||
* Bug fix: cdrskin -msinfo on DVD and BD reported
|
||||
old session start = next writable address.
|
||||
Regression introduced by version 1.2.8 (rev 4956).
|
||||
* Bug fix: The signal handler aborted on SIGCONT, SIGTSTP, SIGTTIN, SIGTTOU
|
||||
* New API call burn_make_input_sheet_v07t()
|
||||
* API call burn_session_input_sheet_v07t(): read multiple blocks from same file
|
||||
* New API calls burn_drive_extract_audio(), burn_drive_extract_audio_track()
|
||||
* New cdrskin option textfile_to_v07t=
|
||||
* New cdrskin options cdtext_to_textfile= and cdtext_to_v07t=
|
||||
* New cdrskin options extract_audio_to= , extract_tracks= , extract_basename= ,
|
||||
--extract_dap
|
||||
* New cdrskin option --pacifier_with_newline
|
||||
* Improved granularity of SCSI log time measurement, now with timestamp
|
||||
* Optional "make doc" now demands doxygen 1.8.4
|
||||
|
||||
libburn-1.3.0.pl01.tar.gz Fri May 31 2013
|
||||
===============================================================================
|
||||
* Bug fix: cdrskin -msinfo on DVD and BD reported
|
||||
old session start = next writable address.
|
||||
Regression introduced by version 1.2.8.
|
||||
|
||||
libburn-1.3.0.tar.gz Fri May 17 2013
|
||||
===============================================================================
|
||||
* Bug fix: Full formatting of BD-RE used certification regardless of drive
|
||||
capabilities
|
||||
* Bug fix: DVD+R with damaged TOC were reported by -minfo with wrong end
|
||||
address
|
||||
|
||||
libburn-1.2.8.tar.gz Mon Mar 18 2013
|
||||
===============================================================================
|
||||
* Bug fix: All CD tracks were reported with the sizes of the tracks in the
|
||||
first session. Regression introduced with version 1.2.0 (rev 4552).
|
||||
* Bug fix: On some drives the request for minimum speed yielded maximum speed
|
||||
* New cdrskin option --list_speeds
|
||||
* -toc and -minfo now report about tracks in the incomplete session
|
||||
* New API call burn_disc_get_incomplete_sessions()
|
||||
* New burn_toc_entry component .track_status_bits
|
||||
|
||||
libburn-1.2.6.tar.gz Tue Jan 08 2013
|
||||
===============================================================================
|
||||
* Bug fix: Speed setting had no effect on BD media
|
||||
* New cdrskin option --no_load
|
||||
* New API call burn_read_audio()
|
||||
* New API call burn_list_sev_texts()
|
||||
|
||||
libburn-1.2.4.tar.gz Fri Jul 20 2012
|
||||
===============================================================================
|
||||
* Bug fix: CD SAO sessions with data tracks started by an audio pause
|
||||
* Bug fix: CD tracks were perceived 2 sectors too short.
|
||||
Nice with TAO, bad with SAO.
|
||||
* Bug fix: cdrskin SIGSEGV if track source was added when no drive was available
|
||||
* New API call burn_write_opts_set_obs_pad(), ./configure --enable-dvd-obs-pad
|
||||
* New cdrskin option --obs_pad
|
||||
|
||||
libburn-1.2.2.tar.gz Mon Apr 02 2012
|
||||
===============================================================================
|
||||
* Small internal refinements
|
||||
|
||||
libburn-1.2.0.tar.gz Sat Jan 28 2012
|
||||
===============================================================================
|
||||
* Bug fix: cdrskin produced a memory fault if interupted before writing began
|
||||
* Bug fix: Solaris adapter mishandled write commands which failed on first try
|
||||
* Bug fix: Interrupting libburn while drive tray is loading led to endless loop
|
||||
* Bug fix: Progress report with blanking and formatting could be bogus
|
||||
* New API calls burn_disc_get_leadin_text(), burn_write_opts_set_leadin_text()
|
||||
* New API calls for composing CD-TEXT, see doc/cdtext.txt
|
||||
* New API call burn_session_by_cue_file() for reading CDRWIN .cue files
|
||||
* New API call burn_track_set_isrc_string()
|
||||
* New API calls burn_track_set_index(), burn_track_clear_indice()
|
||||
* New API calls burn_session_set_start_tno(), burn_session_get_start_tno()
|
||||
* New API calls burn_track_set_pregap_size(), burn_track_set_postgap_size()
|
||||
* Implemented cdrskin option textfile=
|
||||
* Implemented cdrskin option combination -vv -toc for cdtext.dat production
|
||||
* Implemented cdrskin options mcn= and isrc=
|
||||
* Implemented cdrskin options -scms -copy -nocopy -preemp -nopreemp
|
||||
* Implemented cdrskin option index=
|
||||
* Partly implemented cdrskin options cuefile= and -text
|
||||
* New cdrskin option input_sheet_v07t= for CD-TEXT definition
|
||||
* New cdrskin options --cdtext_dummy and --cdtext_verbose
|
||||
* New cdrskin options --four_channel --two_channel
|
||||
* New cdrskin option cd_start_tno=
|
||||
* New cdrskin options sao_pregap=, sao_postgap=
|
||||
|
||||
libburn-1.1.8.tar.gz Mon Nov 21 2011
|
||||
===============================================================================
|
||||
* Bug fix: Misinterpreted mode page 2A if block descriptors are present
|
||||
* Enabled recognition of QEMU DVD-ROM 0.12
|
||||
* Avoiding to intermediately close and open drive device file
|
||||
* New API call burn_drive_re_assess()
|
||||
|
||||
libburn-1.1.6.tar.gz Tue Sep 27 2011
|
||||
===============================================================================
|
||||
* Bug fix: stdio sizes > 4 TB - 32 kB caused integer rollover
|
||||
* Worked around a collision with Linux udev which lets links vanish
|
||||
|
||||
libburn-1.1.4.tar.gz Sun Aug 07 2011
|
||||
===============================================================================
|
||||
* Bug fix: Some drives return -150 as NWA of blank CD, rather than 0.
|
||||
libburn forwarded this misleading information to the application.
|
||||
* Bug fix: Some drives returned wrong CD sizes after having burned DVD-R
|
||||
* Bug fix: Empty ROM drive was mistaken to hold an unsuitable disc
|
||||
* Bug fix: Avoiding to load speed descriptor list twice
|
||||
* New API call burn_lookup_device_link()
|
||||
* New API call burn_disc_get_phys_format_info()
|
||||
* New cdrskin option --device_links
|
||||
|
||||
Release 1.1.2 was skipped to get back in sync with libisoburn.
|
||||
|
||||
libburn-1.1.0.pl01.tar.gz Mon Jun 20 2011
|
||||
===============================================================================
|
||||
* Bug fix: libburn-1.1.0 compiled only on Linux, FreeBSD, and Solaris
|
||||
|
||||
libburn-1.1.0.tar.gz Sat Jun 18 2011
|
||||
===============================================================================
|
||||
* Bug fix: burn_disc_format() on DVD-RW issued wrong block size with type 00h
|
||||
* New API call burn_disc_next_track_is_damaged()
|
||||
* New API call burn_disc_close_damaged()
|
||||
* Dropped suffix .plXY from tarball name
|
||||
|
||||
Release 1.0.8 was skipped to get back in sync with libisofs and libisoburn.
|
||||
|
||||
libburn-1.0.6.pl00.tar.gz Sat Apr 9 2011
|
||||
===============================================================================
|
||||
* Burning DVD-R DAO with 2 kB size granularity rather than 32 kB
|
||||
* New API call burn_allow_drive_role_4()
|
||||
|
||||
libburn-1.0.4.pl00.tar.gz Thu Mar 3 2011
|
||||
===============================================================================
|
||||
* Bug fix: Read-only file descriptors were classified as write-only pseudo
|
||||
drives
|
||||
|
||||
libburn-1.0.2.pl00.tar.gz Wed Feb 23 2011
|
||||
===============================================================================
|
||||
* Removed compilation obstacles on Solaris 9.
|
||||
* Improved recognition of non-seekable stdio pseudo-drives.
|
||||
|
||||
libburn-1.0.0.pl00.tar.gz Sun Jan 16 2011
|
||||
===============================================================================
|
||||
* Allowed umask to create stdio-drive files with rw-permissions for all
|
||||
* cdrskin now refuses to burn if the foreseeable size exceeds media capacity
|
||||
|
||||
libburn-0.9.0.pl00.tar.gz Wed Dec 08 2010
|
||||
===============================================================================
|
||||
* Regression fix: SCSI reply data logging was disabled in release 0.8.6
|
||||
|
||||
libburn-0.8.8.pl00.tar.gz Wed Oct 20 2010
|
||||
===============================================================================
|
||||
* New API call burn_offst_source_new()
|
||||
* New API call burn_disc_get_bd_spare_info()
|
||||
|
||||
libburn-0.8.6.pl00.tar.gz Fri Sep 17 2010
|
||||
===============================================================================
|
||||
* Lifted test reservation on DVD-R DL media.
|
||||
* Hiding all non-API symbols from the linker by use of --version-script
|
||||
* Now with history of release notes in ./ChangeLog file.
|
||||
|
||||
libburn-0.8.4.pl00.tar.gz Wed Jun 30 2010
|
||||
===============================================================================
|
||||
* General POSIX system adapters ignore SIGWINCH and SIGURG if defined
|
||||
* Allowed 64 kB max output buffer size on all OSes
|
||||
|
||||
libburn-0.8.2.pl00.tar.gz Fri Jun 11 2010
|
||||
===============================================================================
|
||||
* New system adapter for Solaris uscsi (tested on snv134, kernel 5.11)
|
||||
* Bug fix: CD TOC was not read if the first track did not start at LBA 0
|
||||
* Bug fix: CD-ROM media got attributed random lead-in and lead-out adresses
|
||||
* Bug fix: SIGSEGV of experimental libcdio system adapter if drive list is
|
||||
empty
|
||||
|
||||
libburn-0.8.0.pl00.tar.gz Fri Apr 09 2010
|
||||
===============================================================================
|
||||
* libburn now works with ahci driver on FreeBSD 8-STABLE.
|
||||
|
||||
libburn-0.7.8.pl00.tar.gz Wed Mar 10 2010
|
||||
===============================================================================
|
||||
* Bug fix: On FreeBSD, piped input was falsely attributed a small fixed size.
|
||||
* Built-in abort handling is more suitable for FreeBSD now.
|
||||
cdrskin novelties:
|
||||
* Bug fix: Option fs=0 led to SIGSEGV. Regression introduced by version 0.7.4
|
||||
in december 2009.
|
||||
* Abort handling is more suitable for FreeBSD now.
|
||||
|
||||
libburn-0.7.6.pl00.tar.gz Sat Jan 23 2010
|
||||
===============================================================================
|
||||
* Bug fix: System adapter for generic X/Open was missing in libburn release
|
||||
tarball
|
||||
* Bug fix: with non-Linux adapters there were 0 readable bytes on block devices
|
||||
* Made FreeBSD system adapter safe from mutal burn spoiling and drive deadlock
|
||||
* Enabled FreeBSD system adapter for Debian kfreebsd
|
||||
* Experimental SCSI transport adapter via GNU libcdio 0.83git
|
||||
cdrskin novelties:
|
||||
* none
|
||||
|
||||
libburn-0.7.4.pl01.tar.gz Sat Dec 26 2009
|
||||
===============================================================================
|
||||
* Bug fix: Added missing system adapter for generic X/Open to libburn release
|
||||
tarball
|
||||
|
||||
Libburn 0.7.4.pl00 Mon Dec 07 2009
|
||||
===============================================================================
|
||||
* Bug fix: SIGSEGV from NULL pointer with media product id inquiry on LG
|
||||
GH22LS30
|
||||
* Bug fix: DVD DAO track size was rounded up much too generously
|
||||
* Workaround for Pioneer DVR-216D which got stuck on DVD-R burns.
|
||||
(already fixed in 0.7.2.pl01)
|
||||
* Workaround for Pioneer DVR-216D refusal to eject.
|
||||
(already fixed in 0.7.2.pl01)
|
||||
* Configure options --enable-dvd-obs-64k, --enable-track-src-odirect
|
||||
* New API calls burn_write_opts_set_dvd_obs(),
|
||||
burn_write_opts_set_stdio_fsync()
|
||||
* New API call burn_set_scsi_logging()
|
||||
* New API calls burn_fifo_get_statistics(), burn_fifo_next_interval(),
|
||||
burn_fifo_fill()
|
||||
* Re-implemented ECMA-130 P-parity, Q-parity and scrambling for BURN_WRITE_RAW
|
||||
cdrskin novelties:
|
||||
* cdrskin option -V for logging of SCSI commands
|
||||
* New cdrskin options dvd_obs= and stdio_fsync=
|
||||
* New compile_cdrskin.sh option -dvd_obs_64k
|
||||
|
||||
libburn-0.7.2.pl01.tar.gz Fri Nov 13 2009
|
||||
===============================================================================
|
||||
* Workaround for Pioneer DVR-216D which got stuck on DVD-R burns.
|
||||
* Workaround for Pioneer DVR-216D refusal to eject.
|
||||
|
||||
Libburn 0.7.2.pl00 Mon Oct 12 2009
|
||||
===============================================================================
|
||||
* Bug fix: CD TAO sessions with multiple tracks did not work in -dummy mode
|
||||
* New API calls burn_get_media_product_id() , burn_guess_manufacturer() ,
|
||||
burn_guess_cd_manufacturer()
|
||||
* New API call burn_disc_get_cd_info()
|
||||
* New API call burn_track_set_cdxa_conv()
|
||||
cdrskin novelties:
|
||||
* Better interpretation of options -mode2, -xa, -xa1, -xa2
|
||||
* New option --xa1-ignore
|
||||
* New -atip report lines "Product Id:" and "Producer:"
|
||||
|
||||
libburn-0.7.0.pl00.tar.gz Thu Aug 27 2009
|
||||
===============================================================================
|
||||
* New API calls burn_drive_get_all_profiles(), burn_obtain_profile_name() allow
|
||||
to inquire and process the list of supported media types. cdrskin lists all
|
||||
supported profiles with option -atip -v
|
||||
* New API call burn_drive_snooze() allows to calm down a drive when no i/o is
|
||||
expected for a while.
|
||||
* Bug fix: Some SCSI commands stalled on U3 memory sticks which appear as a hub
|
||||
with a memory stick and a CD-ROM drive containing a small CD. These commands
|
||||
make not much sense with a CD-ROM and are now avoided for this media
|
||||
situation.
|
||||
|
||||
libburn-0.6.8.pl00.tar.gz Tue Jul 14 2009
|
||||
===============================================================================
|
||||
* Bug fix: Old MMC-1 drives were rejected because of mode page 2Ah length.
|
||||
* cdrskin -scanbus now works with high SCSI bus numbers.
|
||||
|
||||
libburn-0.6.6.pl00.tar.gz Fri May 8 2009
|
||||
===============================================================================
|
||||
* Bug fix: Improper abort handling with broken pipe during outputto a stdio:
|
||||
pseudo-drive.
|
||||
* Bug fix: Device scan stalled on FreeBSD with non-burner USB device
|
||||
|
||||
libburn-0.6.4.pl00.tar.gz Fri Mar 13 2009
|
||||
===============================================================================
|
||||
* New operating system adapter "dummy" for stdio on general X/Open systems
|
||||
* New API function burn_drive_set_stream_recording() allows to write the
|
||||
crucial start blocks of a filesystem with slow BD-RE Defect Management and to
|
||||
write the bulk of data with full nominal speed.
|
||||
|
||||
libburn-0.6.2.pl00.tar.gz Fri Feb 20 2009
|
||||
===============================================================================
|
||||
* Improvements with build system for FreeBSD
|
||||
|
||||
libburn-0.6.0.pl01.tar.gz Wed Jan 07 2009
|
||||
===============================================================================
|
||||
* Bug fix: BD-R were not correctly finalized
|
||||
|
||||
libburn-0.6.0.pl00.tar.gz Sun Jan 04 2009
|
||||
===============================================================================
|
||||
* Formatting and writing of BD-R media
|
||||
* New API function burn_get_read_capacity()
|
||||
|
||||
libburn-0.5.8.pl00.tar.gz Mon Dec 08 2008
|
||||
===============================================================================
|
||||
* Bug fix: A session without leadout entry on CD caused a SIGSEGV by NULL
|
||||
* Improvements about BD-RE formatting
|
||||
|
||||
libburn-0.5.6.pl00.tar.gz Wed Nov 12 2008
|
||||
===============================================================================
|
||||
* Bug fix: libburn fifo thread was not aborted when burn run was aborted which
|
||||
could lead to use of freed memory.
|
||||
|
||||
libburn-0.5.4.pl00.tar.gz Mon Oct 6 2008
|
||||
===============================================================================
|
||||
* Bug fix: On Linux 2.4 /dev/sr0 was accepted as enumerable address but then
|
||||
failed to work.
|
||||
|
||||
libburn-0.5.2.pl00.tar.gz Wed Aug 20 2008
|
||||
===============================================================================
|
||||
* Larger set of possibly acceptable drive device file names
|
||||
|
||||
libburn-0.5.0.pl00.tar.gz Thu Jul 17 2008
|
||||
===============================================================================
|
||||
* Bug fix: cdrskin option drive_scsi_dev_family=scd lead to buffer overflow
|
||||
* Ability to use /dev/scd as fallback if /dev/sr does not exist
|
||||
* New API call burn_fifo_peek_data()
|
||||
|
||||
libburn-0.4.8.pl00.tar.gz Sat May 17 2008
|
||||
===============================================================================
|
||||
* Bug fix: Random access addressing for DVD-RAM and BD-RE did not work.
|
||||
* cdrskin: Affected were options write_start_address= and
|
||||
-- grow_overwriteable_iso on DVD-RAM or BD-RE.
|
||||
* xorriso: Affected were sessions on DVD-RAM or BD-RE after the first one.
|
||||
|
||||
libburn-0.4.6.pl00.tar.gz Sun May 11 2008
|
||||
===============================================================================
|
||||
* Support for BD-RE media is now official
|
||||
* New burn_write_opts_set_stream_recording() can speed up DVD-RAM and BD-RE
|
||||
* New cdrskin option --list_formats
|
||||
* New cdrskin blank types for expert formatting of DVD-RAM and BD-RE
|
||||
* New cdrskin blank type blank=as_needed for automatic handling of media
|
||||
|
||||
libburn-0.4.4.tar.gz Thu April 10 2008
|
||||
===============================================================================
|
||||
* Support for DVD+R/DL media is now official
|
||||
|
||||
libburn-0.4.2.tar.gz Sun Feb 3 2008
|
||||
===============================================================================
|
||||
* Long term commitment to ABI libburn.so.4.
|
||||
* ABI compatibility is guaranteed for any older feature set released since
|
||||
libburn-0.3.2 about one year ago.
|
||||
* libburn provides means for compile time and runtime checking of its version.
|
||||
* Compile time check in cdrskin for proper version of libburn include file.
|
||||
Required is at least 0.4.2.
|
||||
* Runtime check in cdrskin prevents dynamic linking with outdated version of
|
||||
libburn.so.4. Required is at least the version seen in the include file at
|
||||
compile time.
|
||||
|
||||
libburn-0.4.0.tar.gz Mon Oct 29 2007
|
||||
===============================================================================
|
||||
* New option direct_write_amount=
|
||||
* New option --grow_overwriteable_iso
|
||||
* New option --allow_emulated_drives dev=stdio:<path>
|
||||
* More cdrecord options supported: -format, -inq, -load, -lock, -immed, -waiti
|
||||
* New option fallback_program=
|
||||
* A lot of libburn API additions.
|
||||
|
||||
libburn-0.3.8.tar.gz Tue Jul 31 2007
|
||||
===============================================================================
|
||||
* Now able to cope with the peculiarities of Linux 2.4 USB
|
||||
* Refusal to perform -dummy runs on media which cannot simulate burning
|
||||
* New option modesty_on_drive= may help with hda -> hdb burns
|
||||
* New option minbuf= , cdrecord compatible frontend of modesty_on_drive=
|
||||
* New option --adjust_speed_to_drive
|
||||
* Precautions against using the burner drive as track source
|
||||
* Note: ABI has not been broken.
|
||||
|
||||
libburn-0.3.6.tar.gz Thu Apr 26 2007
|
||||
===============================================================================
|
||||
* On Linux kernel 2.6, /dev/sr* gets used rather than /dev/sg*.
|
||||
* DVD+R now get finalized (if not -multi is given)
|
||||
|
||||
libburn-0.3.4.tar.gz Mon Mar 12 2007
|
||||
===============================================================================
|
||||
* Multi-session recording on DVD+R, including -toc, -msinfo
|
||||
* Options --tell_media_space , assert_write_lba=
|
||||
* Bug fix of rare multi track fifo stall
|
||||
|
||||
libburn-0.3.2.tar.gz Feb 11 2007
|
||||
===============================================================================
|
||||
* Burnfree enabled by default
|
||||
* Multi-session recording on sequential DVD-R[W], including -toc, -msinfo
|
||||
* DVD-R[W] Disk-at-once recording
|
||||
|
||||
libburn-0.3.0.1.tar.gz Tue Jan 30 2007
|
||||
===============================================================================
|
||||
* Improved recognition of unsuitable media types
|
||||
* Replaced ban of chmod u+s by loud warning
|
||||
* detailed man page for cdrskin
|
||||
* Burning of DVD+RW and DVD-RAM media as single-track TAO-like initial session
|
||||
* Formatting and then burning to DVD-RW like to DVD+RW
|
||||
* New option -msifile=path from cdrkit/wodim
|
||||
* 0.3.0.1 release notes *
|
||||
* Bug fix enabling tracks >= 1.3 GB from disk file
|
||||
|
||||
libburn-0.2.6.3.tar.gz Fri Dec 29 2006
|
||||
===============================================================================
|
||||
* 0.2.6 release notes (Wed Nov 22 2006)
|
||||
* After a lot of time with dedication to this project, we proudly present you
|
||||
libburn 0.2.6. It is the first version of cdrskin and libburn after they have
|
||||
been split from genisofs and libisofs. Main new features are write mode TAO
|
||||
and support for multi session.
|
||||
* 0.2.6.1 release notes (Fri Nov 24 2006)
|
||||
* Point release to fix misleading version numbers in messages and documentation
|
||||
* 0.2.6.2 release notes (Sat Dec 16 2006)
|
||||
* cdrskin man page backported from development version 0.2.7.
|
||||
* 0.2.6.3 release notes (Fri Dec 29 2006)
|
||||
* Point release to fix build system problems people have experienced with the
|
||||
past release.
|
||||
|
||||
libburn-0.2.3.snapshot02.tar.gz Thu Nov 02 2006
|
||||
===============================================================================
|
||||
* Stabilized snapshot including release 0.2.4.pl01 of cdrskin
|
||||
* cdrskin 0.2.4 release notes
|
||||
* Compatibility with cdrecord has been improved in respect to drive addresses,
|
||||
audio extraction from .wav, -scanbus, -toc, drive buffer fill indicator.
|
||||
* Note: The previous snapshot01 with the same source base is handicapped by a
|
||||
broken ./configure setup. It works well on Intel compatible CPUs but is
|
||||
supposed to be unusable on big-endian architectures.
|
||||
|
||||
libburn-0.2.2.tar.gz Wed Sep 20 2006
|
||||
===============================================================================
|
||||
Initial release of libburnia's libburn combined with cdrskin.
|
|
@ -0,0 +1,234 @@
|
|||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
|
||||
2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is free documentation; the Free Software Foundation gives
|
||||
unlimited permission to copy, distribute and modify it.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell commands `./configure; make; make install' should
|
||||
configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
instructions specific to this package.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation.
|
||||
|
||||
5. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that the
|
||||
`configure' script does not know about. Run `./configure --help' for
|
||||
details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX'.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them.
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out automatically,
|
||||
but needs to determine by the type of machine the package will run on.
|
||||
Usually, assuming the package is built to be run on the _same_
|
||||
architectures, `configure' can figure that out, but if it prints a
|
||||
message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
OS KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share, you
|
||||
can create a site shell script called `config.site' that gives default
|
||||
values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf bug. Until the bug is fixed you can use this workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of the options to `configure', and exit.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
|
|
@ -0,0 +1,240 @@
|
|||
|
||||
# ts A90315 : LIBBURNIA_PKGCONFDIR is defined OS specific in acinclude.m4
|
||||
# was: pkgconfigdir=$(libdir)/pkgconfig
|
||||
pkgconfigdir=$(LIBBURNIA_PKGCONFDIR)
|
||||
|
||||
libincludedir=$(includedir)/libburn
|
||||
|
||||
lib_LTLIBRARIES = libburn/libburn.la
|
||||
ACLOCAL_AMFLAGS = -I ./
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
# Build libraries
|
||||
libburn_libburn_la_LDFLAGS = \
|
||||
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
||||
# This causes undesired .o names
|
||||
# configure.ac appends -D options to variable CFLAG
|
||||
### libburn_libburn_la_CFLAGS = $(LIBBURN_DVD_OBS_64K)
|
||||
libburn_libburn_la_LIBADD = $(LIBBURN_ARCH_LIBS) $(THREAD_LIBS)
|
||||
libburn_libburn_la_SOURCES = \
|
||||
libburn/async.c \
|
||||
libburn/async.h \
|
||||
libburn/back_hacks.h \
|
||||
libburn/cdtext.c \
|
||||
libburn/cleanup.c \
|
||||
libburn/cleanup.h \
|
||||
libburn/crc.c \
|
||||
libburn/crc.h \
|
||||
libburn/debug.c \
|
||||
libburn/debug.h \
|
||||
libburn/drive.c \
|
||||
libburn/drive.h \
|
||||
libburn/ecma130ab.c \
|
||||
libburn/ecma130ab.h \
|
||||
libburn/error.h \
|
||||
libburn/file.c \
|
||||
libburn/file.h \
|
||||
libburn/init.c \
|
||||
libburn/init.h \
|
||||
libburn/libburn.h \
|
||||
libburn/libdax_audioxtr.h \
|
||||
libburn/libdax_audioxtr.c \
|
||||
libburn/libdax_msgs.h \
|
||||
libburn/libdax_msgs.c \
|
||||
libburn/mmc.c \
|
||||
libburn/mmc.h \
|
||||
libburn/null.c \
|
||||
libburn/null.h \
|
||||
libburn/options.c \
|
||||
libburn/options.h \
|
||||
libburn/os.h \
|
||||
libburn/read.c \
|
||||
libburn/read.h \
|
||||
libburn/sbc.c \
|
||||
libburn/sbc.h \
|
||||
libburn/sector.c \
|
||||
libburn/sector.h \
|
||||
libburn/sg.c \
|
||||
libburn/sg.h \
|
||||
libburn/source.h \
|
||||
libburn/source.c \
|
||||
libburn/spc.c \
|
||||
libburn/spc.h \
|
||||
libburn/structure.c \
|
||||
libburn/structure.h \
|
||||
libburn/toc.c \
|
||||
libburn/toc.h \
|
||||
libburn/transport.h \
|
||||
libburn/util.c \
|
||||
libburn/util.h \
|
||||
libburn/write.c \
|
||||
libburn/write.h
|
||||
|
||||
## libburn/sg-@ARCH@.c \
|
||||
|
||||
libinclude_HEADERS = \
|
||||
libburn/libburn.h
|
||||
|
||||
install-exec-hook:
|
||||
$(LIBBURNIA_LDCONFIG_CMD) "$(DESTDIR)$(libdir)" || echo 'NOTE: Explicit dynamic library configuration failed. If needed, configure manually for:' "$(DESTDIR)$(libdir)"
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
## Build test applications
|
||||
noinst_PROGRAMS = \
|
||||
test/libburner \
|
||||
test/offst_source \
|
||||
test/telltoc \
|
||||
test/dewav \
|
||||
test/fake_au \
|
||||
test/poll \
|
||||
test/structest
|
||||
|
||||
bin_PROGRAMS = \
|
||||
cdrskin/cdrskin
|
||||
|
||||
LIBBURN_EXTRALIBS = $(LIBBURN_ARCH_LIBS) $(THREAD_LIBS)
|
||||
|
||||
test_libburner_CPPFLAGS = -Ilibburn
|
||||
test_libburner_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
test_libburner_SOURCES = test/libburner.c
|
||||
test_offst_source_CPPFLAGS = -Ilibburn
|
||||
test_offst_source_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
test_offst_source_SOURCES = test/offst_source.c
|
||||
test_telltoc_CPPFLAGS = -Ilibburn
|
||||
test_telltoc_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
test_telltoc_SOURCES = test/telltoc.c
|
||||
test_dewav_CPPFLAGS = -Ilibburn
|
||||
test_dewav_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
test_dewav_SOURCES = test/dewav.c
|
||||
test_fake_au_CPPFLAGS =
|
||||
test_fake_au_LDADD =
|
||||
test_fake_au_SOURCES = test/fake_au.c
|
||||
test_poll_CPPFLAGS = -Ilibburn
|
||||
test_poll_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
test_poll_SOURCES = test/poll.c
|
||||
test_structest_CPPFLAGS = -Ilibburn
|
||||
test_structest_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
test_structest_SOURCES = test/structest.c
|
||||
|
||||
## cdrskin construction site - ts A60816 - B40628
|
||||
cdrskin_cdrskin_CPPFLAGS = -Ilibburn
|
||||
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_3_9
|
||||
|
||||
# cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
# ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking
|
||||
cdrskin_cdrskin_LDADD = libburn/libburn.la $(LIBBURN_EXTRALIBS)
|
||||
|
||||
cdrskin_cdrskin_SOURCES = cdrskin/cdrskin.c cdrskin/cdrfifo.c cdrskin/cdrfifo.h cdrskin/cdrskin_timestamp.h
|
||||
##
|
||||
## Open questions: how to compute $timestamp and express -DX="$timestamp"
|
||||
##
|
||||
|
||||
# "make clean" shall remove a few stubborn .libs directories
|
||||
# which George Danchev reported Dec 03 2011.
|
||||
# Learned from: http://www.gnu.org/software/automake/manual/automake.html#Clean
|
||||
clean-local:
|
||||
-rm -rf cdrskin/.libs test/.libs
|
||||
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
## Build documentation (You need Doxygen for this to work)
|
||||
webhost = http://libburn-api.pykix.org
|
||||
webpath = /
|
||||
docdir = $(DESTDIR)$(prefix)/share/doc/$(PACKAGE)-$(VERSION)
|
||||
|
||||
doc: doc/html
|
||||
|
||||
doc/html: doc/doxygen.conf
|
||||
if [ -f ./doc/doc.lock ]; then \
|
||||
$(RM) -r doc/html; \
|
||||
doxygen doc/doxygen.conf; \
|
||||
fi
|
||||
|
||||
doc-upload: doc/html
|
||||
scp -r $</* $(webhost):$(webpath)
|
||||
|
||||
## ts B00729
|
||||
## Not by default any more.
|
||||
## It is unclear who is supposed to create file ./doc/doc.lock
|
||||
# all: doc
|
||||
|
||||
install-data-local:
|
||||
if [ -f ./doc/doc.lock ]; then \
|
||||
$(mkinstalldirs) $(docdir)/html; \
|
||||
$(INSTALL_DATA) doc/html/* $(docdir)/html; \
|
||||
fi
|
||||
|
||||
uninstall-local:
|
||||
rm -rf $(docdir)
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
# Indent source files
|
||||
indent_files = \
|
||||
$(libburn_libburn_la_SOURCES) \
|
||||
$(test_poll_SOURCES) \
|
||||
$(test_structest_SOURCES)
|
||||
|
||||
|
||||
indent: $(indent_files)
|
||||
indent -bad -bap -nbbb -nbbo -nbc -bli0 -br -bls \
|
||||
-cdw -ce -cli0 -ncs -nbfda -i8 -l79 -lc79 \
|
||||
-lp -saf -sai -nprs -npsl -saw -sob -ss -ut \
|
||||
-sbi0 -nsc -ts8 -npcs -ncdb -fca \
|
||||
$^
|
||||
|
||||
.PHONY: indent
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
# Extra things
|
||||
nodist_pkgconfig_DATA = \
|
||||
libburn-1.pc
|
||||
|
||||
# http://www.nada.kth.se/cgi-bin/info?(automake.info)Man%20pages
|
||||
man_MANS = cdrskin/cdrskin.1
|
||||
|
||||
EXTRA_DIST = \
|
||||
bootstrap \
|
||||
libburn-1.pc.in \
|
||||
version.h.in \
|
||||
doc/comments \
|
||||
doc/doxygen.conf.in \
|
||||
doc/cookbook.txt \
|
||||
doc/mediainfo.txt \
|
||||
doc/cdtext.txt \
|
||||
README \
|
||||
AUTHORS \
|
||||
CONTRIBUTORS \
|
||||
COPYRIGHT \
|
||||
cdrskin/README \
|
||||
cdrskin/cdrecord_spy.sh \
|
||||
cdrskin/compile_cdrskin.sh \
|
||||
cdrskin/convert_man_to_html.sh \
|
||||
cdrskin/changelog.txt \
|
||||
cdrskin/cdrskin_eng.html \
|
||||
cdrskin/wiki_plain.txt \
|
||||
cdrskin/cleanup.h \
|
||||
cdrskin/cleanup.c \
|
||||
libburn/libburn.ver \
|
||||
libburn/os-dummy.h \
|
||||
libburn/os-freebsd.h \
|
||||
libburn/os-linux.h \
|
||||
libburn/os-libcdio.h \
|
||||
libburn/os-solaris.h \
|
||||
libburn/os-netbsd.h \
|
||||
libburn/sg-dummy.c \
|
||||
libburn/sg-freebsd.c \
|
||||
libburn/sg-linux.c \
|
||||
libburn/sg-libcdio.c \
|
||||
libburn/sg-solaris.c \
|
||||
libburn/sg-netbsd.c \
|
||||
COPYING \
|
||||
NEWS \
|
||||
ChangeLog \
|
||||
INSTALL \
|
||||
$(man_MANS)
|
||||
|
|
@ -0,0 +1 @@
|
|||
nothing here now
|
|
@ -0,0 +1,785 @@
|
|||
------------------------------------------------------------------------------
|
||||
libburnia-project.org
|
||||
------------------------------------------------------------------------------
|
||||
This all is under GPL.
|
||||
(See GPL reference, our clarification and commitment at the end of this text)
|
||||
------------------------------------------------------------------------------
|
||||
libburnia-project.org
|
||||
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-2014 Mario Danic, Thomas Schmitt
|
||||
Still containing parts of Libburn. By Derek Foreman <derek@signalmarketing.com>
|
||||
and Ben Jansens <xor@orodu.net>
|
||||
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
|
||||
http://files.libburnia-project.org/releases/libburn-1.3.8.tar.gz
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Build and Installation
|
||||
|
||||
From tarball
|
||||
|
||||
Obtain libburn-1.3.8.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf libburn-1.3.8.tar.gz
|
||||
cd libburn-1.3.8
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
|
||||
To make libburn accessible for running resp. application development,
|
||||
and to install the cdrecord compatibility binary cdrskin, do
|
||||
(as Superuser):
|
||||
|
||||
make install
|
||||
|
||||
This procedure installs libburn.so.4 and cdrskin depending on it.
|
||||
For a standalone cdrskin binary, see cdrskin/README.
|
||||
|
||||
A behavioral conflict is known between any burn software and demons like hald
|
||||
which probe CD drives. This can spoil burn runs for CD-R or CD-RW.
|
||||
You may have to keep your hald away from the drive. See for example
|
||||
http://www.freebsd.org/gnome/docs/halfaq.html
|
||||
|
||||
|
||||
From SVN
|
||||
|
||||
Our build system is based on autotools. For preparing the build of a SVN
|
||||
snapshot you will need autotools of at least version 1.7.
|
||||
Do in a directory of your choice:
|
||||
|
||||
svn co http://svn.libburnia-project.org/libburn/trunk libburn-svn
|
||||
cd libburn-svn
|
||||
./bootstrap
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
make install
|
||||
|
||||
Warning: The trunk might contain experimental features which might not
|
||||
persist until next release.
|
||||
|
||||
|
||||
Special ./configure options
|
||||
|
||||
make install on GNU/Linux will try to run program ldconfig with the library
|
||||
installation directory as only argument. Failure to do so will not abort
|
||||
installation. One may disable ldconfig by ./configure option:
|
||||
--disable-ldconfig-at-install
|
||||
|
||||
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
|
||||
|
||||
But often libburn call burn_write_opts_set_dvd_obs(opts, 64*1024) will yield
|
||||
even better performance in such a situation. 64k can be made default at
|
||||
configure time by:
|
||||
--enable-dvd-obs-64k
|
||||
This may be combined with above --enable-track-src-odirect .
|
||||
|
||||
If it is desired that DVD DAO writing and stdio: writing get padded up to
|
||||
a full write chunk of 32k resp. 64k, then use ./configure option:
|
||||
--enable-dvd-obs-pad
|
||||
|
||||
Alternatively the transport of SCSI commands can be done via libcdio-0.83.
|
||||
You may install it and re-run libburn's ./configure with option
|
||||
--enable-libcdio
|
||||
|
||||
By use of a version script, the libburn.so library exposes no other function
|
||||
names but those of the API definition in libburn/libburn.h.
|
||||
If -Wl,--version-script=... makes problems with the local compiler, then
|
||||
disable this encapsulation feature by
|
||||
--disable-versioned-libs
|
||||
|
||||
Make sure to re-compile all source files after running ./configure
|
||||
make clean ; make
|
||||
make install
|
||||
|
||||
|
||||
Linux only:
|
||||
|
||||
libburn tries to avoid a collision with udev's drive examination by waiting
|
||||
0.1 seconds before opening the device file for a longer time, after udev
|
||||
might have been alarmed by drive scanning activities.
|
||||
The waiting time can be set at ./configure time with microsecond granularity.
|
||||
E.g. 2 seconds:
|
||||
CFLAGS="$CFLAGS -DLibburn_udev_wait_useC=2000000"
|
||||
./configure ...options...
|
||||
Waiting can be disabled by zero waiting time:
|
||||
CFLAGS="$CFLAGS -DLibburn_udev_wait_useC=0"
|
||||
Alternatively, libburn can try to be nice by opening the device file,
|
||||
closing it immediately, waiting, and only then opening it for real:
|
||||
CFLAGS="$CFLAGS -DLibburn_udev_extra_open_cyclE -DLibburn_udev_wait_useC=500000"
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
An important part of the project, libisofs, is hosted in a bzr repository at
|
||||
launchpad.net :
|
||||
bzr branch lp:libisofs
|
||||
|
||||
Another part the project, libisoburn, is hosted in the libburnia SVN, too:
|
||||
svn co http://svn.libburnia-project.org/libisoburn/trunk libisoburn
|
||||
|
||||
See README files there.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
Overview of libburnia-project.org
|
||||
|
||||
libburnia-project.org is an open-source software project for reading, mastering
|
||||
and writing optical discs.
|
||||
For now this means CD media, all DVD media, all BD media.
|
||||
|
||||
The project comprises of several more or less interdependent parts which
|
||||
together strive to be a usable foundation for application development.
|
||||
These are libraries, language bindings, and middleware binaries which emulate
|
||||
classical (and valuable) Linux tools.
|
||||
Currently it is supported on GNU/Linux with kernels >= 2.4,
|
||||
on FreeBSD with ATAPI/CAM enabled in the kernel (see man atapicam),
|
||||
on OpenSolaris (tested with kernel 5.11),
|
||||
on NetBSD (tested with 6.1.3).
|
||||
On other X/Open compliant systems there will only be pseudo drives, but no
|
||||
direct MMC operation on real CD/DVD/BD drives.
|
||||
|
||||
For full ports to other systems we would need : login on a development machine
|
||||
resp. a live OS on CD or DVD, advise from a system person about the equivalent
|
||||
of Linux sg or FreeBSD CAM, volunteers for testing of realistic use cases.
|
||||
|
||||
We have a well tested code base for burning data and audio CDs, DVDs and BDs.
|
||||
The burn API is quite comprehensively documented and can be used to build a
|
||||
presentable application.
|
||||
We have a functional application which emulates the core use cases of cdrecord
|
||||
in order to prove that usability, and in order to allow you to explore
|
||||
libburn's scope by help of existing cdrecord frontends.
|
||||
|
||||
ISO 9660 filesystems with Rock Ridge and Joliet extensions can be created
|
||||
and manipulated quite freely. This capability together with our burn capability
|
||||
makes possible a single binary application which covers all steps of image
|
||||
composition, updating and writing. Quite unique in the Linux world.
|
||||
|
||||
The project components (list subject to growth, hopefully):
|
||||
|
||||
- libburn is the library by which preformatted data get onto optical media.
|
||||
It uses either /dev/sgN (e.g. on kernel 2.4 with ide-scsi) or
|
||||
/dev/srM or /dev/hdX (e.g. on kernel 2.6).
|
||||
libburn is the foundation of our cdrecord emulation. Its code is
|
||||
independent of cdrecord. Its DVD capabilities are learned from
|
||||
studying the code of dvd+rw-tools and MMC-5 specs. No code but only
|
||||
the pure SCSI knowledge has been taken from dvd+rw-tools, though.
|
||||
|
||||
- libisofs is the library to pack up hard disk files and directories into a
|
||||
ISO 9660 disk image. This may then be brought to CD via libburn.
|
||||
An own ISO 9660 extension stores ACLs, xattr, and MD5 of file
|
||||
content.
|
||||
|
||||
- libisoburn is an add-on to libburn and libisofs which coordinates both and
|
||||
also allows to grow ISO-9660 filesystem images on multi-session
|
||||
media as well as on overwriteable media via the same API.
|
||||
All media peculiarities are handled automatically.
|
||||
It also contains the methods of command oriented application
|
||||
xorriso and offers them via a C language API.
|
||||
|
||||
- cdrskin is a limited cdrecord compatibility wrapper for libburn.
|
||||
cdrecord is a powerful GPL'ed burn program included in Joerg
|
||||
Schilling's cdrtools. cdrskin strives to be a second source for
|
||||
the services traditionally provided by cdrecord. Additionally it
|
||||
provides libburn's DVD capabilities, where only -sao is compatible
|
||||
with cdrecord.
|
||||
cdrskin does not contain any bytes copied from cdrecord's sources.
|
||||
Many bytes have been copied from the message output of cdrecord
|
||||
runs, though.
|
||||
See cdrskin/README for more.
|
||||
|
||||
- xorriso is an application of all three libraries which creates, loads,
|
||||
manipulates and writes ISO 9660 filesystem images with
|
||||
Rock Ridge extensions. Manipulation is not only adding or
|
||||
overwriting of files but also deleting, renaming, attribute
|
||||
changing, incremental backups, activating boot images, and
|
||||
extracting of files from ISO images to disk. There is also a
|
||||
sparse emulation of cdrecord and a more laborate one of mkisofs.
|
||||
All features of xorriso are also available via a C language API
|
||||
of libisoburn.
|
||||
A static compilation of xorriso and the libraries is dedicated
|
||||
to the GNU Operating System. See xorriso/README_gnu_xorriso .
|
||||
|
||||
- "test" is a collection of application gestures and examples given by the
|
||||
authors of the library features. The burn API example of libburn
|
||||
is named test/libburner.c . The API for media information inquiry is
|
||||
demonstrated in test/telltoc.c .
|
||||
Explore these examples if you look for inspiration.
|
||||
|
||||
We strive to be a responsive upstream.
|
||||
|
||||
Our libraries are committed to maintain older feature sets in newer versions.
|
||||
This applies to source code headers (API) as well as to linkable objects (ABI).
|
||||
The only exception from this rule is about non-release versions x.y.*[13579]
|
||||
which are allowed to introduce new features, change those new features in
|
||||
any way and even may revoke such new features before the next release of
|
||||
x.y.*[02468]. As soon as it is released, a feature is promised to persist.
|
||||
|
||||
SONAMES:
|
||||
libburn.so.4 (since 0.3.4, March 2007),
|
||||
libisofs.so.6 (since 0.6.2, February 2008),
|
||||
libisoburn.so.1 (since 0.1.0, February 2008).
|
||||
|
||||
Applications must use 64 bit off_t. E.g. by defining
|
||||
#define _LARGEFILE_SOURCE
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
or take special precautions to interface with the libraries by 64 bit integers
|
||||
where the .h files prescribe off_t. To reduce libburn's off_t size to 32 bit
|
||||
will keep it from processing tracks of more than 2 GB size.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Project history as far as known to me:
|
||||
|
||||
- Founded in 2002 as it seems. See mailing list archives
|
||||
http://lists.freedesktop.org/archives/libburn/
|
||||
The site of this founder team is reachable and offers download of a
|
||||
(somewhat outdated) tarball and from CVS :
|
||||
http://icculus.org/burn/
|
||||
Copyright holders and most probably founders:
|
||||
Derek Foreman and Ben Jansens.
|
||||
|
||||
- I came to using libburn in 2005. Founded the cdrskin project and submitted
|
||||
necessary patches which were accepted or implemented better. Except one
|
||||
remaining patch which prevented cdrskin from using vanilla libburn from CVS.
|
||||
The cdrskin project site is reachable and offers download of the heavily
|
||||
patched (elsewise outdated) tarball under the name cdrskin-0.1.2 :
|
||||
http://scdbackup.sourceforge.net/cdrskin_eng.html
|
||||
It has meanwhile moved to use vanilla libburn.pykix.org , though.
|
||||
Version 0.1.4 constitutes the first release of this kind.
|
||||
|
||||
- In July 2006 our team mate Mario Danic announced a revival of libburn
|
||||
which by about nearly everybody else was perceived as unfriendly fork.
|
||||
Derek Foreman four days later posted a message which expressed his
|
||||
discontent.
|
||||
The situation first caused me to publically regret it and then - after i
|
||||
got the opportunity to move in with cdrskin - gave me true reason to
|
||||
personally apologize to Derek Foreman, Ben Jansens and the contributors at
|
||||
icculus.org/burn. Posted to both projects:
|
||||
http://lists.freedesktop.org/archives/libburn/2006-August/000446.html
|
||||
http://mailman-mail1.webfaction.com/pipermail/libburn-hackers/2006-August/000024.html
|
||||
|
||||
- Mid August 2006 project cdrskin established a branch office in
|
||||
libburn.pykix.org so that all maintainers of our tools have one single place
|
||||
to get the current (at least slightely) usable coordinated versions of
|
||||
everything.
|
||||
Project cdrskin will live forth independendly for a while but it is committed
|
||||
to stay in sync with libburn.pykix.org (or some successor, if ever).
|
||||
cdrskin is also committed to support icculus.org/burn if the pending fork
|
||||
is made reality by content changes in that project. It will cease to maintain
|
||||
a patched version of icculus.org/burn though. Precondition for a new
|
||||
release of cdrskin on base of icculus.org/burn would be the pending
|
||||
"whitelist patch" therefore.
|
||||
I would rather prefer if both projects find consense and merge, or at least
|
||||
cooperate. I have not given up hope totally, yet.
|
||||
I, personally, will honor any approach.
|
||||
|
||||
- 2nd September 2006 the decision is made to strive for a consolidation of
|
||||
copyright and a commitment to GPL in a reasonable and open minded way.
|
||||
This is to avoid long term problems with code of unknown origin and
|
||||
with finding consense among the not so clearly defined group of copyright
|
||||
claimers and -holders.
|
||||
libisofs is already claimed sole copyright Mario Danic.
|
||||
cdrskin and libburner are already claimed sole copyright Thomas Schmitt.
|
||||
Rewrites of other components will follow and concluded by claiming full
|
||||
copyright within the group of libburn.pykix.org-copyright holders.
|
||||
|
||||
- 16th September 2006 feature freeze for release of libburn-0.2.2 .
|
||||
|
||||
- 20th September 2006 release of libburn-0.2.2 .
|
||||
|
||||
- 26th October 2006 feature freeze for cdrskin-0.2.4 based on libburn-0.2.3 .
|
||||
This version of cdrskin is much more cdrecord compatible in repect
|
||||
to drive addressing and audio features.
|
||||
|
||||
- 30th October 2006 release of cdrskin-0.2.4 .
|
||||
|
||||
- 13th November 2006 splitting releases of libburn+cdrskin from libisofs.
|
||||
|
||||
- 24th November 2006 release of libburn-0.2.6 and cdrskin-0.2.6 . cdrskin has
|
||||
become suitable for unaware frontends as long as they perform only the core
|
||||
of cdrecord use cases (including open-ended input streams, audio, and
|
||||
multi-session).
|
||||
|
||||
- 28th November 2006 the umbrella project which encloses both, libisofs and
|
||||
libburn, is now called libburnia. For the origin of this name, see
|
||||
http://en.wikipedia.org/wiki/Liburnians .
|
||||
|
||||
- 16th January 2007 release of libburn-0.3.0 and cdrskin-0.3.0 . Now the scope
|
||||
is widened to a first class of DVD media: overwriteable single layer types
|
||||
DVD-RAM, DVD+RW, DVD-RW. This is not a cdrecord emulation but rather inspired
|
||||
by dvd+rw-tools' "poor man" writing facility for this class of media.
|
||||
Taking a bow towards Andy Polyakov.
|
||||
|
||||
- 11th February 2007 version 0.3.2 covers sequential DVD-RW and DVD-R with
|
||||
multi-session and with DAO.
|
||||
|
||||
- 12th March 2007 version 0.3.4 supports DVD+R and thus covers all single layer
|
||||
DVD media. Code for double layer DVD+/-R is implemented but awaits a tester
|
||||
yet.
|
||||
|
||||
- 23th April 2007 version 0.3.6 follows the unanimous opinion of Linux kernel
|
||||
people that one should not use /dev/sg on kernel 2.6.
|
||||
|
||||
- 31st July 2007 version 0.3.8 marks the first anniversary of libburn revival.
|
||||
We look back on improved stability, a substantially extended list of media
|
||||
and write modes, and better protection against typical user mishaps.
|
||||
|
||||
- 24th October 2007 version 0.4.0 is the foundation of new library libisoburn
|
||||
and an upcomming integrated application for manipulating and writing
|
||||
ISO 9660 + Rock Ridge images. cdrskin-0.4.0 got capabilities like growisofs
|
||||
by these enhancements: growing of overwriteable media and disk files.
|
||||
Taking again a bow towards Andy Polyakov.
|
||||
|
||||
- 26th Januar 2008 version 0.4.2 rectifies the version numbering so that we
|
||||
reliably release libburn.so.4 as should have been done since libburn-0.3.2.
|
||||
cdrskin now is by default linked dynamically and does a runtime check
|
||||
to ensure not to be started with a libburn which is older than itself.
|
||||
|
||||
- 3rd Feb 2008 libisofs-0.2.x (.so.5) has been deprecated.
|
||||
|
||||
- 14th Feb 2008 libisofs-0.6.2 permanently replaces the old libisofs-0.2.x.
|
||||
It is the first release of new libisofs.so.6 which will guarantee future
|
||||
API/ABI compatibility for its whole feature set.
|
||||
|
||||
- 15th Feb 2008 libisoburn-0.1.0 (.so.1) coordinates libisofs and libburn for
|
||||
the purpose of ISO image reading and writing. It emulates multi-session on
|
||||
overwriteable media. Application xorriso makes use of all three libraries.
|
||||
|
||||
- 8th Apr 2008 libburn-0.4.4 has proven to be capable of burning to DVD+R/DL
|
||||
and read performance on disk file pseudo-drives has been improved.
|
||||
|
||||
- 27th Apr 2008 libisofs-0.6.4 can now read data file content from images
|
||||
and can map pieces of disk files onto image files. Image directory iteration
|
||||
has been enhanced. Input data streams and extended information have been
|
||||
exposed in the API to allow future development.
|
||||
|
||||
- 29th Apr 2008 libisoburn-0.1.4 was made more efficient with reading of
|
||||
image tree nodes. It now depends on libisofs-0.6.4 and libburn-0.4.4.
|
||||
xorriso makes use of new libisofs features by performing incremental
|
||||
updates of directory trees and by cutting oversized data files into
|
||||
pieces. A primitive single session emulation of cdrecord and mkisofs is
|
||||
provided.
|
||||
|
||||
- 10th May 2008 libburn-0.4.6 supports formatting and writing of BD-RE,
|
||||
full nominal speed for DVD-RAM and BD-RE. cdrskin has a unified blank
|
||||
type with automatic media state recognition.
|
||||
|
||||
- 17th May 2008 an old bug with DVD-RAM and now with BD-RE is fixed by
|
||||
libburn-0.4.8 to allow libisoburn emulation of multisession on those media.
|
||||
|
||||
- 19th May 2008 libisoburn-0.1.6 brings better table-of-content emulation
|
||||
on overwriteble media and disk files.
|
||||
|
||||
- 1st Jun 2008 libisofs-0.6.6 fixes some problems around device files.
|
||||
|
||||
- 3rd Jun 2008 libisoburn-0.1.8 fixes a bug with overwriteable media.
|
||||
|
||||
- 23rd Jun 2008 libisoburn-0.2.0 introduces extraction of files from
|
||||
ISO images.
|
||||
|
||||
- 16th Jul 2008 libburn-0.5.0 handles systems with no /dev/sr* but only
|
||||
/dev/scd*.
|
||||
|
||||
- 19th Jul 2008 libisoburn/xorriso-0.2.2 can do multi-session in mkisofs
|
||||
and cdrecord style. xorriso now can serve underneath growisofs.
|
||||
|
||||
- 20th Aug 2008 libburn-0.5.2 revokes the necessity that a drive must be
|
||||
enumerable in order to be adressable. Enumeration is enhanced by examining
|
||||
/proc/sys/dev/cdrom/info.
|
||||
|
||||
- 24th Aug 2008 libisoburn/xorriso-0.2.4 introduces a media readability check
|
||||
with data retrieval option.
|
||||
|
||||
- 18th Sep 2008 libisofs-0.6.8 supports ISO 9660 Level 3 which allows very
|
||||
large data files in the image.
|
||||
|
||||
- 20th Sep 2008 libisoburn/xorriso-0.2.6 takes into respect the new Level 3
|
||||
capabilities of libisofs.
|
||||
|
||||
- 6th Oct 2008 libburn-0.5.4 adjusts the changes of 0.5.2 to the needs of
|
||||
Linux kernel 2.4 and introduces human readable SCSI error messages.
|
||||
|
||||
- 6th Oct 2008 libisofs-0.6.10 fixes two bugs which prevented adding and
|
||||
manipulation of ISOLINUX boot images.
|
||||
|
||||
- 15th Oct 2008 libisoburn/xorriso-0.2.8 can activate and maintain an
|
||||
ISOLINUX boot image by an EL Torito boot record.
|
||||
|
||||
- 12th Nov 2008 libburn-0.5.6 fixes usage of freed memory by the fifo thread
|
||||
of an aborted burn run.
|
||||
|
||||
- 26th Nov 2008 libisofs-0.6.12 can produce a ISOLINUX isohybrid MBR on the fly
|
||||
and allows to produce ISO images which resemble old mkisofs images.
|
||||
|
||||
- 2nd Dec 2008 libisoburn-0.3.0. xorriso now is ready for exotic character
|
||||
sets, for legacy FreeBSD systems which expect an outdated Rock Ridge
|
||||
signature, and for producing ISO images with MBR which boot from hard disk
|
||||
or USB stick. Three minor bugs were fixed.
|
||||
|
||||
- 7th Dec 2008 libburn-0.5.8 prevents a SIGSEGV with wierd CD table-of-content
|
||||
and improves BD-RE formatting.
|
||||
|
||||
- 9th Dec 2008 Our project received a donation from Thomas Weber.
|
||||
|
||||
- 2nd Jan 2009 libburn-0.6.0 allows to format BD-R and to write to either
|
||||
formatted or unformatted BD-R.
|
||||
|
||||
- 6th Jan 2009 libisoburn-0.3.2. xorriso can produce and execute commands for
|
||||
mounting older sessions from all kinds of media. Pseudo-drives outside the
|
||||
/dev/ tree can be addressed without prefix "stdio:".
|
||||
|
||||
- 20th Feb 2009 libburn-0.6.2 source release now compiles out of the box
|
||||
on FreeBSD.
|
||||
|
||||
- 28 Feb 2009 libisofs-0.6.14 can record ACLs and Extended Attributes xattr
|
||||
in its ISO images.
|
||||
|
||||
- 01 Mar 2009 libisoburn-0.3.4. xorriso makes use of the ACL and xattr
|
||||
capabilities provided by libisofs for xorriso backup features.
|
||||
|
||||
- 11 Mar 2009 libisofs-0.6.16 of libisofs fixes two bugs which on Solaris
|
||||
prevented to navigate the ISO images by ".." and to recognize the Rock Ridge
|
||||
extensions of ISO images. The ban to build libisofs on operating systems
|
||||
other than Linux and FreeBSD has been lifted.
|
||||
|
||||
- 13 Mar 2009 libburn-0.6.4 got a dummy adapter for SCSI/MMC command transport.
|
||||
It will show no drives and thus libburn will only be able to perform
|
||||
operations on "stdio:" pseudo drives. Nevertheless this allowed to lift the
|
||||
ban to build libburn on operating systems other than Linux and FreeBSD.
|
||||
|
||||
- 16 Mar 2009 libisoburn-0.3.6: xorriso uses RRIP version 1.10 as default
|
||||
in order to be mountable where mkisofs images are mountable.
|
||||
|
||||
- 17 Apr 2009 libisofs-0.6.18 introduces content filtering of data files.
|
||||
Built-in filters allow compression to formats gzip and zisofs. External
|
||||
filter processes allow arbitrary data conversions like encryption.
|
||||
|
||||
- 19 Apr 2009 libisoburn-0.3.8 makes use of the new libisofs capability to
|
||||
perform content filtering of data files.
|
||||
|
||||
- 08 May 2009 libburn-0.6.6 fixes a bug with aborting on broken output pipe
|
||||
and a bug with device scan on FreeBSD.
|
||||
|
||||
- 31 May 2009 libisofs-0.6.20 can record hard link relations in ISO images
|
||||
and offers support with restoring them to disk. Current Linux kernels will
|
||||
mount images with such hard links but will attribute a unique inode number
|
||||
to each file.
|
||||
|
||||
- 28 Jun 2009 libisoburn-0.4.0: xorriso can record and restore hard link
|
||||
relations of files. Performance of data reading has been improved. Option
|
||||
-find now supports logical operators with its tests.
|
||||
|
||||
- 14 Jul 2009 libburn-0.6.8 fixes bugs and shortcommings with old MMC-1 drives
|
||||
and with large SCSI bus numbers as handed out by Linux for USB drives.
|
||||
|
||||
- 20 Jul 2009 libisoburn-0.4.0.pl01 fixes a regression in xorriso which caused
|
||||
data loss in older sessions if xorriso was used underneath growisofs.
|
||||
Affected are releases since libisoburn-0.3.2 in january 2009.
|
||||
|
||||
- 25 Aug 2009 libisofs-0.6.22 can record MD5 checksums for the whole session
|
||||
and for each single data file. Checksum tags allow to verify superblock and
|
||||
directory tree before importing them.
|
||||
|
||||
- 27 Aug 2009 libburn-0.7.0 allows to calm down a drive and to inquire its
|
||||
supported profiles. It works around some pitfalls with U3 enhanced memory
|
||||
sticks which emulate a CD-ROM.
|
||||
|
||||
- 27 Aug 2009 libisoburn-0.4.0.pl00 can record MD5 checksums by which one may
|
||||
verify the session or single data files in the image. When comparing image
|
||||
files with files in the local filesystem, the MD5 sums avoid the need for
|
||||
reading file content from the image.
|
||||
|
||||
- 22 Sep 2009 libisoburn-0.4.0.pl01 fixes a bug in xorriso option -cut_out.
|
||||
|
||||
- 08 Oct 2009 libisofs-0.6.24 fixes a bug which could cause the loss of blanks
|
||||
in file names when a new session got added to an ISO image. With names
|
||||
shorter than 251 characters this happened only to trailing blanks.
|
||||
|
||||
- 08 Oct 2009 libisoburn-0.4.0.pl02 fixes bugs with xorriso option -for_backup,
|
||||
with xorrisofs -help, and with xorrecord -help.
|
||||
|
||||
- 12 Oct 2009 libburn-0.7.2 fixes a bug with CD TAO multi-track dummy sessions.
|
||||
It can retrieve media product info and can process track input which was
|
||||
prepared for CD-ROM XA Mode 2 Form 1. cdrskin now performs option -minfo.
|
||||
|
||||
- 28 Oct 2009 libisoburn-0.4.4 fixes a bug with cdrecord emulation and
|
||||
introduces new information options about media type and ISO image id strings.
|
||||
On Linux it helps with mounting two sessions of the same media
|
||||
simultaneously.
|
||||
|
||||
- 12 Nov 2009 libburn-0.7.2.pl01 works around problems with Pioneer DVR-216D.
|
||||
DVD-R runs made the drive stuck. Ejecting the tray did not work properly.
|
||||
|
||||
- 06 Dec 2009 libburn-0.7.4 works around problems with newer DVD burners,
|
||||
provides throughput enhancements with hampered busses on Linux, and new
|
||||
API calls to log SCSI commands and to control the libburn fifo.
|
||||
|
||||
- 09 Dec 2009 libisoburn-0.4.6 allows performance tuning of output to DVD
|
||||
drives or disk files.
|
||||
|
||||
- 26 Dec 2009 libburn-0.7.4.pl01 fixes the release tarball which was lacking
|
||||
the files of the generic system adapter for X/Open.
|
||||
|
||||
- 29 Dec 2009 Our project received a donation for purchasing a fine small
|
||||
computer which shall serve as OS farm for development and support.
|
||||
|
||||
- 20 Jan 2010 Version 0.6.26 of libisofs fixes minor bugs and shall enhance
|
||||
portability.
|
||||
|
||||
- 22 Jan 2010 libburn-0.7.6 has an improved system adapter for FreeBSD,
|
||||
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.
|
||||
|
||||
- 03 May 2010 Version 0.6.32 of libisofs is able to create ISO images with
|
||||
multiple boot images. All boot catalog parameters described in El-Torito
|
||||
specs can be set and inquired. This allows to use GRUB boot images for EFI.
|
||||
|
||||
- 04 May 2010 Release 0.5.6.pl00 of libisoburn makes use of the new libisofs
|
||||
capabilities about boot images.
|
||||
|
||||
- 11 Jun 2010 libburn-0.8.2 now works on Solaris.
|
||||
|
||||
- 14 Jun 2010 By release 0.5.8.pl00 of libisoburn, xorriso becomes a public C
|
||||
language API of libisoburn. The emulations of mkisofs and cdrecord have
|
||||
been enhanced.
|
||||
|
||||
- Tue Jun 29 2010 Version 0.6.34 of libisofs provides new features about
|
||||
hiding file names from directory trees.
|
||||
|
||||
- Wed Jun 30 2010 libburn-0.8.4 removes some restrictions on operating
|
||||
systems other than Linux and FreeBSD.
|
||||
|
||||
- Fri Jul 02 2010 Release 0.6.0.pl00 of libisoburn adds more options to the
|
||||
mkisofs emulation of xorriso. It also fixes minor bugs and shortcommings.
|
||||
|
||||
- Wed Sep 15 2010 Version 0.6.36 of libisofs can produce ISO images which
|
||||
bear a partiton 1 with non-zero start address. They can be mounted from
|
||||
USB stick via the main device file (e.g. /dev/sdb) as well as via the
|
||||
partition device file (e.g. /dev/sdb1).
|
||||
|
||||
- Fri Sep 17 2010 libburn-0.8.6 lifts the test reservation on DVD-R DL media.
|
||||
|
||||
- Sat Sep 18 2010 Release 0.6.2.pl00 of libisoburn introduces a partition
|
||||
with non-zero offset for ISO 9660 images on USB sticks, improves mkisofs
|
||||
emulation, and fixes a regression which existed since version 0.4.2.
|
||||
|
||||
- Wed Oct 20 2010 libburn-0.8.8 can report the used amount of BD spare blocks.
|
||||
|
||||
- Sat Oct 23 2010 Version 0.6.38 of libisofs can use libjte to produce jigdo
|
||||
files along with the ISO image. Further filesystem images may be appended
|
||||
as MBR partitions 1 to 4. The capability was added to produce boot blocks
|
||||
for computers with MIPS CPU.
|
||||
|
||||
- Tue Oct 26 2010 Release 0.6.4.pl00 of libisoburn and xorriso makes use of
|
||||
the new libisofs capabilities.
|
||||
|
||||
- Wed Dec 08 2010 libburn-0.9.0 fixes a regression with SCSI command logging.
|
||||
|
||||
- Fri Dec 10 2010 Version 0.6.40 of libisofs makes the prediction of the
|
||||
emerging image size less expensive and is able to make images bootable
|
||||
for SUN SPARC systems.
|
||||
|
||||
- Sun Dec 12 2010 Release 0.6.6.pl00 of libisoburn and xorriso can read ISO
|
||||
images which were copied to a different start address than they were prepared
|
||||
for.
|
||||
|
||||
- Mon Jan 17 2011 we go for release 1.0.0. This does not indicate a
|
||||
technological overhaul but shall emphasize the maturity of the software.
|
||||
libisofs-1.0.0 fixes a bug about the length of ECMA-119 directory names and
|
||||
is ready to allow untranslated ECMA-119 names (violating the specs).
|
||||
libburn-1.0.0.pl00 allows umask to create stdio-drive files with
|
||||
rw-permissions for all. cdrskin now refuses to burn if the foreseeable size
|
||||
exceeds media capacity
|
||||
libisoburn-1.0.0.pl00 allows to create an ISO 9660:1999 directory tree,
|
||||
improved the emulation fidelity of command -as mkisofs, lowered the default
|
||||
abort threshold for xorriso batch mode, and increased that threshold for
|
||||
xorriso dialog mode.
|
||||
|
||||
- Wed Feb 23 2011 release 1.0.2:
|
||||
libisofs fixes several bugs and introduces the capability to copy files
|
||||
inside the ISO filesystem.
|
||||
libburn removed a compilation obstacle on Solaris 9 and improved recognition
|
||||
of stdio pseudo-drives.
|
||||
libisoburn and xorriso fix bugs and make use of the new libisofs capability.
|
||||
xorriso improves its mkisofs emulation.
|
||||
|
||||
- Thu Mar 10 2011 release 1.0.4:
|
||||
Several bugs were fixed in the libraries and in the mkisofs emulation of
|
||||
xorriso. This emulation xorrisofs has now an own man page and info document.
|
||||
|
||||
- Sat Apr 09 2011 release 1.0.6:
|
||||
libburn refined its representation of emulated drives. The size alignment
|
||||
of DVD DAO is now 2 kB rather than 32 kB. libisofs produces Joliet names of
|
||||
up to 103 characters. xorriso fixes two bugs and makes use of the library
|
||||
improvements.
|
||||
|
||||
- Thu Apr 14 2011 release libisoburn-1.0.8:
|
||||
A bug in the mkisofs emulation of xorriso could cause options to be ignored.
|
||||
The problem was freshly introduced with libisoburn-1.0.6.
|
||||
|
||||
- Fri May 13 2011 release libisofs-1.0.8:
|
||||
Fixes a few rarely occurring bugs that have been found during the last month.
|
||||
|
||||
- Sat Jun 18 2011 release 1.1.0:
|
||||
The consumption of stack memory was reduced. Statical program analysis found
|
||||
some rarely occuring memory leaks. Several small bugs were fixed.
|
||||
The suffix .plXY was dropped from tarball names of libburn and libisoburn.
|
||||
|
||||
- Mon Jun 20 2011 patch release libburn-1.1.0.pl01:
|
||||
libburn-1.1.0 compiled only on Linux, FreeBSD, and Solaris, but not on
|
||||
other X/Open compliant systems.
|
||||
|
||||
- Fri Jul 08 2011 release libisofs-1.1.2 and libisoburn-1.1.2:
|
||||
A severe regression was fixed in libisoburn and xorriso, which was introduced
|
||||
with version 1.0.6. It caused ISO 9660 images to be unreadable if they were
|
||||
written to a write-only random-access file. E.g. by: xorrisofs ... >image.iso
|
||||
|
||||
- Mon Aug 08 2011 release 1.1.4:
|
||||
Several bugs were fixed in libburn. The most severe of them prevented xorriso
|
||||
on some drives from burning mountable ISO 9660 images to CD media.
|
||||
New means to list drives by their udev symbolic links help to deal with
|
||||
the non-persistent drive addresses on modern GNU/Linux.
|
||||
|
||||
- Tue Sep 27 2011 release 1.1.6:
|
||||
libisoburn now comes with a test suite. See releng/README. Bugs were fixed
|
||||
in several rarely used features. Processing of ACL and extattr was enabled
|
||||
on FreeBSD. Workarounds try to cope with vanishing udev links on GNU/Linux.
|
||||
|
||||
- Mon Nov 21 2011 release libburn-1.1.8 and libisoburn-1.1.8:
|
||||
libburn avoids to close and open drive device files while operating on them.
|
||||
xorriso emulation mode xorrecord now has an own manual. libburn and xorriso
|
||||
were prepared to operate on qemu virtio-blk-pci devices.
|
||||
|
||||
- Sat Jan 28 2012 release 1.2.0:
|
||||
libburn has learned to read and write CD-TEXT with CD SAO audio sessions.
|
||||
It can now read CDRWIN .cue files which define pure audio or pure data
|
||||
sessions. libisofs and libisoburn improved timestamp handling. Several
|
||||
minor bugs were fixed.
|
||||
|
||||
- Mon Apr 02 2012 release 1.2.2:
|
||||
The handling of intentional deviations from ECMA-119 specifications has
|
||||
been improved in libisofs. libisoburn and xorriso now make use of these
|
||||
improvements. Some rarely occuring bugs have been fixed.
|
||||
|
||||
- Fri Jul 20 2012 release 1.2.4:
|
||||
libburn and libisofs got some rarely occuring bugs fixed. libisofs learned
|
||||
to produce HFS+ metadata and Apple Partition Map. The capabilities of
|
||||
isohybrid options --efi and --mac have been implemented (GPT and APM).
|
||||
|
||||
- Tue Jan 08 2013 release 1.2.6:
|
||||
Small improvements were made in libburn. Minor bugs were fixed in the
|
||||
libraries. xorriso improved its capabilities to serve the needs of frontend
|
||||
programs. A proof of concept for a GUI frontend has been implemented:
|
||||
xorriso-tcltk
|
||||
|
||||
- Mon Mar 18 2013 release 1.2.8:
|
||||
Some rarely occuring bugs were fixed in libisofs and libburn. libburn's
|
||||
handling of incomplete sessions has been improved. xorriso's mkisofs
|
||||
emulation learned to set El Torito section id strings.
|
||||
|
||||
- Fri May 17 2013 release 1.3.0:
|
||||
Several bugs were fixed in the libraries and in xorriso. The recently
|
||||
introduced new boot preparation capabilities have been tested. New
|
||||
boot preparation options for GRUB2 were added.
|
||||
|
||||
- Fri May 31 2013 patch release libburn-1.3.0.pl01:
|
||||
cdrskin -msinfo on DVD and BD reported as old session start the same
|
||||
number as the next writable address.
|
||||
Regression introduced by version 1.2.8.
|
||||
|
||||
- Fri Aug 07 2013 release 1.3.2:
|
||||
cdrskin has aquired the capability to copy audio tracks to .wav files.
|
||||
It can extract CD-TEXT in a form that is readable for humans and for
|
||||
cdrskin itself. Several small bugs were fixed in xorriso. Its capabilities
|
||||
to serve frontend programs in dialog mode have been improved.
|
||||
|
||||
- Thu Dec 12 2013 release 1.3.4:
|
||||
A long standing hidden bug was fixed, which affected inspection of
|
||||
unformatted DVD+RW.
|
||||
xorriso now by default puts EL Torito boot images to low block addresses.
|
||||
It can report and set read speeds. Several rarely occuring bugs were fixed.
|
||||
|
||||
- Tue Mar 04 2014 release 1.3.6
|
||||
libburn learned to operate optical drives and media on NetBSD. libisofs got
|
||||
a bug fix about HFS+ and enhancements about character set conversion.
|
||||
Minor bugs were fixed in libisoburn. xorriso can now find files with names
|
||||
which cannot be represented unchanged in ECMA-119, Joliet, or HFS+.
|
||||
|
||||
- Sat Jun 28 2014 release 1.3.8
|
||||
libburn got several bugs fixed. libisofs offers new API calls for inspection
|
||||
of boot sectors in ISO 9660 filesystems. xorriso improved its support for
|
||||
NetBSD, offers new features with command -find, and a command to extract
|
||||
ISO 9660 file content onto standard output or into filter processes.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 or later
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Clarification in my name and in the name of Mario Danic, upcoming copyright
|
||||
holders on toplevel of libburnia. To be fully in effect after the remaining
|
||||
other copyrighted code has been replaced by ours and by copyright-free
|
||||
contributions of our friends:
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
We, the copyright holders, agree on the interpretation that dynamical linking
|
||||
of our libraries constitutes "use of" and not "derivation from" our work in
|
||||
the sense of GPL, provided those libraries are compiled from our unaltered
|
||||
code or from altered code published under GPL.
|
||||
|
||||
So we will not raise legal protest if you link our libraries dynamically with
|
||||
applications which are not under GPL, or if you distribute our libraries
|
||||
and application tools in binary form, as long as you fulfill the usual
|
||||
condition of GPL to offer a copy of their source code -altered or unaltered-
|
||||
under GPL.
|
||||
|
||||
We ask you politely to use our work in open source spirit
|
||||
and with the due reference to the entire open source community.
|
||||
|
||||
If there should really arise the case where above clarification
|
||||
does not suffice to fulfill a clear and neat request in open source
|
||||
spirit that would otherwise be declined for mere formal reasons,
|
||||
only in that case we will duely consider to issue a special license
|
||||
covering only that special case.
|
||||
It is the open source idea of responsible freedom which will be
|
||||
decisive and you will have to prove that you exhausted all own
|
||||
means to qualify for GPL.
|
||||
|
||||
For now we are firmly committed to maintain one single license: GPL.
|
||||
|
||||
signed: Mario Danic, Thomas Schmitt
|
||||
Agreement joined later by: Vreixo Formoso
|
||||
|
|
@ -0,0 +1,115 @@
|
|||
AC_DEFUN([LIBBURNIA_SET_FLAGS],
|
||||
[
|
||||
case $target_os in
|
||||
freebsd* | netbsd*)
|
||||
LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
||||
CPPFLAGS="$CPPFLAGS -I/usr/local/include"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
|
||||
AC_DEFUN([TARGET_SHIZZLE],
|
||||
[
|
||||
ARCH=""
|
||||
LIBBURNIA_PKGCONFDIR="$libdir"/pkgconfig
|
||||
|
||||
AC_MSG_CHECKING([target operating system])
|
||||
|
||||
LIBBURNIA_LDCONFIG_CMD="echo 'No ldconfig run performed. If needed, configure manually for:'"
|
||||
|
||||
case $target_os in
|
||||
linux*)
|
||||
ARCH=linux
|
||||
LIBBURN_ARCH_LIBS=
|
||||
LIBBURNIA_LDCONFIG_CMD=ldconfig
|
||||
;;
|
||||
freebsd*)
|
||||
ARCH=freebsd
|
||||
LIBBURN_ARCH_LIBS=-lcam
|
||||
LIBBURNIA_PKGCONFDIR=$(echo "$libdir" | sed 's/\/lib$/\/libdata/')/pkgconfig
|
||||
;;
|
||||
kfreebsd*-gnu)
|
||||
ARCH=freebsd
|
||||
LIBBURN_ARCH_LIBS=-lcam
|
||||
;;
|
||||
*-solaris*)
|
||||
ARCH=solaris
|
||||
LIBBURN_ARCH_LIBS=-lvolmgt
|
||||
;;
|
||||
*)
|
||||
ARCH=
|
||||
LIBBURN_ARCH_LIBS=
|
||||
# AC_ERROR([You are attempting to compile for an unsupported platform])
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_MSG_RESULT([$ARCH])
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURN_ASSERT_VERS_LIBS is by Thomas Schmitt, libburnia project
|
||||
dnl It tests whether -Wl,--version-script=... works with the compiler
|
||||
AC_DEFUN([LIBBURN_ASSERT_VERS_LIBS],
|
||||
[
|
||||
libburnia_save_LDFLAGS="$LDFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,--version-script=libburn/libburn.ver"
|
||||
AC_TRY_LINK([#include <stdio.h>], [printf("Hello\n");],
|
||||
[vers_libs_test="yes"], [vers_libs_test="no"])
|
||||
if test x$vers_libs_test = xno
|
||||
then
|
||||
LDFLAGS="$libburnia_save_LDFLAGS"
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_SET_PKGCONFIG determines the install directory for the *.pc file.
|
||||
dnl Important: Must be performed _after_ TARGET_SHIZZLE
|
||||
dnl
|
||||
AC_DEFUN([LIBBURNIA_SET_PKGCONFIG],
|
||||
[
|
||||
### for testing --enable-libdir-pkgconfig on Linux
|
||||
### LIBBURNIA_PKGCONFDIR="$libdir"data/pkgconfig
|
||||
|
||||
if test "x$LIBBURNIA_PKGCONFDIR" = "x$libdir"/pkgconfig
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
AC_ARG_ENABLE(libdir-pkgconfig,
|
||||
[ --enable-libdir-pkgconfig Install to $libdir/pkgconfig on any OS, default=no],
|
||||
, enable_libdir_pkgconfig="no")
|
||||
AC_MSG_CHECKING([for --enable-libdir-pkgconfig])
|
||||
if test "x$enable_libdir_pkgconfig" = xyes
|
||||
then
|
||||
LIBBURNIA_PKGCONFDIR="$libdir"/pkgconfig
|
||||
fi
|
||||
AC_MSG_RESULT([$enable_libdir_pkgconfig])
|
||||
fi
|
||||
|
||||
libburnia_pkgconfig_override="no"
|
||||
AC_ARG_ENABLE(pkgconfig-path,
|
||||
[ --enable-pkgconfig-path=DIR Absolute path of directory for libisofs-*.pc],
|
||||
libburnia_pkgconfig_override="yes" , enable_pkgconfig_path="none")
|
||||
AC_MSG_CHECKING([for overridden pkgconfig directory path])
|
||||
if test "x$enable_pkgconfig_path" = xno
|
||||
then
|
||||
libburnia_pkgconfig_override="no"
|
||||
fi
|
||||
if test "x$enable_pkgconfig_path" = x -o "x$enable_pkgconfig_path" = xyes
|
||||
then
|
||||
libburnia_pkgconfig_override="invalid argument"
|
||||
fi
|
||||
if test "x$libburnia_pkgconfig_override" = xyes
|
||||
then
|
||||
LIBBURNIA_PKGCONFDIR="$enable_pkgconfig_path"
|
||||
AC_MSG_RESULT([$LIBBURNIA_PKGCONFDIR])
|
||||
else
|
||||
AC_MSG_RESULT([$libburnia_pkgconfig_override])
|
||||
fi
|
||||
AC_SUBST(LIBBURNIA_PKGCONFDIR)
|
||||
|
||||
dnl For debugging only
|
||||
### AC_MSG_RESULT([LIBBURNIA_PKGCONFDIR = $LIBBURNIA_PKGCONFDIR])
|
||||
|
||||
])
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/sh -x
|
||||
|
||||
aclocal -I .
|
||||
libtoolize --copy --force
|
||||
autoconf
|
||||
|
||||
# ts A61101 : libburn is not prepared for config.h
|
||||
# autoheader
|
||||
|
||||
automake --foreign --add-missing --copy --include-deps
|
|
@ -0,0 +1,601 @@
|
|||
------------------------------------------------------------------------------
|
||||
libburnia-project.org scdbackup.sourceforge.net/cdrskin_eng.html
|
||||
------------------------------------------------------------------------------
|
||||
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
|
||||
Integrated sub project of libburnia-project.org but also published via:
|
||||
http://scdbackup.sourceforge.net/cdrskin_eng.html
|
||||
http://scdbackup.sourceforge.net/cdrskin-1.3.9.tar.gz
|
||||
|
||||
Copyright (C) 2006-2014 Thomas Schmitt, provided under GPL version 2 or later.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
cdrskin is a limited cdrecord compatibility wrapper which allows to use
|
||||
most of the libburn features from the command line.
|
||||
|
||||
Currently it is fully supported on GNU/Linux with kernels >= 2.4, on FreeBSD,
|
||||
on OpenSolaris, and on NetBSD.
|
||||
IDE drives under Linux 2.4. need kernel module ide-scsi.
|
||||
ATA and SATA drives under FreeBSD need kernel module atapicam.
|
||||
On other X/Open compliant systems there will only be emulated drives, but no
|
||||
direct MMC operation on real CD/DVD/BD drives.
|
||||
|
||||
By using this software you agree to the disclaimer at the end of this text
|
||||
"This software is provided as is. There is no warranty implied and ..."
|
||||
|
||||
|
||||
Compilation, First Glimpse, Installation
|
||||
|
||||
Obtain cdrskin-1.3.9.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf cdrskin-1.3.9.tar.gz
|
||||
cd cdrskin-1.3.9
|
||||
|
||||
Within that directory execute:
|
||||
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
|
||||
This will already produce a cdrskin binary. But it will be necessary to
|
||||
install libburn in order to use this binary.
|
||||
|
||||
In order to surely get a standalone binary, execute
|
||||
|
||||
cdrskin/compile_cdrskin.sh
|
||||
|
||||
Version identification and help texts available afterwards:
|
||||
cdrskin/cdrskin -version
|
||||
cdrskin/cdrskin --help
|
||||
cdrskin/cdrskin -help
|
||||
man cdrskin/cdrskin.1
|
||||
|
||||
|
||||
Install (eventually as superuser) cdrskin to a directory where it can be found:
|
||||
The command for global installation of both, libburn and cdrskin is
|
||||
make install
|
||||
If the library libburn.so.4 is not found with a test run of cdrskin, then
|
||||
try whether command
|
||||
ldconfig
|
||||
makes it accessible. With the statically linked binary this should not matter.
|
||||
|
||||
With that static binary you may as well do the few necessary actions manually.
|
||||
If cdrskin was already installed by a previous version, or by "make install"
|
||||
in the course of this installation, then find out where:
|
||||
which cdrskin
|
||||
Copy your standalone binary to exactly the address which you get as reply.
|
||||
E.g.:
|
||||
|
||||
cp cdrskin/cdrskin /usr/bin/cdrskin
|
||||
|
||||
Check the version timestamps of the globally installed binary
|
||||
cdrskin -version
|
||||
|
||||
It is not necessary for the standalone cdrskin binary to have libburn
|
||||
installed, since it incorporates the necessary libburn parts at compile time.
|
||||
It will not collide with an installed version of libburn either.
|
||||
But libpthread must be installed on the system and glibc has to match. (See
|
||||
below for a way to create a totally static linked binary.)
|
||||
|
||||
To install the man page, you may do: echo $MANPATH and choose one of the
|
||||
listed directories to copy the man-page under its ./man1 directory. Like:
|
||||
cp cdrskin/cdrskin.1 /usr/share/man/man1/cdrskin.1
|
||||
|
||||
Note: The content of the cdrskin tarball is essentially the complete libburn
|
||||
of the same version number. You may thus perform above steps in a local
|
||||
SVN copy of libburn or in a unpacked libburn tarball as well.
|
||||
|
||||
|
||||
Usage
|
||||
|
||||
The user of cdrskin needs rw-permission for the CD burner device.
|
||||
A list of rw-accessible drives can be obtained by
|
||||
|
||||
cdrskin --devices
|
||||
|
||||
CD devices which offer no rw-permission are invisible to normal users.
|
||||
The superuser should be able to see any usable drive and then set the
|
||||
permissions as needed. If this hangs then there is a drive with
|
||||
unexpected problems (locked, busy, broken, whatever). You might have to
|
||||
guess the address of your (non-broken) burner by other means, then.
|
||||
On Linux 2.4 this would be some /dev/sgN and on 2.6. some /dev/srM or /dev/hdX.
|
||||
|
||||
The output of cdrskin --devices might look like
|
||||
|
||||
0 dev='/dev/sr0' rwrwr- : '_NEC' 'DVD_RW ND-4570A'
|
||||
1 dev='/dev/sr1' rwrw-- : 'HL-DT-ST' 'DVDRAM GSA-4082B'
|
||||
|
||||
On Linux, full and insecure enabling of both for everybody would look like
|
||||
chmod a+rw /dev/sr0 /dev/hda
|
||||
This is equivalent to the traditional setup chmod a+x,u+s cdrecord.
|
||||
|
||||
On FreeBSD, device rw-permissions are to be set in /etc/devfs.rules.
|
||||
On Solaris, pfexec privileges may be restricted to "basic,sys_devices".
|
||||
On NetBSD, rw-permission may be granted by chmod a+rw /dev/rcd?d.
|
||||
See below "System Dependend Drive Permission Examples".
|
||||
|
||||
I strongly discourage to run cdrskin with setuid root or via sudo !
|
||||
It is not checked for the necessary degree of hacker safety.
|
||||
Better consider to grant the necessary permissions to group "floppy"
|
||||
and to add users to it.
|
||||
|
||||
|
||||
A behavioral conflict is known between any burn software and demons like hald
|
||||
which probe CD drives. This can spoil burn runs for CD-R or CD-RW.
|
||||
You may have to keep your hald away from the drive. See for example
|
||||
http://www.freebsd.org/gnome/docs/halfaq.html
|
||||
|
||||
|
||||
Helpful with Linux kernel 2.4 is a special SCSI feature:
|
||||
It is possible to address a scsi(-emulated) drive via associated device files
|
||||
which are not listed by option --devices but point to the same SCSI addresses
|
||||
as listed device files. This addressing via e.g. /dev/sr0 or /dev/scd1 is
|
||||
compatible with generic read programs like dd and with write program growisofs.
|
||||
For finding /dev/sg1 from /dev/sr0, the program needs rw-access to both files.
|
||||
|
||||
|
||||
Usage examples
|
||||
|
||||
For options and recordable media classes see
|
||||
man 1 cdrskin
|
||||
|
||||
Get an overview of cdrecord style addresses of available devices
|
||||
cdrskin -scanbus
|
||||
cdrskin dev=ATA -scanbus
|
||||
cdrskin --devices
|
||||
|
||||
Adresses reported with dev=ATA need prefix "ATA:". Address examples:
|
||||
dev=0,1,0 dev=ATA:1,0,0 dev=/dev/sg1 dev=/dev/hdc dev=/dev/sr0
|
||||
See also "Drive Addressing" below.
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
Format DVD-RW to avoid need for blanking before re-use
|
||||
cdrskin -v dev=0,1,0 blank=format_overwrite
|
||||
|
||||
De-format DVD-RW to make it capable of multi-session again
|
||||
cdrskin -v dev=/dev/sr0 blank=deformat_sequential
|
||||
|
||||
Burn image file my_image.iso to media
|
||||
cdrskin -v dev=0,1,0 speed=12 fs=8m driveropts=burnfree padsize=300k \
|
||||
-eject my_image.iso
|
||||
|
||||
Write multi-session to the same CD , DVD-R[W] or DVD+R[/DL]
|
||||
cdrskin dev=/dev/hdc padsize=300k -multi 1.iso
|
||||
cdrskin dev=/dev/hdc padsize=300k -multi 2.iso
|
||||
cdrskin dev=/dev/hdc padsize=300k -multi 3.iso
|
||||
cdrskin dev=/dev/hdc padsize=300k 4.iso
|
||||
|
||||
Get multi-session info for option -C of program mkisofs:
|
||||
c_values=$(cdrskin dev=/dev/hdc -msinfo 2>/dev/null)
|
||||
mkisofs ... -C "$c_values" ...
|
||||
|
||||
Burn a compressed afio archive to media on-the-fly
|
||||
find . | afio -oZ - | cdrskin -v dev=0,1,0 fs=32m speed=8 \
|
||||
driveropts=burnfree padsize=300k -
|
||||
|
||||
Burn 6 audio tracks from files with different formats to CD (not to any DVD).
|
||||
Anything except .wav or .au files has to be converted into raw format first.
|
||||
See below "Audio CD" for specifications.
|
||||
ogg123 -d raw -f track01.cd /path/to/track1.ogg
|
||||
oggdec -R -o track02.cd /path/to/track2.ogg
|
||||
lame --decode -t /path/to/track3.mp3 track03.cd
|
||||
madplay -o raw:track04.cd /path/to/track4.mp3
|
||||
mppdec --raw-le /path/to/track5.mpc track05.cd
|
||||
|
||||
cdrskin -v dev=0,1,0 blank=fast -eject speed=48 -sao \
|
||||
-audio -swab track0[1-5].cd /path/to/track6.wav
|
||||
|
||||
Extract audio tracks and CD-TEXT from CD into directory /home/me/my_cd:
|
||||
mkdir /home/me/my_cd
|
||||
cdrskin -v dev=/dev/sr0 extract_audio_to=/home/me/my_cd \
|
||||
cdtext_to_v07t=/home/me/my_cd/cdtext.v07t
|
||||
|
||||
|
||||
Restrictions
|
||||
|
||||
Several advanced CD related options of cdrecord are still unsupported.
|
||||
See output of command
|
||||
cdrskin --list_ignored_options
|
||||
If you have use cases for them, please report your wishes and expectations.
|
||||
|
||||
On the other hand, the capability of multi-session and of writing streams
|
||||
of unpredicted lenght surpass the current DVD capabilities of cdrecord.
|
||||
|
||||
|
||||
Inspiration and Standard
|
||||
|
||||
cdrskin combines the command line interface standard set by cdrecord with
|
||||
libburn, which is a control software for optical drives according to standard
|
||||
MMC-5. For particular CD legacy commands, standards MMC-3 and MMC-1 apply.
|
||||
|
||||
For the original meaning of cdrecord options see :
|
||||
man cdrecord
|
||||
(http://cdrecord.berlios.de/old/private/man/cdrecord-2.0.html)
|
||||
Do not bother Joerg Schilling with any cdrskin problems.
|
||||
(Be cursed if you install cdrskin as "cdrecord" without clearly forwarding
|
||||
this "don't bother Joerg" demand.)
|
||||
|
||||
cdrskin does not contain any bytes copied from cdrecord's sources. Many bytes
|
||||
have been copied from the message output of cdrecord runs, though. I am
|
||||
thankful to Joerg Schilling for every single one of them.
|
||||
I have the hope that Joerg feels more flattered than annoyed by cdrskin.
|
||||
|
||||
Many thanks to Andy Polyakov for his dvd+rw-tools
|
||||
http://fy.chalmers.se/~appro/linux/DVD+RW/tools
|
||||
which provide me with examples and pointers into MMC specs for DVD writing.
|
||||
|
||||
|
||||
Startup Files
|
||||
|
||||
If not --no_rc is the first argument then cdrskin attempts on startup to read
|
||||
arguments from the following three files:
|
||||
/etc/default/cdrskin
|
||||
/etc/opt/cdrskin/rc
|
||||
/etc/cdrskin/cdrskin.conf
|
||||
$HOME/.cdrskinrc
|
||||
The files are read in the sequence given above.
|
||||
Each readable line is treated as one single argument. No extra blanks.
|
||||
A first character '#' marks a comment, empty lines are ignored.
|
||||
|
||||
Example content of a startup file:
|
||||
# This is the default device
|
||||
dev=0,1,0
|
||||
|
||||
# Some more options
|
||||
fifo_start_at=0
|
||||
fs=16m
|
||||
|
||||
|
||||
Audio CD
|
||||
|
||||
Lorenzo Taylor enabled option -audio in cdrskin (thanks !) and reports neat
|
||||
results with audio data files which are :
|
||||
headerless PCM (i.e. uncompressed)
|
||||
44100 Hz sampling rate
|
||||
16 bits per sample
|
||||
stereo (2 channels)
|
||||
little-endian byte order with option -swab, or big-endian without -swab
|
||||
|
||||
Files with name extension .wav get examined wether they are in Microsoft WAVE
|
||||
format with above parameters and eventually get extracted by cdrskin itself.
|
||||
In the same way files with name extension .au get examined wether they are
|
||||
in SUN's audio format. For both formats, track format -audio and eventual
|
||||
endianness option -swab are enabled automatically.
|
||||
|
||||
Any other formats are to be converted to format .wav with above parameters
|
||||
or to be extracted as raw CD track data by commands like those given above
|
||||
under "Usage examples". Those raw files need option -audio and in most cases
|
||||
option -swab to mark them as little-endian/Intel/LSB-first 16-bit data.
|
||||
Incorrect endianness setting results in random noise on CD.
|
||||
|
||||
I myself am not into audio. So libburn-hackers@pykix.org might be the
|
||||
best address for suggestions, requests and bug reports.
|
||||
|
||||
|
||||
DVD+RW , DVD-RAM , BD-RE
|
||||
|
||||
These random access media get treated as blank media regardless wether they
|
||||
hold data or not. Options -audio and -multi are not allowed. Only one track
|
||||
is allowed. -toc does not return information about the media content.
|
||||
Speed is counted in DVD units (i.e. 1x = 1,385,000 bytes/second) or BD units
|
||||
(1x = 4,495,625 bytes/second). Currently there is no difference between -sao
|
||||
and -tao. If ever, then -tao will be the mode which preserves the current
|
||||
behavior.
|
||||
|
||||
BD-RE media need formatting before first use. cdrskin option "blank=as_needed"
|
||||
recognizes unformatted BD-RE and applies a lengthy formatting run.
|
||||
|
||||
During write operations DVD-RAM and BD-RE automatically apply Defect
|
||||
Management. This usually slows them down to half nominal speed. If drive
|
||||
and media produce flawless results anyway, then one can try to reach full
|
||||
nominal speed by option "stream_recording=on".
|
||||
In this case bad blocks are not detected during write and not even previously
|
||||
known bad blocks are avoided. So you have to make your own readability tests
|
||||
and go back to half speed as soon as the first read errors show up.
|
||||
Instead of "on" one may also set a start address for stream recording.
|
||||
Like "stream_recording=100m". This will write slowly to the first 100 MB of
|
||||
the media and accelerate when writing to higher addresses.
|
||||
|
||||
Option --grow_overwriteable_iso allows -multi (although unneeded), enables
|
||||
-msinfo and -toc, and makes blank=fast an invalidator for ISO filesystems
|
||||
on overwriteable media.
|
||||
|
||||
Initial session (equivalent to growisofs -Z):
|
||||
mkisofs ... | cdrskin --grow_overwriteable_iso blank=fast ...
|
||||
|
||||
Add-on session (equivalent to growisofs -M):
|
||||
cparms=$(cdrskin dev=/dev/sr0 --grow_overwriteable_iso -msinfo)
|
||||
mkisofs -C "$cparms" -M /dev/sr0 ... | \
|
||||
cdrskin dev=/dev/sr0 --grow_overwriteable_iso ... -
|
||||
|
||||
|
||||
DVD-RW , DVD-R , DVD-R DL
|
||||
|
||||
DVD-RW are usable if formatted to state "Restricted Overwrite" or if in state
|
||||
"Sequential Recording". DVD-R are always in sequential state. DVD-R DL are
|
||||
always sequential and incapable of multi-session.
|
||||
|
||||
"Sequential" is the state of unused media and of media previously blanked
|
||||
or written by cdrecord. dvd+rw-format -blank can also achieve this state.
|
||||
The according cdrskin option is blank=deformat_sequential .
|
||||
If "Incremental Streaming" is available, then sequential media are capable
|
||||
of multi-session like CD-R[W]. (But not capable of -audio recording.)
|
||||
This means they need option -multi to stay appendable, need to be blanked
|
||||
to be writeable from start, return useable info with -toc and -msinfo,
|
||||
eventually perform appending automatically.
|
||||
Without Incremental Streaming offered by the drive, only write mode DAO is
|
||||
available with sequential DVD-R[W]. It only works with blank media, allows only
|
||||
one single track, no -multi, and demands a fixely predicted track size.
|
||||
(growisofs uses it with DVD-R[W] if option -dvd-compat is given.)
|
||||
|
||||
Overwriteable DVD-RW behave much like DVD+RW. "Restricted" refers only to the
|
||||
granularity of random access and block size which have always to be aligned to
|
||||
full 32 kB. Sequential DVD-RW are converted into overwriteable DVD-RW by
|
||||
cdrskin dev=... -v blank=format_overwrite
|
||||
(Command dvd+rw-format -force can achieve Restricted Overwrite, too.)
|
||||
|
||||
Formatting or first use of freshly formatted DVD-RW can produce unusual noises
|
||||
from the drive and last several minutes. Depending on mutual compatibility of
|
||||
drive and media, formatting can yield unusable media. It seems that those die
|
||||
too on blanking by cdrecord, dvd+rw-format or cdrskin. Perils of DVD-RW.
|
||||
|
||||
There are three DVD-RW formatting variants with cdrskin currently:
|
||||
|
||||
blank=format_overwrite uses "DVD-RW Quick" formatting (MMC-type 15h)
|
||||
and writes a first session of 128 MiB. This leads to media which are expandable
|
||||
and random addressable by cdrskin.
|
||||
|
||||
blank=format_overwrite_quickest uses "DVD-RW Quick" formatting (type 15h) too,
|
||||
but leaves the media in "intermediate" state. In the first session of writing
|
||||
one may only write sequentially to such a DVD. After that, it gets random
|
||||
addressable by cdrskin. DVD-ROM drives might show ill behavior with them.
|
||||
|
||||
blank=format_overwrite_full uses preferrably "Full Format" (type 00h).
|
||||
This formatting lasts as long as writing a full DVD. It includes writing of
|
||||
lead-out which is said to be good for DVD ROM compatibility.
|
||||
|
||||
De-formatting options are available to make overwriteable DVD-RW sequential:
|
||||
|
||||
blank=deformat_sequential performs thorough blanking of all states of DVD-RW.
|
||||
blank=all and blank=fast perform the same thorough blanking, but refuse to do
|
||||
this with overwriteable DVD-RW, thus preserving their formatting. The specs
|
||||
allow minimal blanking but the resulting media on my drives offer no
|
||||
Incremental Streaming afterwards. So blank=fast will do full blanking.
|
||||
|
||||
blank=deformat_sequential_quickest is faster but might yield DAO-only media.
|
||||
|
||||
|
||||
DVD+R , DVD+R DL , BD-R
|
||||
|
||||
From the view of cdrskin they behave much like DVD-R. Each track gets wrapped
|
||||
into an own session, though.
|
||||
|
||||
DVD+R DL appear as extra large DVD+R. cdrskin does not allow to set the address
|
||||
of the layer break where a reading drive might show some delay while switching
|
||||
between both media layers.
|
||||
|
||||
BD-R are sold unformatted blank. If used without initial formatting then the
|
||||
drive is supposed to format them to maximum payload size with no Defect
|
||||
Management (see also above with BD-RE).
|
||||
If Defect Management is desired then BD-R need to be formatted before the
|
||||
first attempt to write a session to them.
|
||||
blank=format_if_needed will detect the situation and eventually apply
|
||||
default sized Defect Management formatting.
|
||||
blank=format_defectmgt_* will apply non-default parameters to formatting.
|
||||
|
||||
|
||||
Emulated Drives
|
||||
|
||||
cdrskin can use filesystem objects as emulated drives. Regular files or block
|
||||
devices appear similar to DVD-RAM. Other file types resemble blank DVD-R.
|
||||
Necessary precondition is option --allow_emulated_drives which is not accepted
|
||||
if cdrskin took another user identity because of the setuid bit of its access
|
||||
permissions.
|
||||
Addresses of emulated drives begin with prefix "stdio:". E.g.
|
||||
dev=stdio:/tmp/my_pseudo_drive
|
||||
|
||||
For safety reasons the superuser is only allowed to use /dev/null as emulated
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
cdrskin/compile_cdrskin.sh -dvd_obs_64k
|
||||
It can also be enabled at configure time by
|
||||
./configure ... --enable-dvd-obs-64k ...
|
||||
|
||||
Alternatively the transport of SCSI commands can be done via libcdio-0.83.
|
||||
You may install it and re-run libburn's ./configure with option
|
||||
--enable-libcdio
|
||||
|
||||
You may get a (super fat) statically linked binary by :
|
||||
cdrskin/compile_cdrskin.sh -static
|
||||
if your system supports static linking, at all. This will not help with kernels
|
||||
which do not properly support the necessary low-level interfaces chosen by
|
||||
your compile-time libraries.
|
||||
|
||||
A size reduced but fully functional binary may be produced by
|
||||
cdrskin/compile_cdrskin.sh -do_strip
|
||||
|
||||
An extra lean binary with reduced capabilities is created by
|
||||
cdrskin/compile_cdrskin.sh -do_diet -do_strip
|
||||
It will not read startup files, will abort on option dev_translation= ,
|
||||
will not have a fifo buffer, and will not be able to put out help texts or
|
||||
debugging messages.
|
||||
|
||||
|
||||
Linux only:
|
||||
|
||||
libburn tries to avoid a collision with udev's drive examination by waiting
|
||||
0.1 seconds before opening the device file for a longer time, after udev
|
||||
might have been alarmed by drive scanning activities.
|
||||
The waiting time can be set at ./configure time with microsecond granularity.
|
||||
E.g. 2 seconds:
|
||||
CFLAGS="$CFLAGS -DLibburn_udev_wait_useC=2000000"
|
||||
./configure ...options...
|
||||
Waiting can be disabled by zero waiting time:
|
||||
CFLAGS="$CFLAGS -DLibburn_udev_wait_useC=0"
|
||||
Alternatively, libburn can try to be nice by opening the device file,
|
||||
closing it immediately, waiting, and only then opening it for real:
|
||||
CFLAGS="$CFLAGS -DLibburn_udev_extra_open_cyclE -DLibburn_udev_wait_useC=500000"
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
System Dependend Drive Permission Examples
|
||||
|
||||
Accessing the optical drives requires privileges which usually are granted
|
||||
only to the superuser. Linux, FreeBSD, Solaris, NetBSD, offer quite different
|
||||
approaches for avoiding the need for unrestricted privileges.
|
||||
|
||||
First check whether some friendly system setting already allows you to
|
||||
access the drives as normal user:
|
||||
cdrskin --devices
|
||||
Those drives of which you see address and type strings are already usable.
|
||||
|
||||
If there remain drives invisible which the superuser can see by the same
|
||||
command, then the following examples might help:
|
||||
|
||||
---------------
|
||||
On all systems:
|
||||
---------------
|
||||
Add the authorized users of CD drives to group "floppy" in /etc/group.
|
||||
If missing: create this group.
|
||||
Changes to /etc/group often only affect new login sessions. So log out and in
|
||||
before making the first tests.
|
||||
|
||||
---------
|
||||
On Linux:
|
||||
---------
|
||||
Allow rw-access to the drives
|
||||
chgrp floppy /dev/sr0 /dev/sr1
|
||||
chmod g+rw /dev/sr0 /dev/sr1
|
||||
It might be necessary to perform chgrp and chmod after each reboot or to
|
||||
edit distro dependent device configuration files for permanent settings.
|
||||
|
||||
-----------
|
||||
On FreeBSD:
|
||||
-----------
|
||||
Edit /etc/devfs.rules and make sure to have these lines
|
||||
[localrules=10]
|
||||
add path 'acd*' mode 0664 group floppy
|
||||
add path 'cd*' mode 0664 group floppy
|
||||
add path 'pass*' mode 0664 group floppy
|
||||
add path 'xpt*' mode 0664 group floppy
|
||||
[localrules=5]
|
||||
add path 'pass*' mode 0664 group floppy
|
||||
add path 'cd*' mode 0664 group floppy
|
||||
add path 'xpt*' mode 0664 group floppy
|
||||
add path 'acd*' mode 0664 group floppy
|
||||
|
||||
Edit /etc/rc.conf and add the following line if missing
|
||||
devfs_system_ruleset="localrules"
|
||||
|
||||
This gets into effect by reboot or by command
|
||||
/etc/rc.d/devfs start
|
||||
|
||||
-----------
|
||||
On Solaris:
|
||||
-----------
|
||||
Run cdrskin by
|
||||
pfexec cdrskin ...arguments...
|
||||
|
||||
The following settings will make pfexec keep original UID and EUID and prevent
|
||||
most superuser powers. Be aware that you still can manipulate all device files
|
||||
if you have the file permissions for that.
|
||||
Full root privileges for cdrskin can then be aquired only by command su.
|
||||
|
||||
Edit /etc/security/exec_attr and add this line to the other "Media Backup"
|
||||
lines:
|
||||
Media Backup:solaris:cmd:::/usr/local/bin/cdrskin:privs=basic,sys_devices
|
||||
Edit /etc/user_attr and add profile "Media Backup" to the user's line:
|
||||
thomas::::profiles=Media Backup,Primary Administrator;roles=root
|
||||
See also man privileges, man exec_attr, man user_attr.
|
||||
|
||||
Then allow the group r-access to the drives
|
||||
pfexec chgrp floppy /dev/rdsk/c3t0d0s2 /dev/rdsk/c4t0d0s2
|
||||
pfexec chmod g+r /dev/rdsk/c3t0d0s2 /dev/rdsk/c4t0d0s2
|
||||
The last two commands have to be executed after each boot. I do not know
|
||||
the relevant device configuration files yet.
|
||||
|
||||
----------
|
||||
On NetBSD:
|
||||
----------
|
||||
Allow rw-access to the drives
|
||||
chgrp floppy /dev/rcd[01]d
|
||||
chmod g+rw /dev/rcd[01]d
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Project aspects and legal stuff
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Important Disclaimer :
|
||||
|
||||
This software is provided as is. There is no warranty implied and no
|
||||
protection against possible damages. You use this on your own risk.
|
||||
Don't blame me or other authors of libburn if anything goes wrong.
|
||||
|
||||
Actually, in case of severe trouble, nearly always the drive and the media
|
||||
are the cause. Any mistake of the burn program is supposed to be caught
|
||||
by the drive's firmware and to lead to mere misburns.
|
||||
The worst mishaps which hit the author imposed the need to reboot the
|
||||
system because of drives gnawing endlessly on ill media. Permanent hardware
|
||||
damage did not occur in 3.5 years of development. But one never knows ...
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Interested users are invited to participate in the development of cdrskin.
|
||||
Contact: scdbackup@gmx.net or libburn-hackers@pykix.org .
|
||||
We will keep copyright narrow but will of course acknowledge valuable
|
||||
contributions in a due way.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 or later
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Based on and sub project of:
|
||||
libburnia-project.org
|
||||
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-2014 Mario Danic, Thomas Schmitt
|
||||
|
||||
libburnia-project.org is inspired by and in other components 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
|
||||
See toplevel README for an overview of the current copyright situation in
|
||||
libburnia-project.org.
|
||||
|
||||
|
|
@ -0,0 +1,246 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -x
|
||||
|
||||
# This script documents how this cdrskin version was derived from
|
||||
# a vanilla libburn version. It is not intended nor needed for any
|
||||
# use of cdrskin but included here only to show the technical
|
||||
# relationship between both projects - which are close friends
|
||||
# and issue roughly the same software.
|
||||
#
|
||||
# Package maintainers are advised to cover rather libburn than
|
||||
# cdrskin unless they put only emphasis on the cdrecord emulation
|
||||
# provided by cdrskin. libburn contains cdrskin - cdrskin is an
|
||||
# oscillating, friendly and coordinated fork of libburn.
|
||||
#
|
||||
# Script results are a source tarball and two binaries
|
||||
# one dynamic and one static in respect to system libs.
|
||||
# Both binaries are static in respect to libburn.
|
||||
#
|
||||
# The script is to be run in the directory above the toplevel
|
||||
# directory of libburn resp. cdrskin development.
|
||||
#
|
||||
|
||||
# The top level directory in the SVN snapshot is named
|
||||
intermediate="./libburn_pykix"
|
||||
|
||||
# libburn source used: http://libburnia.pykix.org
|
||||
# Downloaded by:
|
||||
# $ svn co http://libburnia-svn.pykix.org/libburn/tags/... $intermediate
|
||||
# packed up in a tarball just to save it from inadverted changes by
|
||||
# $ tar czf libburn_svn.tgz $intermediate
|
||||
original="./libburn_svn_release.tgz"
|
||||
# Historic moments:
|
||||
# original="./libburn_svn_A60815.tgz"
|
||||
# original="./libburn_cdrskin_A60819.tgz"
|
||||
|
||||
|
||||
# My changes are in $changes , mainly in $changes/cdrskin
|
||||
changes="./libburn-release"
|
||||
|
||||
skin_release="1.3.8"
|
||||
patch_level=""
|
||||
# patch_level=".pl00"
|
||||
skin_rev="$skin_release""$patch_level"
|
||||
|
||||
# The result directory and the name of the result tarballs
|
||||
target="./cdrskin-${skin_release}"
|
||||
cdrskin_tarball="./cdrskin-${skin_rev}.tar.gz"
|
||||
cdrskin_tarball_svn="./cdrskin-${skin_rev}.svn.tar.gz"
|
||||
|
||||
# (This once earned me an embarrassingly blooping source tarball)
|
||||
# compile_dir="$changes"
|
||||
|
||||
compile_dir="$target"
|
||||
compile_cmd="./cdrskin/compile_cdrskin.sh"
|
||||
compile_static_opts="-static"
|
||||
compile_result="cdrskin/cdrskin"
|
||||
|
||||
man_to_html_cmd="./cdrskin/convert_man_to_html.sh"
|
||||
man_page_html="cdrskin/man_1_cdrskin.html"
|
||||
|
||||
# bintarget_dynamic="cdrskin_${skin_rev}-x86-suse9_0"
|
||||
bintarget_dynamic="cdrskin_${skin_rev}-amd64-suse10_2"
|
||||
bintarget_static="$bintarget_dynamic"-static
|
||||
|
||||
if test -d "$changes"
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "$0 : FATAL : no directory $changes" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for i in "$target" "$intermediate"
|
||||
do
|
||||
if test -e "$i"
|
||||
then
|
||||
echo "$0 : FATAL : already existing $i" >&2
|
||||
exit 2
|
||||
fi
|
||||
done
|
||||
|
||||
if test -f "$original"
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "$0 : FATAL : no file $original" >&2
|
||||
exit 3
|
||||
fi
|
||||
|
||||
|
||||
# Unpack SVN snapshot.
|
||||
tar xzf "$original"
|
||||
|
||||
|
||||
# Rename the directory to the cdrskin name
|
||||
mv "$intermediate" "$target"
|
||||
|
||||
|
||||
# Copy the changes from the development tree
|
||||
#
|
||||
cdrskin_dir="$changes"/cdrskin
|
||||
libburn_dir="$changes"/libburn
|
||||
cdrskin_target="$target"/cdrskin
|
||||
libburn_target="$target"/libburn
|
||||
|
||||
# Create version timestamp
|
||||
# timestamp="$(date -u '+%Y.%m.%d.%H%M%S')"
|
||||
# echo "$timestamp"
|
||||
# echo '#define Cdrskin_timestamP "'"$timestamp"'"' >"$cdrskin_dir"/cdrskin_timestamp.h
|
||||
|
||||
# Add the cdrskin files
|
||||
if test -e "$cdrskin_target"
|
||||
then
|
||||
rm -rf "$cdrskin_target"
|
||||
fi
|
||||
cp -a "$cdrskin_dir" "$cdrskin_target"
|
||||
|
||||
# Remove copied vim.swp and binaries
|
||||
rm "$cdrskin_target"/.*.swp
|
||||
rm "$cdrskin_target"/.*.swo
|
||||
rm "$cdrskin_target"/*.o
|
||||
rm "$cdrskin_target"/cdrfifo
|
||||
rm "$cdrskin_target"/cdrskin
|
||||
rm "$cdrskin_target"/cleanup
|
||||
for i in std new make old
|
||||
do
|
||||
if test -e "$cdrskin_target"/cdrskin_"$i"
|
||||
then
|
||||
rm "$cdrskin_target"/cdrskin_"$i"
|
||||
fi
|
||||
done
|
||||
|
||||
# Remove eventual SVN stuff from cdrskin directory
|
||||
for i in .deps .dirstamp .libs
|
||||
do
|
||||
if test -e "$cdrskin_target"/"$i"
|
||||
then
|
||||
rm -rf "$cdrskin_target"/"$i"
|
||||
fi
|
||||
done
|
||||
|
||||
# Remove GIFs of cdrskin_eng.html
|
||||
rm "$cdrskin_target"/doener_*.gif "$cdrskin_target"/doener_*.png
|
||||
|
||||
# Remove automatically generated HTML man page
|
||||
rm "$cdrskin_target"/man_1_cdrskin.html
|
||||
|
||||
# Remove all add_ts_changes_to_libburn besides this one
|
||||
for i in "$cdrskin_target"/add_ts_changes_to_libburn*
|
||||
do
|
||||
if test $(basename "$0") = $(basename "$i")
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
rm $i
|
||||
fi
|
||||
done
|
||||
|
||||
# Remove libcevap
|
||||
rm -rf "$target"/libcevap
|
||||
|
||||
|
||||
# Remove unwanted SVN stuff (TODO: avoid downloading it)
|
||||
for i in "$target"/.svn "$target"/*/.svn
|
||||
do
|
||||
if test "$i" = "$target"'/*/.svn'
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
if test -e "$i"
|
||||
then
|
||||
rm -rf "$i"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
# Make SVN state tarball for the libburn team
|
||||
tar czf "$cdrskin_tarball_svn" "$target"
|
||||
|
||||
|
||||
# Get over dependecy on autotools. Rely only on cc, make et. al.
|
||||
# This is not the same as "make dist" but i can do it without
|
||||
# having to evaluate the quality of said "make dist"
|
||||
#
|
||||
( cd "$target" ; ./bootstrap )
|
||||
|
||||
# Remove unwanted stuff after bootstrap
|
||||
for i in "$target"/autom4te.cache
|
||||
do
|
||||
if echo "$i" | grep '\*' >/dev/null
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
if test -e "$i"
|
||||
then
|
||||
rm -rf "$i"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# Repair non-portable shell code output of ./bootstrap
|
||||
(
|
||||
cd "$compile_dir" || exit 1
|
||||
sed -e 's/^for ac_header in$/test -z 1 \&\& for ac_header in dummy/' \
|
||||
< ./configure > ./configure-repaired
|
||||
if test "$?" = 0
|
||||
then
|
||||
echo "$0: Empty 'for ac_header in' found in configure." >&2
|
||||
fi
|
||||
mv ./configure-repaired ./configure
|
||||
chmod a+rx,go-w,u+w ./configure
|
||||
)
|
||||
|
||||
# Pack it up to the new libburn+cdrskin-tarball
|
||||
tar czf "$cdrskin_tarball" "$target"
|
||||
|
||||
# Produce a static and a dynamic binary, and a HTML man page
|
||||
(
|
||||
cd "$compile_dir" || exit 1
|
||||
./configure
|
||||
make
|
||||
"$compile_cmd" -O2 -do_strip
|
||||
cp "$compile_result" "../$bintarget_dynamic"
|
||||
if test -n "$compile_static_opts"
|
||||
then
|
||||
"$compile_cmd" $compile_static_opts -O2 -do_strip
|
||||
cp "$compile_result" "../$bintarget_static"
|
||||
fi
|
||||
"$man_to_html_cmd"
|
||||
mv "$man_page_html" ..
|
||||
)
|
||||
|
||||
# Remove the build area
|
||||
# Disable this for debugging the merge process
|
||||
rm -rf "$target"
|
||||
|
||||
# Show the result
|
||||
./"$bintarget_dynamic" -version
|
||||
./"$bintarget_static" -version
|
||||
ls -l "$cdrskin_tarball"
|
||||
ls -l "$bintarget_dynamic"
|
||||
ls -l "$bintarget_static"
|
||||
ls -l $(basename "$man_page_html")
|
||||
|
|
@ -0,0 +1,246 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -x
|
||||
|
||||
# This script documents how this cdrskin version was derived from
|
||||
# a vanilla libburn version. It is not intended nor needed for any
|
||||
# use of cdrskin but included here only to show the technical
|
||||
# relationship between both projects - which are close friends
|
||||
# and issue roughly the same software.
|
||||
#
|
||||
# Package maintainers are advised to cover rather libburn than
|
||||
# cdrskin unless they put only emphasis on the cdrecord emulation
|
||||
# provided by cdrskin. libburn contains cdrskin - cdrskin is an
|
||||
# oscillating, friendly and coordinated fork of libburn.
|
||||
#
|
||||
# Script results are a source tarball and two binaries
|
||||
# one dynamic and one static in respect to system libs.
|
||||
# Both binaries are static in respect to libburn.
|
||||
#
|
||||
# The script is to be run in the directory above the toplevel
|
||||
# directory of libburn resp. cdrskin development.
|
||||
#
|
||||
|
||||
# The top level directory in the SVN snapshot is named
|
||||
intermediate="./libburn_pykix"
|
||||
|
||||
# libburn source used: http://libburnia-project.org
|
||||
# Downloaded by:
|
||||
# $ svn co http://libburnia-project.org/libburn/tags/... $intermediate
|
||||
# packed up in a tarball just to save it from inadverted changes by
|
||||
# $ tar czf libburn_svn.tgz $intermediate
|
||||
original="./libburn_svn.tgz"
|
||||
# Historic moments:
|
||||
# original="./libburn_svn_A60815.tgz"
|
||||
# original="./libburn_cdrskin_A60819.tgz"
|
||||
|
||||
|
||||
# My changes are in $changes , mainly in $changes/cdrskin
|
||||
changes="./libburn-develop"
|
||||
|
||||
skin_release="1.3.9"
|
||||
patch_level=""
|
||||
skin_rev="$skin_release""$patch_level"
|
||||
|
||||
# The result directory and the name of the result tarballs
|
||||
target="./cdrskin-${skin_release}"
|
||||
cdrskin_tarball="./cdrskin-${skin_rev}.tar.gz"
|
||||
cdrskin_tarball_svn="./cdrskin-${skin_rev}.svn.tar.gz"
|
||||
|
||||
# (This once earned me an embarrassingly blooping source tarball)
|
||||
# compile_dir="$changes"
|
||||
|
||||
compile_dir="$target"
|
||||
compile_cmd="./cdrskin/compile_cdrskin.sh"
|
||||
compile_static_opts="-static"
|
||||
compile_result="cdrskin/cdrskin"
|
||||
|
||||
man_to_html_cmd="./cdrskin/convert_man_to_html.sh"
|
||||
man_page_html="cdrskin/man_1_cdrskin.html"
|
||||
|
||||
bintarget_dynamic="cdrskin_${skin_rev}-amd64-suse10_2"
|
||||
bintarget_static="$bintarget_dynamic"-static
|
||||
|
||||
if test -d "$changes"
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "$0 : FATAL : no directory $changes" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for i in "$target" "$intermediate"
|
||||
do
|
||||
if test -e "$i"
|
||||
then
|
||||
echo "$0 : FATAL : already existing $i" >&2
|
||||
exit 2
|
||||
fi
|
||||
done
|
||||
|
||||
if test -f "$original"
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "$0 : FATAL : no file $original" >&2
|
||||
exit 3
|
||||
fi
|
||||
|
||||
|
||||
# Unpack SVN snapshot.
|
||||
tar xzf "$original"
|
||||
|
||||
|
||||
# Rename the directory to the cdrskin name
|
||||
mv "$intermediate" "$target"
|
||||
|
||||
|
||||
# Copy the changes from the development tree
|
||||
#
|
||||
cdrskin_dir="$changes"/cdrskin
|
||||
libburn_dir="$changes"/libburn
|
||||
cdrskin_target="$target"/cdrskin
|
||||
libburn_target="$target"/libburn
|
||||
|
||||
# Create version timestamp
|
||||
timestamp="$(date -u '+%Y.%m.%d.%H%M%S')"
|
||||
echo "$timestamp"
|
||||
echo '#define Cdrskin_timestamP "'"$timestamp"'"' >"$cdrskin_dir"/cdrskin_timestamp.h
|
||||
|
||||
# Add the cdrskin files
|
||||
if test -e "$cdrskin_target"
|
||||
then
|
||||
rm -rf "$cdrskin_target"
|
||||
fi
|
||||
cp -a "$cdrskin_dir" "$cdrskin_target"
|
||||
|
||||
# Remove copied vim.swp and binaries
|
||||
rm "$cdrskin_target"/.*.swp
|
||||
rm "$cdrskin_target"/.*.swo
|
||||
rm "$cdrskin_target"/*.o
|
||||
rm "$cdrskin_target"/cdrfifo
|
||||
rm "$cdrskin_target"/cdrskin
|
||||
rm "$cdrskin_target"/cleanup
|
||||
for i in std new make old
|
||||
do
|
||||
if test -e "$cdrskin_target"/cdrskin_"$i"
|
||||
then
|
||||
rm "$cdrskin_target"/cdrskin_"$i"
|
||||
fi
|
||||
done
|
||||
|
||||
# Remove eventual SVN stuff from cdrskin directory
|
||||
for i in .deps .dirstamp .libs
|
||||
do
|
||||
if test -e "$cdrskin_target"/"$i"
|
||||
then
|
||||
rm -rf "$cdrskin_target"/"$i"
|
||||
fi
|
||||
done
|
||||
|
||||
# Remove GIFs of cdrskin_eng.html
|
||||
rm "$cdrskin_target"/doener_*.gif "$cdrskin_target"/doener_*.png
|
||||
|
||||
# Remove automatically generated HTML man page
|
||||
rm "$cdrskin_target"/man_1_cdrskin.html
|
||||
|
||||
# Remove libcevap
|
||||
rm -rf "$target"/libcevap
|
||||
|
||||
# Remove all add_ts_changes_to_libburn besides this one
|
||||
for i in "$cdrskin_target"/add_ts_changes_to_libburn*
|
||||
do
|
||||
if test $(basename "$0") = $(basename "$i")
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
rm $i
|
||||
fi
|
||||
done
|
||||
|
||||
# Remove unwanted SVN stuff (TODO: avoid downloading it)
|
||||
for i in "$target"/.svn "$target"/*/.svn
|
||||
do
|
||||
if test "$i" = "$target"'/*/.svn'
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
if test -e "$i"
|
||||
then
|
||||
rm -rf "$i"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
# Make SVN state tarball for the libburn team
|
||||
tar czf "$cdrskin_tarball_svn" "$target"
|
||||
|
||||
|
||||
# Get over dependecy on autotools. Rely only on cc, make et. al.
|
||||
# This is not the same as "make dist" but i can do it without
|
||||
# having to evaluate the quality of said "make dist"
|
||||
#
|
||||
( cd "$target" ; ./bootstrap )
|
||||
|
||||
# Remove unwanted stuff after bootstrap
|
||||
for i in "$target"/autom4te.cache
|
||||
do
|
||||
if echo "$i" | grep '\*' >/dev/null
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
if test -e "$i"
|
||||
then
|
||||
rm -rf "$i"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# Repair non-portable shell code output of ./bootstrap
|
||||
(
|
||||
cd "$compile_dir" || exit 1
|
||||
sed -e 's/^for ac_header in$/test -z 1 \&\& for ac_header in dummy/' \
|
||||
< ./configure > ./configure-repaired
|
||||
if test "$?" = 0
|
||||
then
|
||||
echo "$0: Empty 'for ac_header in' found in configure." >&2
|
||||
fi
|
||||
mv ./configure-repaired ./configure
|
||||
chmod a+rx,go-w,u+w ./configure
|
||||
)
|
||||
|
||||
|
||||
# Pack it up to the new libburn+cdrskin-tarball
|
||||
tar czf "$cdrskin_tarball" "$target"
|
||||
|
||||
# Produce a static and a dynamic binary, and a HTML man page
|
||||
(
|
||||
cd "$compile_dir" || exit 1
|
||||
./configure
|
||||
make
|
||||
"$compile_cmd" -libburn_svn -O2 -do_strip
|
||||
cp "$compile_result" "../$bintarget_dynamic"
|
||||
if test -n "$compile_static_opts"
|
||||
then
|
||||
"$compile_cmd" $compile_static_opts -libburn_svn -O2 -do_strip
|
||||
cp "$compile_result" "../$bintarget_static"
|
||||
fi
|
||||
# "$compile_cmd" -libburn_svn -O2 -do_diet -do_strip
|
||||
# cp "$compile_result" "../$bintarget_dynamic"_diet
|
||||
"$man_to_html_cmd"
|
||||
mv "$man_page_html" ..
|
||||
)
|
||||
|
||||
# Remove the build area
|
||||
# Disable this for debugging the merge process
|
||||
rm -rf "$target"
|
||||
|
||||
# Show the result
|
||||
./"$bintarget_dynamic" -version
|
||||
./"$bintarget_static" -version
|
||||
ls -l "$cdrskin_tarball"
|
||||
ls -l "$bintarget_dynamic"
|
||||
ls -l "$bintarget_static"
|
||||
ls -l $(basename "$man_page_html")
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Spying on the call to cdrecord.
|
||||
#
|
||||
# Move $(which cdrecord) to $(dirname $(which cdrecord))/real_cdrecord .
|
||||
# Install this sript instead. (Do not forget to revoke this after the test.)
|
||||
#
|
||||
|
||||
# The report target is set in variable rt.
|
||||
# The default is this file :
|
||||
rt=/tmp/cdrecord_spy_log
|
||||
|
||||
# To use a bystanding xterm as target i find out the pty address by
|
||||
# executing in that terminal
|
||||
# sleep 12345
|
||||
# and then running in another terminal
|
||||
# ps -ef | grep 'sleep 12345'
|
||||
# which answers something like
|
||||
# thomas 21303 30518 0 14:02 pts/23 00:00:00 sleep 12345
|
||||
# thomas 21421 30523 0 14:02 pts/24 00:00:00 grep sleep 12345
|
||||
# from which i learn that pts/23 is sleeping 12345. Now sleep can be aborted.
|
||||
#
|
||||
# rt=/dev/pts/23
|
||||
|
||||
echo '------------------------------------- cdrecord_spy 0.1.0 -------' >>"$rt"
|
||||
date >>"$rt"
|
||||
echo '----------------------------------------------------------------' >>"$rt"
|
||||
echo "$0" >>"$rt"
|
||||
for i in "$@"
|
||||
do
|
||||
echo "$i" >>"$rt"
|
||||
done
|
||||
echo '------------------------------------- cdrecord_spy 0.1.0 - end -' >>"$rt"
|
||||
|
||||
real_cdrecord "$@"
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,171 @@
|
|||
|
||||
/*
|
||||
cdrfifo.c , Copyright 2006 Thomas Schmitt <scdbackup@gmx.net>
|
||||
|
||||
A fd-to-fd or fd-to-memory fifo to be used within cdrskin or independently.
|
||||
By chaining of fifo objects, several fifos can be run simultaneously
|
||||
in fd-to-fd mode. Modes are controlled by parameter flag of
|
||||
Cdrfifo_try_to_work().
|
||||
|
||||
Provided under GPL license within cdrskin and under BSD license elsewise.
|
||||
*/
|
||||
|
||||
#ifndef Cdrfifo_headerfile_includeD
|
||||
#define Cdrfifo_headerfile_includeD
|
||||
|
||||
|
||||
/** The fifo buffer which will smoothen the data stream from data provider
|
||||
to data consumer. Although this is not a mandatory lifesaver for modern
|
||||
burners any more, a fifo can speed up burning of data which is delivered
|
||||
with varying bandwidths (e.g. compressed archives created on the fly
|
||||
or mkisofs running at its speed limit.).
|
||||
This structure is opaque to applications and may only be used via
|
||||
the Cdrfifo*() methods described in cdrfifo.h .
|
||||
*/
|
||||
struct CdrfifO;
|
||||
|
||||
|
||||
/** Create a fifo object.
|
||||
@param ff Returns the address of the new object.
|
||||
@param source_fd Filedescriptor opened to a readable data stream.
|
||||
@param dest_fd Filedescriptor opened to a writable data stream.
|
||||
To work with libburn, it needs to be attached to a
|
||||
struct burn_source object.
|
||||
@param chunk_size Size of buffer block for a single transaction (0=default)
|
||||
@param buffer_size Size of fifo buffer
|
||||
@param flag bit0= Debugging verbosity
|
||||
@return 1 on success, <=0 on failure
|
||||
*/
|
||||
int Cdrfifo_new(struct CdrfifO **ff, int source_fd, int dest_fd,
|
||||
int chunk_size, int buffer_size, int flag);
|
||||
|
||||
/** Release from memory a fifo object previously created by Cdrfifo_new().
|
||||
@param ff The victim (gets returned as NULL, call can stand *ff==NULL)
|
||||
@param flag Bitfield for control purposes:
|
||||
bit0= do not close destination fd
|
||||
*/
|
||||
int Cdrfifo_destroy(struct CdrfifO **ff, int flag);
|
||||
|
||||
/** Close any output fds */
|
||||
int Cdrfifo_close(struct CdrfifO *o, int flag);
|
||||
|
||||
/** Close any output fds of o and its chain peers */
|
||||
int Cdrfifo_close_all(struct CdrfifO *o, int flag);
|
||||
|
||||
int Cdrfifo_get_sizes(struct CdrfifO *o, int *chunk_size, int *buffer_size,
|
||||
int flag);
|
||||
|
||||
/** Set a speed limit for buffer output.
|
||||
@param o The fifo object
|
||||
@param bytes_per_second >0 catch up slowdowns over the whole run time
|
||||
<0 catch up slowdowns only over one interval
|
||||
=0 disable speed limit
|
||||
*/
|
||||
int Cdrfifo_set_speed_limit(struct CdrfifO *o, double bytes_per_second,
|
||||
int flag);
|
||||
|
||||
/** Set a fixed size for input in order to cut off any unwanted tail
|
||||
@param o The fifo object
|
||||
@param idx index for fds attached via Cdrfifo_attach_follow_up_fds(),
|
||||
first attached is 0, <0 directs limit to active fd limit
|
||||
(i.e. first track is -1, second track is 0, third is 1, ...)
|
||||
*/
|
||||
int Cdrfifo_set_fd_in_limit(struct CdrfifO *o, double fd_in_limit, int idx,
|
||||
int flag);
|
||||
|
||||
|
||||
int Cdrfifo_set_fds(struct CdrfifO *o, int source_fd, int dest_fd, int flag);
|
||||
int Cdrfifo_get_fds(struct CdrfifO *o, int *source_fd, int *dest_fd, int flag);
|
||||
|
||||
|
||||
/** Attach a further pair of input and output fd which will use the same
|
||||
fifo buffer when its predecessors are exhausted. Reading will start as
|
||||
soon as reading of the predecessor encounters EOF. Writing will start
|
||||
as soon as all pending predecessor data are written.
|
||||
@return index number of new item + 1, <=0 indicates error
|
||||
*/
|
||||
int Cdrfifo_attach_follow_up_fds(struct CdrfifO *o, int source_fd, int dest_fd,
|
||||
int flag);
|
||||
|
||||
/** Attach a further fifo which shall be processed simultaneously with this
|
||||
one by Cdrfifo_try_to_work() in fd-to-fd mode.
|
||||
*/
|
||||
int Cdrfifo_attach_peer(struct CdrfifO *o, struct CdrfifO *next, int flag);
|
||||
|
||||
|
||||
/** Obtain buffer state.
|
||||
@param o The buffer object
|
||||
@param fill Returns the number of pending payload bytes in the buffer
|
||||
@param space Returns the number of unused buffer bytes
|
||||
@param flag unused yet
|
||||
@return -1=error , 0=inactive , 1=reading and writing ,
|
||||
2=reading ended (but still writing)
|
||||
*/
|
||||
int Cdrfifo_get_buffer_state(struct CdrfifO *o,int *fill,int *space,int flag);
|
||||
|
||||
int Cdrfifo_get_counters(struct CdrfifO *o,
|
||||
double *in_counter, double *out_counter, int flag);
|
||||
|
||||
/** reads min_fill and begins measurement interval for next min_fill */
|
||||
int Cdrfifo_next_interval(struct CdrfifO *o, int *min_fill, int flag);
|
||||
|
||||
int Cdrfifo_get_min_fill(struct CdrfifO *o, int *total_min_fill,
|
||||
int *interval_min_fill, int flag);
|
||||
|
||||
int Cdrfifo_get_cdr_counters(struct CdrfifO *o,
|
||||
double *put_counter, double *get_counter,
|
||||
double *empty_counter, double *full_counter,
|
||||
int flag);
|
||||
|
||||
/** Inquire the eventually detected size of an eventual ISO-9660 file system
|
||||
@return 0=no ISO resp. size detected, 1=size_in_bytes is valid
|
||||
*/
|
||||
int Cdrfifo_get_iso_fs_size(struct CdrfifO *o, double *size_in_bytes,int flag);
|
||||
|
||||
|
||||
/** Take over the eventually memorized blocks 16 to 31 of input (2 kB each).
|
||||
The fifo forgets the blocks by this call. I.e. a second one will return 0.
|
||||
After this call it is the responsibility of the caller to dispose the
|
||||
retrieved memory via call free().
|
||||
@param pt Will be filled either with NULL or a pointer to 32 kB of data
|
||||
@return 0=nothing is buffered, 1=pt points to valid freeable data
|
||||
*/
|
||||
int Cdrfifo_adopt_iso_fs_descr(struct CdrfifO *o, char **pt, int flag);
|
||||
|
||||
|
||||
/** Check for pending data at the fifo's source file descriptor and wether the
|
||||
fifo is ready to take them. Simultaneously check the buffer for existing
|
||||
data and the destination fd for readiness to accept some. If so, a small
|
||||
chunk of data is transfered to and/or from the fifo.
|
||||
This is done for the given fifo object and all members of its next-chain.
|
||||
The check and transactions are repeated until a given timespan has elapsed.
|
||||
libburn applications call this function in the burn loop instead of sleep().
|
||||
It may also be used instead of read(). Then it returns as soon as an output
|
||||
transaction would be performed. See flag:bit2.
|
||||
@param o The fifo object
|
||||
@param wait_usec The time in microseconds after which the function shall
|
||||
return.
|
||||
@param reply_buffer with bit2: Returns write-ready buffer chunk and must
|
||||
be able to take at least chunk_size bytes
|
||||
@param reply_count with bit2: Returns number of writeable bytes in reply_pt
|
||||
@param flag Bitfield for control purposes:
|
||||
bit0= Enable debug pacifier (same with Cdrfifo_debuG)
|
||||
bit1= Do not write, just fill buffer
|
||||
bit2= fd-to-memory mode (else fd-to-fd mode):
|
||||
Rather than writing a chunk return it and its size.
|
||||
No simultaneous processing of chained fifos.
|
||||
bit3= With bit2: do not check destination fd for readiness
|
||||
@return <0 = error , 0 = idle , 1 = did some work , 2 = all work is done
|
||||
*/
|
||||
int Cdrfifo_try_to_work(struct CdrfifO *o, int wait_usec,
|
||||
char *reply_buffer, int *reply_count, int flag);
|
||||
|
||||
/** Fill the fifo as far as possible without writing to destination fd.
|
||||
@param size if >=0 : end filling after the given number of bytes
|
||||
@return 1 on success, <=0 on failure
|
||||
*/
|
||||
int Cdrfifo_fill(struct CdrfifO *o, int size, int flag);
|
||||
|
||||
|
||||
#endif /* Cdrfifo_headerfile_includeD */
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,562 @@
|
|||
<HTML>
|
||||
|
||||
<HEAD>
|
||||
<META NAME="description" CONTENT="cdrskin, a limited cdrecord compatibility wrapper for libburn">
|
||||
<META NAME="keywords" CONTENT="cdrskin, libburn, libburnia, burn, CD, DVD, BD, linux, recording, burning, CD-R, CD-RW, DVD-R, DVD-R DL, DVD-RW, DVD+RW, DVD+R, DVD+R DL, DVD-RAM, BD-RE, BD-R, cdrecord, compatible, scdbackup">
|
||||
<META NAME="robots" CONTENT="follow">
|
||||
<TITLE>cdrskin homepage english</TITLE>
|
||||
</HEAD>
|
||||
|
||||
<BODY BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>
|
||||
<FONT SIZE=+1>
|
||||
|
||||
<CENTER>
|
||||
<A HREF="http://en.wikipedia.org/wiki/D%C3%B6ner_kebab">
|
||||
<IMG SRC="doener_150x200_tr_octx.png" BORDER=0
|
||||
ALT="cdrskin logo: Doener mit Scharf">
|
||||
</A>
|
||||
<P><H2> Homepage of </H2>
|
||||
<H1> cdrskin </H1>
|
||||
|
||||
<H2>Limited cdrecord compatibility wrapper for libburn</H2>
|
||||
</CENTER>
|
||||
|
||||
<P>
|
||||
<H2>Purpose:</H2>
|
||||
Burns preformatted data to CD, DVD, and BD media:<BR>
|
||||
CD-R, DVD-R, DVD-R DL, DVD+R, DVD+R DL, BD-R, CD-RW,
|
||||
DVD-RW, DVD-RAM, DVD+RW, BD-RE
|
||||
</P>
|
||||
<P>
|
||||
|
||||
<HR>
|
||||
|
||||
<A HREF="#download">Direct hop to download links -></A>
|
||||
|
||||
<P>
|
||||
<H2>Hardware requirements:</H2>
|
||||
About any CD, DVD, or BD recorder produced in the recent ten years.
|
||||
<BR>
|
||||
<A HREF="http://libburnia-project.org">libburn</A>
|
||||
supports recorders which are compliant to standards MMC-1 for CD and
|
||||
MMC-5 for DVD or BD. Linux, FreeBSD, Solaris, and NetBSD allow to access drives
|
||||
connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
|
||||
<BR>
|
||||
</P>
|
||||
|
||||
<P>
|
||||
<H2>Software requirements :</H2>
|
||||
<DL>
|
||||
<DT>Linux with kernel 2.4 or higher (and libc, of course) :</DT>
|
||||
<DD>With kernel 2.4 an ATA drive has to be under ide-scsi emulation.</DD>
|
||||
<DD>With kernel 2.6 or higher the drive should not be under ide-scsi.</DD>
|
||||
<DT>or FreeBSD (with libc, of course) :</DT>
|
||||
<DD>ATA and SATA drives need atapicam running.</DD>
|
||||
<DD>libcam has to be installed.</DD>
|
||||
<DT>or Solaris (with libc, of course) :</DT>
|
||||
<DD>Tested on kernel 5.11, hopefully suitable for older ones too.</DD>
|
||||
<DT>or NetBSD (with libc, of course) :</DT>
|
||||
<DD>Tested on 6.1.2 and 6.1.3</DD>
|
||||
<DT>libpthread</DT>
|
||||
<DD>is supposed to be a standard system component.</DD>
|
||||
</DL>
|
||||
</P>
|
||||
|
||||
<P>
|
||||
<H2>
|
||||
GPL software included:<BR>
|
||||
</H2>
|
||||
<DL>
|
||||
<DT>libburn-1.3.8</DT>
|
||||
<DD>(founded by Derek Foreman and Ben Jansens,
|
||||
developed and maintained since August 2006 by
|
||||
Thomas Schmitt from team of libburnia-project.org)
|
||||
</DD>
|
||||
<DD>transfers data to CD, DVD, BD</DD>
|
||||
</DL>
|
||||
</P>
|
||||
|
||||
<P>
|
||||
This program system has been tested on Intel/AMD with Linux, FreeBSD,
|
||||
OpenSolaris, and NetBSD based operating systems.<BR>
|
||||
Ports to other usable systems are appreciated. Reports are welcome.
|
||||
</P>
|
||||
|
||||
<HR>
|
||||
|
||||
<P>
|
||||
<H2>Special features:</H2>
|
||||
<UL>
|
||||
<LI>Source code is independent of
|
||||
<A HREF="http://cdrecord.berlios.de/old/private/cdrecord.html">cdrecord</A>
|
||||
</LI>
|
||||
</UL>
|
||||
</P>
|
||||
|
||||
<P>
|
||||
<H2>Commands:</H2>
|
||||
<DL>
|
||||
<DT>The most common options of cdrecord for data and audio on CD media
|
||||
are provided in a compatible way.<BR>
|
||||
On all DVD media, cdrskin is able to perform any recording job
|
||||
which is possible with cdrecord.
|
||||
Other than with cdrecord, option -multi is supported with many DVD types and
|
||||
BD-R. Write mode -tao works with anything but quickly blanked DVD-RW and
|
||||
DVD-R DL, which both support no -multi.
|
||||
</DT>
|
||||
<BR><BR>
|
||||
<DT>Get an overview of drives and their addresses</DT>
|
||||
<DD>#<KBD> cdrskin -scanbus</KBD></DD>
|
||||
<DD>#<KBD> cdrskin dev=ATA -scanbus</KBD></DD>
|
||||
<DD>#<KBD> cdrskin --devices</KBD></DD>
|
||||
<DT>Being superuser avoids permission problems with /dev/srN resp. /dev/hdX .
|
||||
</DT>
|
||||
<DT>Ordinary users should then get granted access to the /dev files
|
||||
as listed by option --devices. Linux, FreeBSD, and NetBSD demand rw-permission.
|
||||
On Solaris it is r-permission and privileges "basic,sys_devices".</DT>
|
||||
<DT> </DT>
|
||||
|
||||
<DT>Get info about a particular drive or loaded media:</DT>
|
||||
<DD>$<KBD> cdrskin dev=0,1,0 -checkdrive</KBD></DD>
|
||||
<DD>$<KBD> cdrskin dev=ATA:1,0,0 -v -atip</KBD></DD>
|
||||
<DD>$<KBD> cdrskin dev=/dev/hdc -minfo</KBD></DD>
|
||||
|
||||
<DT>Prepare CD-RW or DVD-RW for re-use, DVD-RAM or BD-RE for first use:</DT>
|
||||
<DD>$<KBD> cdrskin -v dev=/dev/sg1 blank=as_needed -eject</KBD></DD>
|
||||
|
||||
<DT>Format DVD-RW to avoid need for blanking before re-use:</DT>
|
||||
<DD>$<KBD> cdrskin -v dev=/dev/sr0 blank=format_overwrite</KBD></DD>
|
||||
|
||||
<DT>De-format DVD-RW to make it capable of multi-session again:</DT>
|
||||
<DD>$<KBD> cdrskin -v dev=/dev/sr0 blank=deformat_sequential</KBD></DD>
|
||||
|
||||
<DT>Write ISO-9660 filesystem image as only one to blank or formatted media:
|
||||
</DT>
|
||||
<DD>$<KBD> cdrskin -v dev=/dev/hdc speed=12 fs=8m \</KBD></DD>
|
||||
<DD><KBD> blank=as_needed -eject padsize=300k my_image.iso</KBD></DD>
|
||||
|
||||
<DT>Write compressed afio archive on-the-fly
|
||||
(not DVD-R DL or minimally blanked DVD-RW):</DT>
|
||||
<DD>$<KBD> find . | afio -oZ - | \</KBD></DD>
|
||||
<DD><KBD> cdrskin -v dev=0,1,0 fs=32m speed=8 \</KBD></DD>
|
||||
<DD><KBD> blank=as_needed padsize=300k -</KBD></DD>
|
||||
|
||||
<DT>Write several sessions to the same CD, DVD-R[W] or DVD+R[/DL]:</DT>
|
||||
<DD>$<KBD> cdrskin dev=/dev/hdc -v padsize=300k -multi 1.iso</KBD>
|
||||
</DD>
|
||||
<DD>$<KBD> cdrskin dev=/dev/hdc -v padsize=300k -multi 2.iso</KBD>
|
||||
</DD>
|
||||
<DD>$<KBD> cdrskin dev=/dev/hdc -v padsize=300k -multi 3.iso</KBD>
|
||||
</DD>
|
||||
<DD>$<KBD> cdrskin dev=/dev/hdc -v padsize=300k 4.iso</KBD></DD>
|
||||
|
||||
<DT>Get multi-session info for option -C of program mkisofs:</DT>
|
||||
<DD>$<KBD> c_values=$(cdrskin dev=/dev/sr0 -msinfo 2>/dev/null)</KBD></DD>
|
||||
<DD>$<KBD> mkisofs ... -C "$c_values" ...</KBD></DD>
|
||||
|
||||
<DT>Inquire free space on media for a -multi run:</DT>
|
||||
<DD>$<KBD> x=$(cdrskin dev=/dev/sr0 -multi \</KBD></DD>
|
||||
<DD><KBD> --tell_media_space 2>/dev/null)</KBD></DD>
|
||||
<DD>$<KBD> echo "Available: $x blocks of 2048 data bytes"</KBD></DD>
|
||||
|
||||
<DT>Accelerate BD-RE writing to full nominal speed after the first 250 MB</DT>
|
||||
<DD>$<KBD> cdrskin ... stream_recording=250m ...</KBD>
|
||||
|
||||
<DT>Write audio tracks to CD:</DT>
|
||||
<DD>$<KBD> cdrskin -v dev=ATA:1,0,0 speed=48 -sao \</KBD></DD>
|
||||
<DD><KBD> track1.wav track2.au -audio -swab track3.raw</KBD></DD>
|
||||
|
||||
<DT>Get overview of the cdrecord compatible options:</DT>
|
||||
<DD>$<KBD> <A HREF="cdrskin_help">cdrskin -help</A></KBD></DD>
|
||||
|
||||
<DT>Get overview of the non-cdrecord options:</DT>
|
||||
<DD>$<KBD> <A HREF="cdrskin__help">cdrskin --help</A></KBD></DD>
|
||||
|
||||
<DT>Read the detailed manual page:</DT>
|
||||
<DD>$<KBD> <A HREF="man_1_cdrskin.html">man cdrskin</A></KBD></DD>
|
||||
</DL>
|
||||
<DL>
|
||||
<DT>Read about the standard for which cdrskin is striving:</DT>
|
||||
<DD>$<KBD>
|
||||
<A HREF="http://cdrecord.berlios.de/old/private/man/cdrecord-2.0.html">
|
||||
man cdrecord</A></KBD></DD>
|
||||
<DD><B>Do not bother Joerg Schilling with any cdrskin problems.</B>
|
||||
(Be cursed if you install cdrskin as "cdrecord" without clearly forwarding
|
||||
this "don't bother Joerg" demand.)
|
||||
</DD>
|
||||
</DL>
|
||||
<DL>
|
||||
<DT>Learn to know a more versatile way to burn ISO 9660 formatted data</DT>
|
||||
<DD>
|
||||
Standalone ISO 9660 multi-session CD/DVD/BD tool
|
||||
<A HREF="http://scdbackup.sourceforge.net/xorriso_eng.html">xorriso</A>.
|
||||
</DD>
|
||||
</DL>
|
||||
|
||||
</P>
|
||||
|
||||
<HR>
|
||||
|
||||
<A NAME="download"></A>
|
||||
|
||||
<P>
|
||||
<DL>
|
||||
<DT>Download as source code (see README):</DT>
|
||||
<DD><A HREF="cdrskin-1.3.8.tar.gz">cdrskin-1.3.8.tar.gz</A>
|
||||
(975 KB).
|
||||
</DD>
|
||||
<DD><A HREF="cdrskin-1.3.8.tar.gz.sig">cdrskin-1.3.8.tar.gz.sig</A></DD>
|
||||
<DD>
|
||||
(detached GPG signature for verification by
|
||||
<KBD>gpg --verify cdrskin-1.3.8.tar.gz.sig cdrskin-1.3.8.tar.gz</KBD>
|
||||
<BR>
|
||||
after <KBD>gpg --keyserver keys.gnupg.net --recv-keys ABC0A854</KBD>).
|
||||
</DD>
|
||||
<DD>
|
||||
The cdrskin tarballs are source code identical with libburn releases
|
||||
of the same version number.
|
||||
They get produced via a different procedure, though.<BR>
|
||||
cdrskin is part of libburn - full libburn is provided with cdrskin releases.
|
||||
</DD>
|
||||
|
||||
<!-- This is not offered any more since spring 2008
|
||||
<DD> </DD>
|
||||
<DT>Download as single x86 binaries (untar and move to /usr/bin/cdrskin):</DT>
|
||||
<DD><A HREF="cdrskin_0.4.2.pl00-x86-suse9_0.tar.gz">
|
||||
cdrskin_0.4.2.pl00-x86-suse9_0.tar.gz</A>, (110 KB),
|
||||
<DL>
|
||||
<DD>runs on SuSE 9.0 (2.4.21) , RIP-14.4 (2.6.14) ,
|
||||
Gentoo (2.6.15 x86_64 Athlon).</DD>
|
||||
</DL>
|
||||
<DD><A HREF="cdrskin_0.4.2.pl00-x86-suse9_0-static.tar.gz">
|
||||
cdrskin_0.4.2.pl00-x86-suse9_0-static.tar.gz</A>, (310 KB), -static compiled,
|
||||
<DL>
|
||||
<DD>runs on SuSE 7.2 (2.4.4), and on the systems above.</DD>
|
||||
</DL>
|
||||
</DD>
|
||||
-->
|
||||
|
||||
|
||||
</DL>
|
||||
<DL><DT>Documentation:</DT>
|
||||
<DD><A HREF="README_cdrskin">README</A> an introduction</DD>
|
||||
<DD><A HREF="cdrskin__help">cdrskin --help</A> non-cdrecord options</DD>
|
||||
<DD><A HREF="cdrskin_help">cdrskin -help</A> cdrecord compatible options</DD>
|
||||
<DD><A HREF="man_1_cdrskin.html">man cdrskin</A> the manual page</DD>
|
||||
<DD> </DD>
|
||||
</DL>
|
||||
<DL><DT>Contact:</DT>
|
||||
<DD>Thomas Schmitt, <A HREF="mailto:scdbackup@gmx.net">scdbackup@gmx.net</A></DD>
|
||||
<DD>libburn development mailing list,
|
||||
<A HREF="mailto:libburn-hackers@pykix.org">libburn-hackers@pykix.org</A></DD>
|
||||
</DL>
|
||||
<DL><DT>License:</DT>
|
||||
<DD><A HREF="COPYING_cdrskin">GPL</A>, an <A HREF="http://www.opensource.org/">Open Source</A> approved license</DD>
|
||||
<DD> </DD>
|
||||
</DL>
|
||||
</P>
|
||||
|
||||
<HR>
|
||||
|
||||
<P>
|
||||
Enhancements towards previous stable version cdrskin-1.3.6.pl01:
|
||||
<UL>
|
||||
<LI>none</LI>
|
||||
<!--
|
||||
<LI>none</LI>
|
||||
-->
|
||||
</UL>
|
||||
|
||||
Bug fixes towards cdrskin-1.3.6.pl01:
|
||||
<UL>
|
||||
<LI>Minimum drive buffer fill was measured by cdrskin before the buffer could get full</LI>
|
||||
<LI>Wrong stack usage caused SIGBUS on sparc when compiled by gcc -O2</LI>
|
||||
<LI>A failed blank run did not cause an error indication</LI>
|
||||
<LI>A final fsync(2) was performed with stdio drives, even if not desired</LI>
|
||||
<!--
|
||||
<LI>none</LI>
|
||||
-->
|
||||
</UL>
|
||||
|
||||
<HR>
|
||||
|
||||
<P>
|
||||
<DL>
|
||||
<DT><H3>Development snapshot, version 1.3.9 :</H3></DT>
|
||||
<DD>Enhancements towards current stable version 1.3.8:
|
||||
<UL>
|
||||
<LI>none yet</LI>
|
||||
<!--
|
||||
<LI>none yet</LI>
|
||||
-->
|
||||
</UL>
|
||||
</DD>
|
||||
|
||||
<DD>Bug fixes towards cdrskin-1.3.8:
|
||||
<UL>
|
||||
<LI>none yet</LI>
|
||||
<!--
|
||||
<LI>none yet</LI>
|
||||
-->
|
||||
</UL>
|
||||
</DD>
|
||||
|
||||
<DD> </DD>
|
||||
<DD><A HREF="README_cdrskin_devel">README 1.3.9</A>
|
||||
<DD><A HREF="cdrskin__help_devel">cdrskin-1.3.9 --help</A></DD>
|
||||
<DD><A HREF="cdrskin_help_devel">cdrskin-1.3.9 -help</A></DD>
|
||||
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.3.9)</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>
|
||||
<DD>Download: <KBD><B>svn co http://svn.libburnia-project.org/libburn/trunk libburn</B>
|
||||
</KBD></DD>
|
||||
<DD>Build: <KBD><B>cd libburn ; ./bootstrap ; ./configure --prefix /usr ; make ; cdrskin/compile_cdrskin.sh</B>
|
||||
</KBD></DD>
|
||||
<DD>Build of SVN versions needs <A HREF="http://sources.redhat.com/autobook/">
|
||||
autotools</A> of at least version 1.7 installed.
|
||||
But after the run of <KBD>./bootstrap</KBD>, only
|
||||
vanilla tools like make and gcc are needed.</DD>
|
||||
</DD>
|
||||
<DD> </DD>
|
||||
<DT>The following download is intended for adventurous end users or
|
||||
admins with full system sovereignty.</DT>
|
||||
<DD>Source (./bootstrap is already applied, build tested, for more see
|
||||
<A HREF="README_cdrskin_devel">upcoming README</A> ):
|
||||
</DD>
|
||||
<DD>
|
||||
<A HREF="cdrskin-1.3.9.tar.gz">cdrskin-1.3.9.tar.gz</A>
|
||||
(975 KB).
|
||||
</DD>
|
||||
|
||||
<!-- This is not offered any more since spring 2008
|
||||
|
||||
<DT>The following downloads are intended for adventurous end users or
|
||||
admins with full system souvereignty.</DT>
|
||||
<DD>Binary (untar and move to /usr/bin/cdrskin):</DD>
|
||||
<DD><A HREF="cdrskin_0.4.3-x86-suse9_0.tar.gz">
|
||||
cdrskin_0.4.3-x86-suse9_0.tar.gz</A>, (110 KB).
|
||||
</DD>
|
||||
<DD><A HREF="cdrskin_0.4.3-x86-suse9_0-static.tar.gz">
|
||||
cdrskin_0.4.3-x86-suse9_0-static.tar.gz</A>, (310 KB)
|
||||
</DD>
|
||||
-->
|
||||
|
||||
</DL>
|
||||
</P>
|
||||
|
||||
<HR>
|
||||
|
||||
<P>
|
||||
Many thanks to Joerg Schilling for cdrecord,
|
||||
<BR>
|
||||
and to Derek Foreman and Ben Jansens for creating libburn.
|
||||
<BR>
|
||||
Historic versions based on Derek's and Ben's
|
||||
<A HREF="http://icculus.org/burn">icculus.org/burn</A> :<BR>
|
||||
<A HREF="cdrskin-0.1.2.0.2.ts.tar.gz">cdrskin-0.1.2.0.2.ts.tar.gz</A><BR>
|
||||
<A HREF="cdrskin-0.1.3.0.2.ts.tar.gz">cdrskin-0.1.3.0.2.ts.tar.gz</A>
|
||||
<BR>
|
||||
Very special thanks to Andy Polyakov whose
|
||||
<A HREF="http://fy.chalmers.se/~appro/linux/DVD+RW/tools">dvd+rw-tools</A>
|
||||
provide libburn with invaluable examples on how to deal with DVD and BD media.
|
||||
</P>
|
||||
|
||||
<HR>
|
||||
|
||||
<A NAME="examples">
|
||||
<P>
|
||||
<DL>
|
||||
<DT>Example for a setup of device permissions.</DT>
|
||||
<DT>
|
||||
Newer Linux distros enable rw-access for the desktop user automatically.
|
||||
So try as normal user whether all your drives are found.
|
||||
CD devices which offer no rw-permission will stay invisible.
|
||||
</DT>
|
||||
<DD>$ <KBD><B>cdrskin --devices</B></KBD></DD>
|
||||
<DT>If not all desired drives show up, become superuser and do again:</DT>
|
||||
</DT>
|
||||
<DD># <KBD><B>cdrskin --devices</B></KBD></DD>
|
||||
<DD><KBD>...</KBD></DD>
|
||||
<DD><KBD>0 dev='/dev/sr0' rwr-r- : 'TEAC' 'CD-ROM CD-532S'</KBD></DD>
|
||||
<DD><KBD>1 dev='/dev/hdc' rwrw-- : 'LITE-ON' 'LTR-48125S'</KBD></DD>
|
||||
<DT>Most simple and most insecure is this equivalent
|
||||
of the usual cdrecord permissions u+s,a+x:</DT>
|
||||
<DD># <KBD><B>chmod a+rw /dev/sr0 /dev/hdc</B></KBD></DD>
|
||||
<DT>
|
||||
More secure is to put the permitted users into a group like
|
||||
"floppy", to assign /dev/sr0 /dev/hdc to this group,
|
||||
and to allow rw-access only to group members.
|
||||
</DT>
|
||||
<DD># <KBD><B>vi /etc/group</B></KBD></DD>
|
||||
<DD><KBD>...</KBD></DD>
|
||||
<DD><KBD>floppy:x:19:thomas,scdbackup</KBD></DD>
|
||||
<DD><KBD>...</KBD></DD>
|
||||
<DD># <KBD><B>chgrp floppy /dev/sr0 /dev/hdc</B></KBD></DD>
|
||||
<DD># <KBD><B>chmod g+rw /dev/sr0 /dev/hdc</B></KBD></DD>
|
||||
</DL>
|
||||
</P>
|
||||
|
||||
<HR>
|
||||
|
||||
<A NAME="k3b">
|
||||
<P>
|
||||
<A HREF="k3b_on_cdrskin.html">
|
||||
Example how to setup K3b to use cdrskin for burning data CD projects.
|
||||
<A><BR>
|
||||
(<A HREF="http://www.k3b.org">K3b</A>
|
||||
is a GUI frontend which uses cdrecord for CD burning.)
|
||||
</P>
|
||||
|
||||
<!--
|
||||
|
||||
<HR>
|
||||
|
||||
<A NAME="scdbackup">
|
||||
<P>
|
||||
<DL>
|
||||
<DT>Example for a test session with a cdrecord based scdbackup installation:</DT>
|
||||
<DD>$ <KBD><B>cdrskin -scanbus</B></KBD></DD>
|
||||
<DD><KBD>...</KBD></DD>
|
||||
<DD><KBD> 2,0,0 0) 'TEAC' 'CD-ROM CD-532S' '?' Removable CD-ROM</KBD></DD>
|
||||
<DD>$ <KBD><B>cdrskin -scanbus dev=ATA</B></KBD></DD>
|
||||
<DD><KBD>...</KBD></DD>
|
||||
<DD><KBD> 1,0,0 1) 'LITE-ON' 'LTR-48125S' '?' Removable CD-ROM</KBD></DD>
|
||||
<DD>$ <KBD><B>export SCDBACKUP_SCSI_ADR="ATA:1,0,0"</B></KBD></DD>
|
||||
<DD>$ <KBD><B>export SCDBACKUP_CDRECORD="cdrskin -v -v"</B></KBD></DD>
|
||||
<DD>$ <KBD><B>scdbackup_home</B></KBD></DD>
|
||||
</DL>
|
||||
<DL>
|
||||
<DT>Example for a permanent configuration of cdrskin based scdbackup</DT>
|
||||
<DD>$ <KBD><B>cd scdbackup-0.8.6/inst</B></KBD></DD>
|
||||
<DD>$ <KBD><B>export SCDBACKUP_USE_CDRSKIN=1</B></KBD></DD>
|
||||
<DD>$ <KBD><B>./CONFIGURE_CD</B></KBD></DD>
|
||||
<DD><KBD>...</KBD></DD>
|
||||
<DD><KBD>cdrskin 0.3.8 : limited cdrecord compatibility wrapper for libburn</KBD></DD>
|
||||
</DL>
|
||||
If your system is stricken with some ill CD device then this can stall
|
||||
and you will have to press <KBD>Ctrl+C</KBD> to abort.
|
||||
In this case, you may execute
|
||||
<KBD>export SCDBACKUP_NO_SCANBUS=1</KBD>
|
||||
and try again.
|
||||
<DL>
|
||||
<DT></DT>
|
||||
<DD><KBD> ------------------- SCSI devices. To be used like 0,0,0</KBD></DD>
|
||||
<DD><KBD> 2,0,0 0) 'TEAC' 'CD-ROM CD-532S' '?' Removable CD-ROM</KBD></DD>
|
||||
<DD><KBD> ------------------- end of SCSI device list</KBD></DD>
|
||||
<DD><KBD> ------------------- ATA devices. To be used like ATA:0,0,0
|
||||
<DD><KBD> 1,0,0 1) 'LITE-ON' 'LTR-48125S' '?' Removable CD-ROM</KBD></DD>
|
||||
<DD><KBD>...</KBD></DD>
|
||||
<DD><KBD> * Your cdrecord offers -driveropts=burnfree with your recorder.</KBD></DD>
|
||||
<DD><KBD>...</KBD></DD>
|
||||
<DD><KBD>scdbackup for CD 0.8.6 : First stage of installation done.</KBD></DD>
|
||||
<DD><KBD>...</KBD></DD>
|
||||
<DD><KBD>Now give it a try. Run : scdbackup_home</KBD></DD>
|
||||
<DD>$ <KBD><B>unset SCDBACKUP_USE_CDRSKIN</B></KBD></DD>
|
||||
</DL>
|
||||
<DL>
|
||||
<DT>To get back to using cdrecord :</DT>
|
||||
<DD>$ <KBD><B>cd scdbackup-0.8.6/inst</B></KBD></DD>
|
||||
<DD>$ <KBD><B>export SCDBACKUP_USE_CDRSKIN=0</B></KBD></DD>
|
||||
<DD>$ <KBD><B>./CONFIGURE_CD</B></KBD></DD>
|
||||
<DD><KBD>...</KBD></DD>
|
||||
<DD>$ <KBD><B>unset SCDBACKUP_USE_CDRSKIN</B></KBD></DD>
|
||||
</DL>
|
||||
</P>
|
||||
|
||||
-->
|
||||
|
||||
<HR>
|
||||
|
||||
<A NAME="cdrecord">
|
||||
<P>
|
||||
<CENTER><H3>About the relationship of cdrecord and cdrskin</H3></CENTER>
|
||||
First of all: this relationship is single sided, as cdrskin has to be aware of
|
||||
cdrecord but not vice versa.
|
||||
<BR>
|
||||
<BR>
|
||||
I was a long time user of cdrecord and it worked fine for me.
|
||||
Especially i do appreciate its write mode -tao which allows to pipe arbitrary
|
||||
data on CD and CD-RW via stdin. cdrecord is reliable, versatile and well
|
||||
maintained. So for me - there would be no problem with using it for
|
||||
burning CDs.
|
||||
<BR>
|
||||
But the author of cdrecord and the Linux kernel people foster a very hostile
|
||||
relationship. Ok, that's their business, not mine (or ours if you are with me).
|
||||
One has to be aware, though, that this relationship might lead to a situation
|
||||
where cdrecord is no longer available for certain Linux kernels.
|
||||
<BR>
|
||||
To have my own project prepared for such a time, i began to implement its
|
||||
cdrecord gestures on top of libburn.
|
||||
From now on i invite other interested users of cdrecord to teach cdrskin
|
||||
the gestures necessary for their cdrecord applications.
|
||||
Contact me. Let's see what we can achieve.
|
||||
<BR>
|
||||
<BR>
|
||||
libburn and cdrskin are now mature enough to substitute cdrecord in its
|
||||
major use cases of CD and DVD burning. It is possible to foist cdrskin on
|
||||
various software packages if it gets falsely named "cdrecord".
|
||||
I do not encourage this approach, but of course such a replacement
|
||||
opportunity is the goal of a cdrecord compatibility wrapper.
|
||||
<BR>
|
||||
<BR>
|
||||
It is very important to me that this project is not perceived as hostile
|
||||
towards Joerg Schilling and his ongoing work.
|
||||
I owe him much. For cdrecord, for mkisofs, for star. Chapeau.
|
||||
<BR>
|
||||
</P>
|
||||
<HR>
|
||||
|
||||
<CENTER><FONT SIZE=+0>
|
||||
<!-- <A NAME="bottom" HREF="main_ger.html#bottom">deutsch (german)</A>
|
||||
<BR><BR>
|
||||
-->
|
||||
<A HREF="http://en.wikipedia.org/wiki/D%C3%B6ner_kebab">
|
||||
<IMG SRC="doener_150x200_tr.png" BORDER=0
|
||||
ALT="cdrskin logo: Doener mit Scharf"></A>
|
||||
<BR><BR>
|
||||
<FONT SIZE=+0>Enjoying free Open Source hosting by <A HREF="http://www.webframe.org">www.webframe.org</A><BR>
|
||||
<A HREF="http://www.webframe.org">
|
||||
<IMG SRC="msfree.gif" ALT="100 % Microsoft free" BORDER=0></A><BR>
|
||||
and by <A HREF="http://sourceforge.net">sourceforge.net</A><BR>
|
||||
<A href="http://sourceforge.net">
|
||||
<IMG src="sflogo-88-1.png" BORDER="0" ALT="SourceForge Logo"></A>
|
||||
<!-- on sourceforge use : <IMG src="http://sourceforge.net/sflogo.php?group_id=16010" width="88" height="31" border="0" alt="SourceForge Logo"></A> -->
|
||||
|
||||
<!--
|
||||
<P>
|
||||
Enjoying a FreeBSD shell account with the opportunity to
|
||||
build and install cdrskin at<BR>
|
||||
<A HREF="http://www.en.free-shells.com.ar">free-shells.com.ar</A>
|
||||
</P>
|
||||
-->
|
||||
|
||||
</FONT></CENTER>
|
||||
<HR>
|
||||
<DL>
|
||||
<DT>Links to my other published software projects :
|
||||
<DD><A HREF="http://scdbackup.webframe.org/xorriso_eng.html">
|
||||
xorriso, a standalone ISO 9660 multi-session CD/DVD/BD burn tool.
|
||||
No mkisofs needed.
|
||||
<DL>
|
||||
<DD>
|
||||
<A HREF="http://scdbackup.sourceforge.net/xorriso_eng.html">
|
||||
(a second source of above)</A>
|
||||
</DD>
|
||||
</DL>
|
||||
</DD>
|
||||
<DD><A HREF=http://scdbackup.webframe.org/main_eng.html>
|
||||
scdbackup, multi volume CD backup</A>
|
||||
<DL><DD><A HREF=http://scdbackup.sourceforge.net/main_eng.html>
|
||||
(a second source of above)</A></DD></DL></DD>
|
||||
<DD><A HREF=http://stic.sourceforge.net>Some Tools for Image Collectors</A>
|
||||
</DD>
|
||||
<DD><A HREF=http://scdbackup.webframe.org/pppoem>
|
||||
pppoem, a DSL throughput monitor (mainly for Linux kernel 2.4)</A>
|
||||
</DD>
|
||||
</DL>
|
||||
<BR><BR>
|
||||
Legal statement: This website does not serve any commercial purpose.<BR>
|
||||
</FONT>
|
||||
</BODY>
|
||||
</HTML>
|
|
@ -0,0 +1 @@
|
|||
#define Cdrskin_timestamP "2015.05.17.083420"
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,216 @@
|
|||
/*
|
||||
cleanup.c , Copyright 2006 Thomas Schmitt <scdbackup@gmx.net>
|
||||
|
||||
A signal handler which cleans up an application and exits.
|
||||
|
||||
Provided under GPL license within GPL projects, BSD license elsewise.
|
||||
*/
|
||||
|
||||
/*
|
||||
cc -g -o cleanup -DCleanup_standalonE cleanup.c
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <signal.h>
|
||||
typedef void (*sighandler_t)(int);
|
||||
|
||||
|
||||
#include "cleanup.h"
|
||||
|
||||
|
||||
#ifndef Cleanup_has_no_libburn_os_H
|
||||
|
||||
|
||||
#include "../libburn/os.h"
|
||||
|
||||
/* see os.h for name of particular os-*.h where this is defined */
|
||||
static int signal_list[]= { BURN_OS_SIGNAL_MACRO_LIST , -1};
|
||||
static char *signal_name_list[]= { BURN_OS_SIGNAL_NAME_LIST , "@"};
|
||||
static int signal_list_count= BURN_OS_SIGNAL_COUNT;
|
||||
static int non_signal_list[]= { BURN_OS_NON_SIGNAL_MACRO_LIST, -1};
|
||||
static int non_signal_list_count= BURN_OS_NON_SIGNAL_COUNT;
|
||||
|
||||
|
||||
#else /* ! Cleanup_has_no_libburn_os_H */
|
||||
|
||||
|
||||
/* Outdated. Linux only. For backward compatibility with pre-libburn-0.2.3 */
|
||||
|
||||
/* Signals to be caught */
|
||||
static int signal_list[]= {
|
||||
SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT,
|
||||
SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM,
|
||||
SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN,
|
||||
SIGTTOU,
|
||||
SIGBUS, SIGPOLL, SIGPROF, SIGSYS, SIGTRAP,
|
||||
SIGVTALRM, SIGXCPU, SIGXFSZ, -1
|
||||
};
|
||||
static char *signal_name_list[]= {
|
||||
"SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT",
|
||||
"SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM",
|
||||
"SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN",
|
||||
"SIGTTOU",
|
||||
"SIGBUS", "SIGPOLL", "SIGPROF", "SIGSYS", "SIGTRAP",
|
||||
"SIGVTALRM", "SIGXCPU", "SIGXFSZ", "@"
|
||||
};
|
||||
static int signal_list_count= 24;
|
||||
|
||||
/* Signals not to be caught */
|
||||
static int non_signal_list[]= {
|
||||
SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH, -1
|
||||
};
|
||||
static int non_signal_list_count= 5;
|
||||
|
||||
|
||||
#endif /* Cleanup_has_no_libburn_os_H */
|
||||
|
||||
|
||||
|
||||
/* run time dynamic part */
|
||||
static char cleanup_msg[4096]= {""};
|
||||
static int cleanup_exiting= 0;
|
||||
static int cleanup_has_reported= -1234567890;
|
||||
|
||||
static void *cleanup_app_handle= NULL;
|
||||
static Cleanup_app_handler_T cleanup_app_handler= NULL;
|
||||
static int cleanup_perform_app_handler_first= 0;
|
||||
|
||||
|
||||
static int Cleanup_handler_exit(int exit_value, int signum, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(cleanup_msg[0]!=0 && cleanup_has_reported!=signum) {
|
||||
fprintf(stderr,"\n%s\n",cleanup_msg);
|
||||
cleanup_has_reported= signum;
|
||||
}
|
||||
if(cleanup_perform_app_handler_first)
|
||||
if(cleanup_app_handler!=NULL) {
|
||||
ret= (*cleanup_app_handler)(cleanup_app_handle,signum,0);
|
||||
if(ret==2 || ret==-2)
|
||||
return(2);
|
||||
}
|
||||
if(cleanup_exiting) {
|
||||
fprintf(stderr,"cleanup: ABORT : repeat by pid=%d, signum=%d\n",
|
||||
getpid(),signum);
|
||||
return(0);
|
||||
}
|
||||
cleanup_exiting= 1;
|
||||
alarm(0);
|
||||
if(!cleanup_perform_app_handler_first)
|
||||
if(cleanup_app_handler!=NULL) {
|
||||
ret= (*cleanup_app_handler)(cleanup_app_handle,signum,0);
|
||||
if(ret==2 || ret==-2)
|
||||
return(2);
|
||||
}
|
||||
exit(exit_value);
|
||||
}
|
||||
|
||||
|
||||
static void Cleanup_handler_generic(int signum)
|
||||
{
|
||||
int i;
|
||||
|
||||
sprintf(cleanup_msg,"UNIX-SIGNAL caught: %d errno= %d",signum,errno);
|
||||
for(i= 0; i<signal_list_count; i++)
|
||||
if(signum==signal_list[i]) {
|
||||
sprintf(cleanup_msg,"UNIX-SIGNAL: %s errno= %d",
|
||||
signal_name_list[i],errno);
|
||||
break;
|
||||
}
|
||||
Cleanup_handler_exit(1,signum,0);
|
||||
}
|
||||
|
||||
|
||||
int Cleanup_set_handlers(void *handle, Cleanup_app_handler_T handler, int flag)
|
||||
/*
|
||||
bit0= set to default handlers
|
||||
bit1= set to ignore
|
||||
bit2= set cleanup_perform_app_handler_first
|
||||
bit3= set SIGABRT to handler (makes sense with bits 0 or 1)
|
||||
*/
|
||||
{
|
||||
int i,j,max_sig= -1,min_sig= 0x7fffffff;
|
||||
sighandler_t sig_handler;
|
||||
|
||||
cleanup_msg[0]= 0;
|
||||
cleanup_app_handle= handle;
|
||||
cleanup_app_handler= handler;
|
||||
|
||||
/* <<< make cleanup_exiting thread safe to get rid of this */
|
||||
if(flag&4)
|
||||
cleanup_perform_app_handler_first= 1;
|
||||
|
||||
|
||||
if(flag&1)
|
||||
sig_handler= SIG_DFL;
|
||||
else if(flag&2)
|
||||
sig_handler= SIG_IGN;
|
||||
else
|
||||
sig_handler= Cleanup_handler_generic;
|
||||
/* set all signal numbers between the lowest and highest in the list
|
||||
except those in the non-signal list */
|
||||
for(i= 0; i<signal_list_count; i++) {
|
||||
if(signal_list[i]>max_sig)
|
||||
max_sig= signal_list[i];
|
||||
if(signal_list[i]<min_sig)
|
||||
min_sig= signal_list[i];
|
||||
}
|
||||
for(i= min_sig; i<=max_sig; i++) {
|
||||
for(j= 0; j<non_signal_list_count; j++)
|
||||
if(i==non_signal_list[j])
|
||||
break;
|
||||
if(j>=non_signal_list_count) {
|
||||
if(i==SIGABRT && (flag&8))
|
||||
signal(i,Cleanup_handler_generic);
|
||||
else
|
||||
signal(i,sig_handler);
|
||||
}
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
#ifdef Cleanup_standalonE
|
||||
|
||||
struct Demo_apP {
|
||||
char *msg;
|
||||
};
|
||||
|
||||
|
||||
int Demo_app_handler(struct Demo_apP *demoapp, int signum, int flag)
|
||||
{
|
||||
printf("Handling exit of demo application on signal %d. msg=\"%s\"\n",
|
||||
signum,demoapp->msg);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
main()
|
||||
{
|
||||
struct Demo_apP demoapp;
|
||||
|
||||
demoapp.msg= "Good Bye";
|
||||
Cleanup_set_handlers(&demoapp,(Cleanup_app_handler_T) Demo_app_handler,0);
|
||||
|
||||
if(1) { /* change to 0 in order to wait for external signals */
|
||||
char *cpt= NULL, c= ' ';
|
||||
printf("Intentionally provoking SIGSEGV ...\n");
|
||||
c= *cpt;
|
||||
printf("Strange: The system ignored a SIGSEGV: c= %u\n", (unsigned int) c);
|
||||
} else {
|
||||
printf("killme: %d\n",getpid());
|
||||
sleep(3600);
|
||||
}
|
||||
|
||||
Cleanup_set_handlers(NULL,NULL,1);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
#endif /* Cleanup_standalonE */
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
cleanup.c , Copyright 2006 Thomas Schmitt <scdbackup@gmx.net>
|
||||
|
||||
A signal handler which cleans up an application and exits.
|
||||
|
||||
Provided under GPL license within GPL projects, BSD license elsewise.
|
||||
*/
|
||||
|
||||
#ifndef Cleanup_includeD
|
||||
#define Cleanup_includeD 1
|
||||
|
||||
|
||||
/** Layout of an application provided cleanup function using an application
|
||||
provided handle as first argument and the signal number as second
|
||||
argument. The third argument is a flag bit field with no defined bits yet.
|
||||
If the handler returns 2 or -2 then it has delegated exit() to some other
|
||||
instance and the Cleanup handler shall return rather than exit.
|
||||
*/
|
||||
typedef int (*Cleanup_app_handler_T)(void *, int, int);
|
||||
|
||||
|
||||
/** Establish exiting signal handlers on (hopefully) all signals that are
|
||||
not ignored by default or non-catchable.
|
||||
@param handle Opaque object which knows how to cleanup application
|
||||
@param handler Function which uses handle to perform application cleanup
|
||||
@param flag Control Bitfield
|
||||
bit0= reset to default signal handling
|
||||
*/
|
||||
int Cleanup_set_handlers(void *handle, Cleanup_app_handler_T handler,
|
||||
int flag);
|
||||
|
||||
|
||||
#endif /* ! Cleanup_includeD */
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue