Compare commits

...

107 Commits

Author SHA1 Message Date
b3bd643d7b Documented changes and release timestamp 2008-08-20 09:13:04 +00:00
30721ca007 Updated cdrskin tarball generator 2008-08-20 09:02:58 +00:00
e98cd4704b Made number transition to 0.5.2 and activated development documentation 2008-08-20 09:01:22 +00:00
3b5ad306c1 Just me again, move along, nothing to see here 2008-08-19 17:26:05 +00:00
f64ed23a98 Reacted on harmless compiler warning 2008-08-19 12:36:10 +00:00
730c1555ab API clarification about CD burn_toc_entries 2008-08-19 12:26:48 +00:00
acd7dbc5c6 New flag bit2 with burn_read_data() 2008-08-09 07:19:54 +00:00
6dc9ecbcad CD burn_toc_entries now bear extension_valid data 2008-08-09 07:18:53 +00:00
5a99f9c4d8 Updated for next 0.5.1 cycle 2008-08-05 18:11:09 +00:00
ea17318e18 Taking into respect drive list from /proc/sys/dev/cdrom/info 2008-08-05 18:00:37 +00:00
98d742a4ef Avoiding drive scan if single drive is given 2008-08-01 10:10:13 +00:00
332a92ac78 Documented changes and release timestamp 2008-07-16 09:14:28 +00:00
6c50416d3c Updated cdrskin tarball generator 2008-07-16 09:13:36 +00:00
91d678a503 Made number transition to 0.5.1 and activated development documentation 2008-07-16 09:12:22 +00:00
76e85e600c Followed hint of Giulio Orsero to recognize disk by /proc/ide/hdX/media 2008-07-14 16:44:59 +00:00
9d48bb6892 New API call burn_fifo_peek_data() 2008-07-14 11:38:22 +00:00
38f0399fff Did LT_CURRENT++, LT_AGE++ because of new API call 2008-07-14 11:31:16 +00:00
39198ff8cb Making visible the new NOTE and HINT about busy alleged hard disks 2008-07-14 11:30:09 +00:00
67ca4a251a Trying to avoid SORRY messages when hitting busy hard disk /dev/hdX 2008-07-14 11:28:55 +00:00
b1c6953b61 With auto device family: scd is now fallback if sr does not exist 2008-07-02 09:39:02 +00:00
eb95d89272 Inserted @since tags for all functions older than 0.2.0 2008-06-14 14:06:38 +00:00
548051e53f Updated release history 2008-06-14 14:05:47 +00:00
a72b38c116 Documented changes and release timestamp 2008-05-17 12:09:02 +00:00
a67aa2ccee Updated cdrskin tarball generator 2008-05-17 12:06:38 +00:00
2fb5ea8def Made number transition to 0.4.9 2008-05-17 12:05:36 +00:00
55061cb7cf Made inability to get format list a reason to abort the program 2008-05-14 16:52:35 +00:00
4b3ec06cc4 Added format types 0x30 and 0x32 to list in API comments 2008-05-14 16:51:40 +00:00
ad6bd91b21 Bug fix: random access addressing for DVD-RAM and BD-RE did not work 2008-05-14 16:50:27 +00:00
0e2aaa2d59 Documented changes and release timestamp 2008-05-10 13:43:12 +00:00
4244a3c141 Updated cdrskin tarball generator 2008-05-10 13:41:58 +00:00
e4d30e4762 Made number transition to 0.4.7 2008-05-10 13:40:55 +00:00
2856e9c984 Changed blank examples to blank=as_needed 2008-05-09 19:42:49 +00:00
6660ef7ece Allowed BD-ROM and BD-R for read-only purposes 2008-05-09 14:51:48 +00:00
37092086d9 Documented read-only profiles CD-ROM and DVD-ROM 2008-05-09 14:31:12 +00:00
35d1394262 Declared BD-RE to be supported 2008-05-06 18:35:48 +00:00
4dec38984d Declared BD-RE to be supported 2008-05-06 18:17:05 +00:00
be0626ae9e Declared BD-RE to be supported 2008-05-06 18:10:44 +00:00
a54113267e Declared BD-RE to be supported 2008-05-06 18:08:04 +00:00
2d9d250471 Mapped undefined size to 0 with burn_disc_get_formats() and DVD-RW 2008-05-06 08:41:48 +00:00
ff7520f2f5 Avoided to report negative burn_multi_caps.start_range_high with DVD-RW 2008-05-06 08:24:11 +00:00
d0d90fc902 Updated project history 2008-05-03 11:16:12 +00:00
1d41767348 Documented newest enhancements 2008-04-27 16:36:13 +00:00
12b0fbf17c New blank type as_needed 2008-04-27 14:02:32 +00:00
44368aef6c New blank type format_if_needed 2008-04-27 08:47:55 +00:00
43b6ad6008 New blank subtypes format_defectmgt_cert_[on|off], on is default 2008-04-26 15:10:35 +00:00
f006ee5436 Enabled quick formatting with DVD-RAM, made slow formatting default with BD-RE 2008-04-26 15:07:39 +00:00
5e4da147a5 Documented newest enhancements 2008-04-25 13:44:01 +00:00
103b301b09 Incremented LT_CURRENT and LT_AGE to reflect API enhancements 2008-04-25 13:36:19 +00:00
0386feabfe Documented experimental support for BD-RE formatting 2008-04-25 13:24:39 +00:00
4e949d79fe Preparations for formatting BD-RE 2008-04-25 13:16:23 +00:00
422a97a2f2 Mentioned new features 2008-04-24 18:37:46 +00:00
a52ea438a5 Wrote down what was learned about DVD-RAM formatting 2008-04-24 18:37:02 +00:00
62f41452bb New blank type blank=format_by_index_<number> 2008-04-23 11:02:11 +00:00
015bc00a91 New option --list_formats 2008-04-22 20:10:38 +00:00
d6fde26824 Adjustments with DVD-RAM formatting 2008-04-22 16:13:05 +00:00
1cfb29f032 Adjustments with DVD-RAM formatting 2008-04-18 19:46:18 +00:00
65cf751a30 Began to implement formatting of DVD-RAM and experimentally of BD-RE 2008-04-18 09:28:16 +00:00
4683386de1 Began to implement formatting of DVD-RAM and experimentally of BD-RE 2008-04-18 09:27:16 +00:00
5d51869c3b Made burn_read_data() obey its flag bit1 2008-04-16 08:22:14 +00:00
fe8a6c6224 Some adjustments of cdrskin man page 2008-04-15 09:43:33 +00:00
db5568c03b Enforced tail padding with stream_recording, enlarged transport buffer 2008-04-15 09:42:32 +00:00
a07631c57b New option stream_recording=on|off 2008-04-12 16:46:05 +00:00
e522db6220 New API call burn_write_opts_set_stream_recording() 2008-04-12 16:42:45 +00:00
51ac900de6 Trying to fix bugs about BD-RE, macro for simulating BD-RE on DVD-RAM 2008-04-10 21:16:07 +00:00
cdea153443 Switched from configure.ac versioning to libburn.h versioning 2008-04-08 13:35:43 +00:00
0ce3f7c224 Updated cdrskin tarball generator 2008-04-08 13:34:14 +00:00
8de0a3dc6c Made number transition 2008-04-08 13:32:07 +00:00
e75e5e04b8 Corrected GPL version 2008-04-02 07:48:24 +00:00
86d5bdfef8 Got rid of a cumbersome open-close cycle with burn_read_data() on stdio: 2008-03-03 20:30:10 +00:00
c1298d82a6 Updated changelog 2008-03-01 18:48:32 +00:00
5c6366ecbd Mentioned support for DVD+R/DL. 2008-02-28 13:24:08 +00:00
616454c737 Made support for DVD+R DL official, enabled untested support for BD-RE 2008-02-28 12:32:34 +00:00
ea6957ef68 Changed meaning of unrecognized severity texts from FATAL to ALL 2008-02-22 21:38:09 +00:00
f9398c08e6 Imported changes from libiso_msgs.h 2008-02-22 21:36:08 +00:00
b4617c679c New error code 0x00040008 2008-02-22 15:10:21 +00:00
42bb74881a Weakened demand to print file path in following message 2008-02-21 21:53:26 +00:00
61671b41d7 Mapped unknown severity text to ALL rather than NEVER 2008-02-21 20:22:53 +00:00
1e74d7a04e Introduced severity ERRFILE 2008-02-21 20:14:23 +00:00
c48244abfc Directed error message to proper output channel 2008-02-21 20:11:20 +00:00
13492efe4b Testwise inquiry of ioctl(CDROM_MEDIA_CHANGED) (disabled by default) 2008-02-21 20:10:38 +00:00
bccb39efd8 Updated project interrelations 2008-02-16 12:37:09 +00:00
6fc60be93c Corrected typo in comment 2008-02-16 12:11:42 +00:00
d69b856b6a Pointed to ldconfig 2008-02-14 08:39:12 +00:00
b5e2d60c68 Updated year 2008-02-14 08:36:02 +00:00
ff1ad50119 Micro corrections in comment text 2008-02-14 07:41:51 +00:00
4cb6706307 Introduced LIBDAX_MSGS_SEV_MISHAP 2008-02-11 19:15:21 +00:00
6e74c8bc2e Allowed DVD +/- DL for reading 2008-02-08 07:34:58 +00:00
fdbed06f84 Added debug message in case of burn_read_data() return 0 2008-02-07 23:29:26 +00:00
67e4282b82 Installed a simple address logger in burn_read_data 2008-02-06 23:01:45 +00:00
bd8d4bb49f Copied usage discussion about *_header_version_* from libisoburn 2008-02-06 18:23:06 +00:00
623edf9d9d Re-instated range "vreixo" with old and new codes, adjusted severity definitions 2008-02-06 17:41:00 +00:00
d4fe8c75be Registered range "libisoburn" 0x00060000 to 0x00006ffff 2008-02-04 17:52:56 +00:00
9ebd020847 Announced deprecation of libisofs-0.2.x, temporory employment of libisofs-0.6.1 2008-02-04 17:52:06 +00:00
a93d18231a New API call burn_sev_to_text() 2008-02-03 09:25:58 +00:00
ec8b75217f Incremented LT_* to get libburn.so.4.8.0 (forgot to do 4.7.1 anyway) 2008-02-03 09:22:29 +00:00
99767afe1f Registered error code range "libisofs-xorriso" 2008-02-03 09:21:01 +00:00
024076ad54 Changed "libburn interface :" version message to libburn.h macros 2008-02-01 10:06:21 +00:00
c39e7d8ce4 Renamed libburn-5.pc to libburn-1.pc 2008-02-01 10:03:56 +00:00
95609061f1 Introduced compile time check of libburn header version 2008-01-31 11:11:50 +00:00
d498003515 Corrected description of major.minor.micro definition in libburn.h 2008-01-29 21:41:59 +00:00
b1630a3b33 Moving the major.minor.micro definition from configure.ac to libburn.h 2008-01-29 21:09:16 +00:00
eddf4e6b13 Updated cdrskin tarball generator 2008-01-27 15:18:12 +00:00
654e25d40a Made number transition to 0.4.3 , still libburn.so.4.7.0 2008-01-27 14:53:55 +00:00
69e1d4a51f Disabled debugging messages about thread properties 2008-01-26 18:03:36 +00:00
305917fe86 Made a sudden end to all stdio drives in burn_abort() 2008-01-26 13:16:12 +00:00
b3b42ff649 Ported change in vreixo message range from isoburn_msgs 2008-01-26 12:31:42 +00:00
63d1f5dcbf Adapted to man -H on my new system 2008-01-26 12:30:22 +00:00
39 changed files with 3999 additions and 634 deletions

View File

@ -1,13 +1,12 @@
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-2007 Mario Danic, Thomas Schmitt
Copyright (C) 2006-2008 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 as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
it under the terms of the GNU General Public License version 2 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

View File

@ -101,9 +101,9 @@ test_structest_CPPFLAGS = -Ilibburn
test_structest_LDADD = $(libburn_libburn_la_OBJECTS) $(THREAD_LIBS)
test_structest_SOURCES = test/structest.c
## cdrskin construction site - ts A60816 - A71025
## cdrskin construction site - ts A60816 - A80820
cdrskin_cdrskin_CPPFLAGS = -Ilibburn
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_4_1
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_5_2
# cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(THREAD_LIBS)
# ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking
@ -167,13 +167,13 @@ indent: $(indent_files)
# Extra things
nodist_pkgconfig_DATA = \
libburn-5.pc
libburn-1.pc
# http://www.nada.kth.se/cgi-bin/info?(automake.info)Man%20pages
man_MANS = cdrskin/cdrskin.1
EXTRA_DIST = \
libburn-5.pc.in \
libburn-1.pc.in \
version.h.in \
doc/comments \
doc/doxygen.conf.in \

139
README
View File

@ -6,7 +6,7 @@ This all is under GPL.
------------------------------------------------------------------------------
libburnia-project.org
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006-2007 Mario Danic, Thomas Schmitt
Copyright (C) 2006-2008 Mario Danic, Thomas Schmitt
Still containing parts of
Libburn. By Derek Foreman <derek@signalmarketing.com> and
@ -19,7 +19,7 @@ commitment as written at the end of this text.
The rights and merits of the Libburn-copyright holders Derek Foreman and
Ben Jansens will be duely respected.
This libburnia-project.org toplevel README (C) 2006-2007 Thomas Schmitt
This libburnia-project.org toplevel README (C) 2006-2008 Thomas Schmitt
------------------------------------------------------------------------------
Build and Installation
@ -39,13 +39,23 @@ into its toplevel directory (here: "libburn") and execute
./configure --prefix=/usr
make
To make the libraries accessible for running resp. developing applications
To make libburn accessible for running resp. application development,
and to install the cdrecord compatibility binary cdrskin, do:
make install
The other half of the project, libisofs, is hosted in the libburnia SVN, too:
svn co http://svn.libburnia-project.org/libisofs/trunk libisofs
See README file there.
Above procedure installs cdrskin depending on libburn.so.4 .
For a standalone cdrskin binary, see cdrskin/README.
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.
------------------------------------------------------------------------------
@ -67,29 +77,39 @@ 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 workable code base for burning CD and most single layer DVD.
The burn API is quite comprehensively documented and can be used to build a
presentable application.
We have a functional binary which emulates parts of cdrecord in order to
prove that usability, and in order to allow you to explore libburnia's scope
by help of existing cdrecord frontends.
We have a well tested code base for burning data and audio CDs and many DVD
types. The burn API is quite comprehensively documented and can be used to
build a presentable application.
We have a functional binary 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/hdX (e.g. on kernel 2.6).
/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 media via libburn.
ISO 9660 disk image. This may then be brought to CD via libburn.
libisofs is to be the foundation of our upcoming mkisofs emulation.
- 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.
- cdrskin is a limited cdrecord compatibility wrapper for libburn.
Cdrecord is a powerful GPL'ed burn program included in Joerg
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
@ -97,14 +117,34 @@ The project components (list subject to growth, hopefully):
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 and man cdrskin/cdrskin.1 for more.
See cdrskin/README for more.
- test is a collection of application gestures and examples given by the
authors of the library features. The main API example for libburn
is test/libburner.c .
- 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 deletion, renaming, and attribute
changing.
See xorriso/README for more.
- "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 plan to be a responsive upstream. Bear with us. We are still practicing.
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).
------------------------------------------------------------------------------
@ -133,7 +173,7 @@ Project history as far as known to me:
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 contibutors at
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
@ -210,6 +250,63 @@ Project history as far as known to me:
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 cdrcord 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.
------------------------------------------------------------------------------

View File

@ -4,7 +4,7 @@
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
Integrated sub project of libburnia-project.org but also published via:
http://scdbackup.sourceforge.net/cdrskin_eng.html
http://scdbackup.sourceforge.net/cdrskin-0.4.1.tar.gz
http://scdbackup.sourceforge.net/cdrskin-0.5.2.pl00.tar.gz
Copyright (C) 2006-2008 Thomas Schmitt, provided under GPL version 2.
------------------------------------------------------------------------------
@ -20,17 +20,17 @@ By using this software you agree to the disclaimer at the end of this text
Compilation, First Glimpse, Installation
Obtain cdrskin-0.4.1.tar.gz, take it to a directory of your choice and do:
Obtain cdrskin-0.5.2.pl00.tar.gz, take it to a directory of your choice and do:
tar xzf cdrskin-0.4.1.tar.gz
cd cdrskin-0.4.1
tar xzf cdrskin-0.5.2.pl00.tar.gz
cd cdrskin-0.5.2
Within that directory execute:
./configure --prefix=/usr
make
This will already produce a cdrskin binary. But it might be necessary to
This will already produce a cdrskin binary. But it will be necessary to
install libburn in order to use this binary. Installation of libburn is
beyond the scope of cdrskin. For this, see included libburn docs.
@ -44,11 +44,21 @@ Version identification and help texts available afterwards:
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
Copy your standalone binary to exactly the address which you get as reply.
E.g.:
cp cdrskin/cdrskin /usr/bin/cdrskin
@ -129,8 +139,8 @@ Obtain some info about the drive
Obtain some info about the drive and the inserted media
cdrskin dev=0,1,0 -atip -v
Make used CD-RW or used unformatted DVD-RW writeable again
cdrskin -v dev=0,1,0 blank=fast -eject
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
@ -142,18 +152,18 @@ 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
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 -tao 2.iso
cdrskin dev=/dev/hdc padsize=300k -multi -tao 3.iso
cdrskin dev=/dev/hdc padsize=300k -tao 4.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 -tao \
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).
@ -176,8 +186,6 @@ See output of command
cdrskin --list_ignored_options
If you have use cases for them, please report your wishes and expectations.
DVD support is restricted to single layer DVD for now. Double layer media
are implemented but untested.
On the other hand, the capability of multi-session and of writing streams
of unpredicted lenght surpass the current DVD capabilities of cdrecord.
@ -252,17 +260,27 @@ I myself am not into audio. So libburn-hackers@pykix.org might be the
best address for suggestions, requests and bug reports.
DVD+RW and DVD-RAM
DVD+RW , DVD-RAM , BD-RE
DVD+RW and DVD-RAM media get treated as blank media regardless wether they
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). Currently
there is no difference between -sao and -tao. If ever, then -tao will be the
mode which preserves the current behavior.
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.
Program growisofs can append to an ISO filesystem on DVD+RW by additionally
manipulating the first session. Meanwhile cdrskin can do the same.
Option --grow_overwriteable_iso allows -multi (although unneeded), enables
-msinfo and -toc, and makes blank=fast an invalidator for ISO filesystems
on overwriteable media.
@ -331,10 +349,13 @@ 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 and DVD+R DL
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.
Emulated Drives
@ -384,9 +405,9 @@ 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 implied the need to reboot the
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 1.5 years of development.
damage did not occur in 2.5 years of development. But one never knows ...
------------------------------------------------------------------------------

View File

@ -38,7 +38,7 @@ original="./libburn_svn_release.tgz"
# My changes are in $changes , mainly in $changes/cdrskin
changes="./libburn-release"
skin_release="0.4.0"
skin_release="0.5.2"
patch_level=".pl00"
skin_rev="$skin_release""$patch_level"
@ -58,7 +58,8 @@ 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}-x86-suse9_0"
bintarget_dynamic="cdrskin_${skin_rev}-amd64-suse10_2"
bintarget_static="$bintarget_dynamic"-static
if test -d "$changes"
@ -103,9 +104,9 @@ 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
# 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"

View File

@ -38,7 +38,7 @@ original="./libburn_svn.tgz"
# My changes are in $changes , mainly in $changes/cdrskin
changes="./libburn-develop"
skin_release="0.4.1"
skin_release="0.5.3"
patch_level=""
skin_rev="$skin_release""$patch_level"
@ -58,7 +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}-x86-suse9_0"
bintarget_dynamic="cdrskin_${skin_rev}-amd64-suse10_2"
bintarget_static="$bintarget_dynamic"-static
if test -d "$changes"
@ -239,7 +239,7 @@ rm -rf "$target"
./"$bintarget_dynamic" -version
./"$bintarget_static" -version
ls -l "$cdrskin_tarball"
ls -l "$bintarget_dynamic"*
ls -l "$bintarget_dynamic"
ls -l "$bintarget_static"
ls -l $(basename "$man_page_html")

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
.TH CDRSKIN 1 "September 26, 2007"
.TH CDRSKIN 1 "Aug 05, 2008"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
@ -16,8 +16,7 @@
.\" .sp <n> insert n+1 empty lines
.\" for manpage-specific macros, see man(7)
.SH NAME
cdrskin \- burns preformatted data to CD-R[W], DVD-R[W], DVD+R[W], DVD-RAM
via libburn.
cdrskin \- burns preformatted data to CD, DVD, and BD-RE via libburn.
.SH SYNOPSIS
.B cdrskin
.RI [ options | track_source_addresses ]
@ -29,13 +28,15 @@ via libburn.
.\" respectively.
.PP
\fBcdrskin\fP is a program that provides some of cdrecord's options
in a compatible way for CD media. With DVD it has its own ways.
in a compatible way for CD media. With DVD and BD-RE it has its own ways.
You do not need to be superuser for its daily usage.
.SS
.B Overview of features:
.br
Blanking of CD-RW and DVD-RW.
.br
Formatting of DVD-RW, DVD+RW, DVD-RAM, BD-RE.
.br
Burning of data or audio tracks to CD,
.br
either in versatile Track at Once mode (TAO)
@ -44,13 +45,13 @@ or in Session at Once mode for seamless tracks.
.br
Multi session on CD (follow-up sessions in TAO only)
.br
or on DVD-R[W] (in Incremental mode) or on DVD+R.
or on DVD-R[W] (in Incremental mode) or on DVD+R[/DL].
.br
Single session on DVD-RW or DVD-R (Disk-at-once).
.br
Single session or emulated ISO-9660 multi-session
.br
on overwriteable DVD+RW, DVD-RW, DVD-RAM,
on overwriteable DVD+RW, DVD-RW, DVD-RAM, BD-RE
.br
or on data file or block device.
.br
@ -68,7 +69,7 @@ Recordable CD Media
.br
Sequentially Recordable DVD Media
.br
Overwriteable DVD Media
Overwriteable DVD or BD Media
.br
Drive preparation and addressing
.br
@ -96,7 +97,7 @@ These informations are also used by the operating systems' CD-ROM read drivers.
.PP
In general there are two types of tracks: data and audio. They differ in
sector size, throughput and readability via the systems' CD-ROM drivers
resp. by music CD players. With DVD there is only type data.
resp. by music CD players. With DVD and BD there is only type data.
.br
If not explicitely option -audio is given, then any track is burned as type
data, unless the track source is a file with suffix ".wav" or ".au" and has a
@ -163,10 +164,10 @@ Multiple cycles of blanking and overwriting with random numbers might be.
.SS
.B Sequentially Recordable DVD Media:
.br
Currently DVD-RW, DVD-R and DVD+R can be used for the Sequential recording
Currently DVD-RW, DVD-R and DVD+R[/DL] can be used for the Sequential recording
model.
.br
DVD-RW must be in state "Sequential Recording".
This applies to DVD-RW only if they are in state "Sequential Recording".
The media must be either blank or appendable.
Newly purchased DVD-RW and DVD-R media are in this state.
Used DVD-RW get into blank sequential state by option
@ -198,9 +199,9 @@ unpredicted length and to keep media appendable by option
The only restriction towards CD-R[W] is the lack of support for -audio tracks.
Multiple tracks per session are permissible.
.br
The write modes for DVD+R resemble those with DVD-R except that with DVD+R
The write modes for DVD+R[/DL] resemble those with DVD-R except that with +R
each track gets wrapped in an own session. There is no -dummy writing with
DVD+R.
DVD+R[/DL].
.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
@ -211,12 +212,10 @@ Option -multi might make DVD media unreadable in some DVD-ROM drives.
Best reader compatibility is achieved without it
(i.e. by single session media).
.SS
.B Overwriteable DVD Media:
.B Overwriteable DVD or BD Media:
.br
Currently types DVD+RW, DVD-RW and DVD-RAM can be overwritten via cdrskin.
.br
DVD+RW and DVD-RAM media need no special initial formatting. They offer a
single continuous data area for blockwise random access.
Currently types DVD+RW, DVD-RW, DVD-RAM and BD-RE can be overwritten via
cdrskin.
.br
Option -audio is not allowed. Only one track is allowed.
Option -multi cannot mark a recognizeable end of overwriteable media.
@ -229,6 +228,12 @@ 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.
.PP
DVD+RW and DVD-RAM media need no special initial formatting. They offer a
single continuous data area for blockwise random access. BD-RE need
explicit formatting before use. See
.B blank=as_needed
or blank=format_defectmgt .
.br
DVD-RW are sold in state "Sequential Recording". To become suitable for the
Overwriteable DVD recording model they need to get formatted to state
@ -331,7 +336,8 @@ original cdrecord by Joerg Schilling:
.TP
.BI \-atip
Retrieve some info about media state. With CD-RW print "Is erasable".
With DVD media print "book type:" and a media type text.
With DVD media print "book type:" and a media type text. With BD media
print "Mounted Media:" and media type text.
.TP
.BI \-audio
Announces that the subsequent tracks are to be burned as audio.
@ -342,16 +348,26 @@ stereo. For little-endian byte order (which is usual on PCs) use option
those parameters and eventually raw audio data get extracted and burned as
audio track. Same is done for suffix ".au" and SUN Audio.
.br
Option -audio may be used only with CD media and not with DVD.
Option -audio may be used only with CD media and not with DVD or BD.
.TP
.BI blank= type
Blank a CD-RW, a DVD-RW, or format a DVD+/-RW.
Blank a CD-RW, DVD-RW, or format a DVD-RW, DVD+RW, DVD-RAM, BD-RE.
This is combinable with burning in the same run of cdrskin.
The type given with blank= selects the particular behavior:
.RS
.TP
help
Print this list of blanking types.
as_needed
Try to make the media ready for writing from scratch. If it needs formatting,
then format it. If it is not blank, then try to apply blank=fast.
It is a reason to abort if the media cannot assume thoroughly writeable state,
e.g. if it is non-blank write-once.
.br
This leaves unformatted DVD-RW in unformatted blank state. To format DVD-RW use
blank=format_overwriteable.
.br
(Note: blank=as_needed is not an original cdrecord option.)
.TP
The following blank types are specific to particular media familes. Use them if special features are desired.
.TP
all
Blank an entire CD-RW or an unformatted DVD-RW.
@ -361,10 +377,35 @@ fast
Minimally blank an entire CD-RW or blank an unformatted DVD-RW.
(See also --prodvd_cli_compatible, --grow_overwriteable_iso)
.TP
deformat_sequential
Like blank=all but with the additional ability to blank overwriteable DVD-RW.
This will destroy their formatting and make them sequentially recordable.
Another peculiarity is the ability to blank media which appear already blank.
This is similar to option -force but does not try to blank media other than
recognizable CD-RW and DVD-RW.
.br
(Note: blank=deformat_* are not original cdrecord options.)
.TP
deformat_sequential_quickest
Like blank=deformat_sequential but blanking DVD-RW only minimally.
This is faster than full blanking but may yield media incapable of
Incremental Streaming (-tao).
.TP
format_if_needed
Format a media if it is not overwriteably formatted yet,
and if cdrskin supports formatting for the media type,
and if formatting will not happen automatically during write.
This currently applies to unformatted DVD-RW, DVD-RAM and BD-RE.
Eventually the appropriate default formatting is chosen.
If other media or states are encountered then nothing happens.
.br
The following formatting types are more specialized to particular
media families.
.TP
format_overwrite
Format a DVD-RW to "Restricted Overwrite". The user should bring some patience.
.br
(Note: blank=format_overwrite* are not original cdrecord options.)
(Note: blank=format_* are not original cdrecord options.)
.TP
format_overwrite_quickest
Like format_overwrite without creating a 128 MiB trailblazer session.
@ -383,19 +424,59 @@ This option treats already formatted media even if not option -force is given.
For DVD+RW this is the only supported explicit formatting type. It provides
complete "de-icing" so no reader slips on unwritten data areas.
.TP
deformat_sequential
Like blank=all but with the additional ability to blank overwriteable DVD-RW.
This will destroy their formatting and make them sequentially recordable.
Another peculiarity is the ability to blank media which appear already blank.
This is similar to option -force but does not try to blank media other than
recognizable CD-RW and DVD-RW.
format_defectmgt
Format DVD-RAM or BD-RE to reserve the default amount of spare blocks for
defect management.
.br
(Note: blank=deformat_sequential* are not original cdrecord options.)
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
deformat_sequential_quickest
Like blank=deformat_sequential but blanking DVD-RW only minimally.
This is faster than full blanking but may yield media incapable of
Incremental Streaming (-tao).
format_defectmgt_cert_off
Disable the usual media quality certification in order to save time and
format to default size.
The certification setting persists even if subsequent blank= options override
the size of the format selection.
.br
Whether formatting without certification works properly depends much on the
drive. One should check the "Format status:" from --list_formats afterwards.
.TP
format_defectmgt_cert_on
Re-enable the usual media quality certification and format to default size.
The certification setting persists like with format_defectmgt_cert_off.
.br
Whether there happens certification at all depends much on the media state
and the actually selected format descriptor.
.TP
format_defectmgt_max
Format DVD-RAM or BD-RE to reserve a maximum number of spare blocks.
.TP
format_defectmgt_min
Format DVD-RAM or BD-RE to reserve a minimum number of spare blocks.
It might be necessary to format format_defectmgt_none first in order to get
offered the most minmal spare blocks sizes for format_defectmgt_min.
.TP
format_defectmgt_none
Format DVD-RAM or BD-RE to the largest available payload in the hope to disable
defect management at all. This seems not to have a speed increasing effect,
though.
.TP
format_defectmgt_payload_<size>
Format DVD-RAM or BD-RE. 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 allows at least the given payload size.
.TP
format_by_index_<number>
Format DVD-RW, DVD+RW, DVD-RAM or BD-RE.
The number after "format_by_index_" is used as index to the list of available
format descriptors. This list can be obtained by option --list_formats.
The numbers after text "Format idx" are the ones to be used with
format_by_index_. Format descriptor lists are volatile. Do neither eject
nor write the media between the run of --list_formats and the run of
blank=format_by_index_ or else you may get a different format than desired.
.TP
help
Print this list of blanking types.
.RE
.TP
.BI \-checkdrive
@ -567,7 +648,7 @@ To retrieve an archive file which was written as follow-up session,
you may use option -toc to learn about the "lba" of the desired track number.
This lba is the address of the 2048 byte block where the archive begins.
.br
With overwriteable DVD media, -multi cannot mark the end of the session.
With overwriteable DVD or BD media, -multi cannot mark the end of the session.
So when adding a new session this end has to be determined from the payload.
Currently only ISO-9660 filesystems can be used that way. See option
.B \--grow_overwriteable_iso
@ -598,7 +679,7 @@ One should use it only if inavoidable.
.TP
.BI \-sao
Write CD in Session At Once mode, a sequential DVD-R[W] in Disc-at-once
(DAO) mode, or a DVD+R.
(DAO) mode, or a DVD+R[/DL].
.br
With CD this mode is able to put several audio tracks on media without
producing audible gaps between them.
@ -606,8 +687,8 @@ producing audible gaps between them.
With DVD-R[W] this mode can only write a single track.
No -multi is allowed with DVD-R[W] -sao.
.br
-sao is permissible with overwriteable DVD and with DVD+R but actually only
imposes restrictions without providing known advantages.
-sao is permissible with overwriteable DVD, BD or DVD+R[/DL] but actually
only imposes restrictions without providing known advantages.
.br
-sao can only be used for tracks of fixely predicted size. This implies that
track arguments which depict stdin or named pipes need to be preceeded by
@ -631,6 +712,7 @@ Bus,Target,Lun Number) 'Vendor' 'Mode' 'Revision'
.BI speed= number
Set speed of drive. With data CD, 1x speed corresponds to a throughput of
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.
Special speed settings are:
@ -647,8 +729,8 @@ suffix ".wav".
.TP
.BI \-tao
Write CD in Track At Once (TAO) mode, sequential DVD-R[W] in Incremental
Streaming mode, or DVD+R without traditional -sao restrictions.
This mode also applies pro-forma to overwriteable DVD media.
Streaming mode, or DVD+R[/DL] without traditional -sao restrictions.
This mode also applies pro-forma to overwriteable media
.br
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
@ -778,8 +860,9 @@ be the only finalization. It is advised to eject the media afterwards because
the write operations circumvent the usual system i/o with its caches and
buffers. By ejecting, those invalid memory copies get surely discarded.
.br
Only few media can be written this way: DVD-RAM, RVD+RW and overwriteable
DVD-RW. Writing is restricted to the already formatted area of the media.
Only few media can be written this way: DVD-RAM, BD-RE, RVD+RW and
overwriteable DVD-RW. Writing is restricted to the already formatted
area of the media.
.br
Writing starts at byte 0 of the media or at the address given by option
.B write_start_address= .
@ -794,7 +877,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 dependend transaction size. With DVD-RAM and 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 fallback_program= command
@ -874,6 +957,16 @@ With multi-session DVD, blank=fast will act like dvd+rw-format -blank=full .
.br
growisofs -dvd-compat is roughly equivalent to cdrskin without option -multi.
.TP
.BI \--list_formats
List the available format descriptors as reported by the drive for the
loaded media. Each descriptor line begins with "Format idx" and the
descriptor's list index, followed by a ":", the format type, the number
of payload blocks and that same number converted to MiB.
.br
The meaning of the format types is defined by the MMC standard
with command FORMAT UNIT. A user will more be interested in the
sizes than in the types.
.TP
.BI \--list_ignored_options
List all ignored cdrecord options. The "-" options cannot be used as addresses
of track sources. No track source address may begin with a text equal to an
@ -930,8 +1023,8 @@ This option redirects to stderr all message output except its own result
string and eventual output of -msinfo.
.TP
.BI write_start_address= byte_offset
Set the address on media where to start writing the track. With DVD+RW or
DVD-RAM byte_offset must be aligned to 2 kiB blocks, but better is 32 kiB.
Set the address on media where to start writing the track. With DVD+RW, DVD-RAM
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.
@ -951,8 +1044,6 @@ tested. Currently this applies to :
.br
Profile 0015h , DVD-R/DL Sequential (will not allow -multi).
.br
Profile 002Bh , DVD+R/DL.
.br
If you really test such media, then please report the outcome on
libburn-hackers@pykix.org
.TP
@ -989,8 +1080,9 @@ Linux specific: Do not ask the operating system to prevent opening busy drives.
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 used for drive command
transactions. Normally this is /dev/sgN on kernel versions < 2.6 and /dev/srN
Linux specific: Select a SCSI device file family to be scanned for by
options --devices and -scanbus.
Normally this is /dev/sgN on kernel versions < 2.6 and /dev/srN
on kernels >= 2.6 . This option allows to explicitely override that default
in order to meet other programs at a common device file for each drive.
On kernel 2.4 families sr and scd will find no drives.
@ -1084,6 +1176,13 @@ Linux specific:
Use and report literal Bus,Target,Lun addresses rather than real SCSI and
pseudo ATA addresses. This method is outdated and was never compatible with
original cdrecord.
.TP
.BI stream_recording="on"|"off"
By setting "on" request that compliance to the desired speed setting is
preferred over management of write errors. With DVD-RAM and BD-RE this can
bring effective write speed near to the nominal write speed of the media.
But it will also disable the automatic use of replacement blocks
if write errors occur. It might as well be disliked or ignored by the drive.
.br
.SH EXAMPLES
.SS
@ -1103,11 +1202,9 @@ cdrskin dev=ATA:1,0,0 -v -atip
.br
cdrskin dev=/dev/hdc -toc
.SS
.B Make used CD-RW or used unformatted DVD-RW writable again:
.B Prepare CD-RW or DVD-RW for re-use, DVD-RAM or BD-RE for first use:
.br
cdrskin -v dev=/dev/sg1 blank=fast -eject
.br
cdrskin -v dev=/dev/dvd blank=all -eject
cdrskin -v dev=/dev/sg1 blank=as_needed -eject
.SS
.B Format DVD-RW to avoid need for blanking before re-use:
.br
@ -1121,7 +1218,7 @@ cdrskin -v dev=/dev/sr0 blank=deformat_sequential
.br
cdrskin -v dev=/dev/hdc speed=12 fs=8m \\
.br
-sao -eject padsize=300k my_image.iso
blank=as_needed -eject padsize=300k my_image.iso
.SS
.B Write compressed afio archive on-the-fly (not possible with minimally blanked DVD-RW):
.br
@ -1129,17 +1226,17 @@ find . | afio -oZ - | \\
.br
cdrskin -v dev=0,1,0 fs=32m speed=8 \\
.br
-tao padsize=300k -
blank=as_needed padsize=300k -
.SS
.B Write multi-session to the same CD, DVD-R[W] or DVD+R:
.B Write multi-session to the same CD, DVD-R[W] or DVD+R[/DL]:
.br
cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 1.iso
cdrskin dev=/dev/hdc -v padsize=300k -multi 1.iso
.br
cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 2.iso
cdrskin dev=/dev/hdc -v padsize=300k -multi 2.iso
.br
cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 3.iso
cdrskin dev=/dev/hdc -v padsize=300k -multi 3.iso
.br
cdrskin dev=/dev/hdc -v padsize=300k -tao 4.iso
cdrskin dev=/dev/hdc -v padsize=300k 4.iso
.SS
.B Get multi-session info for option -C of program mkisofs:
.br
@ -1147,9 +1244,9 @@ c_values=$(cdrskin dev=/dev/hdc -msinfo 2>/dev/null)
.br
mkisofs ... -C "$c_values" ...
.SS
.B Inquire free space on media for a -tao -multi run:
.B Inquire free space on media for a -multi run:
.br
x=$(cdrskin dev=/dev/sr0 -tao -multi \\
x=$(cdrskin dev=/dev/sr0 -multi \\
.br
--tell_media_space 2>/dev/null)
.br
@ -1214,23 +1311,25 @@ Formatting data track sources for cdrskin:
.br
.BR mkisofs (8),
.BR genisoimage (8),
.BR xorriso (1),
.BR afio (1),
.BR star (1)
.br
.TP
Other CD/DVD burn programs:
Other CD/DVD/BD burn programs:
.br
.BR cdrecord (1),
.BR wodim (1)
.BR wodim (1),
.BR xorriso (1)
.br
.TP
For DVD burning (also tutor of libburn's DVD capabilities):
For DVD/BD burning (also tutor of libburn's DVD/BD capabilities):
.br
.BR growisofs (1)
.br
.SH AUTHOR
cdrskin was written by Thomas Schmitt <scdbackup@gmx.net>.
.PP
This manual page was written by George Danchev <danchev@spnet.net> and
Thomas Schmitt, for the Debian project and for all others.
This manual page was started by George Danchev <danchev@spnet.net> and
is now maintained by Thomas Schmitt.

View File

@ -1,13 +1,13 @@
/*
cdrskin.c , Copyright 2006-2007 Thomas Schmitt <scdbackup@gmx.net>
cdrskin.c , Copyright 2006-2008 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2. See future commitment below.
A cdrecord compatible command line interface for libburn.
This project is neither directed against original cdrecord nor does it exploit
any source code of said program. It rather tries to be an alternative method
to burn CD or DVD, which is not based on the same code as cdrecord.
to burn CD, DVD, or BD, which is not based on the same code as cdrecord.
See also : http://scdbackup.sourceforge.net/cdrskin_eng.html
Interested users of cdrecord are encouraged to contribute further option
@ -88,7 +88,7 @@ or
/** The official program version */
#ifndef Cdrskin_prog_versioN
#define Cdrskin_prog_versioN "0.4.1"
#define Cdrskin_prog_versioN "0.5.2"
#endif
/** The official libburn interface revision to use.
@ -98,10 +98,10 @@ or
#define Cdrskin_libburn_majoR 0
#endif
#ifndef Cdrskin_libburn_minoR
#define Cdrskin_libburn_minoR 4
#define Cdrskin_libburn_minoR 5
#endif
#ifndef Cdrskin_libburn_micrO
#define Cdrskin_libburn_micrO 1
#define Cdrskin_libburn_micrO 2
#endif
@ -135,44 +135,44 @@ or
#endif /* Cdrskin_libburn_cvs_A60220_tS */
#ifdef Cdrskin_libburn_0_4_0
#define Cdrskin_libburn_versioN "0.4.0"
#ifdef Cdrskin_libburn_0_5_2
#define Cdrskin_libburn_versioN "0.5.2"
#define Cdrskin_libburn_from_pykix_svN 1
#endif /* Cdrskin_libburn_0_4_0 */
#endif /* Cdrskin_libburn_0_5_2 */
#ifdef Cdrskin_libburn_0_4_1
#define Cdrskin_libburn_versioN "0.4.1"
#ifdef Cdrskin_libburn_0_5_3
#define Cdrskin_libburn_versioN "0.5.3"
#define Cdrskin_libburn_from_pykix_svN 1
/* Place novelty switch macros here.
Move them down to Cdrskin_libburn_from_pykix_svN on version leap
*/
/* there are no novelties in 0.4.1 yet */
/* there are no libburn novelties in 0.5.3 yet */
#endif /* Cdrskin_libburn_0_4_1 */
#endif /* Cdrskin_libburn_0_5_3 */
#ifndef Cdrskin_libburn_versioN
#define Cdrskin_libburn_0_4_0
#define Cdrskin_libburn_versioN "0.4.0"
#define Cdrskin_libburn_0_5_2
#define Cdrskin_libburn_versioN "0.5.2"
#define Cdrskin_libburn_from_pykix_svN 1
#endif
#ifdef Cdrskin_libburn_0_4_0
#ifdef Cdrskin_libburn_0_5_2
#undef Cdrskin_libburn_majoR
#undef Cdrskin_libburn_minoR
#undef Cdrskin_libburn_micrO
#define Cdrskin_libburn_majoR 0
#define Cdrskin_libburn_minoR 4
#define Cdrskin_libburn_micrO 0
#define Cdrskin_libburn_minoR 5
#define Cdrskin_libburn_micrO 2
#endif
#ifdef Cdrskin_libburn_0_4_1
#ifdef Cdrskin_libburn_0_5_3
#undef Cdrskin_libburn_majoR
#undef Cdrskin_libburn_minoR
#undef Cdrskin_libburn_micrO
#define Cdrskin_libburn_majoR 0
#define Cdrskin_libburn_minoR 4
#define Cdrskin_libburn_micrO 1
#define Cdrskin_libburn_minoR 5
#define Cdrskin_libburn_micrO 3
#endif
@ -239,6 +239,21 @@ or
#define Cdrskin_libburn_has_get_drive_rolE 1
#define Cdrskin_libburn_has_drive_equals_adR 1
/* 0.4.2 */
/* no novel libburn features but rather organizational changes */
/* 0.4.4 */
/* novel libburn features are transparent to cdrskin */
/* 0.4.6 */
#define Cdrskin_libburn_has_stream_recordinG 1
/* 0.4.8 */
/* Bug fix release for write_start_address=... on DVD-RAM and BD-RE */
/* 0.5.0 , 0.5.2 */
/* novel libburn features are transparent to cdrskin */
#ifdef Cdrskin_new_api_tesT
@ -1906,19 +1921,53 @@ int Cdrpreskin_initialize_lib(struct CdrpreskiN *preskin, int flag)
{
int ret, major, minor, micro;
/* This is the minimum requirement of cdrskin towards the libburn header
at compile time.
It gets compared against the version macros in libburn/libburn.h :
burn_header_version_major
burn_header_version_minor
burn_header_version_micro
If the header is too old then the following code shall cause failure of
cdrskin compilation rather than to allow production of a program with
unpredictable bugs or memory corruption.
The compiler message supposed to appear in this case is:
error: 'LIBBURN_MISCONFIGURATION' undeclared (first use in this function)
error: 'INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libburn_dot_h_TOO_OLD__SEE_cdrskin_dot_c' undeclared (first use in this function)
error: 'LIBBURN_MISCONFIGURATION_' undeclared (first use in this function)
*/
/* The indendation is an advise of man gcc to help old compilers ignoring */
#if Cdrskin_libburn_majoR > burn_header_version_major
#define Cdrskin_libburn_dot_h_too_olD 1
#endif
#if Cdrskin_libburn_majoR == burn_header_version_major && Cdrskin_libburn_minoR > burn_header_version_minor
#define Cdrskin_libburn_dot_h_too_olD 1
#endif
#if Cdrskin_libburn_minoR == burn_header_version_minor && Cdrskin_libburn_micrO > burn_header_version_micro
#define Cdrskin_libburn_dot_h_too_olD 1
#endif
#ifdef Cdrskin_libburn_dot_h_too_olD
LIBBURN_MISCONFIGURATION = 0;
INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libburn_dot_h_TOO_OLD__SEE_cdrskin_dot_c = 0;
LIBBURN_MISCONFIGURATION_ = 0;
#endif
ret= burn_initialize();
if(ret==0) {
fprintf(stderr,"cdrskin: FATAL : Initialization of libburn failed\n");
return(0);
}
/* This is the runtime check towards eventual dynamically linked libburn.
cdrskin deliberately does not to allow the library to be older than
the header file which was seen at compile time. More liberal would be
to use here Cdrskin_libburn_* instead of burn_header_version_* .
*/
burn_version(&major, &minor, &micro);
/* <<< for testing only */
/* major= 0; minor= 3; micro= 6; */
if(major<Cdrskin_libburn_majoR ||
(major==Cdrskin_libburn_majoR && (minor<Cdrskin_libburn_minoR ||
(minor==Cdrskin_libburn_minoR && micro<Cdrskin_libburn_micrO)))) {
if(major<burn_header_version_major ||
(major==burn_header_version_major && (minor<burn_header_version_minor ||
(minor==burn_header_version_minor && micro<burn_header_version_micro)))) {
fprintf(stderr,"cdrskin: FATAL : libburn version too old: %d.%d.%d . Need at least: %d.%d.%d .\n",
major, minor, micro,
Cdrskin_libburn_majoR, Cdrskin_libburn_minoR, Cdrskin_libburn_micrO);
@ -2351,15 +2400,27 @@ return:
fprintf(stderr,"\tfast\t\tminimally blank the entire disk\n");
fprintf(stderr,"\tminimal\t\tminimally blank the entire disk\n");
fprintf(stderr,
"\tformat_overwrite\tformat a DVD-RW to \"Restricted Overwrite\"\n");
"\tas_needed\tblank or format media to make it ready for (re-)use\n");
fprintf(stderr,
"\tdeformat_sequential\t\tfully blank, even formatted DVD-RW\n");
fprintf(stderr,
"\tdeformat_sequential_quickest\tminimally blank, even DVD-RW\n");
fprintf(stderr,
"\tformat_if_needed\t\tmake overwriteable if needed and possible\n");
fprintf(stderr,
"\tformat_overwrite\t\tformat a DVD-RW to \"Restricted Overwrite\"\n");
fprintf(stderr,
"\tformat_overwrite_quickest\tto \"Restricted Overwrite intermediate\"\n");
fprintf(stderr,
"\tformat_overwrite_full\tfull-size format a DVD-RW or DVD+RW\n");
"\tformat_overwrite_full\t\tfull-size format a DVD-RW or DVD+RW\n");
fprintf(stderr,
"\tdeformat_sequential\tfully blank, even formatted DVD-RW\n");
"\tformat_defectmgt[_max|_min|_none]\tformat DVD-RAM or BD-RE\n");
fprintf(stderr,
"\tdeformat_sequential_quickest\tminimally blank, even DVD-RW\n");
"\tformat_defectmgt[_cert_on|_cert_off]\tcertification slow|quick\n");
fprintf(stderr,
"\tformat_defectmgt_payload_<size>\tformat DVD-RAM or BD-RE\n");
fprintf(stderr,
"\tformat_by_index_<number>\t\tformat by index from --list_formats\n");
#else /* ! Cdrskin_extra_leaN */
@ -2549,7 +2610,7 @@ set_dev:;
printf("\n");
printf("Usage: %s [options|source_addresses]\n", argv[0]);
printf("Burns preformatted data to CD-R, CD-RW or DVD+RW via libburn.\n");
printf("Burns preformatted data to CD or DVD via libburn.\n");
printf("For the cdrecord compatible options which control the work of\n");
printf(
"blanking and burning see output of option -help rather than --help.\n");
@ -2613,6 +2674,7 @@ set_dev:;
" --grow_overwriteable_iso emulate multi-session on media like DVD+RW\n");
printf(
" --ignore_signals try to ignore any signals rather than to abort\n");
printf(" --list_formats list format descriptors for loaded media.\n");
printf(" --list_ignored_options list all ignored cdrecord options.\n");
#ifdef Cdrskin_libburn_has_set_waitinG
printf(" modesty_on_drive=<options> no writing into full drive buffer\n");
@ -2629,6 +2691,13 @@ set_dev:;
printf(
" --single_track accept only last argument as source_address\n");
#ifdef Cdrskin_libburn_has_stream_recordinG
printf(
" stream_recording=\"on\"|\"off\" \"on\" requests to prefer speed\n");
printf(
" over write error management.\n");
#endif
#ifdef Cdrskin_allow_libburn_taO
printf(
" tao_to_sao_tsize=<num> use num as fixed track size if in a\n");
@ -2823,8 +2892,10 @@ set_severities:;
int major, minor, micro;
printf(
"Cdrecord 2.01-Emulation Copyright (C) 2006-2007, see libburnia-project.org\n");
printf("libburn interface : %s\n",Cdrskin_libburn_versioN);
"Cdrecord 2.01-Emulation Copyright (C) 2006-2008, see libburnia-project.org\n");
printf("libburn interface : %d.%d.%d\n",
burn_header_version_major, burn_header_version_minor,
burn_header_version_micro);
burn_version(&major, &minor, &micro);
printf("libburn in use : %d.%d.%d\n", major, minor, micro);
@ -3011,6 +3082,8 @@ ex:;
static double Cdrskin_cd_speed_factoR= 150.0*1024.0;
/** The DVD payload speed factor for reporting progress: 1x */
static double Cdrskin_dvd_speed_factoR= 1385000;
/** The BD payload speed factor for reporting progress: 1x */
static double Cdrskin_bd_speed_factoR= 4495625;
/** The effective payload speed factor for reporting progress */
static double Cdrskin_speed_factoR= 150.0*1024.0;
@ -3020,6 +3093,7 @@ static double Cdrskin_speed_factoR= 150.0*1024.0;
*/
static double Cdrskin_libburn_cd_speed_factoR= 176.4;
static double Cdrskin_libburn_dvd_speed_factoR= 1385.0;
static double Cdrskin_libburn_bd_speed_factoR= 4495.625;
/* The effective speed conversion factor for burn_drive_set_speed() */
static double Cdrskin_libburn_speed_factoR= 176.4;
@ -3029,6 +3103,7 @@ static double Cdrskin_libburn_speed_factoR= 176.4;
*/
static double Cdrskin_libburn_cd_speed_addoN= 40.0;
static double Cdrskin_libburn_dvd_speed_addoN= 1.0; /*poor accuracy with 2.4x*/
static double Cdrskin_libburn_bd_speed_addoN= 1.0;
static double Cdrskin_libburn_speed_addoN = 40.0;
@ -3045,6 +3120,7 @@ struct CdrskiN {
int gracetime;
int dummy_mode;
int force_is_set;
int stream_recording_is_set;
int single_track;
int prodvd_cli_compatible;
@ -3060,21 +3136,60 @@ struct CdrskiN {
char msifile[Cdrskin_strleN];
int do_atip;
int do_list_formats;
int do_blank;
int blank_fast;
int no_blank_appendable;
int blank_format_type; /* 0=blank
bit0-7:
1=format_overwrite
int blank_format_type; /* bit0-7: job type
0=blank
1=format_overwrite for DVD+RW, DVD-RW
bit8-15: bit0-7 of burn_disc_format(flag)
bit8 = write zeros after formatting
bit9 = insist in size 0
bit10= format to maximum available size
bit11= - reserved -
bit12= - reserved -
bit13= - reserved -
bit14= - reserved -
bit15= format by index
2=deformat_sequential (blank_fast might matter)
3=format (= format_overwrite restricted to DVD+RW)
4=format_defectmgt for DVD-RAM, BD-RE
bit8-15: bit0-7 of burn_disc_format(flag)
bit8 = write zeros after formatting
bit9+10: size mode
0 = use parameter size as far as it makes sense
1 = (identical to size mode 0)
2 = without bit7: format to maximum size
with bit7 : take size from indexed format
descriptor
3 = without bit7: format to default size
with bit7 : take size from indexed format
descriptor
bit11= - reserved -
bit12= - reserved -
bit13= try to disable defect management
bit14= - reserved -
bit15= format by index
5=format_by_index
gets mapped to 4 with DVD-RAM and BD-RE else to 1,
bit15 should be set and bit16-23 should contain
a usable index number
6=format_if_needed
gets mapped to default variants of specialized
formats if the media state requires formatting
before writing
7=if_needed
gets mapped to 6 for DVD-RAM and BD-RE,
to 0 with all other non-blanks
bit8-15: bit0-7 of burn_disc_format(flag)
depending on job type
*/
int blank_format_index; /* bit8-15 of burn_disc_format(flag) */
double blank_format_size; /* to be used with burn_disc_format() */
int blank_format_no_certify;
int do_direct_write;
int do_burn;
@ -3220,6 +3335,7 @@ int Cdrskin_new(struct CdrskiN **skin, struct CdrpreskiN *preskin, int flag)
o->gracetime= 0;
o->dummy_mode= 0;
o->force_is_set= 0;
o->stream_recording_is_set= 0;
o->single_track= 0;
o->prodvd_cli_compatible= 0;
o->do_devices= 0;
@ -3229,11 +3345,14 @@ int Cdrskin_new(struct CdrskiN **skin, struct CdrpreskiN *preskin, int flag)
o->do_msinfo= 0;
o->msifile[0]= 0;
o->do_atip= 0;
o->do_list_formats= 0;
o->do_blank= 0;
o->blank_fast= 0;
o->no_blank_appendable= 0;
o->blank_format_type= 0;
o->blank_format_index= -1;
o->blank_format_size= 0.0;
o->blank_format_no_certify= 0;
o->do_direct_write= 0;
o->do_burn= 0;
o->tell_media_space= 0;
@ -3663,6 +3782,10 @@ int Cdrskin_grab_drive(struct CdrskiN *skin, int flag)
Cdrskin_speed_factoR= Cdrskin_dvd_speed_factoR;
Cdrskin_libburn_speed_factoR= Cdrskin_libburn_dvd_speed_factoR;
Cdrskin_libburn_speed_addoN= Cdrskin_libburn_dvd_speed_addoN;
} else if(strstr(profile_name,"BD")==profile_name) {
Cdrskin_speed_factoR= Cdrskin_bd_speed_factoR;
Cdrskin_libburn_speed_factoR= Cdrskin_libburn_bd_speed_factoR;
Cdrskin_libburn_speed_addoN= Cdrskin_libburn_bd_speed_addoN;
}
}
#endif /* Cdrskin_libburn_has_get_profilE */
@ -4193,11 +4316,13 @@ int Cdrskin_invalidate_iso_head(struct CdrskiN *skin, int flag)
@param flag Bitfield for control purposes:
bit0= permission to check for overwriteable ISO image
bit1= do not report media profile
bit2= do not report but only check for pseudo appendable
@return 1=ok, 2=ok, is pseudo appendable, <=0 error
*/
int Cdrskin_report_disc_status(struct CdrskiN *skin, enum burn_disc_status s,
int flag)
{
int ret, iso_size;
int ret, iso_size, pseudo_appendable= 0;
if(flag&1) {
if(skin->media_is_overwriteable && skin->grow_overwriteable_iso>0) {
@ -4205,10 +4330,14 @@ int Cdrskin_report_disc_status(struct CdrskiN *skin, enum burn_disc_status s,
ret= 1;
else
ret= Cdrskin_overwriteable_iso_size(skin,&iso_size,0);
if(ret>0)
if(ret>0) {
s= BURN_DISC_APPENDABLE;
pseudo_appendable= 1;
}
}
}
if(flag&4)
return(1+pseudo_appendable);
printf("cdrskin: status %d ",s);
if(s==BURN_DISC_FULL) {
@ -4236,7 +4365,7 @@ int Cdrskin_report_disc_status(struct CdrskiN *skin, enum burn_disc_status s,
printf("-unknown status code-\n");
if(flag&2)
return(1);
return(1+pseudo_appendable);
#ifdef Cdrskin_libburn_has_get_profilE
if((s==BURN_DISC_FULL || s==BURN_DISC_APPENDABLE || s==BURN_DISC_BLANK ||
@ -4258,7 +4387,7 @@ int Cdrskin_report_disc_status(struct CdrskiN *skin, enum burn_disc_status s,
}
#endif
return(1);
return(1+pseudo_appendable);
}
@ -4432,7 +4561,8 @@ int Cdrskin_checkdrive(struct CdrskiN *skin, char *profile_name, int flag)
if(drive_info->sao_block_types & BURN_BLOCK_SAO)
printf(" SAO");
if((drive_info->raw_block_types & BURN_BLOCK_RAW96R) &&
strstr(profile_name,"DVD")!=profile_name)
strstr(profile_name,"DVD")!=profile_name &&
strstr(profile_name,"BD")!=profile_name)
printf(" RAW/RAW96R");
printf("\n");
@ -4744,6 +4874,8 @@ int Cdrskin_atip(struct CdrskiN *skin, int flag)
printf("book type: %s (emulated booktype)\n", profile_name);
if(profile_number==0x13) /* DVD-RW */
printf("cdrskin: message for sdvdbackup: \"(growisofs mode Restricted Overwrite)\"\n");
} else if(strstr(profile_name,"BD")==profile_name) {
printf("Mounted Media: %2.2Xh, %s\n", profile_number, profile_name);
} else {
printf("ATIP info from disk:\n");
if(burn_disc_erasable(drive)) {
@ -4787,6 +4919,83 @@ ex:;
}
/** Perform --list_formats
@param flag Bitfield for control purposes:
@return <=0 error, 1 success
*/
int Cdrskin_list_formats(struct CdrskiN *skin, int flag)
{
struct burn_drive *drive;
int ret, i, status, num_formats, profile_no, type;
off_t size;
unsigned dummy;
char status_text[80], profile_name[90];
#ifdef Cdrskin_libburn_has_burn_disc_formaT
ret= Cdrskin_grab_drive(skin,0);
if(ret<=0)
return(ret);
drive= skin->drives[skin->driveno].drive;
ret = burn_disc_get_formats(drive, &status, &size, &dummy,
&num_formats);
if(ret <= 0) {
fprintf(stderr, "cdrskin: SORRY: Cannot obtain format list info\n");
ret= 0; goto ex;
}
ret= burn_disc_get_profile(drive, &profile_no, profile_name);
printf("Media current: ");
if(profile_no > 0 && ret > 0) {
if(profile_name[0])
printf("%s\n", profile_name);
else
printf("%4.4Xh\n", profile_no);
} else
printf("is not recognizable\n");
if(status == BURN_FORMAT_IS_UNFORMATTED)
sprintf(status_text, "unformatted, up to %.1f MiB",
((double) size) / 1024.0 / 1024.0);
else if(status == BURN_FORMAT_IS_FORMATTED) {
if(profile_no==0x12 || profile_no==0x13 || profile_no==0x1a ||
profile_no==0x43)
sprintf(status_text, "formatted, with %.1f MiB",
((double) size) / 1024.0 / 1024.0);
else
sprintf(status_text, "written, with %.1f MiB",
((double) size) / 1024.0 / 1024.0);
} else if(status == BURN_FORMAT_IS_UNKNOWN) {
if (profile_no > 0)
sprintf(status_text, "intermediate or unknown");
else
sprintf(status_text, "no media or unknown media");
} else
sprintf(status_text, "illegal status according to MMC-5");
printf("Format status: %s\n", status_text);
for (i = 0; i < num_formats; i++) {
ret= burn_disc_get_format_descr(drive, i, &type, &size, &dummy);
if (ret <= 0)
continue;
printf("Format idx %-2d: %2.2Xh , %.fs , %.1f MiB\n",
i, type, ((double) size) / 2048.0, ((double) size) / 1024.0/1024.0);
}
ret= 1;
ex:;
Cdrskin_release_drive(skin,0);
return(ret);
#else /* Cdrskin_libburn_has_burn_disc_formaT */
fprintf(stderr,
"cdrskin: SORRY: libburn is too old to obtain format list info\n");
return(0);
#endif /* Cdrskin_libburn_has_burn_disc_formaT */
}
#ifndef Cdrskin_extra_leaN
/* A70324: proposal by Eduard Bloch */
@ -4881,13 +5090,17 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag)
struct burn_progress p;
struct burn_drive *drive;
int ret,loop_counter= 0,hint_force= 0,do_format= 0, profile_number= -1;
int wrote_well= 1;
int wrote_well= 1, format_flag= 0, status, num_formats;
off_t size;
unsigned dummy;
double start_time;
char *verb= "blank", *presperf="blanking", *fmt_text= "...";
char profile_name[80];
static char fmtp[][40]= {
"format_default", "format_overwrite", "deformat_sequential"};
static int fmtp_max= 2;
"...", "format_overwrite", "deformat_sequential",
"(-format)", "format_defectmgt", "format_by_index",
"format_if_needed", "as_needed"};
static int fmtp_max= 7;
start_time= Sfile_microtime(0); /* will be refreshed later */
ret= Cdrskin_grab_drive(skin,0);
@ -4901,13 +5114,11 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag)
burn_disc_get_profile(skin->grabbed_drive,&profile_number,profile_name);
#endif
if(skin->verbosity>=Cdrskin_verbose_progresS)
Cdrskin_report_disc_status(skin,s,1);
ret= Cdrskin_report_disc_status(skin,s,
1|(4*!(skin->verbosity>=Cdrskin_verbose_progresS)));
if(ret==2)
s= BURN_DISC_APPENDABLE;
do_format= skin->blank_format_type & 0xff;
if(do_format == 1 || do_format == 3) {
verb= "format";
presperf= "formatting";
}
#ifdef Cdrskin_libburn_has_pretend_fulL
if(s==BURN_DISC_UNSUITABLE) {
@ -4923,7 +5134,47 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag)
if(do_format)
if(do_format>=0 && do_format<=fmtp_max)
fmt_text= fmtp[do_format];
if(do_format==5) { /* format_by_index */
if(profile_number == 0x12 || profile_number == 0x43)
do_format= 4;
else
do_format= 1;
} else if(do_format==6 || do_format==7) { /* format_if_needed , as_needed */
/* Find out whether format is needed at all.
Eventuelly set up a suitable formatting run
*/
if(profile_number == 0x14 && do_format==6) { /* sequential DVD-RW */
do_format= 1;
skin->blank_format_type= 1|(1<<8);
skin->blank_format_size= 128*1024*1024;
} else if(profile_number == 0x12 ||
profile_number == 0x43) { /* DVD-RAM , BD-RE */;
#ifdef Cdrskin_libburn_has_burn_disc_formaT
ret= burn_disc_get_formats(drive, &status, &size, &dummy, &num_formats);
if(ret>0 && status!=BURN_FORMAT_IS_FORMATTED) {
do_format= 4;
skin->blank_format_type= 4|(3<<9); /* default payload size */
skin->blank_format_size= 0;
}
#endif
} else if(do_format==7) { /* try to blank what is not blank yet */
if(s!=BURN_DISC_BLANK) {
do_format= 0;
skin->blank_fast= 1;
}
}
if(do_format==6 || do_format==7) {
if(skin->verbosity>=Cdrskin_verbose_cmD)
ClN(fprintf(stderr,
"cdrskin: NOTE : blank=%s : no need for action detected\n", fmt_text));
{ret= 2; goto ex;}
}
}
if(do_format == 1 || do_format == 3 || do_format == 4) {
verb= "format";
presperf= "formatting";
}
if(do_format==2) {
/* Forceful blanking to Sequential Recording for DVD-R[W] and CD-RW */
@ -4961,12 +5212,26 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag)
fprintf(stderr,
"cdrskin: NOTE : blank=format_... : DVD+RW do not need this\n");
fprintf(stderr,
"cdrskin: HINT : For de-icing use option blank=format_overwrite_full");
"cdrskin: HINT : For de-icing use option blank=format_overwrite_full\n");
{ret= 2; goto ex;}
}
} else {
fprintf(stderr,
"cdrskin: SORRY : blank=%s for now does DVD+/-RW only\n",fmt_text);
"cdrskin: SORRY : blank=%s for now does DVD-RW and DVD+RW only\n",
fmt_text);
{ret= 0; goto ex;}
}
if(s==BURN_DISC_UNSUITABLE)
fprintf(stderr,
"cdrskin: NOTE : blank=%s accepted not yet suitable media\n",
fmt_text);
} else if(do_format==4) {
/* Formatting and influencing defect management of DVD-RAM , BD-RE */
if(!(profile_number == 0x12 || profile_number == 0x43)) {
fprintf(stderr,
"cdrskin: SORRY : blank=%s for now does DVD-RAM and BD-RE only\n",
fmt_text);
{ret= 0; goto ex;}
}
if(s==BURN_DISC_UNSUITABLE)
@ -5036,7 +5301,8 @@ unsupported_format_type:;
Cdrskin_adjust_speed(skin,0);
#ifndef Cdrskin_extra_leaN
Cdrskin_wait_before_action(skin,1+(do_format==1 || do_format==3));
Cdrskin_wait_before_action(skin,
1+(do_format==1 || do_format==3 || do_format==4));
#endif /* ! Cdrskin_extra_leaN */
skin->drive_is_busy= 1;
@ -5044,9 +5310,15 @@ unsupported_format_type:;
burn_disc_erase(drive,skin->blank_fast);
#ifdef Cdrskin_libburn_has_burn_disc_formaT
} else if(do_format==1 || do_format==3) {
burn_disc_format(drive,(off_t) skin->blank_format_size,
((skin->blank_format_type>>8)&0xff) | ((!!skin->force_is_set)<<4));
} else if(do_format==1 || do_format==3 || do_format==4) {
format_flag= (skin->blank_format_type>>8)&(1|2|4|32|128);
if(skin->force_is_set)
format_flag|= 16;
if(format_flag&128)
format_flag|= (skin->blank_format_index&255)<<8;
if(skin->blank_format_no_certify)
format_flag|= 64;
burn_disc_format(drive,(off_t) skin->blank_format_size,format_flag);
#endif
} else {
@ -5080,7 +5352,8 @@ blanking_done:;
"\rcdrskin: %s done \n",
presperf);
printf("%s time: %.3fs\n",
(do_format==1 || do_format==3?"Formatting":"Blanking"),
(do_format==1 || do_format==3 || do_format==4 ?
"Formatting":"Blanking"),
Sfile_microtime(0)-start_time);
}
fflush(stdout);
@ -6187,6 +6460,9 @@ burn_failed:;
#ifdef Cdrskin_libburn_has_set_forcE
burn_write_opts_set_force(o, !!skin->force_is_set);
#endif
#ifdef Cdrskin_libburn_has_stream_recordinG
burn_write_opts_set_stream_recording(o, !!skin->stream_recording_is_set);
#endif
if(skin->dummy_mode) {
fprintf(stderr,
@ -6706,7 +6982,7 @@ sorry_failed_to_eject:;
*/
int Cdrskin_setup(struct CdrskiN *skin, int argc, char **argv, int flag)
{
int i,k,l,ret,source_has_size=0;
int i,k,l,ret,source_has_size=0, idx= -1;
double value,grab_and_wait_value= -1.0;
char *cpt,*value_pt,adr[Cdrskin_adrleN],*blank_mode= "";
struct stat stbuf;
@ -6875,21 +7151,62 @@ set_blank:;
skin->do_blank= 1;
skin->blank_fast= 1;
blank_mode= "fast";
} else if(strcmp(cpt,"format_overwrite")==0) {
} else if(strcmp(cpt,"format_if_needed")==0) {
skin->do_blank= 1;
skin->blank_format_type= 6;
skin->preskin->demands_cdrskin_caps= 1;
} else if(strcmp(cpt,"format_overwrite")==0) {
skin->do_blank= 1;
skin->blank_format_type= 1|(1<<8);
skin->blank_format_size= 128*1024*1024;
skin->preskin->demands_cdrskin_caps= 1;
} else if(strcmp(cpt,"format_overwrite_full")==0) {
} else if(strcmp(cpt,"format_overwrite_full")==0) {
skin->do_blank= 1;
skin->blank_format_type= 1|(1<<10);
skin->blank_format_size= 0;
skin->preskin->demands_cdrskin_caps= 1;
} else if(strcmp(cpt,"format_overwrite_quickest")==0) {
} else if(strcmp(cpt,"format_overwrite_quickest")==0) {
skin->do_blank= 1;
skin->blank_format_type= 1;
skin->blank_format_size= 0;
skin->preskin->demands_cdrskin_caps= 1;
} else if(strncmp(cpt,"format_defectmgt",16)==0) {
skin->do_blank= 1;
skin->blank_format_type= 4|(3<<9); /* default payload size */
skin->blank_format_size= 0;
skin->preskin->demands_cdrskin_caps= 1;
if(cpt[16]=='_') {
cpt+= 17;
if(strcmp(cpt,"none")==0)
skin->blank_format_type= 4|(1<<13);
else if(strcmp(cpt,"max")==0)
skin->blank_format_type= 4; /* smallest payload size above 0 */
else if(strcmp(cpt,"min")==0)
skin->blank_format_type= 4|(2<<9); /*largest payload size with mgt*/
else if(strncmp(cpt,"payload_",8)==0) {
skin->blank_format_size= Scanf_io_size(cpt+8,0);
skin->blank_format_type= 4;
} else if(strcmp(cpt,"cert_off")==0)
skin->blank_format_no_certify= 1;
else if(strcmp(cpt,"cert_on")==0)
skin->blank_format_no_certify= 0;
else
goto unsupported_blank_option;
}
skin->preskin->demands_cdrskin_caps= 1;
} else if(strncmp(cpt,"format_by_index_",16)==0) {
sscanf(cpt+16, "%d", &idx);
if(idx<0 || idx>255) {
fprintf(stderr,"cdrskin: SORRY : blank=%s provides unusable index\n",
cpt);
return(0);
}
skin->do_blank= 1;
skin->blank_format_type= 5|(2<<9)|(1<<15);
skin->blank_format_index= idx;
skin->blank_format_size= 0;
skin->preskin->demands_cdrskin_caps= 1;
} else if(strcmp(cpt,"deformat_sequential")==0) {
skin->do_blank= 1;
skin->blank_format_type= 2;
@ -6900,10 +7217,14 @@ set_blank:;
skin->blank_format_type= 2;
skin->blank_fast= 1;
skin->preskin->demands_cdrskin_caps= 1;
} else if(strcmp(cpt,"help")==0) {
} else if(strcmp(cpt,"as_needed")==0) {
skin->do_blank= 1;
skin->blank_format_type= 7;
} else if(strcmp(cpt,"help")==0) {
/* is handled in Cdrpreskin_setup() */;
continue;
} else {
unsupported_blank_option:;
fprintf(stderr,"cdrskin: FATAL : Blank option '%s' not supported yet\n",
cpt);
return(0);
@ -7167,8 +7488,13 @@ gracetime_equals:;
} else if(strcmp(argv[i],"-isosize")==0) {
skin->use_data_image_size= 1;
} else if(strcmp(argv[i],"--list_formats")==0) {
skin->do_list_formats= 1;
skin->preskin->demands_cdrskin_caps= 1;
} else if(strcmp(argv[i],"--list_ignored_options")==0) {
char line[80];
/* is also handled in Cdrpreskin_setup() */;
line[0]= 0;
printf("cdrskin: List of all ignored options:\n");
@ -7386,6 +7712,17 @@ set_speed:;
if(skin->verbosity>=Cdrskin_verbose_cmD)
ClN(printf("cdrskin: speed : %f\n",skin->x_speed));
} else if(strncmp(argv[i],"-stream_recording=",18)==0) {
value_pt= argv[i]+18;
goto set_stream_recording;
} else if(strncmp(argv[i],"stream_recording=",17)==0) {
value_pt= argv[i]+17;
set_stream_recording:;
if(strcmp(value_pt, "on")==0)
skin->stream_recording_is_set= 1;
else
skin->stream_recording_is_set= 0;
} else if(strcmp(argv[i],"-swab")==0) {
skin->swap_audio_bytes= 0;
@ -7695,11 +8032,15 @@ int Cdrskin_create(struct CdrskiN **o, struct CdrpreskiN **preskin,
printf("cdrskin: scanning for devices ...\n");
fflush(stdout);
#ifdef Cdrskin_libburn_has_burn_msgS
if(skin->preskin->verbosity<Cdrskin_verbose_debuG)
burn_msgs_set_severities("NEVER", "NOTE", "cdrskin: ");
#endif
/* In cdrskin there is not much sense in queueing library messages.
It is done here only for testing it from time to time */
Cdrpreskin_queue_msgs(skin->preskin,1);
#ifndef Cdrskin_oldfashioned_api_usE
if(stdio_drive) {
ret= burn_drive_scan_and_grab(&(skin->drives),skin->preskin->device_adr,0);
@ -7720,6 +8061,11 @@ int Cdrskin_create(struct CdrskiN **o, struct CdrpreskiN **preskin,
}
}
#ifdef Cdrskin_libburn_has_burn_msgS
burn_msgs_set_severities(skin->preskin->queue_severity,
skin->preskin->print_severity, "cdrskin: ");
#endif
/* This prints the eventual queued messages */
Cdrpreskin_queue_msgs(skin->preskin,0);
@ -7804,6 +8150,13 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag)
if(ret<=0)
{*exit_value= 7; goto ex;}
}
if(skin->do_list_formats) {
if(skin->n_drives<=0)
{*exit_value= 14; goto no_drive;}
ret= Cdrskin_list_formats(skin, 0);
if(ret<=0)
{*exit_value= 14; goto ex;}
}
if(skin->do_blank) {
if(skin->n_drives<=0)
{*exit_value= 8; goto no_drive;}

View File

@ -2,7 +2,7 @@
<HEAD>
<META NAME="description" CONTENT="cdrskin, a limited cdrecord compatibility wrapper for libburn">
<META NAME="keywords" CONTENT="cdrskin, libburn, libburnia, burn, CD, DVD, linux, recording, burning, CD-R, CD-RW, DVD-R, DVD-RW, DVD+RW, DVD+R, cdrecord, compatible, scdbackup">
<META NAME="keywords" CONTENT="cdrskin, libburn, libburnia, burn, CD, DVD, linux, recording, burning, CD-R, CD-RW, DVD-R, DVD-RW, DVD+RW, DVD+R, DVD+R/DL, DVD-RAM, BD-RE, cdrecord, compatible, scdbackup">
<META NAME="robots" CONTENT="follow">
<TITLE>cdrskin homepage english</TITLE>
</HEAD>
@ -17,26 +17,27 @@
</A>
<P><H2> Homepage of </H2>
<H1> cdrskin </H1>
<!-- <FONT SIZE=+0><A HREF="cdrskin_ger.html">deutsch (german)</A></FONT> -->
<H2>Limited cdrecord compatibility wrapper for libburn</H2>
</CENTER>
<P>
<H2>Purpose:</H2>
Burns preformatted data to CD and single layer DVD media:<BR>
CD-R, DVD-R, DVD+R, CD-RW, DVD-RW, DVD-RAM, DVD+RW
Burns preformatted data to CD, DVD, and BD media:<BR>
CD-R, DVD-R, DVD+R, DVD+R/DL, 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>
A CD/DVD recorder suitable for
A CD/DVD/BD recorder suitable for
<A HREF="http://libburnia-project.org">http://libburnia-project.org</A> <BR>
(SCSI , ATA , USB , or SATA writers compliant to standard MMC-3 for CD
and to MMC-5 for DVD).
and to MMC-5 for DVD or BD).
<BR>
</P>
@ -56,10 +57,10 @@ and to MMC-5 for DVD).
GPL software included:<BR>
</H2>
<DL>
<DT>libburn-0.4.0</DT>
<DT>libburn-0.5.2</DT>
<DD>(founded by Derek Foreman and Ben Jansens,
furthered by team of libburnia-project.org)</DD>
<DD>transfers data to CD and DVD</DD>
furthered since August 2006 by Thomas Schmitt from team of libburnia-project.org)</DD>
<DD>transfers data to CD, DVD, BD-RE</DD>
</DL>
</P>
@ -84,10 +85,10 @@ Ports to other usable systems are appreciated. Reports are welcome.
<DL>
<DT>The most common options of cdrecord for data and audio on CD media
are provided in a compatible way.<BR>
On single layer DVD media cdrskin is able to perform any recording job
On all DVD media except DVD-R DL, cdrskin is able to perform any recording job
which is possible with cdrecord.
Other than with cdrecord, options -multi and -tao are supported with
certain DVD types.
Other than with cdrecord, option -multi is supported with many DVD types and
write mode -tao works with anything but quickly blanked DVD-RW.
</DT>
<BR><BR>
<DT>Get an overview of drives and their addresses</DT>
@ -105,9 +106,8 @@ as listed by option --devices.</DT>
<DD>$<KBD>&nbsp;cdrskin dev=ATA:1,0,0 -v -atip</KBD></DD>
<DD>$<KBD>&nbsp;cdrskin dev=/dev/hdc -toc</KBD></DD>
<DT>Make used CD-RW or used unformatted DVD-RW writable again:</DT>
<DD>$<KBD>&nbsp;cdrskin -v dev=/dev/sg1 blank=fast -eject</KBD></DD>
<DD>$<KBD>&nbsp;cdrskin -v dev=/dev/dvd blank=all -eject</KBD></DD>
<DT>Prepare CD-RW or DVD-RW for re-use, DVD-RAM or BD-RE for first use:</DT>
<DD>$<KBD>&nbsp;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>&nbsp;cdrskin -v dev=/dev/sr0 blank=format_overwrite</KBD></DD>
@ -118,28 +118,28 @@ as listed by option --devices.</DT>
<DT>Write ISO-9660 filesystem image as only one to blank or formatted media:
</DT>
<DD>$<KBD>&nbsp;cdrskin -v dev=/dev/hdc speed=12 fs=8m \</KBD></DD>
<DD><KBD>&nbsp;&nbsp;-sao -eject padsize=300k my_image.iso</KBD></DD>
<DD><KBD>&nbsp;&nbsp;blank=as_needed -eject padsize=300k my_image.iso</KBD></DD>
<DT>Write compressed afio archive on-the-fly:</DT>
<DD>$<KBD>&nbsp;find . | afio -oZ - | \</KBD></DD>
<DD><KBD>&nbsp;&nbsp;cdrskin -v dev=0,1,0 fs=32m speed=8 \</KBD></DD>
<DD><KBD>&nbsp;&nbsp;-tao padsize=300k -</KBD></DD>
<DD><KBD>&nbsp;&nbsp;blank=as_needed padsize=300k -</KBD></DD>
<DT>Write several sessions to the same CD, DVD-R[W] or DVD+R:</DT>
<DD>$<KBD>&nbsp;cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 1.iso</KBD>
<DT>Write several sessions to the same CD, DVD-R[W] or DVD+R[/DL]:</DT>
<DD>$<KBD>&nbsp;cdrskin dev=/dev/hdc -v padsize=300k -multi 1.iso</KBD>
</DD>
<DD>$<KBD>&nbsp;cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 2.iso</KBD>
<DD>$<KBD>&nbsp;cdrskin dev=/dev/hdc -v padsize=300k -multi 2.iso</KBD>
</DD>
<DD>$<KBD>&nbsp;cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 3.iso</KBD>
<DD>$<KBD>&nbsp;cdrskin dev=/dev/hdc -v padsize=300k -multi 3.iso</KBD>
</DD>
<DD>$<KBD>&nbsp;cdrskin dev=/dev/hdc -v padsize=300k -tao 4.iso</KBD></DD>
<DD>$<KBD>&nbsp;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>&nbsp;c_values=$(cdrskin dev=/dev/sr0 -msinfo 2>/dev/null)</KBD></DD>
<DD>$<KBD>&nbsp;mkisofs ... -C "$c_values" ...</KBD></DD>
<DT>Inquire free space on media for a -tao -multi run:</DT>
<DD>$<KBD>&nbsp;x=$(cdrskin dev=/dev/sr0 -tao -multi \</KBD></DD>
<DT>Inquire free space on media for a -multi run:</DT>
<DD>$<KBD>&nbsp;x=$(cdrskin dev=/dev/sr0 -multi \</KBD></DD>
<DD><KBD>&nbsp;&nbsp;--tell_media_space 2>/dev/null)</KBD></DD>
<DD>$<KBD>&nbsp;echo "Available: $x blocks of 2048 data bytes"</KBD></DD>
@ -166,18 +166,28 @@ man cdrecord</A></KBD></DD>
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 tool
<A HREF="http://scdbackup.sourceforge.net/xorriso_eng.html">xorriso</A>.
</DD>
</DL>
Testers wanted who are willing to risk some double layer DVD media.
Testers wanted who are willing to risk some DVD-R DL media
or to do experiments on BD-R media.
</P>
<HR>
<A NAME="download"></A>
<P>
<DL>
<DT>Download as source code (see README):</DT>
<DD><A HREF="cdrskin-0.4.0.pl00.tar.gz">cdrskin-0.4.0.pl00.tar.gz</A>
(680 KB).
<DD><A HREF="cdrskin-0.5.2.pl00.tar.gz">cdrskin-0.5.2.pl00.tar.gz</A>
(735 KB).
</DD>
<DD>
The cdrskin tarballs are source code identical with libburn releases
@ -185,20 +195,25 @@ 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>&nbsp;</DD>
<DT>Download as single x86 binaries (untar and move to /usr/bin/cdrskin):</DT>
<DD><A HREF="cdrskin_0.4.0.pl00-x86-suse9_0.tar.gz">
cdrskin_0.4.0.pl00-x86-suse9_0.tar.gz</A>, (106 KB),
<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.0.pl00-x86-suse9_0-static.tar.gz">
cdrskin_0.4.0.pl00-x86-suse9_0-static.tar.gz</A>, (310 KB), -static compiled,
<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>
@ -221,22 +236,20 @@ cdrskin_0.4.0.pl00-x86-suse9_0-static.tar.gz</A>, (310 KB), -static compiled,
<HR>
<P>
Enhancements towards previous stable version cdrskin-0.3.8:
Enhancements towards previous stable version cdrskin-0.5.0.pl00:
<UL>
<LI>New option direct_write_amount=</LI>
<LI>New option --grow_overwriteable_iso</LI>
<LI>New option --allow_emulated_drives dev=stdio:&lt;path&gt;</LI>
<LI>More cdrecord options supported:
-format, -inq, -load, -lock, -immed, -waiti</LI>
<LI>New option fallback_program=</LI>
<LI>It is now possible to use drives which are not found by --devices</LI>
<!--
<LI>none</LI>
-->
</UL>
<!--
Bug fixes towards cdrskin-0.4.0.pl00:
Bug fixes towards cdrskin-0.5.0.pl00:
<UL>
<LI>none yet</LI>
</UL>
<LI>none</LI>
<!--
-->
</UL>
</P>
@ -244,25 +257,26 @@ Enhancements towards previous stable version cdrskin-0.3.8:
<P>
<DL>
<DT><H3>Development snapshot, version 0.4.1 :</H3></DT>
<DD>Enhancements towards stable version 0.4.0.pl00:
<DT><H3>Development snapshot, version 0.5.3 :</H3></DT>
<DD>Enhancements towards current stable version 0.5.2.pl00:
<UL>
<LI>none yet</LI>
<!--
-->
<LI>none yet</LI>
</UL>
</DD>
<DD>&nbsp;</DD>
<DD><A HREF="README_cdrskin_devel">README 0.4.1</A>
<DD><A HREF="cdrskin__help_devel">cdrskin_0.4.1 --help</A></DD>
<DD><A HREF="cdrskin_help_devel">cdrskin_0.4.1 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 0.4.1)</A></DD>
<DD><A HREF="README_cdrskin_devel">README 0.5.3</A>
<DD><A HREF="cdrskin__help_devel">cdrskin_0.5.3 --help</A></DD>
<DD><A HREF="cdrskin_help_devel">cdrskin_0.5.3 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 0.5.3)</A></DD>
<DD>&nbsp;</DD>
<DT>Maintainers of cdrskin unstable packages please use SVN of
<A HREF="http://libburnia-project.org"> libburnia-project.org</A></DT>
<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</B>
<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.
@ -270,22 +284,29 @@ But after the run of <KBD>./bootstrap</KBD>, only
vanilla tools like make and gcc are needed.</DD>
</DD>
<DD>&nbsp;</DD>
<DT>The following downloads are intended for adventurous end users or
<DT>The following download is intended for adventurous end users or
admins with full system souvereignty.</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-0.4.1.tar.gz">cdrskin-0.4.1.tar.gz</A>
(680 KB).
<A HREF="cdrskin-0.5.3.tar.gz">cdrskin-0.5.3.tar.gz</A>
(735 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.1-x86-suse9_0.tar.gz">
cdrskin_0.4.1-x86-suse9_0.tar.gz</A>, (105 KB).
<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.1-x86-suse9_0-static.tar.gz">
cdrskin_0.4.1-x86-suse9_0-static.tar.gz</A>, (310 KB)
<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>
@ -311,14 +332,33 @@ provide libburn with invaluable examples on how to deal with DVD media.
<A NAME="examples">
<P>
<DL>
<DT>Example for a setup of device permissions. To be done by the superuser:</DT>
<DT>(CD devices which offer no rw-permission are invisible to normal users.)
<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&nbsp; dev='/dev/sr0'&nbsp; rwrwr- :&nbsp; 'TEAC' 'CD-ROM CD-532S'</KBD></DD>
<DD><KBD>0&nbsp; dev='/dev/sr0'&nbsp; rwr-r- :&nbsp; 'TEAC' 'CD-ROM CD-532S'</KBD></DD>
<DD><KBD>1&nbsp; dev='/dev/hdc'&nbsp; rwrw-- :&nbsp; '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>
@ -333,6 +373,8 @@ Example how to setup K3b to use cdrskin for burning data CD projects.
is a GUI frontend which uses cdrecord for CD burning.)
</P>
<!--
<HR>
<A NAME="scdbackup">
@ -387,6 +429,8 @@ and try again.
</DL>
</P>
-->
<HR>
<A NAME="cdrecord">
@ -399,7 +443,7 @@ cdrecord but not vice versa.
I am a long time user of cdrecord and it works 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 not problem with it.
maintained. So for me - there would be no problem with it.
<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).
@ -446,13 +490,25 @@ and by <A HREF="http://sourceforge.net">sourceforge.net</A><BR>
<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 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></DL>
(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>

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2008.01.23.213607"
#define Cdrskin_timestamP "2008.08.20.080001"

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,13 @@
#!/bin/sh
# compile_cdrskin.sh
# Copyright 2005 - 2007 Thomas Schmitt, scdbackup@gmx.net, GPL
# Copyright 2005 - 2008 Thomas Schmitt, scdbackup@gmx.net, GPL version 2
# to be executed within ./libburn-* resp ./cdrskin-*
debug_opts="-O2"
def_opts=
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
libvers="-DCdrskin_libburn_0_4_1"
libvers="-DCdrskin_libburn_0_5_2"
cleanup_src_or_obj="libburn/cleanup.o"
libdax_msgs_o="libburn/libdax_msgs.o"
libdax_audioxtr_o="libburn/libdax_audioxtr.o"
@ -33,15 +33,15 @@ do
libdax_audioxtr_o=
libdax_msgs_o="libburn/message.o"
cleanup_src_or_obj="-DCleanup_has_no_libburn_os_H cdrskin/cleanup.c"
elif test "$i" = "-libburn_0_4_0"
elif test "$i" = "-libburn_0_5_2"
then
libvers="-DCdrskin_libburn_0_4_0"
libvers="-DCdrskin_libburn_0_5_2"
libdax_audioxtr_o="libburn/libdax_audioxtr.o"
libdax_msgs_o="libburn/libdax_msgs.o"
cleanup_src_or_obj="libburn/cleanup.o"
elif test "$i" = "-libburn_svn"
then
libvers="-DCdrskin_libburn_0_4_1"
libvers="-DCdrskin_libburn_0_5_3"
libdax_audioxtr_o="libburn/libdax_audioxtr.o"
libdax_msgs_o="libburn/libdax_msgs.o"
cleanup_src_or_obj="libburn/cleanup.o"
@ -76,7 +76,7 @@ do
echo " -compile_cdrfifo compile program cdrskin/cdrfifo."
echo " -compile_dewav compile program test/dewav without libburn."
echo " -cvs_A60220 set macro to match libburn-CVS of 20 Feb 2006."
echo " -libburn_0_4_0 set macro to match libburn-0.4.0."
echo " -libburn_0_5_2 set macro to match libburn-0.5.2"
echo " -libburn_svn set macro to match current libburn-SVN."
echo " -no_largefile do not use 64 bit off_t (must match libburn)."
echo " -do_not_compile_cdrskin omit compilation of cdrskin/cdrskin."

View File

@ -16,7 +16,7 @@ manpage="cdrskin"
raw_html=$(pwd)/"cdrskin/raw_man_1_cdrskin.html"
htmlpage=$(pwd)/"cdrskin/man_1_cdrskin.html"
if test -r "$manpage"
if test -r "$man_dir"/"$manpage".1
then
dummy=dummy
else
@ -56,7 +56,7 @@ then
-e 's/^If you only got one CD capable drive/\&nbsp;<BR>If you only got one CD capable drive/' \
-e 's/<b>Emulated drives:<\/b>/\&nbsp;<BR><b>Emulated drives:<\/b>/' \
-e 's/^Alphabetical list of options/\&nbsp;<BR>Alphabetical list of options/' \
-e 's/and for all others\.<\/td><\/table>/and for all others.<\/td><\/table> <BR><HR><FONT SIZE=-1><CENTER>(HTML generated from '"$manpage"'.1 on '"$(date)"' by '$(basename "$0")' )<\/CENTER><\/FONT>/' \
-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>/' \
<"$2" >"$htmlpage"

View File

@ -8,9 +8,9 @@
Its paragon, 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. Currently it does CD-R and CD-RW this way.
Overwriteable media DVD-RAM, DVD+RW and DVD-RW are handled differently than
with cdrecord-ProDVD in order to offer TAO-like single track recording.
Sequential DVD-R[W] and DVD+R are handled like CD-R[W] with TAO and
Overwriteable media DVD-RAM, DVD+RW, DVD-RW, and BD-RE are handled differently
than with cdrecord-ProDVD in order to offer TAO-like single track recording.
Sequential DVD-R[W], DVD+R, DVD+R DL are handled like CD-R[W] with TAO and
multi-session. Additionally cdrskin offers cdrecord-ProDVD-like mode DAO
with DVD-R[W].
@ -23,7 +23,7 @@ About libburn API for burning CD and DVD: http://api.libburnia-project.org
--------------------------------------------------------------------------
For dual layer DVD types see the advice to use dvd+rw-tools at
For yet unsupported media types see the advice to use dvd+rw-tools at
the end of this text.
--------------------------------------------------------------------------
@ -81,6 +81,19 @@ has to offer both, r- and w-permission.
--------------------------------------------------------------------------
blank=as_needed applies the suitable blanking or formatting to make
any supported type of media ready for writing from scratch.
If this is not possible, e.g. because the media is written and not
re-usable, then the program run fails.
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 aquire MMC background information before making use of them.
--------------------------------------------------------------------------
cdrskin does not only read from and write to optical drives which comply
to the MMC standard but also does the same with regular files or block
devices other than optical drives.
@ -115,9 +128,9 @@ All files used as pseudo-drives have to offer rw-permission.
--------------------------------------------------------------------------
The DVD capabilities of cdrskin differ from those of cdrecord-ProDVD. cdrskin
offers TAO-like multi-session with DVD-R[W], DVD+R and TAO-like single session
with overwriteable DVD media. It also offers DAO on DVD-R[W] which is probably
the same as the traditional cdrecord-ProDVD write mode.
offers TAO-like multi-session with DVD-R[W], DVD+R[ DL] and TAO-like single
session with overwriteable DVD media. It also offers DAO on DVD-R[W] which is
probably the same as the traditional cdrecord-ProDVD write mode.
Non-cdrecord blank mode blank=format_overwrite brings a DVD-RW
disc from its initial profile "Sequential Recording" into profile state
@ -126,9 +139,9 @@ disc from its initial profile "Sequential Recording" into profile state
cdrskin dev=/dev/sr0 -v blank=format_overwrite
}}}
DVD-RAM, DVD+RW and overwriteable DVD-RW appear to cdrskin as blank media
which are capable of taking only a single track. This track may be positioned
on a 32KiB aligned address, though.
DVD-RAM, DVD+RW, BD-RE and overwriteable DVD-RW appear to cdrskin as blank
media which are capable of taking only a single track. This track may be
positioned on a 32KiB aligned address, though.
{{{
cdrskin ... write_start_address=2412m ...
}}}
@ -151,7 +164,7 @@ option -multi tolerable with media and write modes which are not suitable for
multi-session. (The default behavior of cdrskin deems me to be preferrable.)
Option --grow_overwriteable_iso gives cdrskin ISO pseudo-multi-session
capabilities on DVD-RAM and DVD+RW similar to growisofs.
capabilities on DVD-RAM, DVD+RW, BD-RE similar to growisofs.
Associated options blank=, -multi, -msinfo and -toc are available in this case.
They either pretend a blank media (if there is no ISO 9660 image) or appendable
media with a single session and track on it. blank= invalidates ISO images.
@ -268,10 +281,10 @@ for an illustrated example with K3b 0.10 .
DVD advise:
For burning of DVD media other than DVD-RAM, DVD+RW, DVD+R, DVD-RW, DVD-R,
the cdrskin project currently advises to use Andy Polyakov's dvd+rw-tools
which despite their historic name are capable of all the media above
and also do dual layer and even BD discs.
For burning of DVD/BD media other than DVD-RAM, DVD+RW, DVD+R, DVD+R DL,
DVD-RW, DVD-R, BD-RE, the cdrskin project currently advises to use
Andy Polyakov's dvd+rw-tools which despite their historic name are
capable of all the media above and more, including BD discs.
http://fy.chalmers.se/~appro/linux/DVD+RW/tools
@ -279,15 +292,27 @@ They are not compatible or related to cdrecord resp. cdrecord-ProDVD
(now obsoleted by original source cdrtools cdrecord with identical
capabilities besides the license key).
--------------------------------------------------------------------------
Advanced multi-session use cases:
A special feature of dvd+rw-tools is growing of ISO-9660 filesystems on
overwriteable media. This is not the same as multi-session writing of cdrskin
with CD media, but retrieves additional information from the existing ISO
image and finally manipulates the start sectors of this existing image.
So, inspired by growisofs, cdrskin can offer DVD multi-session not only with
sequential DVD-R[W] and with DVD+R, but also with DVD-RAM, DVD+RW and
even regular disk files or block devices other than CD/DVD writers.
sequential DVD-R[W] and with DVD+R [DL], but also with DVD-RAM, DVD+RW, BD-RE
and even regular disk files or block devices other than CD/DVD writers.
This is enabled by option --grow_overwriteable_iso.
The libburnia project provides an integrated ISO-9660 multi-session tool
named [wiki:Xorriso xorriso] which tries to go one step beyond
growisofs. It uses [wiki:Libburn libburn] , [wiki:Libisofs libisofs]
and [wiki:Libisoburn libisoburn].
See [http://scdbackup.sourceforge.net/man_1_xorriso.html man xorriso].
--------------------------------------------------------------------------

View File

@ -1,4 +1,4 @@
AC_INIT([libburn], [0.4.1], [http://libburnia-project.org])
AC_INIT([libburn], [0.5.2], [http://libburnia-project.org])
AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h])
@ -7,85 +7,88 @@ AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE([subdir-objects])
dnl Note by ts A71207:
dnl Notes by ts A71207 - A80126 :
dnl
dnl BURN_MICRO_VERSION was _not_ the third component Z of libburn-X.Y.Z
dnl but an eternal counter which leads to CURRENT. This misunderstanding
dnl caused a messed up sequence of CURRENTs.
dnl Regrettably the meaning of the various version types was misunderstood
dnl before version 0.4.1.
dnl
dnl CURRENT and AGE describe the binary compatibility interval of a
dnl dynamic library.
dnl See also http://www.gnu.org/software/libtool/manual.html#Interfaces
dnl In the past MAJOR.MINOR.MICRO versions led to the following SONAME numbers:
dnl 0.2.2 = 2 , 0.2.3 = 3 , 0.2.6 = 6
dnl 0.3.0 = 0 , 0.3.2 = 2 , 0.3.4 = 4 . 0.3.6 = 6 , 0.3.8 = 4
dnl 0.4.0 = 0 (also released as SONAME 4)
dnl
dnl The name of the library will be libburn.so.$CURRENT-$AGE.$AGE.$REV
dnl Meanwhile the following schemes are maintained in parallel:
dnl
dnl BURN_MAJOR_VERSION , BURN_MINOR_VERSION , BURN_MICRO_VERSION
dnl are three small non-negative integers which describe the evolution
dnl steps of the library.
dnl Older applications are able to use younger libraries over
dnl quite a long range of such steps. Some day, nevertheless,
dnl compatibility might get terminated, after due notice.
dnl
dnl SONAME (libburn.so.4)
dnl is a small positive integer which marks a family of compatible
dnl evolution steps. Libraries with a particular SONAME allow a binary
dnl with the same SONAME to start up. Any further compatibility check is to
dnl be done by own runtime means. Especially *_version() calls in the API
dnl which return BURN_MAJOR_VERSION, BURN_MINOR_VERSION, BURN_MICRO_VERSION.
dnl See below.
dnl
dnl CURRENT, AGE, REVISION
dnl are three integers used by libtool. CURRENT is positive, the others
dnl non-negative. The use at runtime is not known yet. But libtool computes
dnl at build time SONAME = CURRENT - AGE.
dnl So this is a superspace of the SONAME version space. To avoid
dnl ill SONAME, the value of CURRENT must be larger than AGE.
dnl See also http://www.gnu.org/software/libtool/manual.html#Interfaces
dnl
dnl The name of the dynamic library will be libburn.so.$SONAME.$AGE.$REV .
dnl In the terminology of this file:
dnl CURRENT = LT_CURRENT
dnl REV = LT_REVISION
dnle AGE = LT_AGE
dnl CURRENT = LT_CURRENT
dnl AGE = LT_AGE
dnl REVISION= LT_REVISION
dnl
dnl In the past the following CURRENTs of libburn have been released.
dnl All with AGE=0.
dnl 0.2.2 = 2 , 0.2.3 = 3 , 0.2.6 = 6
dnl 0.3.0 = 0 , 0.3.2 = 2 , 0.3.4 = 4 . 0.3.6 = 6 , 0.3.8 = 4
dnl 0.4.0 = 0
dnl
dnl Beginning with libburn-0.4.1 a rectified counting was introduced as
dnl CURRENT=10, REV=1, AGE=6
dnl This rectification declared the current version
dnl to be binary compatible down to libburn-0.3.4.
dnl Real backward compatibility is given down to libburn-0.3.2.
dnl Beware of libburn-0.2.6 which had CURRENT=6.
dnl CURRENT=10, REVISION=1, AGE=6
dnl This rectification declared that version to be binary compatible up
dnl from libburn-0.3.4.
dnl Real compatibility was given since libburn-0.3.2.
dnl Beware of libburn-0.2.6 which had SONAME=6 and is not binary compatible.
dnl Applications for libburn-0.2 to libburn-0.3.1 need recompilation but no
dnl source code changes.
dnl
dnl CURRENT=10, REV=0, AGE=6 would be appropriate for libburn-0.4.0
dnl but was not issued, regreattably.
dnl
dnl If libburn-0.4.0 gets patched, its CURRENT will become 10, AGE 6, and
dnl REV will be set to one higher than the highest REV of CURRENT 10.
dnl If libburn-0.4.1 is still on CURRENT 10 then its REV gets set one higher
dnl than that.
dnl As soon as 0.4.1 becomes upwardly incompatible, it shall become 11,0,7.
dnl From then on it counts REV independently of libburn-0.4.0.
dnl Whether 0.4.1 alters independent REV at all, is not decided yet.
dnl It may well stay 0 until a release version joins CURRENT 11.
dnl
dnl Under the preconditions
dnl CURRENT= $BURN_MICRO_VERSION - $BURN_INTERFACE_AGE
dnl REV= $BURN_INTERFACE_AGE
dnl AGE= $BURN_BINARY_AGE
dnl the following old instructions were reasonable. Their drawback
dnl is that they cause large jumps in CURRENT, when BURN_INTERFACE_AGE gets
dnl reset to 0 from a high value. So this is outdated now:
dnl ---------------------------------------------------------------------------
dnl .Making releases:
dnl . BURN_MICRO_VERSION += 1;
dnl . BURN_INTERFACE_AGE += 1;
dnl . BURN_BINARY_AGE += 1;
dnl .if any functions have been added, set BURN_INTERFACE_AGE to 0.
dnl .if backwards compatibility has been broken,
dnl .set BURN_BINARY_AGE and BURN_INTERFACE_AGE to 0.
dnl .
dnl .if MAJOR or MINOR version changes, be sure to change AC_INIT above to match
dnl ---------------------------------------------------------------------------
dnl
dnl Instead, LT_CURRENT, LT_REVISION and LT_AGE get set directly now.
dnl Neatly versioned stable releases meanwhile:
dnl 0.4.2 = libburn.so.4.7.0
dnl 0.4.4 = libburn.so.4.9.0
dnl 0.4.6 = libburn.so.4.11.0
dnl 0.4.8 = libburn.so.4.13.0
dnl 0.5.0 = libburn.so.4.15.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.
dnl The linker will do no finer checks. Especially no age range check for
dnl the cdrskin binary. If SONAME matches, then the couple starts.
dnl the application binary. If SONAME matches, then the couple starts.
dnl
dnl Therefore a run time check is provided by libburn function burn_version().
dnl It returns the major, minor and micro revision of the library. This means
dnl BURN_*_VERSION kept its second job which does not comply to the usual ways
dnl of configure.ac . I.e. now *officially* this is the source code release
dnl version as announced to the public. It has no conection to SONAME or
dnl libtool version numbering.
dnl It rather feeds the API function burn_version().
dnl Therefore at run time info is provided by libburn function burn_version().
dnl It returns the major, minor and micro revision of the library.
dnl Before using any API feature, a program should check for age.
dnl
dnl The variables BURN_*_VERSION are mere copies for informing libtool.
dnl The true values which get issued and should be compared are macros
dnl defined in libburn/libburn.h .
dnl
dnl Normally one can allow a program to run with a library which passed the
dnl linker SONAME test and which is not older than the library it was
dnl developed for. Library2 is younger than library1 if:
dnl major2>major1 || (major2==major1 &&
dnl (minor2>minor1 || (minor2==minor1 && micro2 > micro1)))
dnl
dnl If BURN_*_VERSION changes, be sure to change AC_INIT above to match.
dnl
dnl As said: Only copies. Original in libburn/libburn.h : burn_header_version_*
BURN_MAJOR_VERSION=0
BURN_MINOR_VERSION=4
BURN_MICRO_VERSION=1
BURN_MINOR_VERSION=5
BURN_MICRO_VERSION=2
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
AC_SUBST(BURN_MAJOR_VERSION)
@ -95,10 +98,17 @@ AC_SUBST(BURN_VERSION)
dnl Libtool versioning
LT_RELEASE=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
# SONAME = 10 - 6 = 4 . Library name = libburn.4.6.1
LT_CURRENT=10
LT_REVISION=1
LT_AGE=6
dnl
dnl ts A80820
dnl This is the release version libburn-0.5.2 = libburn.so.4.17.0
dnl ### This is the development version after above release version
dnl ### LT_CURRENT++, LT_AGE++ has not yet happened.
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile.
dnl
dnl SONAME = 21 - 17 = 4 . Library name = libburn.so.4.17.0
LT_CURRENT=21
LT_AGE=17
LT_REVISION=0
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
AC_SUBST(LT_RELEASE)
@ -107,7 +117,7 @@ AC_SUBST(LT_REVISION)
AC_SUBST(LT_AGE)
AC_SUBST(LT_CURRENT_MINUS_AGE)
# ts A71207: This is done only not to break any old components
dnl ts A71207: This is done only not to break any old components
BURN_INTERFACE_AGE=$LT_REVISION
BURN_BINARY_AGE=`expr $LT_AGE + $BURN_INTERFACE_AGE`
AC_SUBST(BURN_INTERFACE_AGE)
@ -169,6 +179,6 @@ AC_CONFIG_FILES([
Makefile
doc/doxygen.conf
version.h
libburn-5.pc
libburn-1.pc
])
AC_OUTPUT

View File

@ -7,10 +7,12 @@
Libburnia is an open-source project for reading, mastering and writing
optical discs.
For now this means CD-R, CD-RW, DVD-RAM, DVD+RW, DVD+R, DVD-RW, DVD-R.
For now this means CD-R, CD-RW, DVD-RAM, DVD+RW, DVD+R, DVD+R/DL, DVD-RW,
DVD-R, BD-RE.
Not supported yet are dual layer media, HD-DVD, BD (blue ray). Testers for
dual layer DVD+/-R are wanted, though.
Not supported yet are DVD-R/DL, HD-DVD, BD-R (blue ray). Testers for
DVD-R/DL are wanted, though. BD-R programming efforts would be made
if an interested tester contacts us.
The project comprises of several more or less interdependent parts which
together strive to be a usable foundation for application development.
@ -22,13 +24,18 @@ 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 workable code base for burning data and audio CDs and many DVD types.
The burn API is quite comprehensively documented and can be used to build a
presentable application.
We have a well tested code base for burning data and audio CDs and many DVD
types. The burn API is quite comprehensively documented and can be used to
build a presentable application.
We have a functional binary 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.
@subsection components The project components (list subject to growth, hopefully):
- libburn is the library by which preformatted data get onto optical media.
@ -43,28 +50,28 @@ scope by help of existing cdrecord frontends.
ISO 9660 disk image. This may then be brought to CD via libburn.
libisofs is to be the foundation of our upcoming mkisofs emulation.
- libisoburn is an add-on to libburn and libisofs which 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.
- 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.
- 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.
provides libburn's DVD/BD 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 upcomming application of all three libraries which creates,
loads, manipulates and writes ISO 9660 filesystem images with
Rock Ridge extensions. Manipulation will not only be adding or
- 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 deletion, renaming, and attribute
changing.
See SVN of libisoburn, man test/xorriso.1, test/compile_xorriso.sh
changing. An incremental backup feature is provided.
See xorriso/README for more
- "test" is a collection of application gestures and examples given by the
authors of the library features. The burn API example of libburn
@ -72,7 +79,19 @@ scope by help of existing cdrecord frontends.
demonstrated in test/telltoc.c .
Explore these examples if you look for inspiration.
We plan to be a responsive upstream. Bear with us.
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).
@section using Using the libraries

View File

@ -1,11 +1,11 @@
libburnia-project.org Optical Media Rotisserie Recipes as of August 2007
libburnia-project.org Optical Media Rotisserie Recipes as of April 2008
Content:
- TAO Multi-Session CD Cookbook (CD-R, CD-RW)
- SAO CD Cookbook (CD-R, CD-RW, pure audio or pure data only)
- Overwriteable DVD Cookbook (DVD-RAM, DVD+RW, DVD-RW)
- Overwriteable DVD Cookbook (DVD-RAM, DVD+RW, DVD-RW, BD-RE)
- Sequential DVD-R[W] Cookbook
- DVD+R Cookbook
- DVD+R[/DL] Cookbook
-------------------------------------------------------------------------------
TAO Multi-Session CD Cookbook
@ -403,7 +403,8 @@ correctness of Pre-gap and Post-gap would become evident.
-------------------------------------------------------------------------------
Inspired by Andy Polyakov's http://fy.chalmers.se/~appro/linux/DVD+RW/tools ,
backed by reading mmc5r03c.pdf from http://www.t10.org/ftp/t10/drafts/mmc5/
and by experiments with drives NEC ND-4570A and LG GSA-4082B.
by own experiments with drives NEC ND-4570A, LG GSA-4082B, PHILIPS SPD3300L,
and by BD-RE experiments done by Giulio Orsero on LG BE06LU10.
For libburnia-project.org by Thomas Schmitt <scdbackup@gmx.net>
@ -416,18 +417,20 @@ DVD-RAM 0012h
DVD-RW Restricted Overwrite 0013h
DVD-RW Sequential Recording 0014h (i.e. unformatted)
DVD+RW 001Ah
BD-RE 0043h
A short compilation of the write model:
- Overwriting in general
The recipes described here are depending on formatting state:
- DVD-RAM, fully formatted DVD+RW or DVD-RW
- DVD-RAM, fully formatted DVD+RW, DVD-RW, BD-RE
- Unformatted DVD+RW
- Partly formatted DVD+RW
- Unformatted DVD-RW
- Partly formatted DVD-RW
- Intermediate state DVD-RW
- DVD-RAM and BD-RE formatting
- DVD-RAM and BD-RE speed tuning
-------------------------------------------------------------------------------
Overwriting in general :
@ -444,7 +447,7 @@ Optimal performance is promised without any speed setting. But my experiments
showed that SET STREAMING values persist after media change.
In the formatted area of the media, coarse random access is possible.
For DVD-RAM and DVD+RW write addresses and data size need to be aligned
For DVD-RAM, DVD+RW, BD-RE write addresses and data size need to be aligned
to 2 KiB. For DVD-RW alignment has to be 32 KiB. Within these limitations
the write address is at the discretion of the sending program.
Just use 2Ah WRITE to send data.
@ -483,9 +486,12 @@ software did anything wrong.
-------------------------------------------------------------------------------
DVD-RAM, fully formatted DVD+RW or DVD-RW :
DVD-RAM, fully formatted DVD+RW, DVD-RW, BD-RE :
Full format is the natural state of DVD-RAM.
Full format is the natural state of DVD-RAM.
BD-RE are sold unformatted and need to be fully formatted first.
See paragraph about DVD-RAM and BD-RE formatting below.
DVD+RW reaches this state if Background Formatting is allowed to finish without
being stopped by 5Bh CLOSE TRACK SESSION.
@ -671,6 +677,91 @@ of Intermediate state by 5Bh CLOSE TRACK SESSION with Close Function 010b.
(mmc5r03c.pdf 6.3.3.2.3)
-------------------------------------------------------------------------------
DVD-RAM and BD-RE formatting :
Although DVD-RAM usually are sold formatted, there may still arise the wish
to adjust formatting.
BD-RE are sold unformatted and need to be formatted prior to usage.
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 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.
00h offers the default size format.
30h offers several sizes with defect management. Usually there are three
size to choose: #1: default size, #2: maximum spare area, #3: minimal spare.
31h offers a single size and disables defect management. This has the side
effect to speed up writing to nominal speed.
(mmc5r03c.pdf 6.5.4.2.15, 6.24.3.3, Table 472)
Only format sizes from the list of format descriptors are permissible
for DVD-RAM. The format list can be obtained by 23h READ FORMAT CAPACITIES.
It also includes a description of the current formatting state.
(mmc5r03c.pdf 6.24, 6.24.3.2, 6.24.3.3)
Formatting is done by command 04h FORMAT UNIT. Its data payload consists
of a Format List Header and a Format Descriptor. It is advisable to set
the Immed bit and the FOV bit in header byte number 1. The descriptor should
be a copy of a descriptor from 23h READ FORMAT CAPACITIES.
(mmc5r03c.pdf 6.5, 6.5.3.2, 6.5.3.3)
With nearly all formats Sub-type should be set to 0. But with BD-RE formats
30h and 31h the Sub-type selects the certification mode.
Usable with 30h seem 10b Full Certification and 11b Quick Certification.
Usable with 31h seem also 00b Quick Reformat and 01b No Certification.
(mmc5r03c.pdf 6.5.4.2.15.1)
Other format types have their certification intensity controlled by
a pair of bits: CmpList and DCRT.
CmpList resides in CDB byte 1 as bit 3. DCRT resides in the payload byte 1
as bit 5. Both together should request a quick size change without lengthy
certification but maintaining the list of known defects.
(mmc5r03c.pdf 6.5, table 249, 6.5.3.2)
With DVD-RAM on my PHILIPS SPD3300L drive they prevent any format size
change though. The TSSTcorp SH-S203B works properly.
With BD-RE format 00h, the default is specified to be Quick Reformat,
and with 00h in general certification can only be disabled not enabled.
(mmc5r03c.pdf 6.5.4.2.1.7)
-------------------------------------------------------------------------------
DVD-RAM and BD-RE tuning :
A special aspect of DVD-RAM and BD-RE is their low speed with write operations,
which usually is only half than the nominal speed of media and drive.
This is blamed to the automatic checkreading which happens ifor managing
eventual defects.
Defect management of BD-RE can be disabled by format type 31h. See above.
There is no drive known yet which would apply command 2Ah WRITE10 to DVD-RAM
with full speed.
The only known way to get full speed from DVD-RAM or BD-RE with enabled defect
management is the use of AAh WRITE12 with Streaming Bit set to 1.
(mmc5r03c.pdf 6.45)
With some DVD-RAM drives this fails if a write buffer is not full 32 kB.
With the tested BD-RE ione has to write write full 64 kB buffers.
Although it seems not optimal, this is specified not only to disable the
cumbersome checkread but also to ignore known defects and to write data
to these defective addresses.
(mmc5r03c.pdf 4.8.5)
So the speed-up is only advisable as long as the media are free of
incorrectable errors.
Caveat:
MMC-5 does not guarantee AAh WRITE12 to work on DVD-RAM or BD-RE at all.
None of the features of profiles 0012h and 0043 promises the existence of
AAh WRITE12.
Nevertheless it worked on all tested drives is proper alignment was observed.
(mmc5r03c.pdf 5.4.13, 6.45)
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
@ -990,7 +1081,7 @@ close session if multi-session is demanded.
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
DVD+R Cookbook
DVD+R[/DL] Cookbook
-------------------------------------------------------------------------------
Inspired by reading mmc5r03c.pdf from http://www.t10.org/ftp/t10/drafts/mmc5/
backed by Andy Polyakov's http://fy.chalmers.se/~appro/linux/DVD+RW/tools ,
@ -1006,7 +1097,7 @@ DVD+R/DL 002bh
- About empty, appendable and finalized DVD+R
- Writing a Pseudo Session to DVD+R
- >>> Hearsay about DVD+R/DL (Dual Layer) :
- DVD+R/DL (Dual Layer
The following two chapters of the Sequential DVD-R[W] Cookbook are valid for
DVD+R media too:
@ -1100,9 +1191,11 @@ by closing them already after the first session.
-------------------------------------------------------------------------------
Hearsay about DVD+R/DL (Dual Layer) :
DVD+R/DL (Dual Layer) :
>>>
libburn treats DL media just like their single layer equivalents.
This seems to work fine for DVD+R/DL, according to a report by nightmorph
in http://libburnia-project.org/ticket/13 .
-------------------------------------------------------------------------------

View File

@ -4,7 +4,7 @@ libdir=@libdir@
includedir=@includedir@
Name: libburn
Description: Disc reading/writing library
Description: Library to read/write optical discs
Version: @VERSION@
Requires:
Libs: -L${libdir} -lburn

View File

@ -43,7 +43,15 @@
#include "libdax_msgs.h"
extern struct libdax_msgs *libdax_messenger;
#define SCAN_GOING() (workers && !workers->drive)
/* ts A80714 : introduced type codes for the worker list */
#define Burnworker_type_scaN 0
#define Burnworker_type_erasE 1
#define Burnworker_type_formaT 2
#define Burnworker_type_writE 3
#define Burnworker_type_fifO 4
#define SCAN_GOING() (workers != NULL && \
workers->w_type == Burnworker_type_scaN)
typedef void *(*WorkerFunc) (void *);
@ -85,6 +93,9 @@ struct fifo_opts
struct w_list
{
/* ts A80714 */
int w_type; /* see above define Burnworker_type_* */
struct burn_drive *drive;
pthread_t thread;
@ -113,7 +124,8 @@ static struct w_list *find_worker(struct burn_drive *d)
return NULL;
}
static void add_worker(struct burn_drive *d, WorkerFunc f, void *data)
static void add_worker(int w_type, struct burn_drive *d,
WorkerFunc f, void *data)
{
struct w_list *a;
struct w_list *tmp;
@ -124,6 +136,7 @@ static void add_worker(struct burn_drive *d, WorkerFunc f, void *data)
#endif
a = malloc(sizeof(struct w_list));
a->w_type = w_type;
a->drive = d;
a->u = *(union w_list_data *)data;
@ -143,9 +156,11 @@ static void add_worker(struct burn_drive *d, WorkerFunc f, void *data)
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
attr_pt= &attr;
/*
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)) {
@ -178,12 +193,14 @@ static void remove_worker(pthread_t th)
dispose themselves.
*/
ret = pthread_detach(th);
/*
sprintf(msg,
"remove_workers(): pid= %lu pthread_detach(%lu)= %d",
(unsigned long) getpid(), (unsigned long) th, ret);
libdax_msgs_submit(libdax_messenger, -1, 0x00020158,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_LOW,
msg, 0, 0);
*/
#endif /* Libburn_detach_done_workeR */
@ -255,7 +272,8 @@ drive_is_active:;
o.drives = drives;
o.n_drives = n_drives;
o.done = 0;
add_worker(NULL, (WorkerFunc) scan_worker_func, &o);
add_worker(Burnworker_type_scaN, NULL,
(WorkerFunc) scan_worker_func, &o);
} else if (workers->u.scan.done) {
/* its done */
ret = workers->u.scan.done;
@ -299,7 +317,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
"NULL pointer caught in burn_disc_erase", 0, 0);
return;
}
if ((SCAN_GOING()) || find_worker(drive)) {
if ((SCAN_GOING()) || find_worker(drive) != NULL) {
libdax_msgs_submit(libdax_messenger, drive->global_index,
0x00020102,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
@ -339,7 +357,8 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
o.drive = drive;
o.fast = fast;
add_worker(drive, (WorkerFunc) erase_worker_func, &o);
add_worker(Burnworker_type_erasE, drive,
(WorkerFunc) erase_worker_func, &o);
}
@ -360,7 +379,7 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag)
int ok = 0;
char msg[160];
if ((SCAN_GOING()) || find_worker(drive)) {
if ((SCAN_GOING()) || find_worker(drive) != NULL) {
libdax_msgs_submit(libdax_messenger, drive->global_index,
0x00020102,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
@ -388,6 +407,10 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag)
size = 0;
flag &= ~(2|8); /* no insisting in size 0, no expansion */
flag |= 4; /* format up to maximum size */
} else if (drive->current_profile == 0x12) {
ok = 1; /* DVD-RAM */
} else if (drive->current_profile == 0x43) {
ok = 1; /* BD-RE */
}
if (!ok) {
@ -403,7 +426,8 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag)
o.drive = drive;
o.size = size;
o.flag = flag;
add_worker(drive, (WorkerFunc) format_worker_func, &o);
add_worker(Burnworker_type_formaT, drive,
(WorkerFunc) format_worker_func, &o);
}
@ -433,7 +457,7 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
/* ts A61006 */
/* a ssert(!SCAN_GOING()); */
/* a ssert(!find_worker(opts->drive)); */
if ((SCAN_GOING()) || find_worker(opts->drive)) {
if ((SCAN_GOING()) || find_worker(opts->drive) != NULL) {
libdax_msgs_submit(libdax_messenger, opts->drive->global_index,
0x00020102,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
@ -487,7 +511,8 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
opts->refcount++;
add_worker(opts->drive, (WorkerFunc) write_disc_worker_func, &o);
add_worker(Burnworker_type_writE, opts->drive,
(WorkerFunc) write_disc_worker_func, &o);
}
@ -515,7 +540,8 @@ int burn_fifo_start(struct burn_source *source, int flag)
o.source = source;
o.flag = flag;
add_worker(NULL, (WorkerFunc) fifo_worker_func, &o);
add_worker(Burnworker_type_fifO, NULL,
(WorkerFunc) fifo_worker_func, &o);
fs->is_started = 1;
return 1;
}

View File

@ -46,6 +46,9 @@ extern struct libdax_msgs *libdax_messenger;
static struct burn_drive drive_array[255];
static int drivetop = -1;
/* ts A80410 : in init.c */
extern int burn_support_untested_profiles;
/* ts A61021 : the unspecific part of sg.c:enumerate_common()
*/
int burn_setup_drive(struct burn_drive *d, char *fname)
@ -58,6 +61,7 @@ int burn_setup_drive(struct burn_drive *d, char *fname)
d->released = 1;
d->stdio_fd = -1;
d->status = BURN_DISC_UNREADY;
d->do_stream_recording = 0;
return 1;
}
@ -192,6 +196,31 @@ unsigned int burn_drive_count(void)
}
/* ts A80801 */
int burn_drive_is_listed(char *path, struct burn_drive **found, int flag)
{
int i, ret;
char drive_adr[BURN_DRIVE_ADR_LEN], off_adr[BURN_DRIVE_ADR_LEN];
ret = burn_drive_convert_fs_adr(path, off_adr);
if (ret <= 0)
strcpy(off_adr, path);
for (i = 0; i <= drivetop; i++) {
if (drive_array[i].global_index < 0)
continue;
ret = burn_drive_d_get_adr(&(drive_array[i]), drive_adr);
if (ret <= 0)
continue;
if(strcmp(off_adr, drive_adr) == 0) {
if (found != NULL)
*found= &(drive_array[i]);
return 1;
}
}
return 0;
}
/* ts A61125 : media status aspects of burn_drive_grab() */
int burn_drive_inquire_media(struct burn_drive *d)
{
@ -439,6 +468,9 @@ int burn_drive_mark_unready(struct burn_drive *d)
burn_disc_free(d->disc);
d->disc = NULL;
}
if (d->stdio_fd >= 0)
close (d->stdio_fd);
d->stdio_fd = -1;
return 1;
}
@ -585,7 +617,7 @@ void burn_disc_erase_sync(struct burn_drive *d, int fast)
/*
@param flag: bit0 = fill formatted size with zeros
bit1, bit2 , bit4, bit7 - bit15 are for d->format_unit()
bit1, bit2 , bit4, bit5, bit7 - bit15 are for d->format_unit()
*/
void burn_disc_format_sync(struct burn_drive *d, off_t size, int flag)
{
@ -608,7 +640,7 @@ void burn_disc_format_sync(struct burn_drive *d, off_t size, int flag)
d->cancel = 0;
d->busy = BURN_DRIVE_FORMATTING;
ret = d->format_unit(d, size, flag & 0xff96); /* forward bits */
ret = d->format_unit(d, size, flag & 0xfff6); /* forward bits */
if (ret <= 0)
d->cancel = 1;
@ -1159,6 +1191,20 @@ int burn_drive_is_banned(char *device_address)
}
/* ts A80731 */
int burn_drive_whitelist_count(void)
{
return enumeration_whitelist_top + 1;
}
char *burn_drive_whitelist_item(int idx, int flag)
{
if (idx < 0 || idx > enumeration_whitelist_top)
return NULL;
return enumeration_whitelist[idx];
}
/* ts A70924 */
int burn_drive__fd_from_special_adr(char *adr)
{
@ -1253,7 +1299,7 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
d->current_is_supported_profile = 1;
d->block_types[BURN_WRITE_TAO] = BURN_BLOCK_MODE1;
d->block_types[BURN_WRITE_SAO] = BURN_BLOCK_SAO;
d->media_capacity_remaining = size;
burn_drive_set_media_capacity_remaining(d, size);
/* >>> ? open file for a test ? (>>> beware of "-" = stdin) */;
@ -1698,7 +1744,10 @@ int burn_abort(int patience,
occup = burn_drive_is_occupied(&(drive_array[i]));
if(occup == -2)
continue;
if(occup <= 10) {
if(drive_array[i].drive_role != 1) {
drive_array[i].busy = BURN_DRIVE_IDLE;
burn_drive_forget(&(drive_array[i]), 1);
} else if(occup <= 10) {
burn_drive_forget(&(drive_array[i]), 1);
} else if(occup <= 100) {
if(first_round)
@ -1862,8 +1911,8 @@ off_t burn_disc_available_space(struct burn_drive *d,
return 0;
if (d->drive_role != 1) {
if (d->media_capacity_remaining <= 0)
d->media_capacity_remaining =
((off_t) (512 * 1024 * 1024 - 1) * (off_t) 2048);
burn_drive_set_media_capacity_remaining(d,
(off_t) (512 * 1024 * 1024 - 1) * (off_t) 2048);
} else {
if (o != NULL)
d->send_write_parameters(d, o);
@ -2095,7 +2144,7 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
o->start_adr = 1;
size = d->media_capacity_remaining;
burn_os_stdio_capacity(d->devname, &size);
d->media_capacity_remaining = size;
burn_drive_set_media_capacity_remaining(d, size);
o->start_range_high = size;
o->start_alignment = 2048; /* imposting a drive, not a file */
o->might_do_sao = 4;
@ -2160,9 +2209,12 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
if (wt == BURN_WRITE_NONE || wt == BURN_WRITE_SAO ||
wt == BURN_WRITE_TAO)
o->might_simulate = 1;
} else if (d->current_profile == 0x12 || d->current_profile == 0x13 ||
d->current_profile == 0x1a) {
/* DVD-RAM, overwriteable DVD-RW, DVD+RW */
} else if (d->current_profile == 0x12 ||
d->current_profile == 0x13 ||
d->current_profile == 0x1a ||
d->current_profile == 0x43
) {
/* DVD-RAM, overwriteable DVD-RW, DVD+RW, BD-RE */
o->start_adr = 1;
ret = burn_disc_get_formats(d, &status, &size, &dummy,
&num_formats);
@ -2181,6 +2233,8 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
}
if (i >= num_formats) /* not expandable */
o->start_range_high -= 32 * 1024;
if (o->start_range_high < 0)
o->start_range_high = 0;
} else {
o->start_alignment = 2 * 1024;
if (d->best_format_size - 2048 >
@ -2444,3 +2498,11 @@ int burn_drive_find_by_thread_pid(struct burn_drive **d, pid_t pid)
}
/* ts A80422 : centralizing this setting for debugging purposes
*/
int burn_drive_set_media_capacity_remaining(struct burn_drive *d, off_t value)
{
d->media_capacity_remaining = value;
return 1;
}

View File

@ -125,4 +125,14 @@ int burn_drive__fd_from_special_adr(char *adr);
int burn_drive_find_by_thread_pid(struct burn_drive **d, pid_t pid);
/* ts A51221 - A80731 : Whitelist inquiry functions */
int burn_drive_is_banned(char *device_address);
int burn_drive_whitelist_count(void);
char *burn_drive_whitelist_item(int idx, int flag);
/* ts A80801 */
int burn_drive_is_listed(char *path, struct burn_drive **found, int flag);
#endif /* __DRIVE */

View File

@ -540,3 +540,64 @@ int burn_fifo_inquire_status(struct burn_source *source,
return ret;
}
int burn_fifo_peek_data(struct burn_source *source, char *buf, int bufsize,
int flag)
{
int size, free_bytes, ret, wait_count= 0;
char *status_text;
struct burn_source_fifo *fs = source->data;
/* Eventually start fifo thread by reading 0 bytes */
ret = fifo_read(source, (unsigned char *) NULL, 0);
if (ret<0)
return 0;
/* wait for at least bufsize bytes being ready */
while (1) {
ret= burn_fifo_inquire_status(source,
&size, &free_bytes, &status_text);
if (size < bufsize) {
libdax_msgs_submit(libdax_messenger, -1, 0x0002015c,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Fifo size is smaller than desired peek buffer", 0, 0);
return -1;
}
if (fs->out_counter > 0 || (ret & 4) || fs->buf == NULL) {
libdax_msgs_submit(libdax_messenger, -1, 0x0002015e,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Fifo is already under consumption when peeking is desired",
0, 0);
return -1;
}
if(size - free_bytes >= bufsize) {
/* <<<
fprintf(stderr,
"libburn_DEBUG: after waiting cycle %d : fifo %s , %d bytes\n",
wait_count, status_text, size - free_bytes);
*/
memcpy(buf, fs->buf, bufsize);
return 1;
}
if (ret&2) { /* input has ended, not enough data arrived */
libdax_msgs_submit(libdax_messenger, -1, 0x0002015d,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"Fifo input ended short of desired peek buffer size",
0, 0);
return 0;
}
usleep(100000);
wait_count++;
/* <<<
if(wait_count%10==0)
fprintf(stderr,
"libburn_DEBUG: waiting cycle %d : fifo %s , %d bytes\n",
wait_count, status_text, size - free_bytes);
*/
}
return(0);
}

View File

@ -247,7 +247,7 @@ int burn_msgs_submit(int error_code, char msg_text[], int os_errno,
ret = libdax_msgs__text_to_sev(severity, &sevno, 0);
if (ret <= 0)
sevno = LIBDAX_MSGS_SEV_FATAL;
sevno = LIBDAX_MSGS_SEV_ALL;
if (error_code <= 0) {
switch(sevno) {
case LIBDAX_MSGS_SEV_ABORT: error_code = 0x00040000;
@ -258,7 +258,7 @@ int burn_msgs_submit(int error_code, char msg_text[], int os_errno,
break; case LIBDAX_MSGS_SEV_NOTE: error_code = 0x00040005;
break; case LIBDAX_MSGS_SEV_UPDATE: error_code = 0x00040006;
break; case LIBDAX_MSGS_SEV_DEBUG: error_code = 0x00040007;
break; default: error_code = 0x00040001;
break; default: error_code = 0x00040008;
}
}
if (d != NULL)
@ -275,8 +275,16 @@ int burn_text_to_sev(char *severity_name, int *sevno, int flag)
int ret;
ret = libdax_msgs__text_to_sev(severity_name, sevno, 0);
if (ret <= 0)
*sevno = LIBDAX_MSGS_SEV_FATAL;
return ret;
}
/* ts A80202 API */
int burn_sev_to_text(int severity_number, char **severity_name, int flag)
{
int ret;
ret = libdax_msgs__sev_to_text(severity_number, severity_name, 0);
return ret;
}

View File

@ -198,10 +198,12 @@ enum burn_disc_status
BURN_DISC_FULL,
/* ts A61007 */
/* @since 0.2.4 */
/** The drive was not grabbed when the status was inquired */
BURN_DISC_UNGRABBED,
/* ts A61020 */
/* @since 0.2.6 */
/** The media seems not to be suitable for burning */
BURN_DISC_UNSUITABLE
};
@ -242,6 +244,7 @@ enum burn_drive_status
BURN_DRIVE_GRABBING,
/* ts A61102 */
/* @since 0.2.6 */
/** The drive gets written zeroes before the track payload data */
BURN_DRIVE_WRITING_PREGAP,
/** The drive is told to close a track (TAO only) */
@ -250,10 +253,12 @@ enum burn_drive_status
BURN_DRIVE_CLOSING_SESSION,
/* ts A61223 */
/* @since 0.3.0 */
/** The drive is formatting media */
BURN_DRIVE_FORMATTING,
/* ts A70822 */
/* @since 0.4.0 */
/** The drive is busy in synchronous read (if you see this then it
has been interrupted) */
BURN_DRIVE_READING_SYNC,
@ -301,12 +306,14 @@ struct burn_toc_entry
/* Indicates whether extension data are valid and eventually override
older elements in this structure:
bit0= DVD extension is valid
bit0= DVD extension is valid @since 0.3.2
@since 0.5.2 : DVD extensions are made valid for CD too
*/
unsigned char extensions_valid;
/* ts A70201 : DVD extension.
If invalid the members are guaranteed to be 0. */
/* @since 0.3.2 */
/* Tracks and session numbers are 16 bit. Here are the high bytes. */
unsigned char session_msb;
unsigned char point_msb;
@ -402,6 +409,7 @@ struct burn_source {
/* ts A70125 : BROKE BINARY BACKWARD COMPATIBILITY AT libburn-0.3.1. */
/* @since 0.3.2 */
/** Program the reply of (*get_size) to a fixed value. It is advised
to implement this by a attribute off_t fixed_size; in *data .
The read() function does not have to take into respect this fake
@ -449,7 +457,7 @@ struct burn_source {
/* ts A71222 : Supposed to be binary backwards compatible extension. */
/* @since 0.4.2 */
/** Valid only if above member .(*read)() is NULL. This indicates a
version of struct burn_source younger than 0.
From then on, member .version tells which further members exist
@ -574,12 +582,14 @@ struct burn_progress {
int sector;
/* ts A61023 */
/* @since 0.2.6 */
/** The capacity of the drive buffer */
unsigned buffer_capacity;
/** The free space in the drive buffer (might be slightly outdated) */
unsigned buffer_available;
/* ts A61119 */
/* @since 0.2.6 */
/** The number of bytes sent to the drive buffer */
off_t buffered_bytes;
/** The minimum number of bytes stored in buffer during write.
@ -591,6 +601,7 @@ struct burn_progress {
/* ts A61226 */
/* @since 0.3.0 */
/** Description of a speed capability as reported by the drive in conjunction
with eventually loaded media. There can be more than one such object per
drive. So they are chained via .next and .prev , where NULL marks the end
@ -642,7 +653,7 @@ struct burn_speed_descriptor {
This must be called before using any other functions in the library. It
may be called more than once with no effect.
It is possible to 'restart' the library by shutting it down and
re-initializing it. This is necessary if you follow the older and
re-initializing it. Once this was necessary if you follow the older and
more general way of accessing a drive via burn_drive_scan() and
burn_drive_grab(). See burn_drive_scan_and_grab() with its strong
urges and its explanations.
@ -673,6 +684,7 @@ void burn_finish(void);
@return 1 ok, all went well
0 had to leave a drive in unclean state
<0 severe error, do no use libburn again
@since 0.2.6
*/
int burn_abort(int patience,
int (*pacifier_func)(void *handle, int patience, int elapsed),
@ -722,6 +734,7 @@ void burn_set_verbosity(int level);
@param abort_on_busy Unconditionally abort process when a non blocking
exclusive opening attempt indicates a busy drive.
Use this only after thorough tests with your app.
@since 0.2.2
*/
void burn_preset_device_open(int exclusive, int blocking, int abort_on_busy);
@ -730,12 +743,12 @@ void burn_preset_device_open(int exclusive, int blocking, int abort_on_busy);
/** Allows the use of media types which are implemented in libburn but not yet
tested. The list of those untested profiles is subject to change.
Currently it contains: 0x15 "DVD-R/DL sequential recording",
0x2b "DVD+R/DL"
If you really test such media, then please report the outcome on
libburn-hackers@pykix.org
If ever then this call should be done soon after burn_initialize() before
any drive scanning.
@param yes 1=allow all implemented profiles, 0=only tested media (default)
@since 0.3.4
*/
void burn_allow_untested_profiles(int yes);
@ -809,8 +822,7 @@ void burn_allow_untested_profiles(int yes);
(cdrom/burner). Thus use with driveno 0 only. On failure
the array has no valid elements at all.
The returned array should be freed via burn_drive_info_free()
when it is no longer needed, and before calling a scan
function again.
when it is no longer needed.
This is a result from call burn_drive_scan(). See there.
Use with driveno 0 only.
@param adr The persistent address of the desired drive. Either once
@ -820,17 +832,21 @@ void burn_allow_untested_profiles(int yes);
@param load Nonzero to make the drive attempt to load a disc (close its
tray door, etc).
@return 1 = success , 0 = drive not found , -1 = other error
@since 0.2.2
*/
int burn_drive_scan_and_grab(struct burn_drive_info *drive_infos[],
char* adr, int load);
/* ts A51221 */
/* @since 0.2.2 */
/** Maximum number of particularly permissible drive addresses */
#define BURN_DRIVE_WHITELIST_LEN 255
/** Add a device to the list of permissible drives. As soon as some entry is in
the whitelist all non-listed drives are banned from scanning.
@return 1 success, <=0 failure
@since 0.2.2
*/
int burn_drive_add_whitelist(char *device_address);
@ -877,6 +893,7 @@ int burn_drive_scan(struct burn_drive_info *drive_infos[],
Use these two only. Further values are to be defined.
@return 1 on success, 2 if drive was already forgotten,
0 if not permissible, <0 on other failures,
@since 0.2.2
*/
int burn_drive_info_forget(struct burn_drive_info *drive_info, int force);
@ -889,23 +906,28 @@ void burn_drive_info_free(struct burn_drive_info drive_infos[]);
/* ts A60823 */
/* @since 0.2.2 */
/** Maximum length+1 to expect with a persistent drive address string */
#define BURN_DRIVE_ADR_LEN 1024
/* ts A70906 */
/** Inquire the persistent address of the given drive.
@param drive The drive to inquire.
@param adr An application provided array of at least BURN_DRIVE_ADR_LEN
characters size. The persistent address gets copied to it.
@return >0 success , <=0 error (due to libburn internal problem)
@since 0.4.0
*/
int burn_drive_d_get_adr(struct burn_drive *drive, char adr[]);
/* A60823 */
/** Inquire the persistent address of a drive via a given drive_info object.
(Note: This is a legacy call.)
@param drive_info The drive to inquire.Usually some &(drive_infos[driveno])
@param adr An application provided array of at least BURN_DRIVE_ADR_LEN
characters size. The persistent address gets copied to it.
@return >0 success , <=0 error (due to libburn internal problem)
@since 0.2.6
*/
int burn_drive_get_adr(struct burn_drive_info *drive_info, char adr[]);
@ -914,6 +936,7 @@ int burn_drive_get_adr(struct burn_drive_info *drive_info, char adr[]);
/** Evaluate whether the given address would be a possible persistent drive
address of libburn.
@return 1 means yes, 0 means no
@since 0.2.6
*/
int burn_drive_is_enumerable_adr(char *adr);
@ -926,6 +949,7 @@ int burn_drive_is_enumerable_adr(char *adr);
@param adr An application provided array of at least BURN_DRIVE_ADR_LEN
characters size. The persistent address gets copied to it.
@return 1 = success , 0 = failure , -1 = severe error
@since 0.2.6
*/
int burn_drive_convert_fs_adr(char *path, char adr[]);
@ -943,6 +967,7 @@ int burn_drive_convert_fs_adr(char *path, char adr[]);
@param adr An application provided array of at least BURN_DRIVE_ADR_LEN
characters size. The persistent address gets copied to it.
@return 1 = success , 0 = failure , -1 = severe error
@since 0.2.6
*/
int burn_drive_convert_scsi_adr(int bus_no, int host_no, int channel_no,
int target_no, int lun_no, char adr[]);
@ -953,6 +978,7 @@ int burn_drive_convert_scsi_adr(int bus_no, int host_no, int channel_no,
drive address obtained via burn_drive_d_get_adr(). It is also supposed to
succeed with any device file of a (possibly emulated) SCSI device.
@return 1 = success , 0 = failure , -1 = severe error
@since 0.2.6
*/
int burn_drive_obtain_scsi_adr(char *path, int *bus_no, int *host_no,
int *channel_no, int *target_no, int *lun_no);
@ -985,6 +1011,7 @@ void burn_drive_release(struct burn_drive *drive, int eject);
@param drive The drive to release and leave locked.
@param flag Bitfield for control purposes (unused yet, submit 0)
@return 1 means success, <=0 means failure
@since 0.4.0
*/
int burn_drive_leave_locked(struct burn_drive *d, int flag);
@ -1005,6 +1032,7 @@ enum burn_disc_status burn_disc_get_status(struct burn_drive *drive);
or BURN_DISC_UNSUITABLE. Thus marking media as writable which actually
failed to declare themselves either blank or (partially) filled.
@return 1 drive status has been set , 0 = unsuitable drive status
@since 0.2.6
*/
int burn_disc_pretend_blank(struct burn_drive *drive);
@ -1014,6 +1042,7 @@ int burn_disc_pretend_blank(struct burn_drive *drive);
Sets the drive status to BURN_DISC_FULL if it is BURN_DISC_UNREADY
or BURN_DISC_UNSUITABLE. Thus marking media as blankable which actually
failed to declare themselves either blank or (partially) filled.
@since 0.2.6
*/
int burn_disc_pretend_full(struct burn_drive *drive);
@ -1024,6 +1053,7 @@ int burn_disc_pretend_full(struct burn_drive *drive);
burn_drive_get_start_end_lba(). The drive must be grabbed for this call.
@param drive The drive to query.
@return 1=sucess, 0=no valid ATIP info read, -1 severe error
@since 0.2.6
*/
int burn_disc_read_atip(struct burn_drive *drive);
@ -1038,6 +1068,7 @@ int burn_disc_read_atip(struct burn_drive *drive);
@param end_lba Returns the end lba value
@param flag Bitfield for control purposes (unused yet, submit 0)
@return 1 if lba values are valid , 0 if invalid
@since 0.2.6
*/
int burn_drive_get_start_end_lba(struct burn_drive *drive,
int *start_lba, int *end_lba, int flag);
@ -1055,6 +1086,7 @@ int burn_drive_get_start_end_lba(struct burn_drive *drive,
@param lba return value: start lba
@param nwa return value: Next Writeable Address
@return 1=nwa is valid , 0=nwa is not valid , -1=error
@since 0.2.6
*/
int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
int trackno, int *lba, int *nwa);
@ -1066,6 +1098,7 @@ int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
@param d The drive to query.
@param start_lba returns the start address of that track
@return <= 0 : failure, 1 = ok
@since 0.3.2
*/
int burn_disc_get_msc1(struct burn_drive *d, int *start_lba);
@ -1082,6 +1115,7 @@ int burn_disc_get_msc1(struct burn_drive *d, int *start_lba);
@param d The drive to query.
@param o If not NULL: write parameters to be set on drive before query
@return number of most probably available free bytes
@since 0.3.4
*/
off_t burn_disc_available_space(struct burn_drive *d,
struct burn_write_opts *o);
@ -1091,22 +1125,30 @@ off_t burn_disc_available_space(struct burn_drive *d,
/** Tells the MMC Profile identifier of the loaded media. The drive must be
grabbed in order to get a non-zero result.
libburn currently writes only to profiles
0x09 "CD-R", 0x0a "CD-RW",
0x11 "DVD-R sequential recording", 0x12 "DVD-RAM",
0x13 "DVD-RW restricted overwrite", 0x14 "DVD-RW sequential recording",
0x1a "DVD+RW", 0x1b "DVD+R".
0x09 "CD-R", 0x0a "CD-RW",
0x11 "DVD-R sequential recording", 0x12 "DVD-RAM",
0x13 "DVD-RW restricted overwrite", 0x14 "DVD-RW sequential recording",
0x1a "DVD+RW", 0x1b "DVD+R",
0x2b "DVD+R/DL", 0x43 "BD-RE",
0xffff "stdio file"
Note: 0xffff is not a MMC profile but a libburn invention.
If enabled by burn_allow_untested_profiles() it also writes to profiles
0x15 "DVD-R/DL sequential recording", 0x2b "DVD+R/DL".
Writeable stdio-drives return this profile
0xffff "stdio file"
0x15 "DVD-R/DL sequential recording",
Read-only are the profiles
0x08 "CD-ROM", 0x10 "DVD-ROM",
0x40 "BD-ROM",
For now read-only are BD-R profiles (testers wanted)
0x41 "BD-R sequential recording", 0x42 "BD-R random recording"
@param d The drive where the media is inserted.
@param pno Profile Number as of mmc5r03c.pdf, table 89
@param pno Profile Number. See also mmc5r03c.pdf, table 89
@param name Profile Name (see above list, unknown profiles have empty name)
@return 1 profile is valid, 0 no profile info available
@since 0.3.0
*/
int burn_disc_get_profile(struct burn_drive *d, int *pno, char name[80]);
/** Tells whether a disc can be erased or not
@param d The drive to inquire.
@return Non-zero means erasable
*/
int burn_disc_erasable(struct burn_drive *d);
@ -1131,6 +1173,7 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive);
/** Inquires the drive associated with a burn_write_opts object.
@param opts object to inquire
@return pointer to drive
@since 0.4.0
*/
struct burn_drive *burn_write_opts_get_drive(struct burn_write_opts *opts);
@ -1165,38 +1208,54 @@ void burn_read_opts_free(struct burn_read_opts *opts);
void burn_disc_erase(struct burn_drive *drive, int fast);
/* ts A70101 - A70112 */
/* ts A70101 - A70417 */
/** Format media for use with libburn. This currently applies to DVD-RW
in state "Sequential Recording" (profile 0014h) which get formatted to
state "Restricted Overwrite" (profile 0013h). DVD+RW can be "de-iced"
by setting bit2 of flag. Other media cannot be formatted yet.
This function usually returns while the drive is still in the process
of formatting. The formatting is done, when burn_drive_get_status()
returns BURN_DRIVE_IDLE. This may be immediately after return or may
need several thousand seconds to occur.
@param drive The drive with the disc to format.
@param size The size in bytes to be used with the format command. It should
be divisible by 32*1024. The effect of this parameter may
depend on the media profile.
depend on the media profile and on parameter flag.
@param flag Bitfield for control purposes:
bit0= after formatting, write the given number of zero-bytes
to the media and eventually perform preliminary closing.
bit1= insist in size 0 even if there is a better default known
bit2= format to maximum available size
bit1+2: size mode
0 = use parameter size as far as it makes sense
1 = insist in size 0 even if there is a better default known
(on DVD-RAM or BD-RE identical to size mode 0)
2 = without bit7: format to maximum available size
with bit7 : take size from indexed format descriptor
3 = without bit7: format to default size
with bit7 : take size from indexed format descriptor
bit3= -reserved-
bit4= enforce re-format of (partly) formatted media
bit5= try to disable eventual defect management
bit6= try to avoid lengthy media certification
bit7= MMC expert application mode (else libburn tries to
choose a suitable format type):
bit8 to bit15 contain the index of the format to use. See
burn_disc_get_formats(), burn_disc_get_format_descr().
Acceptable types are: 0x00, 0x10, 0x11, 0x13, 0x15, 0x26.
Acceptable types are: 0x00, 0x01, 0x10, 0x11, 0x13,
0x15, 0x26, 0x30, 0x31.
If bit7 is set, bit4 is set automatically.
@since 0.3.0
*/
void burn_disc_format(struct burn_drive *drive, off_t size, int flag);
/* ts A70112 */
/* @since 0.3.0 */
/** Possible formatting status values */
#define BURN_FORMAT_IS_UNFORMATTED 1
#define BURN_FORMAT_IS_FORMATTED 2
#define BURN_FORMAT_IS_UNKNOWN 3
/* ts A70112 */
/** Inquire the formatting status, the associated sizes and the number of
available formats. The info is media specific and stems from MMC command
23h READ FORMAT CAPACITY. See mmc5r03c.pdf 6.24 for background details.
@ -1215,10 +1274,12 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag);
burn_disc_get_format_descr() to obtain such a format
and eventually with burn_disc_format() to select one.
@return 1 reply is valid , <=0 failure
@since 0.3.0
*/
int burn_disc_get_formats(struct burn_drive *drive, int *status, off_t *size,
unsigned *bl_sas, int *num_formats);
/* ts A70112 */
/** Inquire parameters of an available media format.
@param drive The drive with the disc to format.
@param index The index of the format item. Beginning with 0 up to reply
@ -1226,10 +1287,12 @@ int burn_disc_get_formats(struct burn_drive *drive, int *status, off_t *size,
@param type The format type. See mmc5r03c.pdf, 6.5, 04h FORMAT UNIT.
0x00=full, 0x10=CD-RW/DVD-RW full, 0x11=CD-RW/DVD-RW grow,
0x15=DVD-RW quick, 0x13=DVD-RW quick grow,
0x26=DVD+RW background
0x26=DVD+RW background, 0x30=BD-RE with spare areas,
0x31=BD-RE without spare areas
@param size The maximum size in bytes achievable with this format.
@param tdp Type Dependent Parameter. See mmc5r03c.pdf.
@return 1 reply is valid , <=0 failure
@since 0.3.0
*/
int burn_disc_get_format_descr(struct burn_drive *drive, int index,
int *type, off_t *size, unsigned *tdp);
@ -1248,6 +1311,7 @@ void burn_disc_read(struct burn_drive *drive, const struct burn_read_opts *o);
/* ts A70222 */
/* @since 0.3.4 */
/** The length of a rejection reasons string for burn_precheck_write() and
burn_write_opts_auto_write_type() .
*/
@ -1263,6 +1327,7 @@ void burn_disc_read(struct burn_drive *drive, const struct burn_read_opts *o);
@param reasons Eventually returns a list of rejection reason statements
@param silent 1= do not issue error messages , 0= report problems
@return 1 ok, -1= no recordable media detected, 0= other failure
@since 0.3.4
*/
int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc,
char reasons[BURN_REASONS_LEN], int silent);
@ -1296,6 +1361,7 @@ void burn_drive_cancel(struct burn_drive *drive);
during write, a call to burn_drive_cancel() by the application thread.
@param d The drive to inquire.
@return 1=burn seems to have went well, 0=burn failed
@since 0.2.6
*/
int burn_drive_wrote_well(struct burn_drive *d);
@ -1412,6 +1478,7 @@ void burn_track_define_data(struct burn_track *t, int offset, int tail,
@param t The track to change
@param swap_source_bytes 0=do not swap, 1=swap byte pairs
@return 1=success , 0=unacceptable value
@since 0.2.6
*/
int burn_track_set_byte_swap(struct burn_track *t, int swap_source_bytes);
@ -1465,6 +1532,7 @@ enum burn_source_status burn_track_set_source(struct burn_track *t,
@param t The track to change
@param size The size to set
@return 0=failure 1=sucess
@since 0.3.4
*/
int burn_track_set_default_size(struct burn_track *t, off_t size);
@ -1524,6 +1592,7 @@ struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size);
to be disposed by calling burn_source_free() for each.
inp can be freed immediately, the returned fifo may be
kept as handle for burn_fifo_inquire_status().
@since 0.4.0
*/
struct burn_source *burn_fifo_source_new(struct burn_source *inp,
int chunksize, int chunks, int flag);
@ -1545,17 +1614,43 @@ struct burn_source *burn_fifo_source_new(struct burn_source *inp,
5="abandoned" : consumption has ended prematurely
6="ended" : consumption has ended without input error
7="aborted" : consumption has ended after input error
@since 0.4.0
*/
int burn_fifo_inquire_status(struct burn_source *fifo, int *size,
int *free_bytes, char **status_text);
/* ts A80713 */
/** Obtain a preview of the first input data of a fifo which was created
by burn_fifo_source_new(). The data will later be delivered normally to
the consumer track of the fifo.
bufsize may not be larger than the fifo size (chunk_size * chunks).
This call will succeed only if data consumption by the track has not
started yet, i.e. best before the call to burn_disc_write().
It will start the worker thread of the fifo with the expectable side
effects on the external data source. Then it waits either until enough
data have arrived or until it becomes clear that this will not happen.
The call may be repeated with increased bufsize. It will always yield
the bytes beginning from the first one in the fifo.
@param fifo The fifo object to inquire
@param buf Pointer to memory of at least bufsize bytes where to
deliver the peeked data
@param bufsize Number of bytes to peek from the start of the fifo data
@param flag Bitfield for control purposes (unused yet, submit 0).
@return <0 on severe error, 0 if not enough data, 1 if bufsize bytes read
@since 0.5.0
*/
int burn_fifo_peek_data(struct burn_source *source, char *buf, int bufsize,
int flag);
/* ts A70328 */
/** Sets a fixed track size after the data source object has already been
created.
@param t The track to operate on
@param size the number of bytes to use as track size
@return <=0 indicates failure , >0 success
@since 0.3.6
*/
int burn_track_set_size(struct burn_track *t, off_t size);
@ -1568,7 +1663,12 @@ int burn_track_get_sectors(struct burn_track *);
/* ts A61101 */
/** Tells how many source bytes have been read and how many data bytes have
been written by the track during burn */
been written by the track during burn.
@param t The track to inquire
@param read_bytes Number of bytes read from the track source
@param written_bytes Number of bytes written to track
@since 0.2.6
*/
int burn_track_get_counters(struct burn_track *t,
off_t *read_bytes, off_t *written_bytes);
@ -1613,6 +1713,7 @@ void burn_drive_set_speed(struct burn_drive *d, int read, int write);
@param min_percent Minimum of desired buffer oscillation: 25 to 100
@param max_percent Maximum of desired buffer oscillation: 25 to 100
@return 1=success , 0=failure
@since 0.3.8
*/
int burn_drive_set_buffer_waiting(struct burn_drive *d, int enable,
int min_usec, int max_usec, int timeout_sec,
@ -1650,6 +1751,7 @@ int burn_write_opts_set_write_type(struct burn_write_opts *opts,
bit1= do not issue error messages via burn_msgs queue
(is automatically set with bit0)
@return Chosen write type. BURN_WRITE_NONE on failure.
@since 0.3.2
*/
enum burn_write_types burn_write_opts_auto_write_type(
struct burn_write_opts *opts, struct burn_disc *disc,
@ -1714,6 +1816,7 @@ void burn_write_opts_set_mediacatalog(struct burn_write_opts *opts, unsigned cha
being the last one and thus creating a BURN_DISC_APPENDABLE media.
@param opts The option object to be manipulated
@param multi 1=media will be appendable, 0=media will be closed (default)
@since 0.2.6
*/
void burn_write_opts_set_multi(struct burn_write_opts *opts, int multi);
@ -1730,6 +1833,7 @@ void burn_write_opts_set_multi(struct burn_write_opts *opts, int multi);
.start_range_low , .start_range_high .
@param opts The write opts to change
@param value The address in bytes (-1 = start at default address)
@since 0.3.0
*/
void burn_write_opts_set_start_byte(struct burn_write_opts *opts, off_t value);
@ -1742,6 +1846,7 @@ void burn_write_opts_set_start_byte(struct burn_write_opts *opts, off_t value);
by the last track of the last session.
@param opts The write opts to change
@param fill_up_media If 1 : fill up by last track, if 0 = do not fill up
@since 0.3.4
*/
void burn_write_opts_set_fillup(struct burn_write_opts *opts,
int fill_up_media);
@ -1753,10 +1858,25 @@ void burn_write_opts_set_fillup(struct burn_write_opts *opts,
- the check whether the media profile supports simulated burning
@param opts The write opts to change
@param use_force 1=ignore above checks, 0=refuse work on failed check
@since 0.3.4
*/
void burn_write_opts_set_force(struct burn_write_opts *opts, int use_force);
/* ts A80412 */
/** Eventually makes use of the more modern write command AAh WRITE12 and
sets the Streaming bit. With DVD-RAM this can override the traditional
slowdown to half nominal speed. But if it speeds up writing then it also
disables error management and correction. Weigh your priorities.
This only affects the write operations of burn_disc_write().
@param opts The write opts to change
@param value 0=use 2Ah WRITE10, 1=use AAh WRITE12 with Streaming bit
@since 0.4.6
*/
void burn_write_opts_set_stream_recording(struct burn_write_opts *opts,
int value);
/** Sets whether to read in raw mode or not
@param opts The read opts to change
@param raw_mode If non-zero, reading will be done in raw mode, so that everything in the data tracks on the
@ -1827,6 +1947,7 @@ int burn_drive_get_write_speed(struct burn_drive *d);
again by call burn_drive_grab() and again by call burn_disc_read_atip().
@param d Drive to query
@return Minimum write speed in K/s
@since 0.2.6
*/
int burn_drive_get_min_write_speed(struct burn_drive *d);
@ -1849,6 +1970,7 @@ int burn_drive_get_read_speed(struct burn_drive *d);
@param d Drive to query
@param speed_list The copy. If empty, *speed_list gets returned as NULL.
@return 1=success , 0=list empty , <0 severe error
@since 0.3.0
*/
int burn_drive_get_speedlist(struct burn_drive *d,
struct burn_speed_descriptor **speed_list);
@ -1868,6 +1990,7 @@ int burn_drive_get_speedlist(struct burn_drive *d,
bit1= look for any source type (else look for source==2 first
and for any other source type only with CD media)
@return >0 indicates a valid best_descr, 0 = no valid best_descr
@since 0.3.8
*/
int burn_drive_get_best_speed(struct burn_drive *d, int speed_goal,
struct burn_speed_descriptor **best_descr, int flag);
@ -1878,11 +2001,13 @@ int burn_drive_get_best_speed(struct burn_drive *d, int speed_goal,
burn_drive_get_speedlist().
@param speed_list The list copy. *speed_list gets set to NULL.
@return 1=list disposed , 0= *speedlist was already NULL
@since 0.3.0
*/
int burn_drive_free_speedlist(struct burn_speed_descriptor **speed_list);
/* ts A70203 */
/* @since 0.3.2 */
/** The reply structure for burn_disc_get_multi_caps()
*/
struct burn_multi_caps {
@ -1960,7 +2085,8 @@ struct burn_multi_caps {
/** Wether the current profile indicates CD media. 1=yes, 0=no */
int current_is_cd_profile;
/* ts A70528, added to version 0.3.7 */
/* ts A70528 */
/* @since 0.3.8 */
/** Wether the current profile is able to perform simulated write */
int might_simulate;
};
@ -1977,6 +2103,7 @@ struct burn_multi_caps {
@param caps returns the info structure
@param flag Bitfield for control purposes (unused yet, submit 0)
@return < 0 : error , 0 : writing seems impossible , 1 : writing possible
@since 0.3.2
*/
int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
struct burn_multi_caps **caps, int flag);
@ -1985,6 +2112,7 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
burn_disc_get_multi_caps(). The pointer *caps gets set to NULL.
@param caps the info structure to dispose (note: pointer to pointer)
@return 0 : *caps was already NULL, 1 : memory object was disposed
@since 0.3.2
*/
int burn_disc_free_multi_caps(struct burn_multi_caps **caps);
@ -2036,7 +2164,9 @@ int burn_track_get_mode(struct burn_track *track);
*/
int burn_session_get_hidefirst(struct burn_session *session);
/** Returns the library's version in its parts
/** Returns the library's version in its parts.
This is the runtime counterpart of the three build time macros
burn_header_version_* below.
@param major The major version number
@param minor The minor version number
@param micro The micro version number
@ -2044,6 +2174,77 @@ int burn_session_get_hidefirst(struct burn_session *session);
void burn_version(int *major, int *minor, int *micro);
/* ts A80129 */
/* @since 0.4.4 */
/** These three release version numbers tell the revision of this header file
and of the API it describes. They are memorized by applications at build
time.
Immediately after burn_initialize() an application should do this check:
burn_version(&major, &minor, &micro);
if(major > burn_header_version_major
|| (major == burn_header_version_major
&& (minor > burn_header_version_minor
|| (minor == burn_header_version_minor
&& micro >= burn_header_version_micro)))) {
... Young enough. Go on with program run ....
} else {
... Too old. Do not use this libburn version ...
}
*/
#define burn_header_version_major 0
#define burn_header_version_minor 5
#define burn_header_version_micro 2
/** Note:
Above version numbers are also recorded in configure.ac because libtool
wants them as parameters at build time.
For the library compatibility check BURN_*_VERSION in configure.ac
are not decisive. Only the three numbers above do matter.
*/
/** Usage discussion:
Some developers of the libburnia project have differing
opinions how to ensure the compatibility of libaries
and applications.
It is about whether to use at compile time and at runtime
the version numbers isoburn_header_version_* provided here.
Thomas Schmitt advises to use them.
Vreixo Formoso advises to use other means.
At compile time:
Vreixo Formoso advises to leave proper version matching
to properly programmed checks in the the application's
build system, which will eventually refuse compilation.
Thomas Schmitt advises to use the macros defined here
for comparison with the application's requirements of
library revisions and to eventually break compilation.
Both advises are combinable. I.e. be master of your
build system and have #if checks in the source code
of your application, nevertheless.
At runtime (via *_is_compatible()):
Vreixo Formoso advises to compare the application's
requirements of library revisions with the runtime
library. This is to allow runtime libraries which are
young enough for the application but too old for
the lib*.h files seen at compile time.
Thomas Schmitt advises to compare the header
revisions defined here with the runtime library.
This is to enforce a strictly monotonous chain
of revisions from app to header to library,
at the cost of excluding some older libraries.
These two advises are mutually exclusive.
*/
/* ts A60924 : ticket 74 */
/** Control queueing and stderr printing of messages from libburn.
Severity may be one of "NEVER", "ABORT", "FATAL", "FAILURE", "SORRY",
@ -2055,12 +2256,13 @@ void burn_version(int *major, int *minor, int *micro);
to stderr. Default: "FATAL".
@param print_id A text prefix to be printed before the message.
@return >0 for success, <=0 for error
@since 0.2.6
*/
int burn_msgs_set_severities(char *queue_severity,
char *print_severity, char *print_id);
/* ts A60924 : ticket 74 */
/* @since 0.2.6 */
#define BURN_MSGS_MESSAGE_LEN 4096
/** Obtain the oldest pending libburn message from the queue which has at
@ -2078,6 +2280,7 @@ int burn_msgs_set_severities(char *queue_severity,
@param severity Will become the severity related to the message and
should provide at least 80 bytes.
@return 1 if a matching item was found, 0 if not, <0 for severe errors
@since 0.2.6
*/
int burn_msgs_obtain(char *minimum_severity,
int *error_code, char msg_text[], int *os_errno,
@ -2100,6 +2303,7 @@ int burn_msgs_obtain(char *minimum_severity,
Submit NULL if the message is not specific to a
particular drive object.
@return 1 if message was delivered, <=0 if failure
@since 0.4.0
*/
int burn_msgs_submit(int error_code, char msg_text[], int os_errno,
char severity[], struct burn_drive *d);
@ -2112,21 +2316,36 @@ int burn_msgs_submit(int error_code, char msg_text[], int os_errno,
@param severity_number The rank number: the higher, the more severe.
@param flag Bitfield for control purposes (unused yet, submit 0)
@return >0 success, <=0 failure
@since 0.4.0
*/
int burn_text_to_sev(char *severity_name, int *severity_number, int flag);
/* ts A80202 */
/** Convert a severity number into a severity name
@since 0.4.4
@param severity_number The rank number: the higher, the more severe.
@param severity_name A name as with burn_msgs_submit(), e.g. "SORRY".
@param flag Bitfield for control purposes (unused yet, submit 0)
@since 0.4.4
*/
int burn_sev_to_text(int severity_number, char **severity_name, int flag);
/* ts A70915 */
/** Replace the messenger object handle of libburn by a compatible handle
obtained from a related library.
See also: libisofs, API function iso_get_messenger().
@param messenger The foreign but compatible message handle.
@return 1 : success, <=0 : failure
@since 0.4.0
*/
int burn_set_messenger(void *messenger);
/* ts A61002 */
/* @since 0.2.6 */
/** The prototype of a handler function suitable for burn_set_abort_handling().
Such a function has to return -2 if it does not want the process to
exit with value 1.
@ -2145,6 +2364,7 @@ typedef int (*burn_abort_handler_t)(void *handle, int signum, int flag);
Arguments (text, NULL, 0) activate the builtin abort handler. It will
eventually call burn_abort() and then perform exit(1). If text is not NULL
then it is used as prefix for pacifier messages of burn_abort_pacifier().
@since 0.2.6
*/
void burn_set_signal_handling(void *handle, burn_abort_handler_t handler,
int mode);
@ -2176,7 +2396,8 @@ void burn_set_signal_handling(void *handle, burn_abort_handler_t handler,
drive buffer without further data transfer).
@param flag Bitfield for control purposes:
bit0 = flush the drive buffer after eventual writing
@return 1=sucessful , <=0 : number of tranfered bytes * -1
@return 1=sucessful , <=0 : number of transfered bytes * -1
@since 0.4.0
*/
int burn_random_access_write(struct burn_drive *d, off_t byte_address,
char *data, off_t data_count, int flag);
@ -2200,7 +2421,10 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
@param flag Bitfield for control purposes:
bit0= - reserved -
bit1= do not submit error message if read error
bit2= on error do not try to read a second time
with single block steps. @since 0.5.2
@return 1=sucessful , <=0 an error occured
@since 0.4.0
*/
int burn_read_data(struct burn_drive *d, off_t byte_address,
char data[], off_t data_size, off_t *data_count, int flag);
@ -2214,6 +2438,7 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
1= real MMC drive
2= stdio-drive, random access, read-write
3= stdio-drive, sequential, write-only
@since 0.4.0
*/
int burn_drive_get_drive_role(struct burn_drive *d);
@ -2240,6 +2465,7 @@ int burn_drive_get_drive_role(struct burn_drive *d);
prefix "stdio:".
@return 1= adr2 leads to d1 , 0= adr2 seems not to lead to d1,
-1 = adr2 is bad
@since 0.4.0
*/
int burn_drive_equals_adr(struct burn_drive *d1, char *adr2, int drive_role2);

View File

@ -254,6 +254,8 @@ int libdax_msgs__text_to_sev(char *severity_name, int *severity,
*severity= LIBDAX_MSGS_SEV_FATAL;
else if(strncmp(severity_name,"FAILURE",7)==0)
*severity= LIBDAX_MSGS_SEV_FAILURE;
else if(strncmp(severity_name,"MISHAP",6)==0)
*severity= LIBDAX_MSGS_SEV_MISHAP;
else if(strncmp(severity_name,"SORRY",5)==0)
*severity= LIBDAX_MSGS_SEV_SORRY;
else if(strncmp(severity_name,"WARNING",7)==0)
@ -266,10 +268,12 @@ int libdax_msgs__text_to_sev(char *severity_name, int *severity,
*severity= LIBDAX_MSGS_SEV_UPDATE;
else if(strncmp(severity_name,"DEBUG",5)==0)
*severity= LIBDAX_MSGS_SEV_DEBUG;
else if(strncmp(severity_name,"ERRFILE",7)==0)
*severity= LIBDAX_MSGS_SEV_ERRFILE;
else if(strncmp(severity_name,"ALL",3)==0)
*severity= LIBDAX_MSGS_SEV_ALL;
else {
*severity= LIBDAX_MSGS_SEV_NEVER;
*severity= LIBDAX_MSGS_SEV_ALL;
return(0);
}
return(1);
@ -280,7 +284,7 @@ int libdax_msgs__sev_to_text(int severity, char **severity_name,
int flag)
{
if(flag&1) {
*severity_name= "NEVER\nABORT\nFATAL\nFAILURE\nSORRY\nWARNING\nHINT\nNOTE\nUPDATE\nDEBUG\nALL";
*severity_name= "NEVER\nABORT\nFATAL\nFAILURE\nMISHAP\nSORRY\nWARNING\nHINT\nNOTE\nUPDATE\nDEBUG\nERRFILE\nALL";
return(1);
}
*severity_name= "";
@ -292,6 +296,8 @@ int libdax_msgs__sev_to_text(int severity, char **severity_name,
*severity_name= "FATAL";
else if(severity>=LIBDAX_MSGS_SEV_FAILURE)
*severity_name= "FAILURE";
else if(severity>=LIBDAX_MSGS_SEV_MISHAP)
*severity_name= "MISHAP";
else if(severity>=LIBDAX_MSGS_SEV_SORRY)
*severity_name= "SORRY";
else if(severity>=LIBDAX_MSGS_SEV_WARNING)
@ -304,6 +310,8 @@ int libdax_msgs__sev_to_text(int severity, char **severity_name,
*severity_name= "UPDATE";
else if(severity>=LIBDAX_MSGS_SEV_DEBUG)
*severity_name= "DEBUG";
else if(severity>=LIBDAX_MSGS_SEV_ERRFILE)
*severity_name= "ERRFILE";
else if(severity>=LIBDAX_MSGS_SEV_ALL)
*severity_name= "ALL";
else {

View File

@ -120,6 +120,19 @@ struct libdax_msgs_item;
*/
#define LIBDAX_MSGS_SEV_ALL 0x00000000
/** Messages of this severity shall transport plain disk file paths
whenever an event of severity SORRY or above is related with an
individual disk file.
No message text shall be added to the file path. The ERRFILE message
shall be issued before the human readable message which carries the
true event severity. That message should contain the file path so it
can be found by strstr(message, path)!=NULL.
The error code shall be the same as with the human readable message.
*/
#define LIBDAX_MSGS_SEV_ERRFILE 0x08000000
/** Debugging messages not to be visible to normal users by default
*/
#define LIBDAX_MSGS_SEV_DEBUG 0x10000000
@ -141,12 +154,19 @@ struct libdax_msgs_item;
#define LIBDAX_MSGS_SEV_WARNING 0x50000000
/** Non-fatal error messages indicating that important parts of an action
failed but processing may go on if one accepts deviations from the
desired result.
/** Non-fatal error messages indicating that parts of an action failed but
processing may go on if one accepts deviations from the desired result.
E.g.: One of several libisofs input files cannot be found.
SORRY may also be the severity for incidents which are severe enough
for FAILURE but happen within already started irrevocable actions,
like ISO image generation. A precondition for such a severity ease is
that the action can be continued after the incident.
See below MISHAP for what xorriso would need instead of this kind of SORRY
and generates for itself in case of libisofs image generation.
E.g.: A pattern yields no result.
A speed setting cannot be made.
A libisofs input file is inaccessible during image generation.
After SORRY a function should try to go on if that makes any sense
and if no threshold prescribes abort on SORRY. The function should
@ -156,15 +176,31 @@ struct libdax_msgs_item;
#define LIBDAX_MSGS_SEV_SORRY 0x60000000
/** Non-fatal error indicating that a complete action failed and that
only a thorough new setup of preconditions will give hope for success.
/** A FAILURE (see below) which can be tolerated during long lasting
operations just because they cannot simply be stopped or revoked.
xorriso converts libisofs SORRY messages issued during image generation
into MISHAP messages in order to allow its evaluators to distinguish
image generation problems from minor image composition problems.
E.g.:
A libisofs input file is inaccessible during image generation.
After a MISHAP a function should behave like after SORRY.
*/
#define LIBDAX_MSGS_SEV_MISHAP 0x64000000
/** Non-fatal error indicating that an important part of an action failed and
that only a new setup of preconditions will give hope for sufficient
success.
E.g.: No media is inserted in the output drive.
No write mode can be found for inserted media.
All libisofs input files are inaccessible.
A libisofs input file is inaccessible during grafting.
After FAILURE a function should end very soon with a return value
indicating failure.
After FAILURE a function should end with a return value indicating failure.
It is at the discretion of the function whether it ends immediately in any
case or whether it tries to go on if the eventual threshold allows.
*/
#define LIBDAX_MSGS_SEV_FAILURE 0x68000000
@ -396,6 +432,8 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
0x00020007 (NOTE,HIGH) = Closed O_EXCL scsi siblings
0x00020008 (SORRY,HIGH) = Device busy. Failed to fcntl-lock
0x00020009 (SORRY,HIGH) = Neither stdio-path nor its directory exist
0x0002000a (FAILURE,HIGH) = Cannot accept '...' as SG_IO CDROM drive
0x0002000b (FAILURE,HIGH) = File object '...' not found
General library operations:
@ -488,6 +526,11 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
0x00020157 (FATAL,HIGH) = burn_source is not a fifo object
0x00020158 (DEBUG,LOW) = Reporting thread disposal precautions
0x00020159 (DEBUG,HIGH) = TOC Format 0 returns inconsistent data
0x0002015a (NOTE,HIGH) = Could not examine busy device
0x0002015b (HINT,HIGH) = Busy '...' seems to be a hard disk, as '...1' exists
0x0002015c (FAILURE,HIGH) = Fifo size is smaller than desired peek buffer
0x0002015d (FAILURE,HIGH) = Fifo input ended short of desired peek buffer size
0x0002015e (FATAL,HIGH) = Fifo is already under consumption when peeking
libdax_audioxtr:
0x00020200 (SORRY,HIGH) = Cannot open audio source file
@ -499,34 +542,81 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
------------------------------------------------------------------------------
Range "vreixo" : 0x00030000 to 0x0003ffff
General:
0x00031001 (SORRY,HIGH) = Cannot read file (ignored)
0x00031002 (FATAL,HIGH) = Cannot read file (operation canceled)
0x0003ffff (FAILURE,HIGH) = Operation canceled
0x0003fffe (FATAL,HIGH) = Unknown or unexpected fatal error
0x0003fffd (FAILURE,HIGH) = Unknown or unexpected error
0x0003fffc (FATAL,HIGH) = Internal programming error
0x0003fffb (FAILURE,HIGH) = NULL pointer where NULL not allowed
0x0003fffa (FATAL,HIGH) = Memory allocation error
0x0003fff9 (FATAL,HIGH) = Interrupted by a signal
0x0003fff8 (FAILURE,HIGH) = Invalid parameter value
0x0003fff7 (FATAL,HIGH) = Cannot create a needed thread
0x0003fff6 (FAILURE,HIGH) = Write error
0x0003fff5 (FAILURE,HIGH) = Buffer read error
0x0003ffc0 (FAILURE,HIGH) = Trying to add a node already added to another dir
0x0003ffbf (FAILURE,HIGH) = Node with same name already exist
0x0003ffbe (FAILURE,HIGH) = Trying to remove a node that was not added to dir
0x0003ffbd (FAILURE,HIGH) = A requested node does not exist
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 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 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
0x0003ff77 (FAILURE,HIGH) = Not symlink used where a symlink is expected
0x0003ff76 (FAILURE,HIGH) = Cannot seek to specified location
0x0003ff75 (HINT,MEDIUM) = File not supported in ECMA-119 tree and ignored
0x0003ff74 (HINT,MEDIUM) = File bigger than supported by used standard
0x0003ff73 (MISHAP,HIGH) = File read error during image creation
0x0003ff72 (HINT,MEDIUM) = Cannot convert filename to requested charset
0x0003ff71 (SORRY,HIGH) = File cannot be added to the tree
0x0003ff70 (HINT,MEDIUM) = File path breaks specification constraints
0x0003ff00 (FAILURE,HIGH) = Charset conversion error
0x0003feff (FAILURE,HIGH) = Too much files to mangle
0x0003fec0 (FAILURE,HIGH) = Wrong or damaged Primary Volume Descriptor
0x0003febf (SORRY,HIGH) = Wrong or damaged RR entry
0x0003febe (SORRY,HIGH) = Unsupported RR feature
0x0003febd (FAILURE,HIGH) = Wrong or damaged ECMA-119
0x0003febc (FAILURE,HIGH) = Unsupported ECMA-119 feature
0x0003febb (SORRY,HIGH) = Wrong or damaged El-Torito catalog
0x0003feba (SORRY,HIGH) = Unsupported El-Torito feature
0x0003feb9 (SORRY,HIGH) = Cannot patch isolinux boot image
0x0003feb8 (SORRY,HIGH) = Unsupported SUSP feature
0x0003feb7 (WARNING,HIGH) = Error on a RR entry that can be ignored
0x0003feb6 (HINT,MEDIUM) = Error on a RR entry that can be ignored
0x0003feb5 (WARNING,HIGH) = Multiple ER SUSP entries found
0x0003feb4 (HINT,MEDIUM) = Unsupported volume descriptor found
0x0003feb3 (WARNING,HIGH) = El-Torito related warning
0x0003feb2 (MISHAP,HIGH) = Image write cancelled
0x0003feb1 (WARNING,HIGH) = El-Torito image is hidden
Image reading:
0x00031000 (FATAL,HIGH) = Unsupported ISO-9660 image
0x00031001 (HINT,MEDIUM) = Unsupported Vol Desc that will be ignored
0x00031002 (FATAL,HIGH) = Damaged ISO-9660 image
0x00031003 (SORRY,HIGH) = Cannot read previous image file
Rock-Ridge:
0x00030101 (HINT,MEDIUM) = Unsupported SUSP entry that will be ignored
0x00030102 (SORRY,HIGH) = Wrong/damaged SUSP entry
0x00030103 (WARNING,MEDIUM)= Multiple SUSP ER entries where found
0x00030111 (SORRY,HIGH) = Unsupported RR feature
0x00030112 (SORRY,HIGH) = Error in a Rock Ridge entry
El-Torito:
0x00030201 (HINT,MEDIUM) = Unsupported Boot Vol Desc that will be ignored
0x00030202 (SORRY,HIGH) = Wrong El-Torito catalog
0x00030203 (HINT,MEDIUM) = Unsupported El-Torito feature
0x00030204 (SORRY,HIGH) = Invalid file to be an El-Torito image
0x00030205 (WARNING,MEDIUM)= Cannot properly patch isolinux image
0x00030206 (WARNING,MEDIUM)= Copying El-Torito from a previous image without
enought info about it
Joliet:
0x00030301 (NOTE,MEDIUM) = Unsupported file type for Joliet tree
Outdated codes which may not be re-used for other purposes than
re-instating them, if ever:
X 0x00031001 (SORRY,HIGH) = Cannot read file (ignored)
X 0x00031002 (FATAL,HIGH) = Cannot read file (operation canceled)
X 0x00031000 (FATAL,HIGH) = Unsupported ISO-9660 image
X 0x00031001 (HINT,MEDIUM) = Unsupported Vol Desc that will be ignored
X 0x00031002 (FATAL,HIGH) = Damaged ISO-9660 image
X 0x00031003 (SORRY,HIGH) = Cannot read previous image file
X 0x00030101 (HINT,MEDIUM) = Unsupported SUSP entry that will be ignored
X 0x00030102 (SORRY,HIGH) = Wrong/damaged SUSP entry
X 0x00030103 (WARNING,MEDIUM)= Multiple SUSP ER entries where found
X 0x00030111 (SORRY,HIGH) = Unsupported RR feature
X 0x00030112 (SORRY,HIGH) = Error in a Rock Ridge entry
X 0x00030201 (HINT,MEDIUM) = Unsupported Boot Vol Desc that will be ignored
X 0x00030202 (SORRY,HIGH) = Wrong El-Torito catalog
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 enought info about it
X 0x00030301 (NOTE,MEDIUM) = Unsupported file type for Joliet tree
------------------------------------------------------------------------------
@ -540,6 +630,23 @@ Range "application" : 0x00040000 to 0x0004ffff
0x00040005 (NOTE,HIGH) : Application supplied message
0x00040006 (UPDATE,HIGH) : Application supplied message
0x00040007 (DEBUG,HIGH) : Application supplied message
0x00040008 (*,HIGH) : Application supplied message
------------------------------------------------------------------------------
Range "libisofs-xorriso" : 0x00050000 to 0x0005ffff
This is an alternative representation of libisofs.so.6 error codes in xorriso.
If values returned by iso_error_get_code() do not fit into 0x30000 to 0x3ffff
then they get truncated to 16 bit and mapped into this range.
(This should never need to happen, of course.)
------------------------------------------------------------------------------
Range "libisoburn" : 0x00060000 to 0x00006ffff
0x00060000 (*,*) : Message which shall be attributed to libisoburn
>>> the messages of libisoburn need to be registered individually
------------------------------------------------------------------------------

View File

@ -46,6 +46,7 @@ extern struct libdax_msgs *libdax_messenger;
#define Libburn_support_dvd_minusrw_overW 1
/* ts A70112 */
/* ts A80410 : applies to BD-RE too */
#define Libburn_support_dvd_raM 1
/* ts A70129 */
@ -54,7 +55,26 @@ extern struct libdax_msgs *libdax_messenger;
/* ts A70306 */
#define Libburn_support_dvd_plus_R 1
/* DVD progress report:
/* ts A70509 : handling 0x41 and 0x42 as read-only types */
#define Libburn_support_bd_r_readonlY 1
/* ts A80410 : <<< Dangerous experiment: Pretend that DVD-RAM is BD-RE
# define Libburn_dvd_ram_as_bd_rE yes
*/
/* ts A80509 : <<< Experiment: pretend that DVD-ROM and CD-ROM are other media
like BD-ROM (0x40), BD-R seq (0x41), BD-R random (0x42)
# define Libburn_rom_as_profilE 0x40
*/
/* ts A80425 : Prevents command FORMAT UNIT for DVD-RAM or BD-RE.
Useful only to test the selection of format descriptors without
actually formatting the media.
# define Libburn_do_not_format_dvd_ram_or_bd_rE 1
*/
/* DVD/BD progress report:
ts A61219 : It seems to work with a used (i.e. thoroughly formatted) DVD+RW.
Error messages of class DEBUG appear because of inability to
read TOC or track info. Nevertheless, the written images verify.
@ -91,6 +111,14 @@ extern struct libdax_msgs *libdax_messenger;
ts A70208 : Finally made tests with DVD-R. Worked exactly as new DVD-RW.
ts A70306 : Implemented DVD+R (always -multi for now)
ts A70330 : Allowed finalizing of DVD+R.
ts A80228 : Made DVD+R/DL support official after nightmorph reported success
in http://libburnia-project.org/ticket/13
ts A80416 : drive->do_stream_recording brings DVD-RAM to full nominal
writing speed at cost of no defect management.
ts A80416 : Giulio Orsero reports success with BD-RE writing. With
drive->do_stream_recording it does full nominal speed.
ts A80506 : Giulio Orsero reports success with BD-RE formatting.
BD-RE is now an officially supported profile.
*/
/* ts A70519 : With MMC commands of data direction FROM_DRIVE:
@ -306,14 +334,19 @@ int mmc_read_track_info(struct burn_drive *d, int trackno, struct buffer *buf,
c.opcode[1] = 1;
if(trackno<=0) {
if (d->current_profile == 0x1a || d->current_profile == 0x13 ||
d->current_profile == 0x12 )
/* DVD+RW , DVD-RW restricted overwrite , DVD-RAM */
d->current_profile == 0x12 || d->current_profile == 0x42 ||
d->current_profile == 0x43)
/* DVD+RW , DVD-RW restricted overwrite , DVD-RAM
BD-R random recording, BD-RE */
trackno = 1;
else if (d->current_profile == 0x10 ||
d->current_profile == 0x11 ||
d->current_profile == 0x14 ||
d->current_profile == 0x15)
/* DVD-ROM , DVD-R[W] Sequential */
d->current_profile == 0x15 ||
d->current_profile == 0x40 ||
d->current_profile == 0x41)
/* DVD-ROM , DVD-R[W] Sequential ,
BD-ROM , BD-R sequential */
trackno = d->last_track_no;
else /* mmc5r03c.pdf: valid only for CD, DVD+R, DVD+R DL */
trackno = 0xFF;
@ -349,7 +382,7 @@ int mmc_get_nwa(struct burn_drive *d, int trackno, int *lba, int *nwa)
*nwa = mmc_four_char_to_int(data + 12);
num = mmc_four_char_to_int(data + 16);
if (d->current_profile == 0x1a || d->current_profile == 0x13 ||
d->current_profile == 0x12) {
d->current_profile == 0x12 || d->current_profile == 0x43) {
/* overwriteable */
*lba = *nwa = num = 0;
} else if (!(data[7]&1)) {
@ -360,7 +393,8 @@ int mmc_get_nwa(struct burn_drive *d, int trackno, int *lba, int *nwa)
return 0;
}
if (num > 0) {
d->media_capacity_remaining = ((off_t) num) * ((off_t) 2048);
burn_drive_set_media_capacity_remaining(d,
((off_t) num) * ((off_t) 2048));
d->media_lba_limit = *nwa + num;
} else
d->media_lba_limit = 0;
@ -700,22 +734,26 @@ int mmc_write(struct burn_drive *d, int start, struct buffer *buf)
if(d->wait_for_buffer_free)
mmc_wait_for_buffer_free(d, buf);
scsi_init_command(&c, MMC_WRITE_10, sizeof(MMC_WRITE_10));
/*
memcpy(c.opcode, MMC_WRITE_10, sizeof(MMC_WRITE_10));
c.oplen = sizeof(MMC_WRITE_10);
*/
/* ts A80412 */
if(d->do_stream_recording > 0) {
/* >>> ??? is WRITE12 available ? */
/* >>> ??? inquire feature 107h Stream Writing bit ? */
scsi_init_command(&c, MMC_WRITE_12, sizeof(MMC_WRITE_12));
mmc_int_to_four_char(c.opcode + 2, start);
mmc_int_to_four_char(c.opcode + 6, len);
c.opcode[10] = 1<<7; /* Streaming bit */
} else {
scsi_init_command(&c, MMC_WRITE_10, sizeof(MMC_WRITE_10));
mmc_int_to_four_char(c.opcode + 2, start);
c.opcode[6] = 0;
c.opcode[7] = (len >> 8) & 0xFF;
c.opcode[8] = len & 0xFF;
}
c.retry = 1;
mmc_int_to_four_char(c.opcode + 2, start);
c.opcode[6] = 0;
c.opcode[7] = (len >> 8) & 0xFF;
c.opcode[8] = len & 0xFF;
c.page = buf;
c.dir = TO_DRIVE;
/*
burn_print(12, "%d, %d, %d, %d - ", c->opcode[2], c->opcode[3], c->opcode[4], c->opcode[5]);
burn_print(12, "%d, %d, %d, %d\n", c->opcode[6], c->opcode[7], c->opcode[8], c->opcode[9]);
*/
#ifdef Libburn_log_in_and_out_streaM
/* <<< ts A61031 */
@ -975,7 +1013,8 @@ int mmc_fake_toc(struct burn_drive *d)
}
/* ts A71128 : My DVD-ROM drive issues no reliable track info.
One has to try 43h READ TOC/PMA/ATIP Form 0. */
if (d->current_profile == 0x10 && d->last_track_no <= 1) {
if ((d->current_profile == 0x10 || d->current_profile == 0x40) &&
d->last_track_no <= 1) {
ret = mmc_read_toc_fmt0(d);
return ret;
}
@ -1038,9 +1077,9 @@ int mmc_fake_toc(struct burn_drive *d)
if (session_number > d->disc->sessions) {
if (i == d->last_track_no - 1) {
/* ts A70212 : Last track field Free Blocks */
d->media_capacity_remaining =
burn_drive_set_media_capacity_remaining(d,
((off_t) mmc_four_char_to_int(tdata + 16)) *
((off_t) 2048);
((off_t) 2048));
d->media_lba_limit = 0;
}
continue;
@ -1254,6 +1293,10 @@ static int mmc_read_toc_al(struct burn_drive *d, int *alloc_len)
if (d->status == BURN_DISC_UNREADY)
d->status = BURN_DISC_FULL;
toc_find_modes(d);
/* A80808 */
burn_disc_cd_toc_extensions(d->disc, 0);
return 1;
}
@ -1418,10 +1461,28 @@ static int mmc_read_disc_info_al(struct burn_drive *d, int *alloc_len)
d->erasable = !!(data[2] & 16);
disc_status = data[2] & 3;
if (d->current_profile == 0x10) { /* DVD-ROM */
if (d->current_profile == 0x10 || d->current_profile == 0x40) {
/* DVD-ROM , BD-ROM */
disc_status = 2; /* always full and finalized */
d->erasable = 0; /* never erasable */
}
/* ts A80207 : DVD - R DL can normally be read but not be written */
if(d->current_profile == 0x15 && !burn_support_untested_profiles) {
disc_status = 2; /* always full and finalized */
d->erasable = 0; /* never erasable */
}
#ifdef Libburn_support_bd_r_readonlY
/* <<< For now: declaring BD-R read-only
*/
if (d->current_profile == 0x41 || d->current_profile == 0x42) {
/* BD-R seq, BD-R rnd */
disc_status = 2; /* always full and finalized */
d->erasable = 0; /* never erasable */
}
#endif /* Libburn_support_bd_r_readonlY */
switch (disc_status) {
case 0:
d->toc_entries = 0;
@ -1445,6 +1506,21 @@ static int mmc_read_disc_info_al(struct burn_drive *d, int *alloc_len)
break;
}
#ifdef NIX
/* <<< on its way out. DVD-R DL are current_is_supported_profile
unconditionally. Writeability is handled above now.
*/
/* ts A80207 : DVD - R DL can normally be read but not be written */
if(d->current_profile == 0x15 && !d->current_is_supported_profile) {
if(d->status == BURN_DISC_APPENDABLE)
d->status = BURN_DISC_FULL;
d->erasable = 0; /* never erasable */
d->current_is_supported_profile = 1;
}
#endif /* NIX */
if ((d->current_profile != 0 || d->status != BURN_DISC_UNREADY)
&& ! d->current_is_supported_profile) {
if (!d->silent_on_scsi_error) {
@ -1480,7 +1556,7 @@ static int mmc_read_disc_info_al(struct burn_drive *d, int *alloc_len)
ts A70112 : same for DVD-RAM
*/
if (d->current_profile == 0x1a || d->current_profile == 0x13 ||
d->current_profile == 0x12)
d->current_profile == 0x12 || d->current_profile == 0x43)
d->status = BURN_DISC_BLANK;
if (d->status == BURN_DISC_BLANK) {
@ -2080,9 +2156,34 @@ static int mmc_get_configuration_al(struct burn_drive *d, int *alloc_len)
if (len < 8 || len > 4096)
return 0;
cp = (c.page->data[6]<<8) | c.page->data[7];
#ifdef Libburn_rom_as_profilE
if (cp == 0x08 || cp == 0x10 || cp==0x40)
cp = Libburn_rom_as_profilE;
#endif /* Libburn_rom_as_profilE */
d->current_profile = cp;
strcpy(d->current_profile_text, mmc_obtain_profile_name(cp));
if (cp == 0x08 || cp == 0x09 || cp == 0x0a)
/* Read-only supported media */
if (cp == 0x08) /* CD-ROM */
d->current_is_supported_profile = d->current_is_cd_profile = 1;
if (cp == 0x10) /* DVD-ROM */
d->current_is_supported_profile = 1;
if (cp == 0x40) /* BD-ROM */
d->current_is_supported_profile = 1;
#ifdef Libburn_support_bd_r_readonlY
if (cp == 0x41 || cp == 0x42) /* BD-R sequential, BD-R random */
d->current_is_supported_profile = 1;
#endif
/* Write supported media (they get declared suitable in
burn_disc_get_multi_caps) */
if (cp == 0x09 || cp == 0x0a)
d->current_is_supported_profile = d->current_is_cd_profile = 1;
#ifdef Libburn_support_dvd_plus_rW
@ -2094,18 +2195,25 @@ static int mmc_get_configuration_al(struct burn_drive *d, int *alloc_len)
d->current_is_supported_profile = 1;
#endif
#ifdef Libburn_support_dvd_raM
if (cp == 0x12)
if (cp == 0x12 || cp == 0x43) { /* DVD-RAM , BD-RE */
d->current_is_supported_profile = 1;
#ifdef Libburn_dvd_ram_as_bd_rE
cp = d->current_profile = 0x43;
strcpy(d->current_profile_text, mmc_obtain_profile_name(cp));
#endif
}
#endif
#ifdef Libburn_support_dvd_r_seQ
if (cp == 0x10 || cp == 0x11 || cp == 0x14) /* DVD-ROM,DVD-R,DVD-RW */
if (cp == 0x11 || cp == 0x14) /* DVD-R, DVD-RW */
d->current_is_supported_profile = 1;
if (cp == 0x15 && burn_support_untested_profiles) /* DVD-R/DL */
if (cp == 0x15) /* DVD-R/DL . */
/* Writeable only if burn_support_untested_profiles */
d->current_is_supported_profile = 1;
#endif
#ifdef Libburn_support_dvd_plus_R
if (cp == 0x1b || (cp == 0x2b && burn_support_untested_profiles))
/* DVD+R , DVD+R/DL */
if (cp == 0x1b || cp == 0x2b) /* DVD+R , DVD+R/DL */
d->current_is_supported_profile = 1;
#endif
@ -2315,6 +2423,8 @@ static int mmc_read_format_capacities_al(struct burn_drive *d,
d->format_descr_type = dpt[4] & 3;
d->format_curr_max_size = (((off_t) dpt[0]) << 24)
+ (dpt[1] << 16) + (dpt[2] << 8) + dpt[3];
if (d->format_descr_type == BURN_FORMAT_IS_UNKNOWN)
d->format_curr_max_size = 0;
d->format_curr_blsas = (dpt[5] << 16) + (dpt[6] << 8) + dpt[7];
/* <<<
@ -2327,6 +2437,45 @@ static int mmc_read_format_capacities_al(struct burn_drive *d,
*/
d->format_curr_max_size *= (off_t) 2048;
if((d->current_profile == 0x12 || d->current_profile == 0x43)
&& d->media_capacity_remaining == 0) {
burn_drive_set_media_capacity_remaining(d,
d->format_curr_max_size);
d->media_lba_limit = d->format_curr_max_size / 2048;
}
#ifdef Libburn_dvd_ram_as_bd_rE
/* <<< dummy format descriptor list as obtained from
dvd+rw-mediainfo by Giulio Orsero in April 2008
*/
d->num_format_descr = 5;
d->format_descriptors[0].type = 0x00;
d->format_descriptors[0].size = (off_t) 11826176 * (off_t) 2048;
d->format_descriptors[0].tdp = 0x3000;
d->format_descriptors[1].type = 0x30;
d->format_descriptors[1].size = (off_t) 11826176 * (off_t) 2048;
d->format_descriptors[1].tdp = 0x3000;
d->format_descriptors[2].type = 0x30;
d->format_descriptors[2].size = (off_t) 11564032 * (off_t) 2048;
d->format_descriptors[2].tdp = 0x5000;
d->format_descriptors[3].type = 0x30;
d->format_descriptors[3].size = (off_t) 12088320 * (off_t) 2048;
d->format_descriptors[3].tdp = 0x1000;
d->format_descriptors[4].type = 0x31;
d->format_descriptors[4].size = (off_t) 12219392 * (off_t) 2048;
d->format_descriptors[4].tdp = 0x800;
d->best_format_type = 0x00;
d->best_format_size = (off_t) 11826176 * (off_t) 2048;
/* silencing compiler warnings about unused variables */
num_blocks = size = sign = i = max_score = num_descr = score = type = 0;
if (d->current_profile == 0x12 || d->current_profile == 0x43)
return 1;
d->num_format_descr = 0;
#endif /* Libburn_dvd_ram_as_bd_rE */
if (top_wanted == 0x00 || top_wanted == 0x10)
sign = -1; /* the caller clearly desires full format */
@ -2359,11 +2508,6 @@ static int mmc_read_format_capacities_al(struct burn_drive *d,
/* Criterion is proximity to quick intermediate state */
if (type == 0x00) { /* full format (with lead out) */
score = 1 * sign;
if(d->current_profile == 0x12 &&
d->media_capacity_remaining == 0) {
d->media_capacity_remaining = size;
d->media_lba_limit = num_blocks;
}
} else if (type == 0x10) { /* DVD-RW full format */
score = 10 * sign;
} else if(type == 0x13) { /* DVD-RW quick grow last session */
@ -2371,12 +2515,13 @@ static int mmc_read_format_capacities_al(struct burn_drive *d,
} else if(type == 0x15) { /* DVD-RW Quick */
score = 50 * sign;
if(d->current_profile == 0x13) {
d->media_capacity_remaining = size;
burn_drive_set_media_capacity_remaining(d,
size);
d->media_lba_limit = num_blocks;
}
} else if(type == 0x26) { /* DVD+RW */
score = 1 * sign;
d->media_capacity_remaining = size;
burn_drive_set_media_capacity_remaining(d, size);
d->media_lba_limit = num_blocks;
} else {
continue;
@ -2532,10 +2677,16 @@ int mmc_read_buffer_capacity(struct burn_drive *d)
and mmc5r03c.pdf, 6.5 FORMAT UNIT */
/*
@param size The size (in bytes) to be sent with the FORMAT comand
@param flag bit1= insist in size 0 even if there is a better default known
bit2= format to maximum available size
@param flag bit1+2: size mode
0 = use parameter size as far as it makes sense
1 = insist in size 0 even if there is a better default known
2 = without bit7: format to maximum available size
with bit7 : take size from indexed format descriptor
3 = format to default size
bit3= expand format up to at least size
bit4= enforce re-format of (partly) formatted media
bit5= try to disable eventual defect management
bit6= try to avoid lengthy media certification
bit7= bit8 to bit15 contain the index of the format to use
bit8-bit15 = see bit7
*/
@ -2544,13 +2695,15 @@ int mmc_format_unit(struct burn_drive *d, off_t size, int flag)
struct buffer buf;
struct command c;
int ret, tolerate_failure = 0, return_immediately = 0, i, format_type;
int index;
off_t num_of_blocks = 0, diff;
int index, format_sub_type = 0, format_00_index, size_mode;
int accept_count = 0;
off_t num_of_blocks = 0, diff, format_size, i_size, format_00_max_size;
char msg[160],descr[80];
int full_format_type = 0x00; /* Full Format (or 0x10 for DVD-RW ?) */
if (mmc_function_spy(d, "mmc_format_unit") <= 0)
return 0;
size_mode = (flag >> 1) & 3;
scsi_init_command(&c, MMC_FORMAT_UNIT, sizeof(MMC_FORMAT_UNIT));
/*
@ -2577,7 +2730,7 @@ int mmc_format_unit(struct burn_drive *d, off_t size, int flag)
if (ret <= 0)
goto selected_not_suitable;
index = (flag >> 8) & 0xff;
if(index < 0 || index > d->num_format_descr) {
if(index < 0 || index >= d->num_format_descr) {
selected_not_suitable:;
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020132,
@ -2588,13 +2741,17 @@ selected_not_suitable:;
}
if (!(d->current_profile == 0x13 ||
d->current_profile == 0x14 ||
d->current_profile == 0x1a))
d->current_profile == 0x1a ||
d->current_profile == 0x12 ||
d->current_profile == 0x43))
goto unsuitable_media;
format_type = d->format_descriptors[index].type;
if (!(format_type == 0x00 || format_type == 0x10 ||
if (!(format_type == 0x00 || format_type == 0x01 ||
format_type == 0x10 ||
format_type == 0x11 || format_type == 0x13 ||
format_type == 0x15 || format_type == 0x26))
format_type == 0x15 || format_type == 0x26 ||
format_type == 0x30 || format_type == 0x31 ))
goto selected_not_suitable;
if (flag & 4) {
num_of_blocks =
@ -2606,7 +2763,20 @@ selected_not_suitable:;
c.page->data[9 + i] =
( d->format_descriptors[index].tdp >>
(16 - 8 * i)) & 0xff;
sprintf(descr, "%s (bit7)", d->current_profile_text);
if (format_type == 0x30 || format_type == 0x31) {
if (flag & 64)
format_sub_type = 3; /* Quick certification */
else
format_sub_type = 2; /* Full certification */
}
if (d->current_profile == 0x12 && format_type !=0x01 &&
(flag & 64)) {
/* DCRT and CmpList, see below */
c.page->data[1] |= 0x20;
c.opcode[1] |= 0x08;
}
c.page->data[1] |= 0x80; /* FOV = this flag vector is valid */
sprintf(descr, "%s (descr %d)", d->current_profile_text,index);
return_immediately = 1; /* caller must do the waiting */
} else if (d->current_profile == 0x1a) { /* DVD+RW */
@ -2617,6 +2787,8 @@ selected_not_suitable:;
/* mmc5r03c.pdf , 6.5.4.2.14, DVD+RW Basic Format */
format_type = 0x26;
/* >>> ??? is this "| 8" a bug ? */
if ((size <= 0 && !(flag & 2)) || (flag & (4 | 8))) {
/* maximum capacity */
memset(c.page->data + 4, 0xff, 4);
@ -2704,6 +2876,7 @@ selected_not_suitable:;
}
} else {
no_suitable_formatting_type:;
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020131,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
@ -2717,9 +2890,170 @@ selected_not_suitable:;
format_type == 0x15 ? "quick" : "full");
return_immediately = 1; /* caller must do the waiting */
} else if (d->current_profile == 0x12) {
/* ts A80417 : DVD-RAM */
/* 6.5.4.2.1 Format Type = 00h (Full Format)
6.5.4.2.2 Format Type = 01h (Spare Area Expansion)
*/
index = format_00_index = -1;
format_size = format_00_max_size = -1;
for (i = 0; i < d->num_format_descr; i++) {
format_type = d->format_descriptors[i].type;
i_size = d->format_descriptors[i].size;
if (format_type != 0x00 && format_type != 0x01)
continue;
if (flag & 32) { /* No defect mgt */
/* Search for largest 0x00 format descriptor */
if (format_type != 0x00)
continue;
if (i_size < format_size)
continue;
format_size = i_size;
index = i;
continue;
} else if (flag & 4) { /*Max or default size with mgt*/
/* Search for second largest 0x00
format descriptor. For max size allow
format type 0x01.
*/
if (format_type == 0x00) {
if (i_size < format_size)
continue;
if (i_size < format_00_max_size) {
format_size = i_size;
index = i;
continue;
}
format_size = format_00_max_size;
index = format_00_index;
format_00_max_size = i_size;
format_00_index = i;
continue;
}
if (size_mode==3)
continue;
if (i_size > format_size) {
format_size = i_size;
index = i;
}
continue;
}
/* Search for smallest 0x0 or 0x01
descriptor >= size */;
if (d->format_descriptors[i].size >= size &&
(format_size < 0 || i_size < format_size)
) {
format_size = i_size;
index = i;
}
}
if(index < 0 && (flag & 4) && !(flag & 32)) {
format_size = format_00_max_size;
index = format_00_index;
}
if(index < 0)
goto no_suitable_formatting_type;
format_type = d->format_descriptors[index].type;
num_of_blocks = d->format_descriptors[index].size / 2048;
mmc_int_to_four_char(c.page->data + 4, num_of_blocks);
for (i = 0; i < 3; i++)
c.page->data[9 + i] =
( d->format_descriptors[index].tdp >>
(16 - 8 * i)) & 0xff;
sprintf(descr, "%s", d->current_profile_text);
return_immediately = 1; /* caller must do the waiting */
c.page->data[1] |= 0x80; /* FOV = this flag vector is valid */
if ((flag & 64) && format_type != 0x01) {
/* MMC-5 6.5.3.2 , 6.5.4.2.1.2
DCRT: Disable Certification and maintain number
of blocks
CmpList: Override maintaining of number of blocks
with DCRT
*/
/* ts A80426 : prevents change of formatted size
with PHILIPS SPD3300L and Verbatim 3x DVD-RAM
and format_type 0x00. Works on TSSTcorp SH-S203B
*/
c.page->data[1] |= 0x20;
c.opcode[1] |= 0x08;
}
} else if (d->current_profile == 0x43) {
/* BD-RE */
index = -1;
format_size = -1;
if (d->num_format_descr <= 0)
goto no_suitable_formatting_type;
if (d->format_descriptors[0].type != 0)
goto no_suitable_formatting_type;
for (i = 0; i < d->num_format_descr; i++) {
format_type = d->format_descriptors[i].type;
i_size = d->format_descriptors[i].size;
if (format_type != 0x00 && format_type != 0x30 &&
format_type != 0x31)
continue;
if (flag & 32) { /* No defect mgt */
/* search largest format 0x31 */
if(format_type != 0x31)
continue;
} else if(size_mode == 2) { /* max payload size */
/* search largest 0x30 format descriptor */
if(format_type != 0x30)
continue;
} else if(size_mode == 3) { /* default payload size */
if (accept_count < 1)
index = 0; /* this cannot certify */
if(format_type != 0x30)
continue;
accept_count++;
if (accept_count == 1)
index = i;
continue;
} else { /* defect managed format with size wish */
/* search for smallest 0x30 >= size */
if(format_type != 0x30)
continue;
if (i_size < size)
continue;
if (format_size >= 0 && i_size >= format_size)
continue;
index = i;
format_size = i_size;
continue;
}
/* common for all cases which search largest
descriptors */
if (i_size > format_size) {
format_size = i_size;
index = i;
}
}
if (size_mode == 2 && index < 0 && !(flag & 32))
index = 0;
if (index < 0)
goto no_suitable_formatting_type;
format_type = d->format_descriptors[index].type;
if (format_type == 0x30 || format_type == 0x31) {
if (flag & 64)
format_sub_type = 3; /* Quick certification */
else
format_sub_type = 2; /* Full certification */
}
num_of_blocks = d->format_descriptors[index].size / 2048;
mmc_int_to_four_char(c.page->data + 4, num_of_blocks);
for (i = 0; i < 3; i++)
c.page->data[9 + i] =
( d->format_descriptors[index].tdp >>
(16 - 8 * i)) & 0xff;
sprintf(descr, "%s", d->current_profile_text);
return_immediately = 1; /* caller must do the waiting */
c.page->data[1] |= 0x80; /* FOV = this flag vector is valid */
} else {
/* >>> other formattable types to come */
/* >>> other formattable types to come */
unsuitable_media:;
sprintf(msg, "Unsuitable media detected. Profile %4.4Xh %s",
d->current_profile, d->current_profile_text);
@ -2729,13 +3063,39 @@ unsuitable_media:;
msg, 0, 0);
return 0;
}
c.page->data[8] = format_type << 2;
c.page->data[8] = (format_type << 2) | (format_sub_type & 3);
sprintf(msg, "Format type %2.2Xh \"%s\", blocks = %.f\n",
sprintf(msg, "Format type %2.2Xh \"%s\", blocks = %.f",
format_type, descr, (double) num_of_blocks);
libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
msg, 0, 0);
sprintf(msg, "CDB: ");
for (i = 0; i < 6; i++)
sprintf(msg + strlen(msg), "%2.2X ", c.opcode[i]);
libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
msg, 0, 0);
sprintf(msg, "Format list: ");
for (i = 0; i < 12; i++)
sprintf(msg + strlen(msg), "%2.2X ", c.page->data[i]);
strcat(msg, "\n");
libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
msg, 0, 0);
#ifdef Libburn_do_not_format_dvd_ram_or_bd_rE
if(d->current_profile == 0x43 || d->current_profile == 0x12) {
sprintf(msg,
"Formatting of %s not implemented yet - This is a dummy",
d->current_profile_text);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00000002,
LIBDAX_MSGS_SEV_WARNING, LIBDAX_MSGS_PRIO_ZERO,
msg, 0, 0);
return 1;
}
#endif /* Libburn_do_not_format_dvd_ram_or_bd_rE */
d->issue_command(d, &c);
if (c.error && !tolerate_failure) {
@ -2994,8 +3354,9 @@ int mmc_compose_mode_page_5(struct burn_drive *d,
pd[13] = 16;
} else if (d->current_profile == 0x1a || d->current_profile == 0x1b ||
d->current_profile == 0x2b || d->current_profile == 0x12) {
/* not with DVD+R[W][/DL] or DVD-RAM */;
d->current_profile == 0x2b || d->current_profile == 0x12 ||
d->current_profile == 0x43) {
/* not with DVD+R[W][/DL] or DVD-RAM or BD-RE */;
return 0;
} else {
/* Traditional setup for CD */

View File

@ -38,6 +38,7 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive)
opts->start_byte = -1;
opts->fill_up_media = 0;
opts->force_is_set = 0;
opts->do_stream_recording = 0;
opts->has_mediacatalog = 0;
opts->format = BURN_CDROM;
opts->multi = 0;
@ -380,6 +381,16 @@ void burn_write_opts_set_force(struct burn_write_opts *opts, int use_force)
}
/* ts A80412: API */
void burn_write_opts_set_stream_recording(struct burn_write_opts *opts,
int value)
{
opts->do_stream_recording = !!value;
}
/* ts A70901: API */
struct burn_drive *burn_write_opts_get_drive(struct burn_write_opts *opts)
{

View File

@ -49,6 +49,11 @@ struct burn_write_opts
*/
int force_is_set;
/* ts A80412 : whether to use WRITE12 with Streaming bit set
rather than WRITE10. Speeds up DVD-RAM. Might help with BD-RE.
This gets transferred to burn_drive.do_stream_recording */
int do_stream_recording;
/** A disc can have a media catalog number */
int has_mediacatalog;
unsigned char mediacatalog[13];

View File

@ -43,16 +43,25 @@ SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH
/* The maximum size for a (SCSI) i/o transaction */
/* Important : MUST be at least 32768 ! */
/* ts A70523 : >32k seems not good with kernel 2.4 USB drivers and audio
#define BURN_OS_TRANSPORT_BUFFER_SIZE 65536
#define BURN_OS_TRANSPORT_BUFFER_SIZE 32768
*/
#define BURN_OS_TRANSPORT_BUFFER_SIZE 32768
/* ts A80414 : curbed in write.c CD media to Libburn_cd_obS = 32 kiB
re-enlarged transport to 64 kiB for BD-RE experiments
*/
#define BURN_OS_TRANSPORT_BUFFER_SIZE 65536
/* To hold the index number of the most recently delivered address from
/* To hold the position of the most recently delivered address from
device enumeration.
*/
struct burn_drive_enumerator_struct {
int pos;
int info_count;
char **info_list;
};
#define BURN_OS_DEFINE_DRIVE_ENUMERATOR_T \
typedef int burn_drive_enumerator_t;
typedef struct burn_drive_enumerator_struct burn_drive_enumerator_t;
/* Parameters for sibling list. See sibling_fds, sibling_fnames */

View File

@ -325,6 +325,19 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
char msg[81], *wpt;
struct buffer buf;
/*
#define Libburn_read_data_adr_logginG 1
*/
#ifdef Libburn_read_data_adr_logginG
static FILE *log_fp= NULL;
if(log_fp == NULL)
log_fp = fopen("/tmp/burn_read_data_log", "a");
if(log_fp!=NULL)
fprintf(log_fp, "%d\n", (int) (byte_address / 2048));
#endif /* Libburn_read_data_logginG */
*data_count = 0;
sose_mem = d->silent_on_scsi_error;
@ -375,7 +388,10 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
#define O_LARGEFILE 0
#endif
fd = open(d->devname, O_RDONLY | O_LARGEFILE);
fd = d->stdio_fd;
if (fd < 0)
d->stdio_fd = fd =
open(d->devname, O_RDONLY | O_LARGEFILE);
if (fd == -1) {
if (errno != ENOENT || !(flag & 2))
libdax_msgs_submit(libdax_messenger,
@ -427,7 +443,8 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
d->silent_on_scsi_error = sose_mem;
if (err == BE_CANCELLED) {
/* Try to read a smaller part of the chunk */
for (i = 0; i < chunksize - 1; i++) {
if(!(flag & 4))
for (i = 0; i < chunksize - 1; i++) {
if (flag & 2)
d->silent_on_scsi_error = 1;
if (d->drive_role == 1) {
@ -448,6 +465,13 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
wpt += 2048;
*data_count += 2048;
}
if (!(flag & 2))
libdax_msgs_submit(libdax_messenger,
d->global_index,
0x00020000,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
"burn_read_data() returns 0",
0, 0);
ret = 0; goto ex;
}
memcpy(wpt, d->buffer->data, cpy_size);
@ -457,8 +481,10 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
ret = 1;
ex:;
/* <<< let it open until drive is given up or writing shall happen
if (fd != -1)
close(fd);
*/
d->buffer = NULL;
d->busy = BURN_DRIVE_IDLE;
return ret;

View File

@ -260,6 +260,37 @@ static void sg_select_device_family(void)
}
/* ts A80701 */
/* This cares for the case that no /dev/srNN but only /dev/scdNN exists.
A theoretical case which has its complement in SuSE 10.2 having
/dev/sr but not /dev/scd.
*/
static int sg_exchange_scd_for_sr(char *fname, int flag)
{
struct stat stbuf;
char scd[17], msg[160];
if (burn_sg_use_family != 0 || strncmp(fname, "/dev/sr", 7)!=0 ||
strlen(fname)>9 || strlen(fname)<8)
return 2;
if (fname[7] < '0' || fname[7] > '9')
return 2;
if (fname [8] != 0 && (fname[7] < '0' || fname[7] > '9'))
return 2;
if (stat(fname, &stbuf) != -1)
return 2;
strcpy(scd, "/dev/scd");
strcpy(scd + 8, fname + 7);
if (stat(scd, &stbuf) == -1)
return 2;
sprintf(msg, "%s substitutes for non-existent %s", scd, fname);
libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0);
strcpy(fname, scd);
return 1;
}
static int sgio_test(int fd)
{
unsigned char test_ops[] = { 0, 0, 0, 0, 0, 0 };
@ -279,6 +310,33 @@ static int sgio_test(int fd)
static int sg_handle_busy_device(char *fname, int os_errno)
{
char msg[4096];
struct stat stbuf;
int looks_like_hd= 0, fd, ret;
/* ts A80713 :
check existence of /dev/hdX1 as hint for hard disk rather than CD
Hint by Giulio Orsero: check /proc/ide/hdX/media for "disk"
*/
if (strncmp(fname, "/dev/hd", 7)==0) {
sprintf(msg, "%s1", fname);
if (stat(msg, &stbuf) != -1)
looks_like_hd= 1;
sprintf(msg, "/proc/ide/hd%c/media", fname[7]);
fd = open(msg, O_RDONLY);
if (fd != -1) {
ret = read(fd, msg, 10);
if (ret < 0)
ret = 0;
msg[ret]= 0;
close(fd);
if (strncmp(msg, "disk\n", 5) == 0 ||
strcmp(msg, "disk") == 0)
looks_like_hd= 2;
else if (strncmp(msg, "cdrom\n", 6) == 0 ||
strcmp(msg, "cdrom") == 0)
looks_like_hd= 0;
}
}
/* ts A60814 : i saw no way to do this more nicely */
if (burn_sg_open_abort_busy) {
@ -292,10 +350,26 @@ static int sg_handle_busy_device(char *fname, int os_errno)
}
/* ts A60924 : now reporting to libdax_msgs */
sprintf(msg, "Cannot open busy device '%s'", fname);
libdax_msgs_submit(libdax_messenger, -1, 0x00020001,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_LOW,
msg, os_errno, 0);
if (looks_like_hd == 2) { /* is surely hard disk */
;
} else if (looks_like_hd) {
sprintf(msg, "Could not examine busy device '%s'", fname);
libdax_msgs_submit(libdax_messenger, -1, 0x0002015a,
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_LOW,
msg, os_errno, 0);
sprintf(msg,
"Busy '%s' seems to be a hard disk, as '%s1' exists. But better check.",
fname, fname);
libdax_msgs_submit(libdax_messenger, -1, 0x0002015b,
LIBDAX_MSGS_SEV_HINT, LIBDAX_MSGS_PRIO_LOW,
msg, 0, 0);
} else {
sprintf(msg, "Cannot open busy device '%s'", fname);
libdax_msgs_submit(libdax_messenger, -1, 0x00020001,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_LOW,
msg, os_errno, 0);
}
return 1;
}
@ -308,6 +382,28 @@ static int sg_close_drive_fd(char *fname, int driveno, int *fd, int sorry)
if(*fd < 0)
return(0);
#ifdef CDROM_MEDIA_CHANGED_disabled_because_not_helpful
#ifdef CDSL_CURRENT
/* ts A80217 : wondering whether the os knows about our activities */
ret = ioctl(*fd, CDROM_MEDIA_CHANGED, CDSL_CURRENT);
sprintf(msg, "ioctl(CDROM_MEDIA_CHANGED) == %d", ret);
libdax_msgs_submit(libdax_messenger, driveno, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0);
#ifdef BLKFLSBUF_disabled_because_not_helpful
ret = ioctl(*fd, BLKFLSBUF, 0);
sprintf(msg, "ioctl(BLKFLSBUF) == %d", ret);
os_errno = 0;
if(ret == -1)
os_errno = errno;
libdax_msgs_submit(libdax_messenger, driveno, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, msg, os_errno,0);
#endif /* BLKFLSBUF */
#endif /* CDSL_CURRENT */
#endif /* CDROM_MEDIA_CHANGED */
ret = close(*fd);
*fd = -1337;
if(ret != -1) {
@ -548,12 +644,195 @@ failed:;
}
#define Libburn_drive_new_deaL 1
#ifdef Libburn_drive_new_deaL
/* ts A80731 */
static int is_ata_drive(char *fname)
{
int fd;
struct hd_driveid tm;
fd = sg_open_drive_fd(fname, 1);
if (fd == -1) {
if (linux_ata_enumerate_verbous)
fprintf(stderr,"open failed, errno=%d '%s'\n",
errno, strerror(errno));
return 0;
}
memset(&tm, 0, sizeof(tm));
ioctl(fd, HDIO_GET_IDENTITY, &tm);
/* not atapi */
if (!(tm.config & 0x8000) || (tm.config & 0x4000)) {
if (linux_ata_enumerate_verbous)
fprintf(stderr, "not marked as ATAPI\n");
sg_close_drive_fd(fname, -1, &fd, 0);
return 0;
}
/* if SG_IO fails on an atapi device, we should stop trying to
use hd* devices */
if (sgio_test(fd) == -1) {
if (linux_ata_enumerate_verbous)
fprintf(stderr,
"FATAL: sgio_test() failed: errno=%d '%s'\n",
errno, strerror(errno));
sg_close_drive_fd(fname, -1, &fd, 0);
return 0;
}
if (sg_close_drive_fd(fname, -1, &fd, 1) <= 0) {
if (linux_ata_enumerate_verbous)
fprintf(stderr,
"cannot close properly, errno=%d '%s'\n",
errno, strerror(errno));
return 0;
}
return 1;
}
static int is_scsi_drive(char *fname, int *bus_no, int *host_no,
int *channel_no, int *target_no, int *lun_no)
{
int fd, sid_ret = 0, ret;
struct sg_scsi_id sid;
int sibling_fds[BURN_OS_SG_MAX_SIBLINGS], sibling_count= 0;
char sibling_fnames[BURN_OS_SG_MAX_SIBLINGS][BURN_OS_SG_MAX_NAMELEN];
fd = sg_open_drive_fd(fname, 1);
if (fd == -1) {
if (linux_sg_enumerate_debug)
fprintf(stderr, "open failed, errno=%d '%s'\n",
errno, strerror(errno));
return 0;
}
sid_ret = ioctl(fd, SG_GET_SCSI_ID, &sid);
if (sid_ret == -1) {
sid.scsi_id = -1; /* mark SCSI address as invalid */
if(linux_sg_enumerate_debug)
fprintf(stderr,
"ioctl(SG_GET_SCSI_ID) failed, errno=%d '%s' , ",
errno, strerror(errno));
if (sgio_test(fd) == -1) {
if (linux_sg_enumerate_debug)
fprintf(stderr,
"FATAL: sgio_test() failed: errno=%d '%s'",
errno, strerror(errno));
sg_close_drive_fd(fname, -1, &fd, 0);
return 0;
}
#ifdef CDROM_DRIVE_STATUS
if (strcmp(linux_sg_device_family,"/dev/sg%d") != 0) {
/* http://developer.osdl.org/dev/robustmutexes/
src/fusyn.hg/Documentation/ioctl/cdrom.txt */
sid_ret = ioctl(fd, CDROM_DRIVE_STATUS, 0);
if(linux_sg_enumerate_debug)
fprintf(stderr,
"ioctl(CDROM_DRIVE_STATUS) = %d , ",
sid_ret);
if (sid_ret != -1 && sid_ret != CDS_NO_INFO)
sid.scsi_type = TYPE_ROM;
else
sid_ret = -1;
}
#endif /* CDROM_DRIVE_STATUS */
}
#ifdef SCSI_IOCTL_GET_BUS_NUMBER
/* Hearsay A61005 */
if (ioctl(fd, SCSI_IOCTL_GET_BUS_NUMBER, bus_no) == -1)
*bus_no = -1;
#endif
if (sg_close_drive_fd(fname, -1, &fd,
sid.scsi_type == TYPE_ROM ) <= 0) {
if (linux_sg_enumerate_debug)
fprintf(stderr,
"cannot close properly, errno=%d '%s'\n",
errno, strerror(errno));
return 0;
}
if ( (sid_ret == -1 || sid.scsi_type != TYPE_ROM)
&& !linux_sg_accept_any_type) {
if (linux_sg_enumerate_debug)
fprintf(stderr, "sid.scsi_type = %d (!= TYPE_ROM)\n",
sid.scsi_type);
return 0;
}
if (sid_ret == -1 || sid.scsi_id < 0) {
/* ts A61211 : employ a more general ioctl */
ret = sg_obtain_scsi_adr(fname, bus_no, host_no,
channel_no, target_no, lun_no);
if (ret>0) {
sid.host_no = *host_no;
sid.channel = *channel_no;
sid.scsi_id = *target_no;
sid.lun = *lun_no;
} else {
if (linux_sg_enumerate_debug)
fprintf(stderr,
"sg_obtain_scsi_adr() failed\n");
return 0;
}
}
/* ts A60927 : trying to do locking with growisofs */
if(burn_sg_open_o_excl>1) {
ret = sg_open_scsi_siblings(
fname, -1, sibling_fds, sibling_fnames,
&sibling_count,
sid.host_no, sid.channel,
sid.scsi_id, sid.lun);
if (ret<=0) {
if (linux_sg_enumerate_debug)
fprintf(stderr, "cannot lock siblings\n");
sg_handle_busy_device(fname, 0);
return 0;
}
/* the final occupation will be done in sg_grab() */
sg_release_siblings(sibling_fds, sibling_fnames,
&sibling_count);
}
#ifdef SCSI_IOCTL_GET_BUS_NUMBER
if(*bus_no == -1)
*bus_no = 1000 * (sid.host_no + 1) + sid.channel;
#else
*bus_no = sid.host_no;
#endif
*host_no= sid.host_no;
*channel_no= sid.channel;
*target_no= sid.scsi_id;
*lun_no= sid.lun;
return 1;
}
#endif /* Libburn_drive_new_deaL */
/** Speciality of Linux: detect non-SCSI ATAPI (EIDE) which will from
then on used used via generic SCSI as is done with (emulated) SCSI drives */
static void ata_enumerate(void)
{
#ifdef Libburn_drive_new_deaL
int ret;
#else
struct hd_driveid tm;
int i, fd;
int fd;
#endif
int i;
char fname[10];
if (linux_ata_enumerate_verbous)
@ -574,6 +853,17 @@ static void ata_enumerate(void)
fprintf(stderr, "not in whitelist\n");
continue;
}
#ifdef Libburn_drive_new_deaL
ret = is_ata_drive(fname);
if (ret < 0)
break;
if (ret == 0)
continue;
#else /* Libburn_drive_new_deaL */
fd = sg_open_drive_fd(fname, 1);
if (fd == -1) {
if (linux_ata_enumerate_verbous)
@ -610,6 +900,10 @@ static void ata_enumerate(void)
errno, strerror(errno));
continue;
}
#endif /* Libburn_drive_new_deaL */
if (linux_ata_enumerate_verbous)
fprintf(stderr, "accepting as drive without SCSI address\n");
enumerate_common(fname, -1, -1, -1, -1, -1);
@ -620,12 +914,18 @@ static void ata_enumerate(void)
/** Detects (probably emulated) SCSI drives */
static void sg_enumerate(void)
{
#ifdef Libburn_drive_new_deaL
#else
struct sg_scsi_id sid;
int i, fd, sibling_fds[BURN_OS_SG_MAX_SIBLINGS], sibling_count= 0, ret;
int sid_ret = 0;
int bus_no= -1, host_no= -1, channel_no= -1, target_no= -1, lun_no= -1;
char fname[10];
int fd, sibling_fds[BURN_OS_SG_MAX_SIBLINGS], sibling_count= 0;
char sibling_fnames[BURN_OS_SG_MAX_SIBLINGS][BURN_OS_SG_MAX_NAMELEN];
int sid_ret = 0;
#endif
int i, ret;
int bus_no= -1, host_no= -1, channel_no= -1, target_no= -1, lun_no= -1;
char fname[17];
sg_select_device_family();
@ -639,6 +939,9 @@ static void sg_enumerate(void)
for (i = 0; i < 32; i++) {
sprintf(fname, linux_sg_device_family, i);
/* ts A80702 */
sg_exchange_scd_for_sr(fname, 0);
if (linux_sg_enumerate_debug)
fprintf(stderr, "libburn_debug: %s : ", fname);
@ -649,6 +952,23 @@ static void sg_enumerate(void)
continue;
}
#ifdef Libburn_drive_new_deaL
ret = is_scsi_drive(fname, &bus_no, &host_no, &channel_no,
&target_no, &lun_no);
if (ret < 0)
break;
if (ret == 0)
continue;
if (linux_sg_enumerate_debug)
fprintf(stderr, "accepting as SCSI %d,%d,%d,%d bus=%d\n",
host_no, channel_no, target_no, lun_no, bus_no);
enumerate_common(fname, bus_no, host_no, channel_no,
target_no, lun_no);
#else /* Libburn_drive_new_deaL */
/* ts A60927 */
fd = sg_open_drive_fd(fname, 1);
if (fd == -1) {
@ -758,16 +1078,218 @@ static void sg_enumerate(void)
#else
bus_no = sid.host_no;
#endif
if (linux_sg_enumerate_debug)
fprintf(stderr, "accepting as SCSI %d,%d,%d,%d bus=%d\n",
sid.host_no, sid.channel, sid.scsi_id, sid.lun,
bus_no);
enumerate_common(fname, bus_no, sid.host_no, sid.channel,
sid.scsi_id, sid.lun);
#endif /* Libburn_drive_new_deaL */
}
}
#ifdef Libburn_drive_new_deaL
/* ts A80805 : eventually produce the other official name of a device file */
static int fname_other_name(char *fname, char other_name[80], int flag)
{
if(strncmp(fname, "/dev/sr", 7) == 0 &&
(fname[7] >= '0' && fname[7] <= '9') &&
(fname[8] == 0 ||
(fname[8] >= '0' && fname[8] <= '9' && fname[9] == 0))) {
sprintf(other_name, "/dev/scd%s", fname + 7);
return 1;
}
if(strncmp(fname, "/dev/scd", 8) == 0 &&
(fname[8] >= '0' && fname[8] <= '9') &&
(fname[9] == 0 ||
(fname[9] >= '0' && fname[9] <= '9' && fname[10] == 0))) {
sprintf(other_name, "/dev/sr%s", fname + 8);
return 1;
}
return 0;
}
/* ts A80805 */
static int fname_drive_is_listed(char *fname, int flag)
{
char other_fname[80];
if (burn_drive_is_listed(fname, NULL, 0))
return 1;
if (fname_other_name(fname, other_fname, 0) > 0)
if (burn_drive_is_listed(other_fname, NULL, 0))
return 2;
return 0;
}
/* ts A80731 : Directly open the given address.
@param flag bit0= do not compain about missing file
*/
static int fname_enumerate(char *fname, int flag)
{
int is_ata= 0, is_scsi= 0;
int bus_no= -1, host_no= -1, channel_no= -1, target_no= -1, lun_no= -1;
char msg[BURN_DRIVE_ADR_LEN + 80];
struct stat stbuf;
if (fname_drive_is_listed(fname, 0))
return 2;
if (stat(fname, &stbuf) == -1) {
sprintf(msg, "File object '%s' not found", fname);
if (!(flag & 1))
libdax_msgs_submit(libdax_messenger, -1, 0x0002000b,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
return -1;
}
is_ata = is_ata_drive(fname);
if (is_ata < 0)
return -1;
if (!is_ata)
is_scsi = is_scsi_drive(fname, &bus_no, &host_no, &channel_no,
&target_no, &lun_no);
if (is_scsi < 0)
return -1;
if (is_ata == 0 && is_scsi == 0)
return 0;
if (linux_sg_enumerate_debug)
fprintf(stderr,
"(single) accepting as SCSI %d,%d,%d,%d bus=%d\n",
host_no, channel_no, target_no, lun_no, bus_no);
enumerate_common(fname, bus_no, host_no, channel_no,
target_no, lun_no);
return 1;
}
/* ts A80731 : Directly open the given address from a single-item whitlist */
static int single_enumerate(int flag)
{
int ret, wl_count;
char *fname, msg[BURN_DRIVE_ADR_LEN + 80];
wl_count= burn_drive_whitelist_count();
if (wl_count != 1)
return 0;
fname= burn_drive_whitelist_item(0, 0);
if (fname == NULL)
return 0;
ret = fname_enumerate(fname, 0);
if (ret <= 0) {
sprintf(msg, "Cannot access '%s' as SG_IO CDROM drive", fname);
libdax_msgs_submit(libdax_messenger, -1, 0x0002000a,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
ret = -1;
}
return ret;
}
/* ts A80801 : looking up drives listed in /proc/sys/dev/cdrom/info line like:
drive name: sr1 hdc hda sr0
@parm flag bit0= release list memory and exit
*/
static int proc_sys_dev_cdrom_info(char ***list, int *count, int flag)
{
FILE *fp;
char line[1024], fname[1024 + 5], *cpt, *retpt, *list_data;
int maxl= 0, pass, i;
if (*list != NULL) {
if ((*list)[0] != NULL)
free((*list)[0]);
free(*list);
*list = NULL;
*count = 0;
}
if (flag & 1)
return 1;
*count = 0;
fp = fopen("/proc/sys/dev/cdrom/info", "r");
if (fp == NULL)
return 0;
while (1) {
retpt = fgets(line, sizeof(line), fp);
if (retpt == NULL)
break;
if(strncmp(line, "drive name:", 11) == 0)
break;
}
fclose(fp);
if (retpt == NULL)
return 0;
strcpy(fname, "/dev/");
for(pass = 0; pass < 2; pass++) {
*count = 0;
cpt = line + 11;
while (*cpt != 0) {
for(; *cpt == ' ' || *cpt == '\t'; cpt++);
if (*cpt == 0 || *cpt == '\n')
break;
sscanf(cpt, "%s", fname + 5);
if (strlen(fname) > maxl)
maxl = strlen(fname);
if (pass == 1)
strcpy((*list)[*count], fname);
(*count)++;
for(cpt++; *cpt != ' ' && *cpt != '\t'
&& *cpt != 0 && *cpt != '\n'; cpt++);
}
if (pass == 0) {
list_data = calloc(*count + 1, maxl+1);
*list = calloc(*count + 1, sizeof(char *));
if(list_data == NULL || *list == NULL) {
libdax_msgs_submit(libdax_messenger, -1,
0x00000003,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Out of virtual memory", 0, 0);
if (list_data != NULL)
free(list_data);
if (*list != NULL)
free((char *) *list);
return -1;
}
for (i = 0; i <= *count; i++)
(*list)[i] = list_data + i * (maxl + 1);
}
}
return 1;
}
static int add_proc_info_drives(int flag)
{
int ret, list_count, count = 0, i;
char **list= NULL;
ret = proc_sys_dev_cdrom_info(&list, &list_count, 0);
if (ret <= 0)
return ret;
for (i = 0; i < list_count; i++) {
if (burn_drive_is_banned(list[i]))
continue;
ret = fname_enumerate(list[i], 1);
if (ret == 1)
count++;
}
proc_sys_dev_cdrom_info(&list, &list_count, 1); /* free memory */
return 1 + count;
}
#endif /* Libburn_drive_new_deaL */
/* ts A61115 */
/* ----------------------------------------------------------------------- */
/* PORTING: Private functions which contain publicly needed functionality. */
@ -852,10 +1374,14 @@ int sg_give_next_adr(burn_drive_enumerator_t *idx,
{
/* os-linux.h : typedef int burn_drive_enumerator_t; */
static int sg_limit = 32, ata_limit = 26;
int baseno = 0;
int baseno = 0, i;
char other_name[80];
if (initialize == -1)
if (initialize == -1) {
proc_sys_dev_cdrom_info(&(idx->info_list), &(idx->info_count),
1);
return 0;
}
sg_select_device_family();
if (linux_sg_device_family[0] == 0)
@ -863,26 +1389,56 @@ int sg_give_next_adr(burn_drive_enumerator_t *idx,
if (linux_ata_device_family[0] == 0)
ata_limit = 0;
if (initialize == 1)
*idx = -1;
(*idx)++;
if (*idx >= sg_limit)
if (initialize == 1) {
idx->pos = -1;
idx->info_count= 0;
idx->info_list= NULL;
proc_sys_dev_cdrom_info(&(idx->info_list), &(idx->info_count),
0);
}
(idx->pos)++;
if (idx->pos >= sg_limit)
goto next_ata;
if (adr_size < 10)
if (adr_size < 11)
return -1;
sprintf(adr, linux_sg_device_family, *idx);
return 1;
sprintf(adr, linux_sg_device_family, idx->pos);
sg_exchange_scd_for_sr(adr, 0);
goto return_1_pre_proc;
next_ata:;
baseno += sg_limit;
if (*idx - baseno >= ata_limit)
goto next_nothing;
if (idx->pos - baseno >= ata_limit)
goto next_proc_info;
if (adr_size < 9)
return -1;
sprintf(adr, linux_ata_device_family, 'a' + (*idx - baseno));
return 1;
next_nothing:;
sprintf(adr, linux_ata_device_family, 'a' + (idx->pos - baseno));
goto return_1_pre_proc;
next_proc_info:;
baseno += ata_limit;
for (i = 0; i < idx->info_count; i++) {
if ((idx->info_list)[i][0] == 0)
continue;
if (baseno == idx->pos) {
if (adr_size < strlen((idx->info_list)[i]) + 1)
return -1;
strcpy(adr, (idx->info_list)[i]);
return 1;
}
baseno++;
}
return 0;
return_1_pre_proc:;
for (i = 0; i < idx->info_count; i++) {
if (strcmp((idx->info_list)[i], adr) == 0)
(idx->info_list)[i][0] = 0;
if (fname_other_name(adr, other_name, 0) > 0)
if (strcmp((idx->info_list)[i], other_name) == 0)
(idx->info_list)[i][0] = 0;
}
return 1;
}
@ -904,8 +1460,27 @@ next_nothing:;
/* ts A61115: replacing call to sg-implementation internals from drive.c */
int scsi_enumerate_drives(void)
{
#ifdef Libburn_drive_new_deaL
int ret;
#endif
#ifdef Libburn_drive_new_deaL
/* Direct examination of eventually single whitelisted name */
ret = single_enumerate(0);
if (ret < 0)
return -1;
if (ret > 0)
return 1;
#endif /* Libburn_drive_new_deaL */
sg_enumerate();
ata_enumerate();
#ifdef Libburn_drive_new_deaL
add_proc_info_drives(0);
#endif /* Libburn_drive_new_deaL */
return 1;
}
@ -1356,9 +1931,9 @@ int sg_is_enumerable_adr(char *adr)
sg_give_next_adr(&idx, fname, sizeof(fname), -1);
return 1;
}
}
sg_give_next_adr(&idx, fname, sizeof(fname), -1);
if (first == 0)
sg_give_next_adr(&idx, fname, sizeof(fname), -1);
return(0);
}

View File

@ -580,7 +580,7 @@ void spc_sense_write_params(struct burn_drive *d)
/* ts A70212 : try to setup d->media_capacity_remaining */
if (d->current_profile == 0x1a || d->current_profile == 0x13 ||
d->current_profile == 0x12)
d->current_profile == 0x12 || d->current_profile == 0x43)
d->read_format_capacities(d, -1);
else if (d->status == BURN_DISC_BLANK ||
(d->current_is_cd_profile && d->status == BURN_DISC_APPENDABLE)) {

View File

@ -330,11 +330,19 @@ void burn_track_clear_isrc(struct burn_track *t)
int burn_track_get_sectors(struct burn_track *t)
{
/* ts A70125 : was int */
off_t size;
off_t size = 0;
int sectors, seclen;
seclen = burn_sector_length(t->mode);
size = t->offset + t->source->get_size(t->source) + t->tail;
if (t->source != NULL) /* ts A80808 : mending sigsegv */
size = t->offset + t->source->get_size(t->source) + t->tail;
else if(t->entry != NULL) {
/* ts A80808 : all burn_toc_entry of track starts should now
have (extensions_valid & 1), even those from CD.
*/
if (t->entry->extensions_valid & 1)
size = ((off_t) t->entry->track_blocks) * (off_t) 2048;
}
sectors = size / seclen;
if (size % seclen)
sectors++;
@ -468,6 +476,7 @@ int burn_session_get_sectors(struct burn_session *s)
return sectors;
}
int burn_disc_get_sectors(struct burn_disc *d)
{
int sectors = 0, i;
@ -515,3 +524,40 @@ int burn_session_get_hidefirst(struct burn_session *session)
{
return session->hidefirst;
}
/* ts A80808 : Enhance CD toc to DVD toc */
int burn_disc_cd_toc_extensions(struct burn_disc *d, int flag)
{
int sidx, tidx;
struct burn_toc_entry *entry, *prev_entry= NULL;
for (sidx = 0; sidx < d->sessions; sidx++) {
for (tidx = 0; tidx < d->session[sidx]->tracks + 1; tidx++) {
if (tidx < d->session[sidx]->tracks)
entry = d->session[sidx]->track[tidx]->entry;
else
entry = d->session[sidx]->leadout_entry;
entry->session_msb = 0;
entry->point_msb = 0;
entry->start_lba = burn_msf_to_lba(entry->pmin,
entry->psec, entry->pframe);
if (tidx > 0) {
prev_entry->track_blocks =
entry->start_lba
- prev_entry->start_lba;
prev_entry->extensions_valid |= 1;
}
if (tidx == d->session[sidx]->tracks) {
entry->session_msb = 0;
entry->point_msb = 0;
entry->track_blocks = 0;
entry->extensions_valid |= 1;
}
prev_entry = entry;
}
}
return 1;
}

View File

@ -109,4 +109,8 @@ int burn_track_apply_fillup(struct burn_track *t, off_t max_size, int flag);
off_t burn_track_get_default_size(struct burn_track *t);
/* ts A80808 : Enhance CD toc to DVD toc */
int burn_disc_cd_toc_extensions(struct burn_disc *d, int flag);
#endif /* BURN__STRUCTURE_H */

View File

@ -187,6 +187,11 @@ struct burn_drive
synchronize chache has happened yet */
int needs_sync_cache;
/* ts A80412 : whether to use WRITE12 with Streaming bit set
rather than WRITE10. Speeds up DVD-RAM. Might help
with BD-RE */
int do_stream_recording;
/* ts A61218 from 51h READ DISC INFORMATION */
int bg_format_status; /* 0=needs format start, 1=needs format restart*/
@ -348,4 +353,9 @@ struct burn_drive
/* end of generic 'drive' data structures */
/* ts A80422 : centralizing this setting for debugging purposes
*/
int burn_drive_set_media_capacity_remaining(struct burn_drive *d, off_t value);
#endif /* __TRANSPORT */

View File

@ -47,7 +47,14 @@ char *burn_strndup(char *s, int n)
void burn_version(int *major, int *minor, int *micro)
{
/* ts A80408 : switched from configure.ac versioning to libburn.h versioning */
#ifdef burn_header_version_major
*major = burn_header_version_major;
*minor = burn_header_version_minor;
*micro = burn_header_version_micro;
#else
*major = BURN_MAJOR_VERSION;
*minor = BURN_MINOR_VERSION;
*micro = BURN_MICRO_VERSION;
#endif
}

View File

@ -49,6 +49,24 @@
extern struct libdax_msgs *libdax_messenger;
/* The maximum output size to be used with CD media. This is also curbed
by BURN_OS_TRANSPORT_BUFFER_SIZE. The smaller number gets into effect.
*/
#define Libburn_cd_obS (32 * 1024)
/* The size to be used with DVD media.
*/
#define Libburn_dvd_obS (32 * 1024)
/* The size to be used with BD-RE media in normal, not streamed mode.
*/
#define Libburn_bd_re_obS (32 * 1024)
/* The size to be used with BD-RE media in streamed mode.
*/
#define Libburn_bd_re_streamed_obS (64 * 1024)
static int type_to_ctrl(int mode)
{
int ctrl = 0;
@ -967,8 +985,9 @@ int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc,
if (d->status == BURN_DISC_UNSUITABLE)
goto unsuitable_profile;
if (d->drive_role == 2 ||
d->current_profile == 0x1a || d->current_profile == 0x12) {
/* DVD+RW , DVD-RAM , emulated drive on stdio file */
d->current_profile == 0x1a || d->current_profile == 0x12 ||
d->current_profile == 0x43) {
/* DVD+RW , DVD-RAM , BD-RE, emulated drive on stdio file */
if (o->start_byte >= 0 && (o->start_byte % 2048))
strcat(reasons,
"write start address not properly aligned to 2048, ");
@ -1370,8 +1389,8 @@ int burn_dvd_write_session(struct burn_write_opts *o,
ret = burn_disc_close_session_dvd_minus_r(o, s);
if (ret <= 0)
return 0;
} else if (d->current_profile == 0x12) {
/* DVD-RAM */
} else if (d->current_profile == 0x12 || d->current_profile == 0x43) {
/* DVD-RAM , BD-RE */
/* ??? any finalization needed ? */;
} else if (d->current_profile == 0x13) {
/* DVD-RW restricted overwrite */
@ -1400,7 +1419,6 @@ int burn_disc_setup_dvd_plus_rw(struct burn_write_opts *o,
{
struct burn_drive *d = o->drive;
int ret;
char msg[160];
if (d->bg_format_status==0 || d->bg_format_status==1) {
d->busy = BURN_DRIVE_FORMATTING;
@ -1411,16 +1429,6 @@ int burn_disc_setup_dvd_plus_rw(struct burn_write_opts *o,
d->busy = BURN_DRIVE_WRITING;
d->needs_close_session = 1;
}
d->nwa = 0;
if (o->start_byte >= 0) {
d->nwa = o->start_byte / 2048;
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,
msg, 0, 0);
}
/* >>> perform OPC if needed */;
@ -1510,7 +1518,7 @@ int burn_disc_setup_dvd_plus_r(struct burn_write_opts *o,
}
/* ts A61218 - A70129 */
/* ts A61218 - A70415 */
int burn_dvd_write_sync(struct burn_write_opts *o,
struct burn_disc *disc)
{
@ -1522,8 +1530,12 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
d->needs_close_session = 0;
if (d->current_profile == 0x1a || d->current_profile == 0x12) {
/* DVD+RW , DVD-RAM */
/* buffer flush trigger for sector.c:get_sector() */
o->obs = Libburn_dvd_obS;
if (d->current_profile == 0x1a || d->current_profile == 0x12 ||
d->current_profile == 0x43) {
/* DVD+RW , DVD-RAM , BD-RE */
ret = 1;
if (d->current_profile == 0x1a)
ret = burn_disc_setup_dvd_plus_rw(o, disc);
@ -1536,7 +1548,24 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
msg, 0, 0);
goto early_failure;
}
d->nwa = 0;
if (o->start_byte >= 0) {
d->nwa = o->start_byte / 2048;
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,
msg, 0, 0);
}
o->obs_pad = 0; /* no filling-up of track's last 32k buffer */
if (d->current_profile == 0x43) /* BD-RE */
o->obs = Libburn_bd_re_obS;
if (d->do_stream_recording) {
o->obs_pad = 1;
if (d->current_profile == 0x43) /* BD-RE */
o->obs = Libburn_bd_re_streamed_obS;
}
} else if (d->current_profile == 0x13) {
/* DVD-RW Restricted Overwrite */
@ -1609,7 +1638,11 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
/* ??? padding needed ??? cowardly doing it for now */
o->obs_pad = 1; /* fill-up track's last 32k buffer */
}
o->obs = 32*1024; /* buffer flush trigger for sector.c:get_sector() */
sprintf(msg, "dvd/bd Profile= %2.2Xh , obs= %d , obs_pad= %d",
d->current_profile, o->obs, o->obs_pad);
libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg, 0, 0);
for (i = 0; i < disc->sessions; i++) {
/* update progress */
@ -1976,6 +2009,9 @@ 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 */
d->do_stream_recording = o->do_stream_recording;
d->buffer = &buf;
memset(d->buffer, 0, sizeof(struct buffer));
d->rlba = -150;
@ -1986,16 +2022,26 @@ void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc)
ret = burn_stdio_write_sync(o, disc);
if (ret <= 0)
goto fail_wo_sync;
return;
goto ex;
}
/* ts A61218 */
if (! d->current_is_cd_profile) {
ret = burn_dvd_write_sync(o, disc);
if (ret <= 0)
goto fail_wo_sync;
return;
goto ex;
}
/* ts A70521 : Linux 2.4 USB audio fails with 64 kiB */
/* ts A80414 : might need 64 kiB for BD-RE streaming */
/* buffer flush trigger for sector.c:get_sector() */
o->obs = Libburn_cd_obS;
sprintf(msg, "cd Profile= %2.2Xh , obs= %d , obs_pad= %d",
d->current_profile, o->obs, o->obs_pad);
libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg, 0, 0);
/* ts A70218 */
if (o->write_type == BURN_WRITE_SAO) {
for (i = 0 ; i < disc->session[0]->tracks; i++) {
@ -2146,7 +2192,7 @@ return crap. so we send the command, then ignore the result.
/* ts A61012 : This return was traditionally missing. I suspect this
to have caused Cdrskin_eject() failures */
return;
goto ex;
fail:
d->sync_cache(d);
@ -2158,6 +2204,9 @@ fail_wo_sync:;
"Burn run failed", 0, 0);
d->cancel = 1;
d->busy = BURN_DRIVE_IDLE;
ex:;
d->do_stream_recording = 0;
return;
}
/* ts A70811 : API function */
@ -2191,6 +2240,8 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
alignment = 32 * 1024;
if (d->current_profile == 0x1a) /* DVD+RW */
alignment = 2 * 1024;
if (d->current_profile == 0x43) /* BD-RE */
alignment = 2 * 1024;
if (alignment == 0) {
sprintf(msg, "Write start address not supported");
libdax_msgs_submit(libdax_messenger, d->global_index,

View File

@ -8,8 +8,9 @@
libburner is a minimal demo application for the library libburn as provided
on http://libburnia-project.org . It can list the available devices, can
blank a CD-RW or DVD-RW, can format a DVD-RW, can burn to CD-R, CD-RW, DVD-R,
DVD+R, DVD+RW, DVD-RAM or DVD-RW. Not supported yet: double layer media.
blank a CD-RW or DVD-RW, can format DVD-RW and BD-RE, can burn to CD-R,
CD-RW, DVD-R, DVD+R, DVD+R/DL, DVD+RW, DVD-RW, DVD-RAM, BD-RE.
Not supported yet: DVD-R/DL, BD-R.
It's main purpose, nevertheless, is to show you how to use libburn and also
to serve the libburnia team as reference application. libburner.c does indeed
@ -28,8 +29,9 @@
With that aquired drive you can blank a CD-RW
libburner_blank_disc()
or you can format a DVD-RW to profile "Restricted Overwrite" (needed once)
libburner_format_row()
With the aquired drive you can burn to CD-R, CD-RW, DVD+RW, DVD-RAM, DVD-RW
or an unused BD-RE to default size
libburner_format_owrt()
With the aquired drive you can burn to CD or DVD
libburner_payload()
When everything is done, main() releases the drive and shuts down libburn:
burn_drive_release();
@ -313,26 +315,45 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
}
/** Persistently changes DVD-RW profile 0014h "Sequential Recording" to
profile 0013h "Restricted Overwrite" which needs no blanking for re-use
but is not capable of multi-session.
/** Formats unformatted DVD-RW to profile 0013h "Restricted Overwrite"
which needs no blanking for re-use but is not capable of multi-session.
Expect a behavior similar to blanking with unusual noises from the drive.
Formats unformatted BD-RE to default size. This will allocate some
reserve space, test for bad blocks and make the media ready for writing.
Expect a very long run time.
*/
int libburner_format_row(struct burn_drive *drive)
int libburner_format_owrt(struct burn_drive *drive)
{
struct burn_progress p;
double percent = 1.0;
int ret, status, num_formats, format_flag= 0;
off_t size = 0;
unsigned dummy;
if (current_profile == 0x13) {
fprintf(stderr, "IDLE: DVD-RW media is already formatted\n");
return 2;
} else if (current_profile != 0x14) {
fprintf(stderr, "FATAL: Can only format DVD-RW\n");
} else if (current_profile == 0x43) {
ret = burn_disc_get_formats(drive, &status, &size, &dummy,
&num_formats);
if (ret > 0 && status == BURN_FORMAT_IS_FORMATTED) {
fprintf(stderr,
"IDLE: BD-RE media is already formatted\n");
return 2;
}
size = 0; /* does not really matter */
format_flag = 3<<1; /* format to default size, no quick */
} else if (current_profile == 0x14) { /* sequential DVD-RW */
size = 128 * 1024 * 1024;
format_flag = 1; /* write initial 128 MiB */
} else {
fprintf(stderr, "FATAL: Can only format DVD-RW or BD-RE\n");
return 0;
}
printf("Beginning to format media.\n");
burn_disc_format(drive, (off_t) 0, 0);
burn_disc_format(drive, size, format_flag);
sleep(1);
while (burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) {
@ -344,9 +365,10 @@ int libburner_format_row(struct burn_drive *drive)
}
burn_disc_get_profile(drive_list[0].drive, &current_profile,
current_profile_name);
printf("Media type now: %4.4xh \"%s\"\n",
current_profile, current_profile_name);
if (current_profile != 0x13) {
if (current_profile == 0x14 || current_profile == 0x13)
printf("Media type now: %4.4xh \"%s\"\n",
current_profile, current_profile_name);
if (current_profile == 0x14) {
fprintf(stderr,
"FATAL: Failed to change media profile to desired value\n");
return 0;
@ -443,7 +465,8 @@ int libburner_payload(struct burn_drive *drive,
/* Use the fifo object as data source for the track */
if (burn_track_set_source(track, fifo_src[trackno])
!= BURN_SOURCE_OK) {
printf("FATAL: Cannot attach source object to track object\n");
fprintf(stderr,
"FATAL: Cannot attach source object to track object\n");
return 0;
}
@ -533,7 +556,8 @@ int libburner_payload(struct burn_drive *drive,
burn_session_free(session);
burn_disc_free(target_disc);
if (multi && current_profile != 0x1a && current_profile != 0x13 &&
current_profile != 0x12) /* not with DVD+RW, DVD-RW, DVD-RAM */
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");
@ -696,7 +720,7 @@ int main(int argc, char **argv)
{ ret = 0; goto release_drive; }
if (do_blank) {
if (do_blank > 100)
ret = libburner_format_row(drive_list[driveno].drive);
ret = libburner_format_owrt(drive_list[driveno].drive);
else
ret = libburner_blank_disc(drive_list[driveno].drive,
do_blank == 1);