Compare commits

...

166 Commits

Author SHA1 Message Date
03336c0555 Updated web page 2007-01-16 15:20:17 +00:00
7479eb6f3a Corrected old libburn.pykix.org URL 2007-01-16 15:16:23 +00:00
ff3b6e38fc Corrected name of tarball 2007-01-16 13:33:15 +00:00
99f23179f3 Silenced a compiler warning 2007-01-16 13:27:27 +00:00
c87983eec2 Corrected statement about restriction to CD 2007-01-16 13:09:00 +00:00
102ef4ca74 Updated cdrskin tarball generator 2007-01-15 18:26:41 +00:00
a32584c01e Made version number transition to 0.3.0 2007-01-15 17:24:17 +00:00
d2265df667 Tagged 0.3.0 libburn/cdrskin release 2007-01-15 14:49:13 +00:00
9180a0036d Avoided closing of 0x13-DVD-RW sessions which are not intermediate 2007-01-14 13:41:19 +00:00
f28ec96709 Added missing cache sync in case of aborted DVD-RW burns 2007-01-14 11:55:17 +00:00
16baf48b2e Corrected bug with debug messages for fifo 2007-01-14 10:19:10 +00:00
caef0aa400 Shifted fifo reporting to new 4-times -v verbosity level 2007-01-13 21:45:04 +00:00
fefdbc646f Mentioned DVD-RAM where appropriate 2007-01-13 21:20:56 +00:00
44cd12a0a0 Added printing of list of available formats 2007-01-13 21:20:05 +00:00
07cef29616 Introduced API for inspection and selection of format capacities 2007-01-13 21:18:20 +00:00
a426df57d7 Load array of format capacities into struct burn_drive 2007-01-13 21:16:04 +00:00
a2f8174330 Documentation updates about DVD-RAM 2007-01-13 14:12:07 +00:00
b6025c6e4a Implemented debugging messages for ATA enumeration 2007-01-13 14:10:21 +00:00
ceb5159770 Implemented debugging messages for ATA enumeration 2007-01-13 14:09:53 +00:00
f77dd3134b Enabled writing to DVD-RAM 2007-01-12 16:26:31 +00:00
c381104505 Removed surplus newlines from messages 2007-01-11 13:35:48 +00:00
d61f1279c1 Sketched better handling of self-inflicted SIGs 2007-01-11 13:34:41 +00:00
0f34fb03a0 Kept SIGWINCH from spoiling a burn. 2007-01-11 13:31:28 +00:00
ef6212f4ec With full formatting prefer format 10h over 13h or 15h 2007-01-11 13:29:39 +00:00
fcc9f8fe8e Removed outdated option from startup file example 2007-01-11 13:28:36 +00:00
8877b36625 Enabled explicit full formatting of DVD+RW ("de-icing") 2007-01-10 21:07:48 +00:00
435eeea15f Removed writing of dummy data with blank=format_overwrite_full 2007-01-10 15:30:54 +00:00
15af71d448 Switched full formatting from type 10h to 00h which includes lead-out 2007-01-10 15:27:54 +00:00
27262bde51 Option -force enables re-formatting 2007-01-10 15:26:30 +00:00
7bf228954c Next cdrskin-0.2.7 cycle 2007-01-10 15:22:48 +00:00
071feccd32 Updated size estimation of development downloads 2007-01-10 15:21:42 +00:00
f1b817b520 Now available: "quickest" and "full" formatting for DVD-RW 2007-01-09 21:14:47 +00:00
e6cfff69eb Enhanced DVD-RW formatting 2007-01-09 21:06:55 +00:00
5fc55ec164 Fixed a SIGFPE with formatting via libburner 2007-01-09 14:03:43 +00:00
7211f210dc Using 128 MB of size plus writing of zeros with blank=format_overwrite 2007-01-08 10:44:34 +00:00
fdd40d4492 Introduced size parameter to DVD-RW formatting plus writing of zeros. 2007-01-08 10:42:54 +00:00
6a69cfcf07 Added note that buffer may not be smaller than 32768 2007-01-08 10:30:30 +00:00
ab51d551d3 New formatting parameter "size". Sorry for changing API. Function is a week old. 2007-01-06 12:08:57 +00:00
f6b751c4bd Comments and name changes from new findings out of reading MMC-5 2007-01-05 12:58:36 +00:00
f23deebe80 Moved blanking suitability test before eventual spwaning of threads 2007-01-03 16:49:09 +00:00
b362f80d40 Made formatting report progress (as good as the drive does) 2007-01-03 16:42:53 +00:00
f634a52e86 Some DVD-RW statements 2007-01-02 18:40:09 +00:00
441c2a32cd Made use of formatting of DVD-RW 2007-01-02 12:57:47 +00:00
bee5484d46 Some DVD-RW statements 2007-01-02 12:54:42 +00:00
342283ffea Next cdrskin-0.2.7 cycle 2007-01-02 10:58:34 +00:00
cb24c90f0c Greeting the new year 2007-01-02 09:10:44 +00:00
1824c065f0 Added links to cdrskin help texts 2007-01-02 09:04:38 +00:00
9e4c2866a9 Made use of formatting of DVD-RW 2007-01-01 17:19:41 +00:00
97fe858760 Prepared formatting of DVD-RW 2007-01-01 17:10:54 +00:00
ca9d11c692 Next cdrskin-0.2.7 cycle 2006-12-30 00:19:38 +00:00
c05d6550cb Prepared support for DVD-RW in mode Restricted Overwrite 2006-12-30 00:15:07 +00:00
6e9c399930 Corrected DVD-RW sequential profile name 2006-12-29 14:39:42 +00:00
7c6895aec2 Updated about msifile=path 2006-12-27 21:44:17 +00:00
a9e4bc1dbd Followed revision 644 of wodim (msifile output without newline) 2006-12-27 21:39:02 +00:00
5f4e9d9cfb Emulated wodim option -msifile=path 2006-12-27 16:30:25 +00:00
c4fe384b56 Avoided self contradicting result of ATIP speed inquiry 2006-12-27 13:28:40 +00:00
b2cf633bdc Defended against a race condition on SuSE 9.3 after -atip (hald et.al. ?) 2006-12-27 13:04:17 +00:00
13ecca61bc Corrected kB conversion factor to 176.4 with ATIP speed codes 2006-12-27 13:03:09 +00:00
6277678a8e Disabled obsolete drive-media-state workaround. (Spinoff of ticket 93 :)) 2006-12-27 13:01:39 +00:00
cafad767a9 Minor corrections to revisions 559 and 560 2006-12-26 18:45:21 +00:00
18ba02c2bb Enabled report of speed descriptor list 2006-12-26 17:08:46 +00:00
85ffe77a32 New API calls burn_drive_get_speedlist() , burn_drive_free_speedlist() 2006-12-26 17:07:53 +00:00
95bebfb814 Completed revision 556 2006-12-25 19:07:43 +00:00
1b68e65005 Adjusted to new (more mature) speed info semantics 2006-12-25 19:01:25 +00:00
979e35d979 Ticket 93: write speeds from ACh GET PERFORMANCE, Type 03h, DVD media capacity 2006-12-25 19:00:26 +00:00
d4711abba8 Corrected CD speed conversion factor to 2352*75/1000 = 176.4 kB/s 2006-12-25 18:57:11 +00:00
d53114b723 Adjusted to new (still immature) speed info semantics 2006-12-25 11:37:24 +00:00
a4846ef882 Ticket 93: write speeds from mode page 2Ah descriptors 2006-12-25 11:34:43 +00:00
00afac796e Removed unnecessary waiting loops after grab, mentioned DVD+RW 2006-12-24 20:24:43 +00:00
42c0cc6dd4 Bugfix after changes for DVD+RW: start_byte was initialized 0, but must be -1 2006-12-24 18:23:30 +00:00
221aee23d1 Bugfix with DVD+RW : progress indicators were initialized too late 2006-12-24 18:22:27 +00:00
c3a5d3c7a5 Made DVD ignore CD write modes of drive. Made TAO default for DVD+RW. 2006-12-24 15:47:11 +00:00
a7610aa0c9 Made DVD 32k end padding controllable 2006-12-24 14:24:35 +00:00
fb4a209a34 Fixed a bug with speed measurement at end of DVD+RW burning 2006-12-24 14:22:38 +00:00
9ba4f5f3df Made Jean name more friendly 2006-12-23 22:00:43 +00:00
745c8ca611 Modified cdrskin_timestamp 2006-12-23 21:56:39 +00:00
2f007fcb36 Added Jean to contributors 2006-12-23 18:56:29 +00:00
7e30dbfc5a More appropriate drive status during format and close of DVD+RW 2006-12-23 18:43:31 +00:00
1ce6ec4a3a New API function to inquire burn success (and avoid confusing messages) 2006-12-23 14:12:55 +00:00
750b897ef0 Added more info about DVD+RW 2006-12-23 11:24:11 +00:00
c6555dd8f5 New option write_start_address= 2006-12-23 10:21:44 +00:00
c09d8e6da6 Adjustable write position for DVD+RW: burn_write_opts_set_start_byte() 2006-12-23 10:20:35 +00:00
9d65aa1c40 Some bragging about DVD+RW 2006-12-21 21:46:58 +00:00
59d3e7296b Report media type, avoid self contradicting messages with DVD+RW --multi 2006-12-21 20:58:26 +00:00
9a752c6130 Disallowed multi flag with DVD+RW (nurses wrong hopes for now) 2006-12-21 20:57:15 +00:00
ce27ad5159 DVD speed setting via B6h SET STREAMING, DVD+RW now enabled in vanilla build 2006-12-21 20:06:04 +00:00
1f3c3fe622 DVD speed reporting (and setting for drives which obey BBh SET CD SPEED) 2006-12-21 12:25:38 +00:00
ff755e7204 Removed some debugging messages 2006-12-21 12:23:10 +00:00
4a2402171a With -atip on DVD report no RAW/RAW96R among "Supported modes" 2006-12-20 19:54:46 +00:00
8d54a56590 With -atip report "booktype" for DVD media and no questionable ATIP info 2006-12-20 18:02:34 +00:00
dae337de09 Corrected bug reported by gcc -O2 2006-12-20 17:40:38 +00:00
adaf3f20d7 Corrected bug reported by gcc -O2 2006-12-20 17:13:05 +00:00
de33492cde Corrected DVD+RW track number and nwa with 52h READ TRACK INFORMATION 2006-12-20 17:05:33 +00:00
1b1ef5a31d Avoid undefined 43h commands (TOC/ATIP) with non-CD 2006-12-20 14:52:48 +00:00
b02b2a40e7 Refuse to burn audio tracks to DVD 2006-12-20 14:23:36 +00:00
94848398c0 Prepared experiments for writing to DVD (most easy: DVD+RW) 2006-12-20 11:20:08 +00:00
c1f49bab3b Noted some insight about necessity of OPC gained from growisofs_mmc.cpp 2006-12-18 12:33:51 +00:00
4778a57c53 Made several minor clarifications 2006-12-18 12:29:20 +00:00
ea923c391a Introduced term "session" 2006-12-15 16:14:20 +00:00
0aec5f2981 Adapted to changes in cdrskin.1 2006-12-15 10:27:08 +00:00
59a8cfc0d4 Clarified drives and their addresses 2006-12-15 10:15:50 +00:00
99eeb27688 Adapted to existence of man page 2006-12-14 17:15:22 +00:00
336c599741 Added some meta info to the document header, changed title to "man 1 cdrskin" 2006-12-14 17:14:17 +00:00
f095e04165 Next cdrskin-0.2.7 cycle 2006-12-14 14:07:47 +00:00
409c086581 Corrected alphabetical sorting error 2006-12-14 14:06:23 +00:00
0f1d433d5b Re-arranged examples of documentation commands 2006-12-14 14:05:24 +00:00
deed90b65e Removed outdated experiment 2006-12-14 11:03:46 +00:00
ab08d66af3 Publishing cdrskin.1 as man_1_cdrskin.html 2006-12-14 10:29:03 +00:00
3acd08b34b Mentioned George Danchev for his merits about cdrskin man page 2006-12-14 10:23:42 +00:00
d187efea4d Unified some nomenclature. Removed an error with dev_translation= 2006-12-14 10:22:17 +00:00
ed5eb49b18 Explained recordable CD media. Removed a typo. 2006-12-13 23:24:23 +00:00
c9fc338174 Next cdrskin-0.2.7 cycle 2006-12-13 22:33:52 +00:00
8c6c78ed4e Took more care for man page 2006-12-13 22:20:16 +00:00
2dea8b0f60 Clarified track content meaning. Corrected some typos and beauty flaws 2006-12-13 22:12:36 +00:00
0160a98e67 Took care for man page 2006-12-13 22:09:42 +00:00
84b87f4eb5 Trying to get new man page into release tarball and installation. 2006-12-13 19:54:55 +00:00
4c70280527 Detailed man page for cdrskin. Based on work of George Danchev. 2006-12-13 19:30:31 +00:00
178a0305c5 Updated dev=help to versions >= 0.2.4, new option --list_ignored_options 2006-12-13 17:03:46 +00:00
fcf9c50220 Appeased doxygen warnings 2006-12-11 21:51:00 +00:00
17bac86aae Trying to identfy CD device via ioctl(CDROM_DRIVE_STATUS) 2006-12-11 19:19:15 +00:00
d9e502ee5f Reacted better on failing ioctl(SG_GET_SCSI_ID) 2006-12-11 16:20:54 +00:00
17fc8e7161 Removed ban on linux_sg_device_family, warning now of linux_sg_accept_any_type 2006-12-11 14:54:26 +00:00
e405092ab0 Enabled correct SCSI address parameter registration for /dev/srM 2006-12-11 13:45:50 +00:00
c6d22a1eb0 Prevented SIGSEGVs when using -atip with my SCSI CD-ROM (sr,sg: no matter) 2006-12-11 12:53:12 +00:00
8265834404 Silenced a compiler warning. Worked further on /dev/srM test. Not done yet. 2006-12-11 11:58:52 +00:00
592b52df5e Repaired README link and planted helptext links 2006-12-11 11:57:21 +00:00
4d62e6003f Consequences from newly introduces startup file 2006-12-11 10:14:43 +00:00
77f44ce5a2 Prepared experiments for new Linux SCSI adventures 2006-12-11 10:01:18 +00:00
5ecd7455ac Unified mix of tab an blanks which looks ugly in diff 2006-12-11 09:58:57 +00:00
bb951e0538 Belated timestamp for changes in cdrskin 2006-12-11 09:56:59 +00:00
1677d40e91 Next cdrskin-0.2.7 cycle 2006-12-11 09:56:09 +00:00
4c0d113956 Added autoreconf-needed files - libburn tree 2006-12-10 17:08:28 +00:00
ae338b8f2c Added dummy NEWS, Changelog, and Install - libburn tree 2006-12-10 17:06:28 +00:00
d5eda47306 Added Gabriel to contributors 2006-12-10 16:34:52 +00:00
9a0442b60c Made cdrskin configuration more friendly to other distros 2006-12-10 16:32:19 +00:00
c4c571f7e3 Replaced setuid blocker by warning. People must know themselves what they do. 2006-12-09 11:09:42 +00:00
81c86161a7 Fixed build system autoconf-related bug 2006-12-04 22:01:21 +00:00
003c72a396 Added reporting of current media profile, changed "Media type" to "Media reuse" 2006-12-04 18:30:20 +00:00
13f77b4428 Removed a newline which made the Mozilla family show a "_" 2006-12-04 17:21:36 +00:00
80f5923e90 Next cdrskin-0.2.7 cycle 2006-12-03 23:07:38 +00:00
165e83b692 Excluded doener gifs from cdrskin tarballs 2006-12-03 20:52:43 +00:00
e1b2beea4e Added Doener logo and link 2006-12-03 17:20:43 +00:00
bab1cf96c6 Changed URLs and umbrella names to libburnia 2006-12-03 16:52:55 +00:00
aafc0b0be2 Changed URLs and umbrella names to libburnia 2006-12-03 15:56:27 +00:00
915e24a0c2 Have wikipedia explain doenerism ("Eat the rich" and so) 2006-12-03 14:24:04 +00:00
7d7c19b628 cdrskin is declared honoray Doenerware (burp) 2006-12-03 13:16:24 +00:00
f6ce7ca8ce Testing wether the after-grab status waiting loops are necessary 2006-12-02 20:14:56 +00:00
e29f13980b Avoided unsuitable media complaint on burn_drive_grab() with load==0 2006-12-02 20:13:31 +00:00
90d0a6952c Next cdrskin-0.2.7 cycle 2006-12-02 17:03:38 +00:00
91ff41856b Correction for drives which return empty tray as profile 0x00 rather than error 2006-12-02 13:06:05 +00:00
229328e869 New API function to obtain media type: burn_disc_get_profile() 2006-12-02 11:17:12 +00:00
ad2c080145 Ticket 21: media type via 46h GET CONFIGURATION , Current Profile 2006-12-01 21:38:34 +00:00
6869e12e4d Added preliminary support for new cdrecord 1000+ = ATA busses (input only) 2006-11-29 20:51:58 +00:00
0e3fb8d620 Mentioned renaming of umbrella project to libburnia 2006-11-28 11:55:08 +00:00
221aa948e4 Enabled options -vv, -vvv and -vvvv 2006-11-25 21:05:14 +00:00
9270f41c65 Prevented premature BURN_DRIVE_IDLE introduced with revision 443 2006-11-25 18:30:06 +00:00
3d5cb04093 Trying to keep signal handler from repeating messages 2006-11-25 17:06:17 +00:00
15df1d819c Corrected two minor bugs 2006-11-25 16:05:23 +00:00
11f16316b1 Made use of libburn device address translation (/dev/sr0, /dev/cdrom, ...) 2006-11-25 15:43:31 +00:00
56ab215db0 Ticket 91: update media state model after content change 2006-11-25 15:26:35 +00:00
13214d9ac5 Disabled old workaround for ticket 8, burn_disc_read_atip() fixed the problem 2006-11-25 10:42:22 +00:00
c67bd685a2 Made our claim of burning CD more general 2006-11-24 16:28:25 +00:00
d20c4fee8c Updated libburner helptext copy 2006-11-24 16:18:42 +00:00
ba982ebf64 First cdrskin-0.2.7 cycle 2006-11-24 16:15:58 +00:00
5bd74c3064 Mentioned telltoc and dewav as helpers of libburner 2006-11-24 12:41:39 +00:00
5cdc9db76c Version leap to 0.2.7 2006-11-24 12:19:43 +00:00
45 changed files with 5496 additions and 1004 deletions

View File

@ -1,2 +1,5 @@
Joe Neeman Joe Neeman
Philippe Rouquier Philippe Rouquier
Gabriel Craciunescu
George Danchev
Jean-Francois Wauthy

View File

@ -1,7 +1,7 @@
Derek Foreman <derek@signalmarketing.com> and Ben Jansens <xor@orodu.net> Derek Foreman <derek@signalmarketing.com> and Ben Jansens <xor@orodu.net>
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
Mario Danic <mario.danic@gmail.com>, Thomas Schmitt <scdbackup@gmx.net> Mario Danic <mario.danic@gmail.com>, Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006 Mario Danic, Thomas Schmitt Copyright (C) 2006-2007 Mario Danic, Thomas Schmitt
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify

1
ChangeLog Normal file
View File

@ -0,0 +1 @@
nothing here now

234
INSTALL Normal file
View File

@ -0,0 +1,234 @@
Installation Instructions
*************************
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
2006 Free Software Foundation, Inc.
This file is free documentation; the Free Software Foundation gives
unlimited permission to copy, distribute and modify it.
Basic Installation
==================
Briefly, the shell commands `./configure; make; make install' should
configure, build, and install this package. The following
more-detailed instructions are generic; see the `README' file for
instructions specific to this package.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, and a
file `config.log' containing compiler output (useful mainly for
debugging `configure').
It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves
the results of its tests to speed up reconfiguring. Caching is
disabled by default to prevent problems with accidental use of stale
cache files.
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If you are using the cache, and at
some point `config.cache' contains results you don't want to keep, you
may remove or edit it.
The file `configure.ac' (or `configure.in') is used to create
`configure' by a program called `autoconf'. You need `configure.ac' if
you want to change it or regenerate `configure' using a newer version
of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system.
Running `configure' might take a while. While running, it prints
some messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package.
4. Type `make install' to install the programs and any data files and
documentation.
5. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that the
`configure' script does not know about. Run `./configure --help' for
details on some of the pertinent environment variables.
You can give `configure' initial values for configuration parameters
by setting variables in the command line or in the environment. Here
is an example:
./configure CC=c99 CFLAGS=-g LIBS=-lposix
*Note Defining Variables::, for more details.
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you can use GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.
With a non-GNU `make', it is safer to compile the package for one
architecture at a time in the source code directory. After you have
installed the package for one architecture, use `make distclean' before
reconfiguring for another architecture.
Installation Names
==================
By default, `make install' installs the package's commands under
`/usr/local/bin', include files under `/usr/local/include', etc. You
can specify an installation prefix other than `/usr/local' by giving
`configure' the option `--prefix=PREFIX'.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
PREFIX as the prefix for installing programs and libraries.
Documentation and other data files still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=DIR' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them.
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Optional Features
=================
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Specifying the System Type
==========================
There may be some features `configure' cannot figure out automatically,
but needs to determine by the type of machine the package will run on.
Usually, assuming the package is built to be run on the _same_
architectures, `configure' can figure that out, but if it prints a
message saying it cannot guess the machine type, give it the
`--build=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name which has the form:
CPU-COMPANY-SYSTEM
where SYSTEM can have one of these forms:
OS KERNEL-OS
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the machine type.
If you are _building_ compiler tools for cross-compiling, you should
use the option `--target=TYPE' to select the type of system they will
produce code for.
If you want to _use_ a cross compiler, that generates code for a
platform different from the build platform, you should specify the
"host" platform (i.e., that on which the generated programs will
eventually be run) with `--host=TYPE'.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share, you
can create a site shell script called `config.site' that gives default
values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Defining Variables
==================
Variables not defined in a site shell script can be set in the
environment passed to `configure'. However, some packages may run
configure again during the build, and the customized values of these
variables may be lost. In order to avoid this problem, you should set
them in the `configure' command line, using `VAR=value'. For example:
./configure CC=/usr/local2/bin/gcc
causes the specified `gcc' to be used as the C compiler (unless it is
overridden in the site shell script).
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
an Autoconf bug. Until the bug is fixed you can use this workaround:
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
`configure' Invocation
======================
`configure' recognizes the following options to control how it operates.
`--help'
`-h'
Print a summary of the options to `configure', and exit.
`--version'
`-V'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`--cache-file=FILE'
Enable the cache: use and save the results of the tests in FILE,
traditionally `config.cache'. FILE defaults to `/dev/null' to
disable caching.
`--config-cache'
`-C'
Alias for `--cache-file=config.cache'.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`configure' also accepts some other, not widely useful, options. Run
`configure --help' for more details.

View File

@ -103,7 +103,7 @@ test_structest_SOURCES = test/structest.c
## cdrskin construction site - ts A60816 ## cdrskin construction site - ts A60816
cdrskin_cdrskin_CPPFLAGS = -Ilibburn cdrskin_cdrskin_CPPFLAGS = -Ilibburn
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_2_6 cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_3_0
cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(THREAD_LIBS) cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(THREAD_LIBS)
cdrskin_cdrskin_SOURCES = cdrskin/cdrskin.c cdrskin/cdrfifo.c cdrskin/cdrfifo.h cdrskin/cdrskin_timestamp.h cdrskin_cdrskin_SOURCES = cdrskin/cdrskin.c cdrskin/cdrfifo.c cdrskin/cdrfifo.h cdrskin/cdrskin_timestamp.h
## ##
@ -165,6 +165,9 @@ indent: $(indent_files)
nodist_pkgconfig_DATA = \ nodist_pkgconfig_DATA = \
libburn-1.pc libburn-1.pc
# http://www.nada.kth.se/cgi-bin/info?(automake.info)Man%20pages
man_MANS = cdrskin/cdrskin.1
EXTRA_DIST = \ EXTRA_DIST = \
libburn-1.pc.in \ libburn-1.pc.in \
version.h.in \ version.h.in \
@ -177,6 +180,7 @@ EXTRA_DIST = \
cdrskin/README \ cdrskin/README \
cdrskin/cdrecord_spy.sh \ cdrskin/cdrecord_spy.sh \
cdrskin/compile_cdrskin.sh \ cdrskin/compile_cdrskin.sh \
cdrskin/convert_man_to_html.sh \
cdrskin/changelog.txt \ cdrskin/changelog.txt \
cdrskin/cdrskin_eng.html \ cdrskin/cdrskin_eng.html \
cdrskin/wiki_plain.txt \ cdrskin/wiki_plain.txt \
@ -186,5 +190,9 @@ EXTRA_DIST = \
libburn/os-linux.h \ libburn/os-linux.h \
libburn/sg-freebsd.c \ libburn/sg-freebsd.c \
libburn/sg-linux.c \ libburn/sg-linux.c \
COPYING COPYING \
NEWS \
ChangeLog \
INSTALL \
$(man_MANS)

1
NEWS Normal file
View File

@ -0,0 +1 @@
nothing here now

59
README
View File

@ -1,25 +1,25 @@
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
libburn.pykix.org libburnia.pykix.org
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
This all is under GPL. This all is under GPL.
(See GPL reference, our clarification and commitment at the end of this text) (See GPL reference, our clarification and commitment at the end of this text)
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
libburn.pykix.org libburnia.pykix.org
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net> By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006 Mario Danic, Thomas Schmitt Copyright (C) 2006-2007 Mario Danic, Thomas Schmitt
Still containing parts of Still containing parts of
Libburn. By Derek Foreman <derek@signalmarketing.com> and Libburn. By Derek Foreman <derek@signalmarketing.com> and
Ben Jansens <xor@orodu.net> Ben Jansens <xor@orodu.net>
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
These parts are to be replaced by own code of above libburn.pykix.org-copyright These parts are to be replaced by own code of above libburnia.pykix.org
holders and then libburn.pykix.org is to be their sole copyright. copyright holders and then libburnia.pykix.org is to be their sole copyright.
This is done to achieve the right to issue the clarification and the This is done to achieve the right to issue the clarification and the
commitment as written at the end of this text. commitment as written at the end of this text.
The rights and merits of the Libburn-copyright holders Derek Foreman and The rights and merits of the Libburn-copyright holders Derek Foreman and
Ben Jansens will be duely respected. Ben Jansens will be duely respected.
This libburn.pykix.org toplevel README (C) 2006 Thomas Schmitt This libburnia.pykix.org toplevel README (C) 2006-2007 Thomas Schmitt
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
Build and Installation Build and Installation
@ -27,14 +27,14 @@ This libburn.pykix.org toplevel README (C) 2006 Thomas Schmitt
Our build system is based on autotools. For preparing the build of a SVN Our build system is based on autotools. For preparing the build of a SVN
snapshot you will need autotools of at least version 1.7. snapshot you will need autotools of at least version 1.7.
Check out from SVN by Check out from SVN by
svn co http://libburn-svn.pykix.org/libburn/trunk libburn_pykix svn co http://libburnia-svn.pykix.org/libburn/trunk libburn_pykix
go into directory libburn_pykix and apply autotools by go into directory libburn_pykix and apply autotools by
./bootstrap ./bootstrap
Alternatively you may unpack a release tarball for which you do not need Alternatively you may unpack a release tarball for which you do not need
autotools installed. autotools installed.
To build libburn.pykix.org and its subprojects it should be sufficient to go To build a libburnia.pykix.org subproject it should be sufficient to go
into its toplevel directory (here: "libburn_pykix") and execute into its toplevel directory (here: "libburn_pykix") and execute
./configure ./configure
make make
@ -43,18 +43,19 @@ To make the libraries accessible for running resp. developing applications
make install make install
The other half of the project, libisofs, is hosted in the libburn SVN, too: The other half of the project, libisofs, is hosted in the libburnia SVN, too:
svn co http://libburn-svn.pykix.org/libisofs/trunk libisofs_pykix svn co http://libburnia-svn.pykix.org/libisofs/trunk libisofs_pykix
See README file there. See README file there.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
Overview of libburn.pykix.org Overview of libburnia.pykix.org
libburn.pykix.org is an open-source software project for reading, mastering and libburnia.pykix.org is an open-source software project for reading, mastering
writing optical discs. For now this means only CD-R and CD-RW. and writing optical discs. For now this means only CD-R, CD-RW, DVD-RAM,
DVD+RW, DVD-RW.
The project comprises of several more or less interdependent parts which The project comprises of several more or less interdependent parts which
together strive to be a usable foundation for application development. together strive to be a usable foundation for application development.
@ -66,11 +67,11 @@ 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, advise from a system person about the equivalent of Linux sg or FreeBSD CAM,
volunteers for testing of realistic use cases. volunteers for testing of realistic use cases.
We do have a workable code base for burning data CDs, though. The burn API is We have a workable code base for burning CDs and overwriteable DVDs, though.
quite comprehensively documented and can be used to build a presentable The burn API is quite comprehensively documented and can be used to build a
application. presentable application.
We do have a functional binary which emulates parts of cdrecord in order to We have a functional binary which emulates parts of cdrecord in order to
prove that usability, and in order to allow you to explore libburn's scope prove that usability, and in order to allow you to explore libburnia's scope
by help of existing cdrecord frontends. by help of existing cdrecord frontends.
The project components (list subject to growth, hopefully): The project components (list subject to growth, hopefully):
@ -169,6 +170,22 @@ Project history as far as known to me:
- 13th November 2006 splitting releases of libburn+cdrskin from libisofs. - 13th November 2006 splitting releases of libburn+cdrskin from libisofs.
- 24th November 2006 release of libburn-0.2.6 and cdrskin-0.2.6 . cdrskin has
become suitable for unaware frontends as long as they perform only the core
of cdrecord use cases (including open-ended input streams, audio, and
multi-session).
- 28th November 2006 the umbrella project which encloses both, libisofs and
libburn, is now called libburnia. For the origin of this name, see
http://en.wikipedia.org/wiki/Liburnians .
- 16th January 2007 release of libburn-0.3.0 and cdrskin-0.3.0 . Now the scope
is widened to a first class of DVD media: overwriteable single layer types
DVD-RAM, DVD+RW, DVD-RW. This is not a cdrecord emulation but rather inspired
by dvd+rw-tools' "poor man" writing facility for this class of media.
Taking a bow towards Andy Polyakov.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
@ -187,9 +204,9 @@ Project history as far as known to me:
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
Clarification in my name and in the name of Mario Danic, upcoming copyright Clarification in my name and in the name of Mario Danic, upcoming copyright
holders on toplevel of libburn. To be fully in effect after the remaining other holders on toplevel of libburnia. To be fully in effect after the remaining
copyrighted code has been replaced by ours and by copyright-free contributions other copyrighted code has been replaced by ours and by copyright-free
of our friends: contributions of our friends:
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
We, the copyright holders, agree on the interpretation that We, the copyright holders, agree on the interpretation that

View File

@ -1,5 +1,5 @@
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
libburn.pykix.org scdbackup.sourceforge.net/cdrskin_eng.html libburnia.pykix.org scdbackup.sourceforge.net/cdrskin_eng.html
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
Installation instructions at about line 60. First the legal stuff: Installation instructions at about line 60. First the legal stuff:
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
@ -7,31 +7,31 @@ This all is under GPL.
(See GPL reference, our clarification and commitment at the end of this text) (See GPL reference, our clarification and commitment at the end of this text)
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
Based on and sub project of: Based on and sub project of:
libburn.pykix.org libburnia.pykix.org
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net> By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006 Mario Danic, Thomas Schmitt Copyright (C) 2006-2007 Mario Danic, Thomas Schmitt
libburn.pykix.org is inspired by and in other components still containing libburnia.pykix.org is inspired by and in other components still containing
parts of parts of
Libburn. By Derek Foreman <derek@signalmarketing.com> and Libburn. By Derek Foreman <derek@signalmarketing.com> and
Ben Jansens <xor@orodu.net> Ben Jansens <xor@orodu.net>
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
See toplevel README for an overview of the current copyright situation in See toplevel README for an overview of the current copyright situation in
libburn.pykix.org. libburnia.pykix.org.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
My thanks to the above authors (except myself, of course) for making the My thanks to the above authors (except myself, of course) for making the
following possible. following possible.
cdrskin. By Thomas Schmitt <scdbackup@gmx.net> cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
Integrated sub project of libburn.pykix.org but also published via: Integrated sub project of libburnia.pykix.org but also published via:
http://scdbackup.sourceforge.net/cdrskin_eng.html http://scdbackup.sourceforge.net/cdrskin_eng.html
http://scdbackup.sourceforge.net/cdrskin-0.2.6.pl01.tar.gz http://scdbackup.sourceforge.net/cdrskin-0.3.0.pl00.tar.gz
Copyright (C) 2006 Thomas Schmitt Copyright (C) 2006-2007 Thomas Schmitt
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
On top of libburn there is implemented cdrskin 0.2.6, a limited cdrecord On top of libburn there is implemented cdrskin 0.3.0, a limited cdrecord
compatibility wrapper which allows to use some libburn features from compatibility wrapper which allows to use some libburn features from
the command line. the command line.
Interested users of cdrecord are invited to participate in the development Interested users of cdrecord are invited to participate in the development
@ -59,16 +59,16 @@ systems, including 64 bit systems. (Further reports are welcome.)
Compilation, First Glimpse, Installation Compilation, First Glimpse, Installation
Obtain cdrskin-0.2.6.pl01.tar.gz, take it to a directory of your choice and do: Obtain cdrskin-0.3.0.pl00.tar.gz, take it to a directory of your choice and do:
tar xzf cdrskin-0.2.6.pl01.tar.gz tar xzf cdrskin-0.3.0.pl00.tar.gz
cd cdrskin-0.2.6 cd cdrskin-0.3.0
Or obtain a libburn.pykix.org SVN snapshot, Or obtain a libburnia.pykix.org SVN snapshot,
go into the toplevel directory of the snapshot (e.g. cd libburn_pykix ), go into the toplevel directory of the snapshot (e.g. cd libburn_pykix ),
and execute the autotools script ./bootstrap . Use autools version >= 1.7 . and execute the autotools script ./bootstrap . Use autools version >= 1.7 .
Within that toplevel directory of either cdrskin-0.2.6 or libburn then execute: Within that toplevel directory of either cdrskin-0.3.0 or libburn then execute:
./configure ./configure
make make
@ -90,6 +90,7 @@ Version identification and help texts available afterwards:
cdrskin/cdrskin -version cdrskin/cdrskin -version
cdrskin/cdrskin --help cdrskin/cdrskin --help
cdrskin/cdrskin -help cdrskin/cdrskin -help
man cdrskin/cdrskin.1
Install (eventually as superuser) cdrskin to a directory where it can be found: Install (eventually as superuser) cdrskin to a directory where it can be found:
If cdrskin was already installed by a previous version, or by "make install" If cdrskin was already installed by a previous version, or by "make install"
@ -108,6 +109,10 @@ It will not collide with an installed version of libburn either.
But libpthread must be installed on the system and glibc has to match. (See But libpthread must be installed on the system and glibc has to match. (See
below for a way to create a statically linked binary.) below for a way to create a statically linked binary.)
To install the man page, you may do: echo $MANPATH and choose one of the
listed directories to copy the man-page under its ./man1 directory. Like:
cp cdrskin/cdrskin.1 /usr/share/man/man1/cdrskin.1
Usage Usage
@ -141,34 +146,32 @@ It is not checked for the necessary degree of hacker safety.
Get an overview of cdrecord style addresses of available devices Get an overview of cdrecord style addresses of available devices
cdrskin -scanbus cdrskin -scanbus
cdrskin dev=ATA -scanbus cdrskin dev=ATA -scanbus
cdrskin --devices
Note: Adresses reported with dev=ATA are to be used with prefix "ATA:". You may Adresses reported with dev=ATA need prefix "ATA:". Address examples:
well use device file addresses as reported with --devices. Examples: dev=0,1,0 dev=ATA:1,0,0 dev=/dev/sg1 dev=/dev/hdc
dev=0,1,0 dev=/dev/sg1 dev=ATA:1,0,0 dev=/dev/hdc See also "Drive Addressing" below.
See also "Drive Addressing".
Note: Address numbers have changed since cdrskin-0.2.2 in order to become
compatible with cdrecord numbers. To get the old number scheme, use
option --old_pseudo_scsi_adr . See also "Pseudo-SCSI Adresses".
Sorry for any inconvenience.
Obtain some info about the drive Obtain some info about the drive
cdrskin dev=0,1,0 -checkdrive cdrskin dev=0,1,0 -checkdrive
Obtain some info about the drive and the inserted media Obtain some info about the drive and the inserted media
cdrskin dev=0,1,0 -atip cdrskin dev=0,1,0 -atip -v
Thoroughly blank a CD-RW Thoroughly blank a CD-RW
cdrskin -v dev=0,1,0 blank=all -eject cdrskin -v dev=0,1,0 blank=all -eject
Format DVD-RW before first use with cdrskin
cdrskin -v dev=0,1,0 blank=format_overwrite
Blank CD-RW sufficiently for making it ready for overwrite Blank CD-RW sufficiently for making it ready for overwrite
cdrskin -v dev=0,1,0 blank=fast -eject cdrskin -v dev=0,1,0 blank=fast -eject
Burn image file my_image.iso to CD Burn image file my_image.iso to CD-R, CD-RW, DVD+RW, DVD-RAM, DVD-RW
cdrskin -v dev=0,1,0 speed=12 fs=8m -sao driveropts=burnfree padsize=300k \ cdrskin -v dev=0,1,0 speed=12 fs=8m driveropts=burnfree padsize=300k \
-eject my_image.iso -eject my_image.iso
Burn a compressed afio archive to CD on-the-fly Burn a compressed afio archive to any of the above media types 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 -tao \
driveropts=burnfree padsize=300k - driveropts=burnfree padsize=300k -
@ -208,10 +211,13 @@ Run a backup :
Restrictions Restrictions
The major restrictions are lifted now: audio, TAO, multi-session do work. The major restrictions are lifted now: audio, TAO, multi-session do work.
Many cdrecord options are still unsupported, though.
Many cdrecord options are still unsupported, though.
If you have use cases for them, please report your wishes and expectations. If you have use cases for them, please report your wishes and expectations.
DVD support is restricted to single layer overwriteable DVD (-RAM, +RW, -RW)
for now.
Inspiration and Standard Inspiration and Standard
@ -230,6 +236,10 @@ Actually i, Thomas Schmitt, am a devoted user of cdrecord via my project
scdbackup which still runs a bit better with cdrecord than with cdrskin. TAO. scdbackup which still runs a bit better with cdrecord than with cdrskin. TAO.
I have the hope that Joerg feels more flattered than annoyed by cdrskin. I have the hope that Joerg feels more flattered than annoyed by cdrskin.
Many thanks to Andy Polyakov for his dvd+rw-tools
http://fy.chalmers.se/~appro/linux/DVD+RW/tools
which provide me with examples and pointers into MMC specs for DVD writing.
Drive Addressing Drive Addressing
@ -325,6 +335,7 @@ If not --no_rc is the first argument then cdrskin attempts on startup to read
arguments from the following three files: arguments from the following three files:
/etc/default/cdrskin /etc/default/cdrskin
/etc/opt/cdrskin/rc /etc/opt/cdrskin/rc
/etc/cdrskin/cdrskin.conf
$HOME/.cdrskinrc $HOME/.cdrskinrc
The files are read in the sequence given above. The files are read in the sequence given above.
Each readable line is treated as one single argument. No extra blanks. Each readable line is treated as one single argument. No extra blanks.
@ -337,7 +348,7 @@ dev=0,1,0
dev_translation=+1,0,0+0,1,0 dev_translation=+1,0,0+0,1,0
# Some more options # Some more options
--fifo_start_empty fifo_start_at=0
fs=16m fs=16m
@ -367,6 +378,66 @@ I myself am not into audio. So libburn-hackers@pykix.org might be the
best address for suggestions, requests and bug reports. best address for suggestions, requests and bug reports.
DVD+RW and DVD-RAM
DVD+RW and DVD-RAM 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.
For these media, -msinfo alone would not be enough to perform appending of an
ISO filesystem. The filesystem driver will need a hint to find the start of the
most recent session. For example put an ISO filesystem at address 1 GB:
mkisofs -C 0,524288 ... | \
cdrskin dev=/dev/sr0 -v fs=32m -eject speed=4 write_start_address=524288s -
The superuser may then do:
mount -t iso9660 -o ro,sbsector=524288 /dev/sr0 /mnt
Note: On my linux-2.4.21-215 mount works only with sbsector <= 337920 (660 MB).
To extend a filesystem already existing at address 0
mkisofs -C 0,524288 -M /dev/sr0 ... | cdrskin dev=/dev/sr0 ...
Record the number 524288 for usage as first number with -C at the next
extension:
mkisofs -C 524288,1000000 ... | cdrskin write_start_address=1000000s ...
Program growisofs can append to an ISO filesystem on DVD+RW by additionally
manipulating the first session. cdrskin does not want to get involved so deep
into the format of the burned data. Be advised to use growisofs for the
task of maintaining extendable ISO-Filesystems on DVD+RW.
DVD-RW
DVD-RW are usable if formatted to state "Restricted Overwrite". They then
behave much like DVD+RW. See above.
DVD-RW in state "Sequential" have first to be formatted by
cdrskin dev=... -v blank=format_overwrite
"Sequential" is the state of unused media and of media previously blanked
or written by cdrecord. dvd+rw-format -blank can also achieve this state.
(Command dvd+rw-format -force can achieve "Restricted Overwrite".)
Formatting or first use of freshly formatted DVD-RW can produce unusual noises
from the drive and last several minutes. Depending on mutual compatibility of
drive and media, formatting can yield unusable media. It seems that those die
too on blanking by cdrecord or dvd+rw-format. Perils of DVD-RW, i fear.
There are three formatting variants with cdrskin currently:
blank=format_overwrite uses "DVD-RW Quick" formatting (MMC-type 15h)
and writes a first session of 128 MB. This leads to media which are expandable
and random addressable by cdrskin.
blank=format_overwrite_quickest uses "DVD-RW Quick" formatting (type 15h) too,
but leaves the media in "intermediate" state. In the first session of writing
one may only write sequentially to such a DVD. After that, it gets random
addressable by cdrskin.
blank=format_overwrite_full uses preferrably "Full Format" (type 00h).
This formatting lasts as long as writing a full DVD. It includes writing of
lead-out which is said to be good for DVD ROM compatibility.
Special compilation variations Special compilation variations
You may get a (super fat) statically linked binary by : You may get a (super fat) statically linked binary by :

View File

@ -1,206 +0,0 @@
#!/bin/sh
set -x
# This script documents how this cdrskin version was derived from
# a vanilla libburn version. It is not intended nor needed for any
# use of cdrskin but included here only to show the technical
# relationship between both projects - which are close friends
# and issue roughly the same software.
#
# Package maintainers are advised to cover rather libburn than
# cdrskin unless they put only emphasis on the cdrecord emulation
# provided by cdrskin. libburn contains cdrskin - cdrskin is an
# oscillating, friendly and coordinated fork of libburn.
#
# Script results are a source tarball and two binaries
# one dynamic and one static in respect to system libs.
# Both binaries are static in respect to libburn.
#
# The script is to be run in the directory above the toplevel
# directory of libburn resp. cdrskin development.
#
# libburn version used: http://libburn.pykix.org
# Downloaded by:
# $ svn co http://libburn-svn.pykix.org/trunk libburn_pykix
# packed up in a tarball just to save it from inadverted changes by
# $ tar czf libburn_svn.tgz libburn_pykix
original="./libburn_svn.tgz"
# Historic moments:
# original="./libburn_svn_A60815.tgz"
# original="./libburn_cdrskin_A60819.tgz"
# The top level directory in that snapshot is named
intermediate="./libburn_pykix"
# My changes are in libburn-0.2.3.ts.develop , mainly in ./cdrskin
changes="./libburn-0.2.3.ts.develop"
skin_release="0.2.6"
patch_level=".pl01"
skin_rev="$skin_release""$patch_level"
# The result directory and the name of the result tarballs
target="./cdrskin-${skin_release}"
cdrskin_tarball="./cdrskin-${skin_rev}.tar.gz"
cdrskin_tarball_svn="./cdrskin-${skin_rev}.svn.tar.gz"
# (This once earned me an embarrassingly blooping source tarball)
# compile_dir="$changes"
compile_dir="$target"
compile_cmd="./cdrskin/compile_cdrskin.sh"
compile_static_opts="-static"
compile_result="cdrskin/cdrskin"
bintarget_dynamic="cdrskin_${skin_rev}-x86-suse9_0"
bintarget_static="$bintarget_dynamic"-static
if test -d "$changes"
then
dummy=dummy
else
echo "$0 : FATAL : no directory $changes" >&2
exit 1
fi
for i in "$target" "$intermediate"
do
if test -e "$i"
then
echo "$0 : FATAL : already existing $i" >&2
exit 2
fi
done
if test -f "$original"
then
dummy=dummy
else
echo "$0 : FATAL : no file $original" >&2
exit 3
fi
# Unpack SVN snapshot.
tar xzf "$original"
# Rename the directory to the cdrskin name
mv "$intermediate" "$target"
# Copy the changes from the development tree
#
cdrskin_dir="$changes"/cdrskin
libburn_dir="$changes"/libburn
cdrskin_target="$target"/cdrskin
libburn_target="$target"/libburn
# Create version timestamp
timestamp="$(date -u '+%Y.%m.%d.%H%M%S')"
echo "$timestamp"
echo '#define Cdrskin_timestamP "'"$timestamp"'"' >"$cdrskin_dir"/cdrskin_timestamp.h
# Add the cdrskin files
if test -e "$cdrskin_target"
then
rm -rf "$cdrskin_target"
fi
cp -a "$cdrskin_dir" "$cdrskin_target"
# Remove copied binaries
rm "$cdrskin_target"/*.o
rm "$cdrskin_target"/cdrfifo
rm "$cdrskin_target"/cdrskin
rm "$cdrskin_target"/cleanup
for i in std new make old
do
if test -e "$cdrskin_target"/cdrskin_"$i"
then
rm "$cdrskin_target"/cdrskin_"$i"
fi
done
for i in .deps .dirstamp .libs
do
if test -e "$cdrskin_target"/"$i"
then
rm -rf "$cdrskin_target"/"$i"
fi
done
# Remove unwanted SVN stuff (TODO: avoid downloading it)
for i in "$target"/.svn "$target"/*/.svn
do
if test "$i" = "$target"'/*/.svn'
then
dummy=dummy
else
if test -e "$i"
then
rm -rf "$i"
fi
fi
done
## No more : Add own libburn-README in toplevel
# cp -a "$changes"/README "$target"
## No more : Add modified Makefile.am
# cp -a "$changes"/Makefile.am "$target"
# Make SVN state tarball for the libburn team
tar czf "$cdrskin_tarball_svn" "$target"
# Get over dependecy on autotools. Rely only on cc, make et. al.
# This is not the same as "make dist" but i can do it without
# having to evaluate the quality of said "make dist"
#
( cd "$target" ; ./bootstrap )
# Remove unwanted stuff after bootstrap
for i in "$target"/autom4te.cache
do
if echo "$i" | grep '\*' >/dev/null
then
dummy=dummy
else
if test -e "$i"
then
rm -rf "$i"
fi
fi
done
# Pack it up to the new libburn+cdrskin-tarball
tar czf "$cdrskin_tarball" "$target"
# Produce a static and a dynamic binary
(
cd "$compile_dir" || exit 1
./configure
make
$compile_cmd -do_strip
cp "$compile_result" "../$bintarget_dynamic"
if test -n "$compile_static_opts"
then
$compile_cmd $compile_static_opts -do_strip
cp "$compile_result" "../$bintarget_static"
fi
)
# Remove the build area
# Disable this for debugging the merge process
rm -rf "$target"
# Show the result
./"$bintarget_dynamic" -version
./"$bintarget_static" -version
ls -l "$cdrskin_tarball"
ls -l "$bintarget_dynamic"
ls -l "$bintarget_static"

View File

@ -33,10 +33,10 @@ original="./libburn_svn.tgz"
# The top level directory in that snapshot is named # The top level directory in that snapshot is named
intermediate="./libburn_pykix" intermediate="./libburn_pykix"
# My changes are in libburn-0.2.3.ts.develop , mainly in ./cdrskin # My changes are in libburn-develop , mainly in ./cdrskin
changes="./libburn-0.2.3.ts.develop" changes="./libburn-develop"
skin_rev="0.2.7" skin_rev="0.3.0"
# The result directory and the name of the result tarballs # The result directory and the name of the result tarballs
target="./cdrskin-${skin_rev}" target="./cdrskin-${skin_rev}"
@ -51,6 +51,9 @@ compile_cmd="./cdrskin/compile_cdrskin.sh"
compile_static_opts="-static" compile_static_opts="-static"
compile_result="cdrskin/cdrskin" 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_static="$bintarget_dynamic"-static bintarget_static="$bintarget_dynamic"-static
@ -119,6 +122,8 @@ do
rm "$cdrskin_target"/cdrskin_"$i" rm "$cdrskin_target"/cdrskin_"$i"
fi fi
done done
# Remove eventual SVN stuff from cdrskin directory
for i in .deps .dirstamp .libs for i in .deps .dirstamp .libs
do do
if test -e "$cdrskin_target"/"$i" if test -e "$cdrskin_target"/"$i"
@ -127,6 +132,23 @@ do
fi fi
done done
# Remove GIFs of cdrskin_eng.html
rm "$cdrskin_target"/doener_*.gif
# Remove automatically generated HTML man page
rm "$cdrskin_target"/man_1_cdrskin.html
# Remove all add_ts_changes_to_libburn besides this one
for i in "$cdrskin_target"/add_ts_changes_to_libburn*
do
if test $(basename "$0") = $(basename "$i")
then
dummy=dummy
else
rm $i
fi
done
# Remove unwanted SVN stuff (TODO: avoid downloading it) # Remove unwanted SVN stuff (TODO: avoid downloading it)
for i in "$target"/.svn "$target"/*/.svn for i in "$target"/.svn "$target"/*/.svn
do do
@ -141,12 +163,6 @@ do
fi fi
done done
## No more : Add own libburn-README in toplevel
# cp -a "$changes"/README "$target"
## No more : Add modified Makefile.am
# cp -a "$changes"/Makefile.am "$target"
# Make SVN state tarball for the libburn team # Make SVN state tarball for the libburn team
tar czf "$cdrskin_tarball_svn" "$target" tar czf "$cdrskin_tarball_svn" "$target"
@ -176,18 +192,20 @@ done
# Pack it up to the new libburn+cdrskin-tarball # Pack it up to the new libburn+cdrskin-tarball
tar czf "$cdrskin_tarball" "$target" tar czf "$cdrskin_tarball" "$target"
# Produce a static and a dynamic binary # Produce a static and a dynamic binary, and a HTML man page
( (
cd "$compile_dir" || exit 1 cd "$compile_dir" || exit 1
./configure ./configure
make make
$compile_cmd -do_strip "$compile_cmd" -do_strip
cp "$compile_result" "../$bintarget_dynamic" cp "$compile_result" "../$bintarget_dynamic"
if test -n "$compile_static_opts" if test -n "$compile_static_opts"
then then
$compile_cmd $compile_static_opts -do_strip "$compile_cmd" $compile_static_opts -do_strip
cp "$compile_result" "../$bintarget_static" cp "$compile_result" "../$bintarget_static"
fi fi
"$man_to_html_cmd"
mv "$man_page_html" ..
) )
# Remove the build area # Remove the build area
@ -200,4 +218,5 @@ rm -rf "$target"
ls -l "$cdrskin_tarball" ls -l "$cdrskin_tarball"
ls -l "$bintarget_dynamic" ls -l "$bintarget_dynamic"
ls -l "$bintarget_static" ls -l "$bintarget_static"
ls -l $(basename "$man_page_html")

703
cdrskin/cdrskin.1 Normal file
View File

@ -0,0 +1,703 @@
.\" Hey, EMACS: -*- nroff -*-
.\" 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 "January 12, 2007"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
.\" .nh disable hyphenation
.\" .hy enable hyphenation
.\" .ad l left justify
.\" .ad b justify to both left and right margins
.\" .nf disable filling
.\" .fi enable filling
.\" .br insert line break
.\" .sp <n> insert n+1 empty lines
.\" for manpage-specific macros, see man(7)
.SH NAME
cdrskin \- burns preformatted data to CD-R, CD-RW, DVD+/-RW, DVD-RAM
via libburn.
.SH SYNOPSIS
.B cdrskin
.RI [ options | track_source_addresses ]
.br
.SH DESCRIPTION
.PP
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
.\" 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 for now.
You do not need to be superuser for its daily usage.
.PP
.B Overview of features:
.br
Blanking of CD-RW.
.br
Burning of data or audio tracks to CD,
.br
either in versatile Track at Once mode (TAO)
.br
or in Session at Once mode for seamless tracks.
.br
Multi session on CD (follow-up sessions in TAO only).
.br
Bus scan, burnfree, speed options, retrieving media info, padding, fifo.
.br
Burning of a single data track to DVD+RW, DVD-RW or DVD-RAM.
.br
See section EXAMPLES at the end of this text.
.PP
.B Track recording model:
.br
The input-output entities which get processed are called tracks.
A \fBtrack\fP stores a stream of bytes.
.br
Each track is initiated by one track source address argument, which may either
be "-" for standard input or the address of a readable file. If no write mode
is given explicitely then one will be chosen which matches the peculiarities
of track sources and the state of the output media.
.PP
More than one track can be burned by a single run of cdrskin.
In the terms of the MMC standard all tracks written by the same run constitute
a \fBsession\fP.
.br
CDs can be kept appendable so that further tracks can
be written to them in subsequent runs of cdrskin (see option -multi).
Info about the addresses of burned tracks is kept in a table of
content (TOC) on media and can be retrieved via cdrskin option -toc.
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.
.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
header part which identifies it as MS-WAVE resp. SUN Audio with suitable
parameters. Such files are burned as audio tracks by default.
.PP
While audio tracks just contain a given time span of acoustic vibrations,
data tracks may have an arbitray meaning. Nevertheless, ISO-9660 filesystems
are established as a format which can represent a tree of directories and
files on all major operating systems. Such filesystem images can be
produced by programs mkisofs or genisoimage. They can also be extended by
follow-up tracks if prepared properly. See the man pages of said programs.
cdrskin is able to fulfill the needs about their option -C.
.br
Another type of data track content are archive formats which originally
have been developed for magnetic tapes. Only formats which mark a detectable
end-of-archive in their data are suitable, though. Well tested are
the archivers afio and star. Not suitable seems GNU tar.
.PP
.B Recordable CD Media:
.br
CD-R can be initially written only once and eventually extended until they
get closed (or are spoiled because they are overly full). After that they are
read-only.
.br
CD-RW media can be blanked to make them re-usable for another
round of overwriting. Usually
.B blank=fast
is the appropriate option.
Blanking damages the previous content but does not
make it completely unreadable. It is no effective privacy precaution.
Multiple cycles of blanking and overwriting with random numbers might be.
.PP
.B Recordable DVD Media:
.br
Currently only types DVD+RW, DVD-RW and DVD-RAM can be burned via cdrskin.
.br
DVD+RW and DVD-RAM media get treated as blank media regardless wether they
hold data or not. They need no special initial formatting.
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.
.br
DVD-RW need to be formatted to state "Restricted Overwrite". Then they behave
much like DVD+RW. This formatting can be done by option
.B blank=format_overwrite
It is necessary for unused media, for media written or blanked by cdrecord,
for media which have been written unformatted by growisofs or blanked by
dvd+rw-format -blank. If in doubt, just give it a try.
.PP
.B Drive preparation and addressing:
.br
The drives, either CD burners or DVD burners, are accessed via addresses which
are specific to libburn and the operating system. Those addresses get listed
by a run of \fBcdrskin --devices\fP.
.br
On Linux, they are device files which traditionally do not offer
w-permissions for normal users. Because libburn needs rw-permission,
it might be only the superuser who is able to get this list without further
precautions.
.br
It is consensus that \fBchmod a+rw /dev/sg0\fP or \fBchmod a+rw /dev/hdc\fP
is less security sensitive than chmod u+s /usr/bin/cdrskin. The risk for the
drive is somewhat higher but the overall system is much less at stake.
.br
.PP
If you only got one CD capable drive then you may leave out cdrskin option
\fBdev=\fP. Else you should use this option to address the drive you want.
.br
cdrskin option dev= not only accepts the listed addresses but also
traditional cdrecord SCSI addresses which on Linux consist of three
numbers: Bus,Target,Lun. There is also a related address family "ATA" which
accesses IDE drives not under control of Linux SCSI drivers:
ATA:Bus,Target,Lun.
.br
See option -scanbus for getting a list of cdrecord style addresses.
.br
Further are accepted on Linux: links to libburn-suitable device files,
device files which have the same major and minor device number,
and device files which have the same SCSI address parameters (e.g. /dev/sr0).
.br
.SH OPTIONS
.TP
.BI \-\-help
Show non-cdrecord compatible options.
.TP
.BI \-help
Show cdrecord compatible options.
.TP
.BI \-version
Print cdrskin id line, compatibility lure line, libburn version, cdrskin
version, version timestamp, build timestamp (if available), and then exit.
.PP
Alphabetical list of options which are intended to be compatible with
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.
.TP
.BI \-audio
Announces that the subsequent tracks are to be burned as audio.
The source is supposed to be uncompressed headerless PCM, 44100 Hz, 16 bit,
stereo. For little-endian byte order (which is usual on PCs) use option
-swab. Unless marked explicitely by option -data, input files with suffix
.wav are examined wether they have a header in MS-WAVE format confirming
those parameters and eventually raw audio data get extracted and burned as
audio track. Same is done for suffix .au and SUN Audio.
.TP
.BI blank= type
Blank a CD-RW or format a DVD+/-RW.
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.
.TP
all
Blank an entire CD.
.TP
fast
Minimally blank an entire CD.
.TP
format_overwrite
Format a DVD-RW to "Restricted Overwrite". The user should bring some patience.
(Note: format_overwrite* are not original cdrecord options.)
.TP
format_overwrite_quickest
Like format_overwrite without creating a 128 MB trailblazer session.
Leads to "intermediate" state which only allows sequential write
beginning from address 0.
The "intermediate" state ends after the first session of writing data.
.TP
format_overwrite_full
For DVD-RW this is like format_overwrite but claims full media size
rather than just 128 MB.
Most traditional formatting is attempted. No data get written.
Much patience is required.
.br
For DVD+RW this is the only supported explicit formatting type. It provides
complete "de-icing" so no reader slips on unwritten data areas.
.RE
.TP
.BI \-checkdrive
Retrieve some info about the addressed drive.
Exits with non-zero value if the drive cannot be found and opened.
.TP
.BI \-dao
Alias for option -sao. Write disk in Session at Once mode.
.TP
.BI \-data
Subsequent tracks are data tracks. This option is default and only needed
to mark the end of the range of an eventual option -audio.
.TP
.BI dev= target
Set the address of the drive to use. Valid are at least the
addresses listed with option --devices,
X,Y,Z addresses listed with option -scanbus,
ATA:X,Y,Z addresses listed with options dev=ATA -scanbus,
and volatile libburn drive numbers (numbering starts at "0").
Other device file addresses which lead to the same drive might work too.
.br
If no dev= is given, volatile address "dev=0" is assumed. That is the first
drive found being available. Better avoid this ambiguity on systems with more
than one drive.
.br
The special target "help" lists hints about available addressing formats.
Be aware that deprecated option --old_pseudo_scsi_adr may change the meaning
of Bus,Target,Lun addresses.
.TP
.BI driveropts= opt
Set "driveropts=burnfree" to enable the drive's eventual protection mechanism
against temporary lack of source data (i.e. buffer underrun).
It is not an error to do this with a drive that has no such capabilities.
.TP
.BI \-dummy
Try to perform the drive operations without actually affecting the inserted
media. There is no guarantee that this will work with a particular drive
in a particular write mode. Blanking is prevented reliably, though.
.TP
.BI \-eject
Eject the disk after work is done.
.TP
.BI \-force
Assume that the user knows better in situations when cdrskin or libburn are
insecure about drive or media state. This includes the attempt to blank
media which are classified as unknown or unsuitable, and the attempt to use
write modes which libburn believes they are not supported by the drive.
.br
Another application is with blank=format_* to enforce re-formatting of media
which appear to be sufficiently formatted already.
.br
Use this only when in urgent need.
.TP
.BI fs= size
Set the fifo size to the given value. The value may have appended letters which
multiply the preceding number:
.br
"k" or "K" = 1024 , "m" or "M" = 1024k , "g" or "G" = 1024m , "s" or "S" = 2048
.br
Set size to 0 in order to disable the fifo (default is "4m").
.br
The fifo buffers an eventual temporary surplus of track source data in order to
provide the drive with a steady stream during times of temporary lack of track
source supply.
The larger the fifo, the longer periods of poor source supply can be
compensated.
But a large fifo needs substantial time to fill up if not curbed via
option fifo_start_at=size.
.TP
.BI gracetime= seconds
Set the grace time before starting to write. (Default is 0)
.TP
.BI msifile= path
Run option -msinfo and copy the result line into the file given by path.
Unlike -msinfo this option does not redirect all normal output away from
standard output. But it may be combined with -msinfo to achieve this.
.br
Note: msifile=path is actually an option of wodim and not of cdrecord.
.TP
.BI \-msinfo
Retrieve multi-session info for preparing a follow-up session by option -C
of programs mkisofs or genisoimage. Print result to standard output.
This option redirects to stderr all
message output besides its own result string, which consists of two numbers.
The result string shall be used as argument of option -C with said programs.
It gives the start address of the most recent session and the predicted
start address of the next session to be appended. The string is empty if
the most recent session was not written with option -multi.
.TP
.BI \-multi
This option keeps the CD appendable after the current session has been written.
Without it the disk gets closed and may not be written any more - unless it
is a CD-RW and gets blanked which causes loss of its content.
.br
The following sessions can only be written in -tao mode.
.br
In order to have all filesystem content accessible, the eventual ISO-9660
filesystem of a follow-up
session needs to be prepared in a special way by the filesystem formatter
program. mkisofs and genisoimage expect particular info about the situation
which can be retrieved by cdrskin option -msinfo.
.br
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.
.TP
.BI \-nopad
Do not add trailing zeros to the data stream. Nevertheless, since there seems
to be no use for audio tracks with incomplete last sector, this option applies
only to data tracks. There it is default.
.TP
.BI \-pad
Add 30 kB of trailing zeros to each data track. (This is not sufficient to
avoid problems with various CD-ROM read drivers.)
.TP
.BI padsize= size
Add the given amount of trailing zeros to the next data track. This option
gets reset to padsize=0 after that next track is written. It may be set
again before the next track argument. About size specifiers, see option fs=.
.TP
.BI \-raw96r
Write disk in RAW/RAW96R mode. This mode allows to put more payload bytes
into a CD sector but obviously at the cost of error correction. It can only
be used for tracks of fixely predicted size. Some drives allow this mode but
then behave strange or even go bad for the next few attempts to burn a CD.
One should use it only if inavoidable.
.TP
.BI \-sao
Write disk in Session At Once mode. This mode is able to put several audio
tracks on CD without producing audible gaps between them. It 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 option tsize= or
by option tao_to_sao_tsize=.
.TP
.BI \-scanbus
Scan the system for drives. On Linux the drives at /dev/s* and at /dev/hd*
are to be scanned by two separate runs. One without dev= for /dev/s* and
one with dev=ATA for /dev/hd* devices. (Option --drives lists all available
drives in a single run.)
.br
Drives which are busy or which offer no rw-permission to the user of cdrskin
are not listed. Busy drives get reported in form of warning messages.
.br
The useful fields in a result line are:
.br
Bus,Target,Lun Number) 'Vendor' 'Mode' 'Revision'
.TP
.BI speed= number
Set speed of drive. With data CD, 1x speed corresponds to a throughput of
150 kB/s. 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.
.TP
.BI \-swab
Announce that the raw audio data source of subsequent tracks is byte swapped
versus the expectations of cdrecord. This option is suitable for audio where
the least significant byte of a 16 bit word is first (little-endian, Intel).
Most raw audio data on PC systems are available in this byte order.
Less guesswork is needed if track sources are in format MS-WAVE in a file with
suffix ".wav".
.TP
.BI \-tao
Write disk in Track At Once (TAO) mode. This mode can be used with track
sources of unpredictable size, like standard input or named pipes. It is
also the only mode that can be used for writing to appendable CD which
already hold data.
.TP
.BI \-toc
Print the table of content (TOC) which describes the tracks recorded on CD.
The output contains all info from option -atip plus lines which begin with
"track:", the track number, the word "lba:" and a number which gives the
start address of the track. Addresses are counted in CD sectors which with
SAO or TAO data tracks hold 2048 bytes each.
.RS
.TP
Example. Retrieve an afio archive from track number 2:
.br
tracknumber=2
.br
lba=$(cdrskin dev=/dev/cdrom -toc 2>&1 | \\
.br
grep '^track:[ ]*[ 0-9][0-9]' | \\
.br
tail +"$tracknumber" | head -1 | \\
.br
awk '{ print $4}' )
.br
dd if=/dev/cdrom bs=2048 skip="$lba" | \\
.br
afio -t - | less
.RE
.TP
.BI tsize= size
Announces the exact size of the next track source. This is necessary with any
write mode other than -tao if the track source is not a regular disk file, but
e.g. "-" (standard input) or a named pipe.
About size specifiers, see option fs=.
.br
If the track source does not deliver the predicted amount of bytes, the
remainder of the track is padded with zeros. This is not considered an error.
If on the other hand the track source delivers more than the announced bytes
then the track on CD gets truncated to the predicted size and cdrskin exits
with non-zero value.
.TP
.BI \-v
Increment verbose level by one. Startlevel is 0 with only few messages.
Level 1 prints progress report with long running operations and also causes
some extra lines to be put out with info retrieval options.
Level 2 additionally reports about option settings derived from arguments or
startup files. Level 3 is for debugging and useful mainly in conjunction with
somebody who had a look into the program sourcecode.
.PP
Alphabetical list of options which are genuine to cdrskin and intended for
normal use:
.TP
.BI \--allow_setuid
Disable the loud warning about insecure discrepance between login user and
effective user which indicates application of chmod u+s to the program binary.
One should not do this chmod u+s , but it is an old cdrecord tradition.
.TP
.BI \--any_track
Allow source_addresses to begin with "-" (plus further characters) or to
contain a "=" character.
By default such arguments are seen as misspelled options. It is nevertheless
not possible to use one of the options listed with --list_ignored_options.
.TP
.BI \--demand_a_drive
Exit with a nonzero value if no drive can be found during a bus scan.
.TP
.BI \--devices
List the device file addresses of all accessible CD drives. In order to get
listed, a drive has to offer rw-permission for the cdrskin user and it may
not be busy. The superuser should be able to see all idle drives listed and
busy drives reported as "SORRY" messages.
.br
Each available drive gets listed by a line containing the following fields:
.br
Number dev='Devicefile' rw-Permissions : 'Vendor' 'Model'
.br
Number and Devicefile can both be used with option dev=, but number is
volatile (numbering changes if drives become busy).
.TP
.BI fifo_start_at= size
Do not wait for full fifo but start burning as soon as the given number
of bytes is read. This option may be helpful to bring the average throughput
near to the maximum throughput of a drive. A large fs= and a small
fifo_start_at= combine a quick burn start and a large savings buffer to
compensate for temporary lack of source data. At the beginning of burning,
the software protection against buffer underun is as weak as the size of
fifo_start_at= . So it is best if the drive offers hardware protection which
has to be enabled by driveropts=burnfree.
.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
option which ends by "=". The list is ended by an empty line.
.TP
.BI \--no_rc
Only if used as first command line argument this option prevents reading and
interpretation of eventual startup files. See section FILES below.
.TP
.BI \--single_track
Accept only the last argument of the command line as track source address.
.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 KB blocks, but better is 32 kB.
With DVD-RW 32 kB alignment is mandatory.
.br
Other media are not suitable for this option yet.
.PP
Alphabetical list of options which are only intended for very special
situations and not for normal use:
.TP
.BI \--abort_handler
Establish default signal handling not to leave a drive in busy state
but rather to shut it down and to wait until it has ended the final operations.
This option is only needed for revoking eventual --ignore_signals or
--no_abort_handler.
.TP
.BI dev_translation= <sep><from><sep><to>
Set drive address alias. This was necessary before cdrskin-0.2.4 to manually
translate cdrecord addresses into cdrskin addresses.
.br
<sep> is a single character which may not occur in the address string
<from>. <from> is an address as expected to be given by the user via option
dev=. <to> is the address to be used instead whenever <from> is given.
More than one translation instruction can be given in one cdrskin run.
.br
E.g.: dev_translation=+ATA:1,0,0+/dev/sg1 dev_translation=+ATA:1,1,0+/dev/sg2
.TP
.BI \--drive_abort_on_busy
Linux specific: Abort process if a busy drive is encountered.
.TP
.BI \--drive_blocking
Linux specific: Try to wait for a busy drive to become free.
This is not guaranteed to work with all drivers. Some need nonblocking i/o.
.TP
.BI \--drive_not_exclusive
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_exclusive
Linux specific:
Try to exclusively reserve device files /dev/srN, /dev/scdM, /dev/stK of drive.
this would be helpful to protect against collisions with program growisofs.
Regrettably on Linux kernel 2.4 with ide-scsi emulation this seems not to
work. Wether it becomes helpful with new Linux systems has to be evaluated.
.TP
.BI \--fifo_disable
Disable fifo despite any fs=.
.TP
.BI \--fifo_per_track
Use a separate fifo for each track.
.TP
.BI grab_drive_and_wait= seconds
Open the addressed drive, wait the given number of seconds, release the drive,
and do normal work as indicated by the other options used. This option helps
to explore the program behavior when faced with busy drives. Just start a
second cdrskin with option --devices while grab_drive_and_wait= is still
active.
.TP
.BI \--ignore_signals
Try to ignore any signals rather than to abort the program. This is not a
very good idea. You might end up waiting a very long time for cdrskin
to finish.
.TP
.BI \--no_abort_handler
On signals exit even if the drive is in busy state. This is not a very good
idea. You might end up with a stuck drive that refuses to hand out the media.
.TP
.BI \--no_blank_appendable
Refuse to blank appendable CD-RW. This is a feature that was once builtin with
libburn. No information available for what use case it was needed.
.TP
.BI \--no_convert_fs_adr
Do only literal translations of dev=. This prevents cdrskin from test-opening
device files in order to find one that matches the given dev= specifier.
.br
Partly Linux specific:
Such opening is needed for Bus,Target,Lun addresses unless option
--old_pseudo_scsi_adr is given. It is also needed to resolve device file
addresses which are not listed with cdrskin --devices but nevertheless point
to a usable drive. (Like /dev/sr0 using the same SCSI address as /dev/sg0.)
.TP
.BI \--old_pseudo_scsi_adr
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 tao_to_sao_tsize= size
Set an exact fixed size for the next track to be in effect only if the track
source cannot deliver a size prediction and no tsize= was specified.
This is the fallback from bad old times when cdrskin was unable to burn
in mode -tao.
.br
.SH EXAMPLES
.SS
.B Get an overview of drives:
.br
cdrskin -scanbus
.br
cdrskin dev=ATA -scanbus
.br
cdrskin --devices
.SS
.B Get info about a particular drive or loaded media:
.br
cdrskin dev=0,1,0 -checkdrive
.br
cdrskin dev=ATA:1,0,0 -atip
.br
cdrskin dev=/dev/hdc -toc
.SS
.B Make used CD-RW writable again:
.br
cdrskin -v dev=/dev/sg1 blank=all -eject
.br
cdrskin -v dev=/dev/dvd blank=fast -eject
.SS
.B Format DVD-RW before first use with cdrskin:
.br
cdrskin -v dev=/dev/sr0 blank=format_overwrite
.SS
.B Write ISO-9660 filesystem image:
.br
cdrskin -v dev=/dev/hdc speed=12 fs=8m \\
.br
driveropts=burnfree -sao -eject \\
.br
padsize=300k my_image.iso
.SS
.B Write compressed afio archive on-the-fly:
.br
find . | afio -oZ - | \\
.br
cdrskin -v dev=0,1,0 fs=32m speed=8 driveropts=burnfree \\
.br
padsize=300k -tao -
.SS
.B Write several sessions to the same CD:
.br
cdrskin dev=/dev/hdc padsize=300k -multi 1.iso
.br
cdrskin dev=/dev/hdc padsize=300k -multi -tao 2.afio
.br
cdrskin dev=/dev/hdc padsize=300k -multi -tao 3.afio
.br
cdrskin dev=/dev/hdc padsize=300k -tao 4.afio
.SS
.B Get CD multi-session info for option -C of program mkisofs:
.br
c_values=$(cdrskin dev=/dev/sr0 -msinfo 2>/dev/null)
.br
mkisofs ... -C "$c_values" ...
.SS
.B Write audio tracks to CD:
.br
cdrskin -v dev=ATA:1,0,0 speed=48 \\
.br
driveropts=burnfree -sao \\
.br
track1.wav track2.au -audio -swab track3.raw
.br
.SH FILES
If not --no_rc is given as the first argument then cdrskin attempts on
startup to read the arguments from the following files:
.PP
.br
.B /etc/default/cdrskin
.br
.B /etc/opt/cdrskin/rc
.br
.B /etc/cdrskin/cdrskin.conf
.br
.B $HOME/.cdrskinrc
.br
.PP
The files are read in the sequence given above, but none of them is
required for cdrskin to function properly. Each readable line is treated
as one single argument. No extra blanks.
A first character '#' marks a comment, empty lines are ignored.
.SS
.B Example content of a startup file:
.br
# This is the default device
.br
dev=0,1,0
.br
# To accomodate to remnant cdrskin-0.2.2 addresses
.br
dev_translation=+1,0,0+0,1,0
.br
# Some more options
.br
fifo_start_at=0
.br
fs=16m
.br
.SH SEE ALSO
.TP
Formatting track sources for cdrskin:
.br
.BR mkisofs (8),
.BR genisoimage (8),
.BR afio (1),
.BR star (1)
.br
.TP
Other CD/DVD burn programs:
.br
.BR cdrecord (1),
.BR wodim (1)
.br
.TP
For DVD burning:
.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.

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
<HEAD> <HEAD>
<META NAME="description" CONTENT="cdrskin, a limited cdrecord compatibility wrapper for libburn"> <META NAME="description" CONTENT="cdrskin, a limited cdrecord compatibility wrapper for libburn">
<META NAME="keywords" CONTENT="cdrskin, libburn, burn, CD, linux, CDR, CD-R, CDRW, CD-RW, cdrecord, compatible, scdbackup, burning"> <META NAME="keywords" CONTENT="cdrskin, libburn, libburnia, burn, CD, linux, CDR, CD-R, CDRW, CD-RW, cdrecord, compatible, scdbackup, burning">
<META NAME="robots" CONTENT="follow"> <META NAME="robots" CONTENT="follow">
<TITLE>cdrskin homepage english</TITLE> <TITLE>cdrskin homepage english</TITLE>
</HEAD> </HEAD>
@ -11,7 +11,12 @@
<FONT SIZE=+1> <FONT SIZE=+1>
<CENTER> <CENTER>
<P><H2>Homepage of</H2><H1><BR>cdrskin</H1><BR> <A HREF="http://en.wikipedia.org/wiki/D%C3%B6ner_kebab">
<IMG SRC="doener_150x200_tr_octx.gif" BORDER=0
ALT="cdrskin logo: Doener mit Scharf">
</A>
<P><H2> Homepage of </H2>
<H1> cdrskin </H1>
<!-- <FONT SIZE=+0><A HREF="cdrskin_ger.html">deutsch (german)</A></FONT> --> <!-- <FONT SIZE=+0><A HREF="cdrskin_ger.html">deutsch (german)</A></FONT> -->
<H2>Limited cdrecord compatibility wrapper for libburn</H2> <H2>Limited cdrecord compatibility wrapper for libburn</H2>
@ -20,7 +25,7 @@
<P> <P>
<H2>Purpose:</H2> <H2>Purpose:</H2>
<UL> <UL>
<LI>Burns preformatted data to CD-R or CD-RW</LI> <LI>Burns preformatted data to CD-R, CD-RW, DVD-RAM, DVD+RW, DVD-RW</LI>
</UL> </UL>
</P> </P>
<P> <P>
@ -30,8 +35,8 @@
<P> <P>
<H2>Hardware requirements:</H2> <H2>Hardware requirements:</H2>
A CD recorder suitable for A CD recorder suitable for
<A HREF="http://libburn.pykix.org">libburn.pykix.org</A> <A HREF="http://libburnia.pykix.org">libburnia.pykix.org</A>
(SCSI or IDE/ATAPI writers compliant to mmc standard). (SCSI or IDE/ATAPI writers compliant to mmc-3 standard).
<BR> <BR>
</P> </P>
@ -51,8 +56,8 @@ A CD recorder suitable for
GPL software included:<BR> GPL software included:<BR>
</H2> </H2>
<DL> <DL>
<DT>libburn-0.2.6</DT> <DT>libburn-0.3.0</DT>
<DD>(by Derek Foreman, Ben Jansens, and team of libburn.pykix.org)</DD> <DD>(by Derek Foreman, Ben Jansens, and team of libburnia.pykix.org)</DD>
<DD>transfers data to CD</DD> <DD>transfers data to CD</DD>
</DL> </DL>
</P> </P>
@ -83,6 +88,8 @@ and for data CD projects of <A HREF="http://www.k3b.org">K3b</A>
(see <A HREF="#examples">examples</A>). (see <A HREF="#examples">examples</A>).
Suitability for audio CD frontends has been improved much and is now being Suitability for audio CD frontends has been improved much and is now being
evaluated.<BR> evaluated.<BR>
DVD are written in a pseudo -tao mode which is very different from the
write mode used by cdrecord(-ProDVD).<BR>
Further enhancements depend on people who can describe and discuss their Further enhancements depend on people who can describe and discuss their
wishes as well as on the development of libburn.</DT> wishes as well as on the development of libburn.</DT>
<BR><BR> <BR><BR>
@ -97,21 +104,26 @@ wishes as well as on the development of libburn.</DT>
<DT>Make used CD-RW writable again:</DT> <DT>Make used CD-RW writable again:</DT>
<DD>$ cdrskin -v dev=/dev/sg1 blank=all -eject</DD> <DD>$ cdrskin -v dev=/dev/sg1 blank=all -eject</DD>
<DD>$ cdrskin -v dev=/dev/dvd blank=fast -eject</DD> <DD>$ cdrskin -v dev=/dev/dvd blank=fast -eject</DD>
<DT>Format DVD-RW before first use with cdrskin</DT>
<DD>$ cdrskin -v dev=0,1,0 blank=format_overwrite -eject<DD>
<DT>Write ISO-9660 filesystem image:</DT> <DT>Write ISO-9660 filesystem image:</DT>
<DD>$ cdrskin -v dev=/dev/hdc speed=12 fs=8m driveropts=burnfree -sao -eject padsize=300k my_image.iso</DD> <DD>$ cdrskin -v dev=/dev/hdc speed=12 fs=8m driveropts=burnfree -eject padsize=300k my_image.iso</DD>
<DT>Write compressed afio archive on-the-fly :</DT> <DT>Write compressed afio archive on-the-fly :</DT>
<DD>$ find . | afio -oZ - | cdrskin -v dev=0,1,0 fs=32m speed=8 driveropts=burnfree padsize=300k -tao -</DD> <DD>$ find . | afio -oZ - | cdrskin -v dev=0,1,0 fs=32m speed=8 driveropts=burnfree padsize=300k -tao -</DD>
<DT>Write audio tracks:</DT> <DT>Write audio tracks:</DT>
<DD>$ cdrskin -v dev=ATA:1,0,0 speed=48 driveropts=burnfree -sao track1.wav track2.au -audio -swab track3.raw <DD>$ cdrskin -v dev=ATA:1,0,0 speed=48 driveropts=burnfree -sao track1.wav track2.au -audio -swab track3.raw
<DD> <DD>
<BR> <BR>
<DT><A HREF="cdrskin_help">cdrskin -help</A></DT> <DT>Get overview of the cdrecord compatible options:</DT>
<DD>reports the cdrecord compatible options</DD> <DD><A HREF="cdrskin_help">$ cdrskin -help</A></DD>
<DT><A HREF="cdrskin__help">cdrskin --help</A></DT> <DT>Get overview of the non-cdrecord options:</DT>
<DD>reports the non-cdrecord options</DD> <DD><A HREF="cdrskin__help">$ cdrskin --help</A></DD>
<DT><A HREF="http://cdrecord.berlios.de/old/private/man/cdrecord-2.0.html">man cdrecord</A></DT> <DT>Read the detailed manual page:</DT>
<DD>documents the standard for which cdrskin is striving. <DD><A HREF="man_1_cdrskin.html">$ man cdrskin</A></DD>
<B>Do not bother Joerg Schilling with any cdrskin problems.</B> <DT>Read about the standard for which cdrskin is striving:</DT>
<DD><A HREF="http://cdrecord.berlios.de/old/private/man/cdrecord-2.0.html">
$ man cdrecord</A></DD>
<DD><B>Do not bother Joerg Schilling with any cdrskin problems.</B>
(Be cursed if you install cdrskin as "cdrecord" without clearly forwarding (Be cursed if you install cdrskin as "cdrecord" without clearly forwarding
this "don't bother Joerg" demand.) this "don't bother Joerg" demand.)
</DD> </DD>
@ -145,8 +157,8 @@ rw-permissions and retry the bus scan as non-superuser.
<P> <P>
<DL> <DL>
<DT>Download as source code (see README):</DT> <DT>Download as source code (see README):</DT>
<DD><A HREF="cdrskin-0.2.6.pl01.tar.gz">cdrskin-0.2.6.pl01.tar.gz</A> <DD><A HREF="cdrskin-0.3.0.pl00.tar.gz">cdrskin-0.3.0.pl00.tar.gz</A>
(510 KB). (540 KB).
</DD> </DD>
<DD> <DD>
The "stable" cdrskin tarballs are source code identical with "stable" The "stable" cdrskin tarballs are source code identical with "stable"
@ -156,14 +168,14 @@ cdrskin is part of libburn - full libburn is provided with cdrskin releases.
</DD> </DD>
<DD>&nbsp;</DD> <DD>&nbsp;</DD>
<DT>Download as single x86 binaries (untar and move to /usr/bin/cdrskin):</DT> <DT>Download as single x86 binaries (untar and move to /usr/bin/cdrskin):</DT>
<DD><A HREF="cdrskin_0.2.6.pl01-x86-suse9_0.tar.gz"> <DD><A HREF="cdrskin_0.3.0.pl00-x86-suse9_0.tar.gz">
cdrskin_0.2.6.pl01-x86-suse9_0.tar.gz</A>, (60 KB), cdrskin_0.3.0.pl00-x86-suse9_0.tar.gz</A>, (75 KB),
<DL> <DL>
<DD>runs on SuSE 9.0 (2.4.21) , RIP-14.4 (2.6.14) , <DD>runs on SuSE 9.0 (2.4.21) , RIP-14.4 (2.6.14) ,
Gentoo (2.6.15 x86_64 Athlon).</DD> Gentoo (2.6.15 x86_64 Athlon).</DD>
</DL> </DL>
<DD><A HREF="cdrskin_0.2.6.pl01-x86-suse9_0-static.tar.gz"> <DD><A HREF="cdrskin_0.3.0.pl00-x86-suse9_0-static.tar.gz">
cdrskin_0.2.6.pl01-x86-suse9_0-static.tar.gz</A>, (260 KB), -static compiled, cdrskin_0.3.0.pl00-x86-suse9_0-static.tar.gz</A>, (275 KB), -static compiled,
<DL> <DL>
<DD>runs on SuSE 7.2 (2.4.4), and on the systems above.</DD> <DD>runs on SuSE 7.2 (2.4.4), and on the systems above.</DD>
</DL> </DL>
@ -173,10 +185,13 @@ cdrskin_0.2.6.pl01-x86-suse9_0-static.tar.gz</A>, (260 KB), -static compiled,
<DD><A HREF="README_cdrskin">README</A> a short introduction</DD> <DD><A HREF="README_cdrskin">README</A> a short introduction</DD>
<DD><A HREF="cdrskin__help">cdrskin --help</A> non-cdrecord options</DD> <DD><A HREF="cdrskin__help">cdrskin --help</A> non-cdrecord options</DD>
<DD><A HREF="cdrskin_help">cdrskin -help</A> cdrecord compatible options</DD> <DD><A HREF="cdrskin_help">cdrskin -help</A> cdrecord compatible options</DD>
<DD><A HREF="man_1_cdrskin.html">man cdrskin</A> the manual page</DD>
<DD>&nbsp;</DD> <DD>&nbsp;</DD>
</DL> </DL>
<DL><DT>Contact:</DT> <DL><DT>Contact:</DT>
<DD>Thomas Schmitt, <A HREF="mailto:scdbackup@gmx.net">scdbackup@gmx.net</A></DD> <DD>Thomas Schmitt, <A HREF="mailto:scdbackup@gmx.net">scdbackup@gmx.net</A></DD>
<DD>libburn development mailing list,
<A HREF="mailto:libburn-hackers@pykix.org">libburn-hackers@pykix.org</A></DD>
</DL> </DL>
<DL><DT>License:</DT> <DL><DT>License:</DT>
<DD><A HREF="COPYING_cdrskin">GPL</A>, an <A HREF="http://www.opensource.org/">Open Source</A> approved license</DD> <DD><A HREF="COPYING_cdrskin">GPL</A>, an <A HREF="http://www.opensource.org/">Open Source</A> approved license</DD>
@ -187,23 +202,15 @@ cdrskin_0.2.6.pl01-x86-suse9_0-static.tar.gz</A>, (260 KB), -static compiled,
<HR> <HR>
<P> <P>
Enhancements towards previous stable version cdrskin-0.2.4: Enhancements towards previous stable version cdrskin-0.2.6:
<UL> <UL>
<LI>Option <KBD><B>-tao</B></KBD> is fully enabled.<BR> <LI>Improved recognition of unsuitable media types</LI>
SAO is still the preferred default but TAO is default if a track of <LI>Ban of chmod u+s is replaced by a loud warning</LI>
unpredicted size is present (stdin, named pipe, ...) or if a follow-up <LI>Detailed man page</LI>
session is written to an appendable CD. <LI>Burning to DVD+RW and DVD-RAM as non-multi, non-appending,
(This is an intentional deviation from cdrecord defaults which themselves single-track session</LI>
have changed with the newest cdrecord versions.) <LI>Formatting and then burning to DVD-RW like to DVD+RW</LI>
</LI> <LI>Emulation of new wodim option msifile=path</LI>
<LI>Status report during blank, preparation and finalization improved.</LI>
<LI>Bug fixed: Trailing trash appended to .wav files caused error message
and, if exceeding fifo size, could even stall a burn.
(Workaround: disable fifo by <KBD><B>fs=0</B></KBD>)</LI>
<LI>Bug fixed: False speed with first pacifier cycle. Potential program
abort by floating point exception (NaN).</LI>
<LI>multi-session CDs: <KBD><B>-multi</B></KBD>, <KBD><B>-msinfo</B></KBD>,
writing to appendable CDs (for now restricted to write mode TAO).</LI>
</UL> </UL>
</P> </P>
@ -211,18 +218,21 @@ Enhancements towards previous stable version cdrskin-0.2.4:
<P> <P>
<DL> <DL>
<DT><H3>Development snapshot, version 0.2.7 :</H3></DT> <DT><H3>Development snapshot, version 0.3.1 :</H3></DT>
<DD>Enhancements towards stable version 0.2.6: <DD>Enhancements towards stable version 0.3.0:
(none yet) <UL>
<LI>-none yet-</LI>
</UL>
</DD> </DD>
<DD>&nbsp;</DD> <DD>&nbsp;</DD>
<DD><A HREF="README_cdrskin_devel">README 0.2.7</A> <DD><A HREF="README_cdrskin_devel">README 0.3.1</A>
<DD><A HREF="cdrskin__help_devel">cdrskin_0.2.7 --help</A></DD> <DD><A HREF="cdrskin__help_devel">cdrskin_0.3.1 --help</A></DD>
<DD><A HREF="cdrskin_help_devel">cdrskin_0.2.7 -help</A></DD> <DD><A HREF="cdrskin_help_devel">cdrskin_0.3.1 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 0.3.1)</A></DD>
<DD>&nbsp;</DD> <DD>&nbsp;</DD>
<DT>Maintainers of cdrskin unstable packages please use SVN of <DT>Maintainers of cdrskin unstable packages please use SVN of
<A HREF="http://libburn.pykix.org"> libburn.pykix.org</A></DT> <A HREF="http://libburnia.pykix.org"> libburnia.pykix.org</A></DT>
<DD>Download: <KBD><B>svn co http://libburn-svn.pykix.org/libburn/trunk libburn_pykix</B> <DD>Download: <KBD><B>svn co http://libburnia-svn.pykix.org/libburn/trunk libburn_pykix</B>
</KBD></DD> </KBD></DD>
<DD>Build: <KBD><B>cd libburn_pykix ; ./bootstrap ; ./configure ; make</B> <DD>Build: <KBD><B>cd libburn_pykix ; ./bootstrap ; ./configure ; make</B>
</KBD></DD> </KBD></DD>
@ -234,19 +244,19 @@ vanilla tools like make and gcc are needed.</DD>
<DD>&nbsp;</DD> <DD>&nbsp;</DD>
<DT>The following downloads are intended for adventurous end users or <DT>The following downloads are intended for adventurous end users or
admins with full system souvereignty.</DT> admins with full system souvereignty.</DT>
<DD>Source (./bootstrap is already applied, build tested, for more see above <DD>Source (./bootstrap is already applied, build tested, for more see
<A HREF="README_cdrskin_devel">upcoming README</A> ): <A HREF="README_cdrskin_devel">upcoming README</A> ):
</DD> </DD>
<DD> <DD>
<A HREF="cdrskin-0.2.7.tar.gz">cdrskin-0.2.7.tar.gz</A> <A HREF="cdrskin-0.3.1.tar.gz">cdrskin-0.3.1.tar.gz</A>
(500 KB). (550 KB).
</DD> </DD>
<DD>Binary (untar and move to /usr/bin/cdrskin):</DD> <DD>Binary (untar and move to /usr/bin/cdrskin):</DD>
<DD><A HREF="cdrskin_0.2.7-x86-suse9_0.tar.gz"> <DD><A HREF="cdrskin_0.3.1-x86-suse9_0.tar.gz">
cdrskin_0.2.7-x86-suse9_0.tar.gz</A>, (60 KB). cdrskin_0.3.1-x86-suse9_0.tar.gz</A>, (75 KB).
</DD> </DD>
<DD><A HREF="cdrskin_0.2.7-x86-suse9_0-static.tar.gz"> <DD><A HREF="cdrskin_0.3.1-x86-suse9_0-static.tar.gz">
cdrskin_0.2.7-x86-suse9_0-static.tar.gz</A>, (260 KB) cdrskin_0.3.1-x86-suse9_0-static.tar.gz</A>, (275 KB)
</DD> </DD>
</DL> </DL>
</P> </P>
@ -313,7 +323,7 @@ is a GUI frontend which uses cdrecord for CD burning.)
<DD>$ <KBD><B>export SCDBACKUP_USE_CDRSKIN=1</B></KBD></DD> <DD>$ <KBD><B>export SCDBACKUP_USE_CDRSKIN=1</B></KBD></DD>
<DD>$ <KBD><B>./CONFIGURE_CD</B></KBD></DD> <DD>$ <KBD><B>./CONFIGURE_CD</B></KBD></DD>
<DD><KBD>...</KBD></DD> <DD><KBD>...</KBD></DD>
<DD><KBD>cdrskin 0.2.6 : limited cdrecord compatibility wrapper for libburn</KBD></DD> <DD><KBD>cdrskin 0.3.0 : limited cdrecord compatibility wrapper for libburn</KBD></DD>
</DL> </DL>
If your system is stricken with some ill CD device then this can stall If your system is stricken with some ill CD device then this can stall
and you will have to press <KBD>Ctrl+C</KBD> to abort. and you will have to press <KBD>Ctrl+C</KBD> to abort.
@ -371,10 +381,11 @@ the gestures necessary for their cdrecord applications.
Contact me. Let's see what we can achieve. Contact me. Let's see what we can achieve.
<BR> <BR>
<BR> <BR>
I am aware that libburn and cdrskin still have way to go until you can simply libburn and cdrskin are now mature enough to substitute cdrecord in its
install cdrskin as cdrecord and may expect any application to run with it. major use cases of CD burning. It is possible to foist cdrskin on various
Currently i do not encourage this approach, but of course such a replacement software packages if it gets falsely named "cdrecord".
opportunity is the long term goal of a cdrecord compatibility wrapper. I do not encourage this approach, but of course such a replacement
opportunity is the goal of a cdrecord compatibility wrapper.
<BR> <BR>
<BR> <BR>
It is very important to me that this project is not perceived as hostile It is very important to me that this project is not perceived as hostile
@ -388,6 +399,10 @@ I owe him much. For cdrecord, for mkisofs, for star. Chapeau.
<!-- <A NAME="bottom" HREF="main_ger.html#bottom">deutsch (german)</A> <!-- <A NAME="bottom" HREF="main_ger.html#bottom">deutsch (german)</A>
<BR><BR> <BR><BR>
--> -->
<A HREF="http://en.wikipedia.org/wiki/D%C3%B6ner_kebab">
<IMG SRC="doener_150x200_tr.gif" BORDER=0
ALT="cdrskin logo: Doener mit Scharf"></A>
<BR><BR>
<FONT SIZE=+0>Enjoying free Open Source hosting by <A HREF="http://www.webframe.org">www.webframe.org</A><BR> <FONT SIZE=+0>Enjoying free Open Source hosting by <A HREF="http://www.webframe.org">www.webframe.org</A><BR>
<A HREF="http://www.webframe.org"> <A HREF="http://www.webframe.org">
<IMG SRC="msfree.gif" ALT="100 % Microsoft free" BORDER=0></A><BR> <IMG SRC="msfree.gif" ALT="100 % Microsoft free" BORDER=0></A><BR>

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2006.11.23.102340" #define Cdrskin_timestamP "2007.01.16.120001"

View File

@ -18,6 +18,13 @@ Deliberate deviations of cdrskin from cdrecord compatibility:
+ -msinfo pushes all other messages to stderr. It works independent of + -msinfo pushes all other messages to stderr. It works independent of
other options which would prevent it with cdrecord (-atip, -scanbus, ...) other options which would prevent it with cdrecord (-atip, -scanbus, ...)
+ DVD+RW writing is like -tao on giant blank CD-RW.
Same with DVD-RW in mode Restricted Overwrite.
+ DVD-RW "Restricted Overwrite" writing is like DVD+RW (i.e. like -tao).
Formatting is done via cdrskin-specific blank=format_overwrite and not
with option -format.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
Changelog Changelog
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
@ -1710,18 +1717,902 @@ Coordinated scsi_notify_error() and scsi_error()
------------------------------------ cycle - cdrskin-0.2.5 - 2006.11.22.142517 ------------------------------------ cycle - cdrskin-0.2.5 - 2006.11.22.142517
23 Nov 2006 [] 23 Nov 2006 [433]
cdrskin/changelog.txt cdrskin/changelog.txt
Last cdrskin-0.2.5 cycle Last cdrskin-0.2.5 cycle
23 Nov 2006 [434]
- test/burn.c
- test/master.c
- test/tree.py
- test/tree.pyc
- test/rip.c
Removed obsolete test programs
2006.11.23.102340 [435]
Makefile.am
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin.c
cdrskin/cdrskin_eng.html
cdrskin/README
cdrskin/wiki_plain.txt
+ cdrskin/add_ts_changes_to_libburn_0_2_6
+ cdrskin/add_ts_changes_to_libburn_0_2_7
- cdrskin/add_ts_changes_to_libburn_0_2_4
- cdrskin/add_ts_changes_to_libburn_0_2_5
Version leap to 0.2.6
24 Nov 2006
Published cdrskin-0.2.6.pl01 on cdrskin home pages
------------------------------- cycle - cdrskin-0.2.6.pl01 - 2006.11.23.114611
2006.11.24.121745 [437]
Makefile.am
configure.ac
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin.c
cdrskin/README
Version leap to 0.2.7
24 Nov 2006 [438]
doc/comments
Mentioned telltoc and dewav as helpers of libburner
------------------------------------ cycle - cdrskin-0.2.7 - 2006.11.24.125445
24 Nov 2006 [439]
cdrskin/changelog.txt
First cdrskin-0.2.7 cycle
24 Nov 2006 [440]
doc/comments
Updated libburner helptext copy
24 Nov 2006 [441]
doc/comments
Made our claim of burning CD more general
2006.11.25.104047 [442]
cdrskin/cdrskin.c
Disabled old workaround for ticket 8, burn_disc_read_atip() fixed the problem
25 Nov 2006 [443]
libburn/drive.h
libburn/drive.c
libburn/write.c
test/libburner.c
Ticket 91: update media state model after content change
25 Nov 2006 [444]
test/libburner.c
test/telltoc.c
Made use of libburn device address translation (/dev/sr0, /dev/cdrom, ...)
25 Nov 2006 [445]
test/libburner.c
Corrected two minor bugs
2006.11.25.170456 [446]
libburn/cleanup.c
cdrskin/cleanup.c
Trying to keep signal handler from repeating messages
2006.11.25.182841 [447]
libburn/write.c
libburn/drive.c
Prevented premature BURN_DRIVE_IDLE introduced with revision 443
2006.11.25.210321 [448]
cdrskin/cdrskin.c
Enabled options -vv, -vvv and -vvvv
28 Nov 2006 [449]
README
Mentioned renaming of umbrella project to libburnia
2006.11.29.205136 [450]
cdrskin/cdrskin.c
Added preliminary support for new cdrecord 1000+ = ATA busses (input only)
2006.12.01.213845 [451]
libburn/transport.h
libburn/libdax_msgs.h
libburn/mmc.c
Ticket 21: media type via 46h GET CONFIGURATION , Current Profile
2006.12.02.111701 [452]
libburn/libburn.h
libburn/mmc.c
libburn/drive.c
cdrskin/cdrskin.c
New API function to obtain media type: burn_disc_get_profile()
2006.12.02.130631 [453]
libburn/mmc.c
Correction for drives which return empty tray as profile 0x00 rather than error
------------------------------------ cycle - cdrskin-0.2.7 - 2006.12.02.151257
* Improved recognition of unsuitable media types
2 Dec 2006 [454]
cdrskin/changelog.txt
cdrskin/cdrskin_eng.html
Next cdrskin-0.2.7 cycle
2006.12.02.201405 [456]
libburn/drive.c
libburn/mmc.c
Avoided unsuitable media complaint on burn_drive_grab() with load==0
2006.12.02.201529 [457]
cdrskin/cdrskin.c
Testing wether the after-grab status waiting loops are necessary
3 Dec 2006 [461]
cdrskin/doener_150x200_tr.gif
cdrskin/doener_150x200_tr_octx.gif
cdrskin/cdrskin_eng.html
cdrskin is declared honoray Doenerware (burp)
3 Dec 2006 [463]
cdrskin/cdrskin_eng.html
Have wikipedia explain doenerism ("Eat the rich" and so)
2006.12.03.155703 [464]
README
doc/comments
test/libburner.c
cdrskin/cdrskin_eng.html
cdrskin/README
cdrskin/cdrskin.c
Changed URLs and umbrella names to libburnia
3 Dec 2006 [465]
cdrskin/wiki_plain.txt
Changed URLs and umbrella names to libburnia
3 Dec 2006 [466]
cdrskin/wiki_plain.txt
Added Doener logo and link
3 Dec 2006 [468]
cdrskin/cdrskin_eng.html
cdrskin/add_ts_changes_to_libburn_0_2_7
Excluded doener gifs from cdrskin tarballs
------------------------------------ cycle - cdrskin-0.2.7 - 2006.12.03.204709
2006.12.03.204709 [469]
cdrskin/changelog.txt
Next cdrskin-0.2.7 cycle
4 Dec 2006 [470]
cdrskin/cdrskin_eng.html
Removed a newline which made the Mozilla family show a "_"
4 Dec 2006 [471]
test/telltoc.c
Added reporting of current media profile, changed "Media type" to "Media reuse"
2006.12.09.111108 [475]
cdrskin/cdrskin.c
Replaced setuid blocker by warning. People must know themselves what they do.
------------------------------------ cycle - cdrskin-0.2.7 - 2006.12.09.141837
* Replaced ban of chmod u+s by loud warning
11 Dec 2006 [484]
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Next cdrskin-0.2.7 cycle
2006.12.11.095230 [485]
cdrskin/cdrskin_timestamp.h
Belated timestamp for changes in cdrskin
11 Dec 2006 [486]
Makefile.am
Unified mix of tab an blanks which looks ugly in diff
2006.12.11.100021 [487]
libburn/sg-linux.c
Prepared experiments for new Linux SCSI adventures
2006.12.11.101350 [488]
cdrskin/README
cdrskin/cdrskin.c
cdrskin/wiki_plain.txt
Consequences from newly introduces startup file
11 Dec 2006 [489]
cdrskin/wiki_plain.txt
Repaired README link and planted helptext links
2006.12.11.115802 [490]
libburn/sg-linux.c
Silenced a compiler warning. Worked further on /dev/srM test. Not done yet.
2006.12.11.125222 [491]
libburn/mmc.c
libburn/structure.c
Prevented SIGSEGVs when using -atip with my SCSI CD-ROM (sr,sg: no matter)
2006.12.11.134452 [492]
libburn/sg-linux.c
Enabled correct SCSI address parameter registration for /dev/srM.
2006.12.11.145332 [493]
libburn/sg-linux.c
Removed ban on linux_sg_device_family, warning now of linux_sg_accept_any_type
2006.12.11.161952 [494]
libburn/sg-linux.c
Reacted better on failing ioctl(SG_GET_SCSI_ID)
2006.12.11.191826 [495]
libburn/sg-linux.c
cdrskin/cdrskin.c
Trying to identfy CD device via ioctl(CDROM_DRIVE_STATUS)
2006.12.11.215017 [496]
libburn/libburn.h
Appeased doxygen warnings
2006.12.13.170319 [497]
cdrskin/cdrskin.c
Updated dev=help to versions >= 0.2.4, new option --list_ignored_options
13 Dec 2006 [498]
+ cdrskin/cdrskin.1
Detailed man page for cdrskin. Based on work of George Danchev.
2006.12.13.195441 [499]
Makefile.am
Trying to get new man page into release tarball and installation.
13 Dec 2006 [500]
cdrskin/README
Took care for man page
13 Dec 2006 [501]
cdrskin/cdrskin.1
Clarified track content meaning. Corrected some typos and beauty flaws
13 Dec 2006 [502]
cdrskin/README
cdrskin/cdrskin_eng.html
Took more care for man page
------------------------------------ cycle - cdrskin-0.2.7 - 2006.12.13.221921
* detailed man page for cdrskin
13 Dec 2006 [503]
cdrskin/changelog.txt
Next cdrskin-0.2.7 cycle
13 Dec 2006 [504]
cdrskin/cdrskin.1
Explained recordable CD media. Removed a typo.
14 Dec 2006 [505]
cdrskin/cdrskin.1
Unified some nomenclature. Removed an error with dev_translation=
14 Dec 2006 [506]
CONTRIBUTORS
Mentioned George Danchev for his merits about cdrskin man page
2006.12.14.102857 [507]
Makefile.am
cdrskin/cdrskin_eng.html
+ cdrskin/convert_man_to_html.sh
cdrskin/add_ts_changes_to_libburn_0_2_7
Publishing cdrskin.1 as man_1_cdrskin.html
14 Dec 2006 [508]
- doc/comments_test_ts
Removed outdated experiment
------------------------------------ cycle - cdrskin-0.2.7 - 2006.12.14.111807
2006.12.14.140001
+ cdrskin-0.2.6/cdrskin/cdrskin.1
cdrskin-0.2.6/cdrskin/README
cdrskin-0.2.6/cdrskin/cdrskin_eng.html
cdrskin-0.2.6/cdrskin/changelog.txt
Backported manpage to cdrskin-0.2.6 -> pl02 and libburn-0.2.6 -> 0.2.6.2
14 Dec 2006 [509]
cdrskin/cdrskin_eng.html
Re-arranged examples of documentation commands
14 Dec 2006 [510]
cdrskin/cdrskin.1
Corrected alphabetical sorting error
14 Dec 2006 [511]
cdrskin/changelog.txt
Next cdrskin-0.2.7 cycle
14 Dec 2006 [512]
cdrskin/convert_man_to_html.sh
Added some meta info to the document header, changed title to "man 1 cdrskin"
14 Dec 2006 [513]
cdrskin/wiki_plain.txt
Adapted to existence of man page
15 Dec 2006 [514]
cdrskin/cdrskin.1
Clarified drives and their addresses
15 Dec 2006 [515]
cdrskin/convert_man_to_html.sh
Adapted to changes in cdrskin.1
15 Dec 2006 [516]
cdrskin/cdrskin.1
Introduced term "session"
2006.12.16.090001 [518]
cdrskin-0.2.6/Makefile.am
+ cdrskin-0.2.6/cdrskin/cdrskin.1
cdrskin-0.2.6/cdrskin/README
cdrskin-0.2.6/cdrskin/cdrskin_eng.html
cdrskin-0.2.6/cdrskin/changelog.txt
cdrskin-0.2.6/cdrskin/cdrskin_timestamp.h
Backported manpage to libburn-0.2.6.1 -> libburn-0.2.6.2
18 Dec 2006 [519]
cdrskin/cdrskin.1
Made several minor clarifications
2006.12.18.123242 [520]
libburn/mmc.c
Noted some insight about necessity of OPC gained from growisofs_mmc.cpp
2006.12.20.111932 [522]
libburn/transport.h
libburn/options.h
libburn/options.c
libburn/write.c
libburn/sector.c
libburn/mmc.c
libburn/libdax_msgs.h
Prepared experiments for writing to DVD (most easy: DVD+RW)
2006.12.20.142301 [523]
libburn/write.c
libburn/libdax_msgs.h
Refuse to burn audio tracks to DVD
2006.12.20.145222 [524]
libburn/drive.c
libburn/mmc.c
Avoid undefined 43h commands (TOC/ATIP) with non-CD
2006.12.20.170502 [525]
libburn/mmc.c
Corrected DVD+RW track number and nwa with 52h READ TRACK INFORMATION
2006.12.20.171230 [526]
libburn/mmc.c
Corrected bug reported by gcc -O2
2006.12.20.174016 [527]
yylibburn/write.c
Corrected bug reported by gcc -O2
2006.12.20.180214 [528]
cdrskin/cdrskin.c
With -atip report "booktype" for DVD media and no questionable ATIP info
2006.12.20.195421 [529]
cdrskin/cdrskin.c
With -atip on DVD report no RAW/RAW96R among "Supported modes"
2006.12.21.122301 [530]
libburn/write.c
Removed some debugging messages
2006.12.21.122533 [531]
cdrskin/cdrskin.c
DVD speed reporting (and setting for drives which obey BBh SET CD SPEED)
2006.12.21.200556 [532]
libburn/mmc.c
libburn/libdax_msgs.h
DVD speed setting via B6h SET STREAMING, DVD+RW now enabled in vanilla build
2006.12.21.205702 [533]
Disallowed multi flag with DVD+RW (nurses wrong hopes for now)
libburn/write.c
21 Dec 2006 [534]
test/libburner.c
Report media type, avoid self contradicting messages with DVD+RW --multi
2006.12.21.214641 [535]
cdrskin/cdrskin.c
cdrskin/cdrskin.1
cdrskin/README
cdrskin/cdrskin_eng.html
doc/comments
Some bragging about DVD+RW
------------------------------------ cycle - cdrskin-0.2.7 - 2006.12.22.120854
* Burning of DVD+RW media as single-track TAO-like initial session
2006.12.23.102056 [536]
libburn/libburn.h
libburn/options.h
libburn/options.c
libburn/write.c
Adjustable write position for DVD+RW: burn_write_opts_set_start_byte()
2006.12.23.102201 [537]
cdrskin/cdrskin.c
New option write_start_address=
23 Dec 2006 [538]
cdrskin/cdrskin.1
cdrskin/README
cdrskin/convert_man_to_html.sh
Added more info about DVD+RW
2006.12.23.141315 [539]
libburn/libburn.h
libburn/drive.c
libburn/write.c
cdrskin/cdrskin.c
New API function to inquire burn success (and avoid confusing messages)
2006.12.23.184353 [540]
libburn/libburn.h
libburn/write.c
cdrskin/cdrskin.c
More appropriate drive status during format and close of DVD+RW
2006.12.24.140904 [547]
cdrskin/cdrskin.c
libburn/write.c
Fixed a bug with speed measurement at end of DVD+RW burning
2006.12.24.142512 [548]
libburn/options.h
libburn/options.c
libburn/write.c
Made DVD 32k end padding controllable
2006.12.24.154455 [549]
cdrskin/cdrskin.c
Made DVD ignore CD write modes of drive. Made TAO default for DVD+RW.
2006.12.24.182307 [550]
libburn/write.c
Bugfix with DVD+RW : progress indicators were initialized too late
2006.12.24.182410 [551]
libburn/options.c
Bugfix after changes for DVD+RW: start_byte was initialized 0, but must be -1
24 Dec 2006 [552]
test/libburner.c
test/telltoc.c
Removed unnecessary waiting loops after grab, mentioned DVD+RW
2006.12.25.113534 [553]
libburn/libburn.h
libburn/spc.c
libburn/drive.c
Ticket 93: write speeds from mode page 2Ah descriptors
25 Dec 2006 [554]
test/telltoc.c
Adjusted to new (still immature) speed info semantics
2006.12.25.185747 [555]
cdrskin/cdrskin.c
Corrected CD speed conversion factor to 2352*75/1000 = 176.4 kB/s
2006.12.25.190055 [556]
libburn/spc.c
libburn/mmc.h
libburn/mmc.c
libburn/write.c
libburn/libdax_msgs.h
Ticket 93: write speeds from ACh GET PERFORMANCE, Type 03h, DVD media capacity
25 Dec 2006 [557]
test/telltoc.c
Adjusted to new (more mature) speed info semantics
2006.12.25.190811 [558]
libburn/transport.h
Completed revision 556
2006.12.26.170459 [559]
libburn/libburn.h
libburn/transport.h
libburn/drive.h
libburn/drive.c
libburn/mmc.c
libburn/spc.c
New API calls burn_drive_get_speedlist() , burn_drive_free_speedlist()
26 Dec 2006 [560]
test/telltoc.c
Enabled report of speed descriptor list
2006.12.26.184321 [561]
libburn/libburn.h
test/telltoc.c
Minor corrections to revisions 559 and 560
2006.12.27.125948 [562]
libburn/drive.c
Disabled obsolete drive-media-state workaround. (Spinoff of ticket 93 :))
2006.12.27.130125 [563]
libburn/mmc.c
Corrected kB conversion factor to 176.4 with ATIP speed codes
2006.12.27.130239 [564]
cdrskin/cdrskin.c
Defended against a race condition on SuSE 9.3 after -atip (hald et.al. ?)
2006.12.27.132653 [565]
libburn/mmc.c
Avoided self contradicting result of ATIP speed inquiry
2006.12.27.162846 [566]
cdrskin/cdrskin.c
cdrskin/cdrskin.1
Emulated wodim option -msifile=path
2006.12.27.213729 [567]
cdrskin/cdrskin.c
Followed revision 644 of wodim (msifile output without newline)
27 Dec 2006 [568]
cdrskin/cdrskin_eng.html
cdrskin/cdrskin.1
Updated about msifile=path
------------------------------------ cycle - cdrskin-0.2.7 - 2006.12.27.214424
* New option -msifile=path from cdrskit/wodim
2006.12.29.143734 [569]
libburn/mmc.c
Corrected DVD-RW sequential profile name
2006.12.30.001343 [570]
libburn/mmc.h
libburn/mmc.c
libburn/spc.c
libburn/write.c
libburn/libdax_msgs.h
cdrskin/cdrskin.c
Prepared support for DVD-RW in mode Restricted Overwrite
29 Dec 2006 [571]
cdrskin/changelog.txt
Next cdrskin-0.2.7 cycle
2007.01.01.170824 [572]
libburn/libburn.h
libburn/transport.h
libburn/spc.c
libburn/mmc.h
libburn/mmc.c
libburn/async.c
libburn/drive.h
libburn/drive.c
libburn/write.c
libburn/libdax_msgs.h
Prepared formatting of DVD-RW
2007.01.01.171725 [573]
cdrskin/cdrskin.c
cdrskin/README
cdrskin/cdrskin.1
cdrskin/wiki_plain.txt
cdrskin/cdrskin_eng.html
Made use of formatting of DVD-RW
2 Jan 2007 [574]
cdrskin/wiki_plain.txt
Added links to cdrskin help texts
2007.01.02.090530 [575]
COPYRIGHT
README
cdrskin/cdrskin.c
Greeting the new year
------------------------------------ cycle - cdrskin-0.2.7 - 2007.01.02.101027
* Formatting and then burning to DVD-RW like to DVD+RW
2 Jan 2006 [576]
cdrskin/changelog.txt
Next cdrskin-0.2.7 cycle
2 Jan 2006 [577]
cdrskin/wiki_plain.txt
cdrskin/README
Some DVD-RW statements
2 Jan 2006 [578]
test/libburner.c
doc/comments
Made use of formatting of DVD-RW
2 Jan 2006 [579]
cdrskin/cdrskin.1
Some DVD-RW statements
2007.01.03.163026 [583]
libburn/mmc.c
Made formatting report progress (as good as the drive does)
2007.01.03.164716 [584]
libburn/async.c
libburn/drive.c
Moved blanking suitability test before eventual spwaning of threads
2007.01.05.125715 [587]
libburn/mmc.c
libburn/write.c
Comments and name changes from new findings out of reading MMC-5
2007.01.06.120551 [591]
libburn/libburn.h
libburn/transport.h
libburn/mmc.h
libburn/mmc.c
libburn/async.c
libburn/drive.h
libburn/drive.c
libburn/write.c
cdrskin/cdrskin.c
test/libburner.c
New formatting parameter "size". Sorry for changing API. Function is a week old.
8 Jan 2007 [592]
libburn/os-linux.h
libburn/os-freebsd.h
Added note that buffer may not be smaller than 32768
2007.01.08.104222 [593]
libburn/libburn.h
libburn/drive.c
libburn/write.c
libburn/mmc.c
Introduced size parameter to DVD-RW formatting plus writing of zeros.
2007.01.08.104407 [594]
cdrskin/cdrskin.1
cdrskin/cdrskin.c
Using 128 MB of size plus writing of zeros with blank=format_overwrite
2007.01.09.140302 [595]
libburn/drive.c
Fixed a SIGFPE with formatting via libburner
9 Jan 2007 [596]
libburn/libburn.h
libburn/transport.h
libburn/libdax_msgs.h
libburn/drive.c
libburn/write.c
libburn/mmc.c
Enhanced DVD-RW formatting
2007.01.09.211152 [597]
cdrskin/README
cdrskin/cdrskin.1
cdrskin/cdrskin.c
Now available: "quickest" and "full" formatting for DVD-RW
------------------------------------ cycle - cdrskin-0.2.7 - 2007.01.10.101406
10 Jan 2007 [598]
cdrskin/cdrskin_eng.html
Updated size estimation of development downloads
10 Jan 2007 [599]
cdrskin/changelog.txt
Next cdrskin-0.2.7 cycle
2007.01.10.152350 [600]
libburn/libburn.h
libburn/mmc.c
libburn/drive.c
libburn/async.c
cdrskin/cdrskin.c
Option -force enables re-formatting
2007.01.10.152520 [601]
libburn/mmc.c
Switched full formatting from type 10h to 00h which includes lead-out
2007.01.10.152812 [602]
cdrskin/cdrskin.c
cdrskin/cdrskin.1
cdrskin/README
Removed writing of dummy data with blank=format_overwrite_full
2007.01.10.204839 [603]
libburn/mmc.c
libburn/async.c
cdrskin/cdrskin.c
cdrskin/cdrskin.1
Enabled explicit full formatting of DVD+RW ("de-icing")
11 Jan 2007 [604]
cdrskin/README
Removed outdated option from startup file example
2007.01.11.131106 [605]
libburn/mmc.c
With full formatting prefer format 10h over 13h or 15h
2007.01.11.131302 [606]
libburn/os-linux.h
libburn/os-freebsd.h
libburn/cleanup.c
cdrskin/cleanup.c
Kept SIGWINCH from spoiling a burn.
2007.01.11.131615 [607]
libburn/init.c
Sketched better handling of self-inflicted SIGs
2007.01.11.131716 [608]
libburn/drive.c
Removed surplus newlines from messages
2007.01.12.162239 [609]
libburn/write.c
libburn/spc.c
libburn/mmc.c
cdrskin/cdrskin.c
cdrskin/cdrskin.1
Enabled writing to DVD-RAM
2007.01.13.140812 [610] [611]
libburn/sg-linux.c
Implemented debugging messages for ATA enumeration
13 Jan 2007 [612]
cdrskin/cdrskin_eng.html
cdrskin/README
Documentation updates about DVD-RAM
2007.01.13.211425 [613]
libburn/transport.h
libburn/mmc.c
Load array of format capacities into struct burn_drive
2007.01.13.211639 [614]
libburn/libburn.h
libburn/drive.c
libburn/async.c
Introduced API for inspection and selection of format capacities
13 Jan 2007 [615]
test/telltoc.c
Added printing of list of available formats
13 Jan 2007 [616]
test/libburner.c
Mentioned DVD-RAM where appropriate
2007.01.13.214259 [617]
cdrskin/cdrskin.c
Shifted fifo reporting to new 4-times -v verbosity level
2007.01.14.101742 [618]
cdrskin/cdrskin.c
Corrected bug with debug messages for fifo
2007.01.14.115347 [619]
libburn/write.c
Added missing cache sync in case of aborted DVD-RW burns
2007.01.14.133951 [620]
libburn/transport.h
libburn/mmc.c
libburn/write.c
Avoided closing of 0x13-DVD-RW sessions which are not intermediate
15 Jan 2007 [621]
cdrskin/wiki_plain.txt
Updated about overwriteable DVD and pointer to dvd+rw-tools
------------------------------------ cycle - cdrskin-0.2.7 - 2007.01.15.131357
* Burning to DVD-RAM
15 Jan 2007 [623]
cdrskin/changelog.txt
Next cdrskin-0.2.7 cycle
2007.01.16.120001 [tag]
Makefile.am
configure.ac
README
cdrskin/cdrskin.c
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/changelog.txt
Make version number transition to 0.3.0
------------------------------- cycle - cdrskin-0.3.0.pl00 - 2007.01.16.120001
* Improved recognition of unsuitable media types
* Replaced ban of chmod u+s by loud warning
* detailed man page for cdrskin
* Burning of DVD+RW and DVD-RAM media as single-track TAO-like initial session
* Formatting and then burning to DVD-RW like to DVD+RW
* New option -msifile=path from cdrskit/wodim
Post cdrskin/wiki_plain.txt
Format DVD-RAM ?
How to handle finalizing ?
Check wether current_profile is kept up to date with each possible media change
Make drive_info reflect DVD capabilities
Make proper use of reflected capabilities (e.g. in burn_drive_inquire_media())
Rectify mmc_read_atip speed interpretation. 12x media are reported as 10x. I never heard of 6x media.
Sequentially check option list for DVD compliance
(Learn about multi-track with DVD-RW Restricted Overwrite.) My drives don't offer
----------------------------------------- long term intentions: ----------------------------------------- long term intentions:
[] []
Truely recognize media type Ticket 90: failure on USB
[] []
-reset: ioctl(fd,CDROMRESET) ioctl(fd,SG_SCSI_RESET,SG_SCSI_RESET_DEVICE) -reset: ioctl(fd,CDROMRESET) ioctl(fd,SG_SCSI_RESET,SG_SCSI_RESET_DEVICE)
http://developer.osdl.org/dev/robustmutexes/src/fusyn.hg/Documentation/ioctl/cdrom.txt
[] []
Open O_EXCL all devices in address resolution chain Open O_EXCL all devices in address resolution chain

View File

@ -63,9 +63,9 @@ static int signal_list_count= 24;
/* Signals not to be caught */ /* Signals not to be caught */
static int non_signal_list[]= { static int non_signal_list[]= {
SIGKILL, SIGCHLD, SIGSTOP, SIGURG, -1 SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH, -1
}; };
static int non_signal_list_count= 4; static int non_signal_list_count= 5;
#endif /* Cleanup_has_no_libburn_os_H */ #endif /* Cleanup_has_no_libburn_os_H */
@ -75,6 +75,7 @@ static int non_signal_list_count= 4;
/* run time dynamic part */ /* run time dynamic part */
static char cleanup_msg[4096]= {""}; static char cleanup_msg[4096]= {""};
static int cleanup_exiting= 0; static int cleanup_exiting= 0;
static int cleanup_has_reported= -1234567890;
static void *cleanup_app_handle= NULL; static void *cleanup_app_handle= NULL;
static Cleanup_app_handler_T cleanup_app_handler= NULL; static Cleanup_app_handler_T cleanup_app_handler= NULL;
@ -85,8 +86,10 @@ static int Cleanup_handler_exit(int exit_value, int signum, int flag)
{ {
int ret; int ret;
if(cleanup_msg[0]!=0) if(cleanup_msg[0]!=0 && cleanup_has_reported!=signum) {
fprintf(stderr,"\n%s\n",cleanup_msg); fprintf(stderr,"\n%s\n",cleanup_msg);
cleanup_has_reported= signum;
}
if(cleanup_perform_app_handler_first) if(cleanup_perform_app_handler_first)
if(cleanup_app_handler!=NULL) { if(cleanup_app_handler!=NULL) {
ret= (*cleanup_app_handler)(cleanup_app_handle,signum,0); ret= (*cleanup_app_handler)(cleanup_app_handle,signum,0);

View File

@ -7,7 +7,7 @@
debug_opts= debug_opts=
def_opts= def_opts=
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1" largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
libvers="-DCdrskin_libburn_0_2_6" libvers="-DCdrskin_libburn_0_3_0"
cleanup_src_or_obj="libburn/cleanup.o" cleanup_src_or_obj="libburn/cleanup.o"
libdax_msgs_o="libburn/libdax_msgs.o" libdax_msgs_o="libburn/libdax_msgs.o"
libdax_audioxtr_o="libburn/libdax_audioxtr.o" libdax_audioxtr_o="libburn/libdax_audioxtr.o"
@ -33,15 +33,15 @@ do
libdax_audioxtr_o= libdax_audioxtr_o=
libdax_msgs_o="libburn/message.o" libdax_msgs_o="libburn/message.o"
cleanup_src_or_obj="-DCleanup_has_no_libburn_os_H cdrskin/cleanup.c" cleanup_src_or_obj="-DCleanup_has_no_libburn_os_H cdrskin/cleanup.c"
elif test "$i" = "-libburn_0_2_6" elif test "$i" = "-libburn_0_3_0"
then then
libvers="-DCdrskin_libburn_0_2_6" libvers="-DCdrskin_libburn_0_3_0"
libdax_audioxtr_o="libburn/libdax_audioxtr.o" libdax_audioxtr_o="libburn/libdax_audioxtr.o"
libdax_msgs_o="libburn/libdax_msgs.o" libdax_msgs_o="libburn/libdax_msgs.o"
cleanup_src_or_obj="libburn/cleanup.o" cleanup_src_or_obj="libburn/cleanup.o"
elif test "$i" = "-libburn_svn" elif test "$i" = "-libburn_svn"
then then
libvers="-DCdrskin_libburn_0_2_6" libvers="-DCdrskin_libburn_0_3_1"
libdax_audioxtr_o="libburn/libdax_audioxtr.o" libdax_audioxtr_o="libburn/libdax_audioxtr.o"
libdax_msgs_o="libburn/libdax_msgs.o" libdax_msgs_o="libburn/libdax_msgs.o"
cleanup_src_or_obj="libburn/cleanup.o" cleanup_src_or_obj="libburn/cleanup.o"
@ -79,7 +79,7 @@ do
echo " -compile_cdrfifo compile program cdrskin/cdrfifo." echo " -compile_cdrfifo compile program cdrskin/cdrfifo."
echo " -compile_dewav compile program test/dewav without libburn." echo " -compile_dewav compile program test/dewav without libburn."
echo " -cvs_A60220 set macro to match libburn-CVS of 20 Feb 2006." echo " -cvs_A60220 set macro to match libburn-CVS of 20 Feb 2006."
echo " -libburn_0_2_6 set macro to match libburn-0.2.6." echo " -libburn_0_3_0 set macro to match libburn-0.3.0."
echo " -libburn_svn set macro to match current libburn-SVN." echo " -libburn_svn set macro to match current libburn-SVN."
echo " -no_largefile do not use 64 bit off_t (must match libburn)." echo " -no_largefile do not use 64 bit off_t (must match libburn)."
echo " -do_not_compile_cdrskin omit compilation of cdrskin/cdrskin." echo " -do_not_compile_cdrskin omit compilation of cdrskin/cdrskin."

72
cdrskin/convert_man_to_html.sh Executable file
View File

@ -0,0 +1,72 @@
#!/bin/sh
#
# convert_man_to_html.sh - ts A61214
#
# Generates a HTML version of man page cdrskin.1
#
# To be executed within the libburn toplevel directory (like ./libburn-0.2.7)
#
# set -x
man_dir=$(pwd)"/cdrskin"
export MANPATH="$man_dir"
manpage="cdrskin"
raw_html=$(pwd)/"cdrskin/raw_man_1_cdrskin.html"
htmlpage=$(pwd)/"cdrskin/man_1_cdrskin.html"
if test -r "$manpage"
then
dummy=dummy
else
echo "Cannot find readable man page source $1" >&2
exit 1
fi
if test -e "$man_dir"/man1
then
dummy=dummy
else
ln -s . "$man_dir"/man1
fi
if test "$1" = "-work_as_filter"
then
# set -x
sed \
-e 's/<meta name="generator" content="groff -Thtml, see www.gnu.org">/<meta name="generator" content="groff -Thtml, via man -H, via cdrskin\/convert_man_to_html.sh">/' \
-e 's/<meta name="Content-Style" content="text\/css">/<meta name="Content-Style" content="text\/css"><META NAME="description" CONTENT="man page of cdrskin"><META NAME="keywords" CONTENT="man cdrskin, manual, cdrskin, CD, CD-RW, CD-R, burning, cdrecord, compatible"><META NAME="robots" CONTENT="follow">/' \
-e 's/<title>CDRSKIN<\/title>/<title>man 1 cdrskin<\/title>/' \
-e 's/<h1 align=center>CDRSKIN<\/h1>/<h1 align=center>man 1 cdrskin<\/h1>/' \
-e 's/<body>/<body BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>/' \
-e 's/<b>Overview of features:<\/b>/\&nbsp;<BR><b>Overview of features:<\/b>/' \
-e 's/<b>Track recording model:<\/b>/\&nbsp;<BR><b>Track recording model:<\/b>/' \
-e 's/In general there are two types of tracks: data and audio./\&nbsp;<BR>In general there are two types of tracks: data and audio./' \
-e 's/While audio tracks just contain a given/\&nbsp;<BR>While audio tracks just contain a given/' \
-e 's/<b>Recordable CD Media:<\/b>/\&nbsp;<BR><b>Recordable CD Media:<\/b>/' \
-e 's/<b>Recordable DVD Media:<\/b>/\&nbsp;<BR><b>Recordable DVD Media:<\/b>/' \
-e 's/<b>Drive preparation and addressing:<\/b>/\&nbsp;<BR><b>Drive preparation and addressing:<\/b>/' \
-e 's/If you only got one CD capable drive/\&nbsp;<BR>If you only got one CD capable drive/' \
-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/See section EXAMPLES/See section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \
<"$2" >"$htmlpage"
set +x
chmod u+rw,go+r,go-w "$htmlpage"
echo "Emerged file:"
ls -l "$htmlpage"
else
export BROWSER='cp "%s" '"$raw_html"
man -H "$manpage"
"$0" -work_as_filter "$raw_html"
rm "$raw_html"
rm "$man_dir"/man1
fi

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -1,8 +1,9 @@
-------------------------------------------------------------------------- --------------------------------------------------------------------------
cdrskin Wiki - plain text copy cdrskin Wiki - plain text copy
-------------------------------------------------------------------------- --------------------------------------------------------------------------
[[Image(source:/libburn/trunk/cdrskin/doener_150x200_tr.gif)]] [http://en.wikipedia.org/wiki/D%C3%B6ner_kebab Doener]
cdrskin is the cdrecord compatibility middleware of libburn. '''cdrskin is the cdrecord compatibility middleware of libburn.'''
Its paragon, cdrecord, is a powerful GPL'ed burn program included in Joerg 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 Schilling's cdrtools. cdrskin strives to be a second source for the services
@ -12,24 +13,28 @@ Its future ability to burn DVD media depends on the development of libburn.
cdrskin does not contain any bytes copied from cdrecord's sources. cdrskin does not contain any bytes copied from cdrecord's sources.
Many bytes have been copied from the message output of cdrecord Many bytes have been copied from the message output of cdrecord
runs, though. The most comprehensive technical overview of cdrskin runs, though. The most comprehensive technical overview of cdrskin
can be found in cdrskin/README . Online available as : can be found in [http://libburnia.pykix.org/browser/libburn/trunk/cdrskin/README?format=txt cdrskin/README].
http://libburn.pykix.org/browser/trunk/cdrskin/README?format=raw
About libburn API for burning CD: http://libburn-api.pykix.org About libburn API for burning CD: http://libburnia-api.pykix.org
-------------------------------------------------------------------------- --------------------------------------------------------------------------
Appending sessions to an unclosed CD is restricted to write mode TAO. Appending sessions to an unclosed CD is restricted to write mode TAO.
(Users who have a burner which succeeds with a follow-up session via (Users who have a burner which succeeds with a follow-up session via
cdrecord -sao : please contact us.) cdrecord -sao : please contact us.)
cdrskin does not provide DVD burning yet. See advise to use dvd+rw-tools The development version of cdrskin is able to burn a single track to DVD+RW
at the end of this text. or DVD-RW media.
For other DVD types and for appending sessions to ISO filesystems see the
advise to use dvd+rw-tools at the end of this text.
-------------------------------------------------------------------------- --------------------------------------------------------------------------
About the command line options of cdrskin: About the command line options of cdrskin:
They are described in detail in [http://scdbackup.sourceforge.net/man_1_cdrskin_devel.html#OPTIONS section OPTIONS] of
[http://scdbackup.sourceforge.net/man_1_cdrskin_devel.html man cdrskin]
There are two families of options: cdrecord-compatible ones and options There are two families of options: cdrecord-compatible ones and options
which are specific to cdrskin. The latter are mostly used to configure which are specific to cdrskin. The latter are mostly used to configure
cdrskin for its task to emulate cdrecord. There are some, nevertheless, cdrskin for its task to emulate cdrecord. There are some, nevertheless,
@ -39,9 +44,10 @@ The cdrecord-compatible options are listed in the output of
{{{ {{{
cdrskin -help cdrskin -help
}}} }}}
where the option "help" has *one* dash. where the option "help" has *one* dash. Online: [http://scdbackup.sourceforge.net/cdrskin_help_devel cdrskin -help]
For these options you may expect program behavior that is roughly the For these options you may expect program behavior that is roughly the
same as described in original man 1 cdrecord . same as described in original man cdrecord .
Online: http://cdrecord.berlios.de/old/private/man/cdrecord-2.0.html Online: http://cdrecord.berlios.de/old/private/man/cdrecord-2.0.html
@ -49,10 +55,10 @@ The cdrskin-specific options are listed by
{{{ {{{
cdrskin --help cdrskin --help
}}} }}}
where the option "help" has *two* dashes. where the option "help" has *two* dashes. Online: [http://scdbackup.sourceforge.net/cdrskin__help_devel cdrskin --help]
Those have no man page yet. Some are very experimental and should only be Some are very experimental and should only be
used in coordination with the libburn developer team. used in coordination with the libburnia developer team.
Some are of general user interest, though: Some are of general user interest, though:
-------------------------------------------------------------------------- --------------------------------------------------------------------------
@ -77,6 +83,22 @@ has to offer both, r- and w-permission.
-------------------------------------------------------------------------- --------------------------------------------------------------------------
Non-cdrecord blank mode blank=format_overwrite is needed to bring a DVD-RW
disc from its initial profile "Sequential Recording" into profile state
"Restricted Overwrite". The latter is usable with cdrskin.
{{{
cdrskin dev=/dev/sr0 -v blank=format_overwrite
}}}
DVD-RW "Restricted Overwrite" and 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 ...
}}}
--------------------------------------------------------------------------
fifo_start_at=<num> is a throughput enhancer for unsteady data streams fifo_start_at=<num> is a throughput enhancer for unsteady data streams
like they are produced by a compressing archiver program when piping to like they are produced by a compressing archiver program when piping to
CD on-the-fly. It makes better use of the general property of a FIFO CD on-the-fly. It makes better use of the general property of a FIFO
@ -126,6 +148,8 @@ default settings of cdrskin. Possible locations for such settings:
/etc/opt/cdrskin/rc /etc/opt/cdrskin/rc
/etc/cdrskin/cdrskin.conf
$HOME/.cdrskinrc $HOME/.cdrskinrc
-------------------------------------------------------------------------- --------------------------------------------------------------------------
@ -186,12 +210,9 @@ They are not compatible or related to cdrecord resp. cdrecord-ProDVD
(now obsoleted by original source cdrtools cdrecord with identical (now obsoleted by original source cdrtools cdrecord with identical
capabilities besides the license key). capabilities besides the license key).
If there is sincere and well motivated interest, the cdrskin project could try libburn and thus the cdrskin project are currently aquiring own capabilities
to employ growisofs as DVD burning engine. The cdrskin project would prefer to to burn to DVD media. For now restricted to DVD+RW and DVD-RW and to single
wait for DVD support being included in libburn, though. tracks.
A very limited and specialized cdrecord-compatibility wrapper for growisofs
serves in my project scdbackup. It is not overly hard to make one that serves
some very few fixed use cases.
To my knowledge, Linux kernels 2.6 do write to DVD+RW via block devices as To my knowledge, Linux kernels 2.6 do write to DVD+RW via block devices as
they would write to a traditional tape device. Try old tape archiver they would write to a traditional tape device. Try old tape archiver

View File

@ -1,4 +1,4 @@
AC_INIT([libburn], [0.2.6], [http://libburn.pykix.org]) AC_INIT([libburn], [0.3.0], [http://libburnia.pykix.org])
AC_PREREQ([2.50]) AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h]) dnl AC_CONFIG_HEADER([config.h])
@ -24,8 +24,8 @@ dnl
dnl if MAJOR or MINOR version changes, be sure to change AC_INIT above to match dnl if MAJOR or MINOR version changes, be sure to change AC_INIT above to match
dnl dnl
BURN_MAJOR_VERSION=0 BURN_MAJOR_VERSION=0
BURN_MINOR_VERSION=2 BURN_MINOR_VERSION=3
BURN_MICRO_VERSION=6 BURN_MICRO_VERSION=0
BURN_INTERFACE_AGE=0 BURN_INTERFACE_AGE=0
BURN_BINARY_AGE=0 BURN_BINARY_AGE=0
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
@ -63,6 +63,7 @@ AC_C_BIGENDIAN
dnl Large file support dnl Large file support
AC_SYS_LARGEFILE AC_SYS_LARGEFILE
AC_FUNC_FSEEKO AC_FUNC_FSEEKO
AC_CHECK_FUNC([fseeko])
if test ! $ac_cv_func_fseeko; then if test ! $ac_cv_func_fseeko; then
AC_ERROR([Libburn requires largefile support.]) AC_ERROR([Libburn requires largefile support.])
fi fi

View File

@ -1,12 +1,14 @@
/** /**
@author Mario Danic, Thomas Schmitt @author Mario Danic, Thomas Schmitt
@mainpage Libburn Documentation Index @mainpage Libburnia Documentation Index
@section intro Introduction @section intro Introduction
Libburn is an open-source library for reading, mastering and writing Libburnia is an open-source project for reading, mastering and writing
optical discs. For now this means only CD-R and CD-RW. optical discs. For now this means only CD-R and CD-RW.
Support for DVD+RW and DVD-RW is emerging.
The project comprises of several more or less interdependent parts which The project comprises of several more or less interdependent parts which
together strive to be a usable foundation for application development. together strive to be a usable foundation for application development.
@ -18,12 +20,12 @@ 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, advise from a system person about the equivalent of Linux sg or FreeBSD CAM,
volunteers for testing of realistic use cases. volunteers for testing of realistic use cases.
We do have a workable code base for burning data CDs, though. The burn API is We have a workable code base for burning data and audio CDs. The burn API is
quite comprehensively documented and can be used to build a presentable quite comprehensively documented and can be used to build a presentable
application. application.
We do have a functional binary which emulates parts of cdrecord in order to We have a functional binary which emulates the core use cases of cdrecord in
prove that usability, and in order to allow you to explore libburn's scope order to prove that usability, and in order to allow you to explore libburn's
by help of existing cdrecord frontends. scope by help of existing cdrecord frontends.
@subsection components The project components (list subject to growth, hopefully): @subsection components The project components (list subject to growth, hopefully):
@ -82,9 +84,10 @@ libburner is a minimal demo application for the library libburn
(see: libburn/libburn.h) as provided on http://libburn.pykix.org . (see: libburn/libburn.h) as provided on http://libburn.pykix.org .
It can list the available devices, can blank a CD-RW and It can list the available devices, can blank a CD-RW and
can burn to CD-R or CD-RW. can burn to CD-R or CD-RW.
New: burning to DVD+/-RW (single data track, single session only).
It's main purpose, nevertheless, is to show you how to use libburn and also It's main purpose, nevertheless, is to show you how to use libburn and also
to serve the libburn team as reference application. libburner does indeed to serve the libburnia team as reference application. libburner does indeed
define the standard way how above three gestures can be implemented and define the standard way how above three gestures can be implemented and
stay upward compatible for a good while. stay upward compatible for a good while.
@ -93,13 +96,13 @@ stay upward compatible for a good while.
Usage: test/libburner Usage: test/libburner
[--drive <address>|<driveno>|"-"] [--audio] [--drive <address>|<driveno>|"-"] [--audio]
[--blank_fast|--blank_full] [--try_to_simulate] [--blank_fast|--blank_full] [--try_to_simulate]
[<one or more imagefiles>|"-"] [--multi] [one or more imagefiles|"-"]
Examples Examples
A bus scan (needs rw-permissions to see a drive): A bus scan (needs rw-permissions to see a drive):
test/libburner --drive - test/libburner --drive -
Burn a file to drive chosen by number: Burn a file to drive chosen by number, leave appendable:
test/libburner --drive 0 my_image_file test/libburner --drive 0 --multi my_image_file
Burn a file to drive chosen by persistent address: Burn a file to drive chosen by persistent address, close:
test/libburner --drive /dev/hdc my_image_file test/libburner --drive /dev/hdc my_image_file
Blank a used CD-RW (is combinable with burning in one run): Blank a used CD-RW (is combinable with burning in one run):
test/libburner --drive /dev/hdc --blank_fast test/libburner --drive /dev/hdc --blank_fast
@ -107,12 +110,22 @@ Burn two audio tracks
lame --decode -t /path/to/track1.mp3 track1.cd lame --decode -t /path/to/track1.mp3 track1.cd
test/dewav /path/to/track2.wav -o track2.cd test/dewav /path/to/track2.wav -o track2.cd
test/libburner --drive /dev/hdc --audio track1.cd track2.cd test/libburner --drive /dev/hdc --audio track1.cd track2.cd
Burn a compressed afio archive on-the-fly, pad up to 700 MB: Burn a compressed afio archive on-the-fly:
( cd my_directory ; find . -print | afio -oZ - ) | \ ( cd my_directory ; find . -print | afio -oZ - ) | \
test/libburner --drive /dev/hdc - test/libburner --drive /dev/hdc -
To be read from *not mounted* CD via: afio -tvZ /dev/hdc To be read from *not mounted* CD via: afio -tvZ /dev/hdc
Program tar would need a clean EOF which our padded CD cannot deliver. Program tar would need a clean EOF which our padded CD cannot deliver.
</pre> </pre>
libburner has two companions, telltoc and dewav, which help to perform some
peripheral tasks of burning.
telltoc prints a table of content (sessions, tracks and leadouts), it tells
about type and state of CD media, and also is able to provide the necessary
multi-session information for program mkisofs option -C.
See: test/telltoc --help.
dewav extracts raw byte-swapped audio data from files of format .wav (MS WAVE)
or .au (SUN Audio). See example in libburner --help.
@subsection libburner-source Sourceode of libburner @subsection libburner-source Sourceode of libburner

View File

@ -1,121 +0,0 @@
/**
@author Mario Danic, Thomas Schmitt
@mainpage Libburn Documentation Index
@section intro Introduction
Libburn is an open-source library for reading, mastering and writing
optical discs. For now this means only CD-R and CD-RW.
The project comprises of several more or less interdependent parts which
together strive to be a usable foundation for application development.
These are libraries, language bindings, and middleware binaries which emulate
classical (and valuable) Linux tools.
Our scope is currently Linux 2.4 and 2.6 and we will have a hard time to widen
this for now, because of our history. The project could need advise from or
membership of skilled kernel people and people who know how to talk CD/DVD
drives into doing things.
We do have a workable code base for burning data CDs, though. The burn API is
quite comprehensively documented and can be used to build a presentable
application.
We do have a functional binary which emulates parts 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.
@subsection components 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).
libburn is the foundation of our cdrecord emulation.
- libisofs is the library to pack up hard disk files and directories into a
ISO 9660 disk image. This may then be brought to CD via libburn.
libisofs is to be the foundation of our upcoming mkisofs emulation.
- 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.
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.
- "test" is a collection of application gestures and examples given by the
authors of the library features. The main API example of libburn
is named test/libburner.c .
Explore these examples if you look for inspiration.
We plan to be a responsive upstream. Bear with us.
@section using Using the libraries
Our build system is based on autotools.
User experience tells us that you will need at least autotools version 1.7.
To build libburn and its subprojects it should be sufficient to go into
its toplevel directory and execute
- ./bootstrap (needed if you downloaded from SVN)
- ./configure
- make
To make the libraries accessible for running resp. developing applications
- make install
Both libraries are written in C language and get built by autotools.
Thus we expect them to be useable by a wide range of Linux-implemented
languages and development tools.
@section libburner Libburner
libburner is a minimal demo application for the library libburn
(see: libburn/libburn.h) as provided on http://libburn.pykix.org .
It can list the available devices, can blank a CD-RW and
can burn to CD-R or CD-RW.
It's main purpose, nevertheless, is to show you how to use libburn and also
to serve the libburn team as reference application. libburner does indeed
define the standard way how above three gestures can be implemented and
stay upward compatible for a good while.
@subsection libburner-help Libburner --help
<pre>
Usage: test/libburner
[--drive <address>|<driveno>|"-"]
[--verbose <level>] [--blank_fast|--blank_full]
[--burn_for_real|--try_to_simulate] [--stdin_size <bytes>]
[<imagefile>|"-"]
Examples
A bus scan (needs rw-permissions to see a drive):
test/libburner --drive -
Burn a file to drive chosen by number:
test/libburner --drive 0 --burn_for_real my_image_file
Burn a file to drive chosen by persistent address:
test/libburner --drive /dev/hdc --burn_for_real my_image_file
Blank a used CD-RW (is combinable with burning in one run):
test/libburner --drive 0 --blank_fast
Burn a compressed afio archive on-the-fly, pad up to 700 MB:
( cd my_directory ; find . -print | afio -oZ - ) | \
test/libburner --drive /dev/hdc --burn_for_real --stdin_size 734003200 -
To be read from *not mounted* CD via:
afio -tvZ /dev/hdc
Program tar would need a clean EOF which our padded CD cannot deliver.
</pre>
@subsection libburner-source Sourceode of libburner
Click on blue names of functions, structures, variables, etc in oder to
get to the according specs of libburn API or libburner sourcecode.
@include libburner.c
*/

View File

@ -7,9 +7,11 @@
#include "options.h" #include "options.h"
#include "async.h" #include "async.h"
#include "init.h" #include "init.h"
#include "back_hacks.h"
#include <pthread.h> #include <pthread.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
/* /*
#include <a ssert.h> #include <a ssert.h>
@ -35,6 +37,14 @@ struct erase_opts
int fast; int fast;
}; };
/* ts A61230 */
struct format_opts
{
struct burn_drive *drive;
off_t size;
int flag;
};
struct write_opts struct write_opts
{ {
struct burn_drive *drive; struct burn_drive *drive;
@ -42,6 +52,7 @@ struct write_opts
struct burn_disc *disc; struct burn_disc *disc;
}; };
struct w_list struct w_list
{ {
struct burn_drive *drive; struct burn_drive *drive;
@ -53,6 +64,7 @@ struct w_list
{ {
struct scan_opts scan; struct scan_opts scan;
struct erase_opts erase; struct erase_opts erase;
struct format_opts format;
struct write_opts write; struct write_opts write;
} u; } u;
}; };
@ -198,6 +210,9 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
{ {
struct erase_opts o; struct erase_opts o;
/* A70103 : will be set to 0 by burn_disc_erase_sync() */
drive->cancel = 1;
/* ts A61006 */ /* ts A61006 */
/* a ssert(drive); */ /* a ssert(drive); */
/* a ssert(!SCAN_GOING()); */ /* a ssert(!SCAN_GOING()); */
@ -218,11 +233,81 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
return; return;
} }
/* ts A70103 moved up from burn_disc_erase_sync() */
/* ts A60825 : allow on parole to blank appendable CDs */
if ( ! (drive->status == BURN_DISC_FULL ||
(drive->status == BURN_DISC_APPENDABLE &&
! libburn_back_hack_42) ) ) {
libdax_msgs_submit(libdax_messenger, drive->global_index,
0x00020130,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"Drive and media state unsuitable for blanking",
0, 0);
return;
}
o.drive = drive; o.drive = drive;
o.fast = fast; o.fast = fast;
add_worker(drive, (WorkerFunc) erase_worker_func, &o); add_worker(drive, (WorkerFunc) erase_worker_func, &o);
} }
/* ts A61230 */
static void *format_worker_func(struct w_list *w)
{
burn_disc_format_sync(w->u.format.drive, w->u.format.size,
w->u.format.flag);
remove_worker(pthread_self());
return NULL;
}
/* ts A61230 */
void burn_disc_format(struct burn_drive *drive, off_t size, int flag)
{
struct format_opts o;
int ok = 0;
char msg[160];
if ((SCAN_GOING()) || find_worker(drive)) {
libdax_msgs_submit(libdax_messenger, drive->global_index,
0x00020102,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"A drive operation is still going on (want to format)",
0, 0);
return;
}
if (flag & 128) /* application prescribed format type */
flag |= 16; /* enforce re-format */
if (drive->current_profile == 0x14)
ok = 1; /* DVD-RW sequential */
else if (drive->current_profile == 0x13 && (flag & 16))
ok = 1; /* DVD-RW Restricted Overwrite with force bit */
else if (drive->current_profile == 0x1a) {
ok = 1; /* DVD+RW */
size = 0;
flag &= ~(2|8); /* no insisting in size 0, no expansion */
flag |= 4; /* format up to maximum size */
}
if (!ok) {
sprintf(msg,"Will not format media type %4.4Xh",
drive->current_profile);
libdax_msgs_submit(libdax_messenger, drive->global_index,
0x00020129,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
drive->cancel = 1;
return;
}
o.drive = drive;
o.size = size;
o.flag = flag;
add_worker(drive, (WorkerFunc) format_worker_func, &o);
}
static void *write_disc_worker_func(struct w_list *w) static void *write_disc_worker_func(struct w_list *w)
{ {
burn_disc_write_sync(w->u.write.opts, w->u.write.disc); burn_disc_write_sync(w->u.write.opts, w->u.write.disc);

View File

@ -63,9 +63,9 @@ static int signal_list_count= 24;
/* Signals not to be caught */ /* Signals not to be caught */
static int non_signal_list[]= { static int non_signal_list[]= {
SIGKILL, SIGCHLD, SIGSTOP, SIGURG, -1 SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH, -1
}; };
static int non_signal_list_count= 4; static int non_signal_list_count= 5;
#endif /* Cleanup_has_no_libburn_os_H */ #endif /* Cleanup_has_no_libburn_os_H */
@ -75,6 +75,7 @@ static int non_signal_list_count= 4;
/* run time dynamic part */ /* run time dynamic part */
static char cleanup_msg[4096]= {""}; static char cleanup_msg[4096]= {""};
static int cleanup_exiting= 0; static int cleanup_exiting= 0;
static int cleanup_has_reported= -1234567890;
static void *cleanup_app_handle= NULL; static void *cleanup_app_handle= NULL;
static Cleanup_app_handler_T cleanup_app_handler= NULL; static Cleanup_app_handler_T cleanup_app_handler= NULL;
@ -85,8 +86,10 @@ static int Cleanup_handler_exit(int exit_value, int signum, int flag)
{ {
int ret; int ret;
if(cleanup_msg[0]!=0) if(cleanup_msg[0]!=0 && cleanup_has_reported!=signum) {
fprintf(stderr,"\n%s\n",cleanup_msg); fprintf(stderr,"\n%s\n",cleanup_msg);
cleanup_has_reported= signum;
}
if(cleanup_perform_app_handler_first) if(cleanup_perform_app_handler_first)
if(cleanup_app_handler!=NULL) { if(cleanup_app_handler!=NULL) {
ret= (*cleanup_app_handler)(cleanup_app_handle,signum,0); ret= (*cleanup_app_handler)(cleanup_app_handle,signum,0);

View File

@ -25,7 +25,9 @@
#include "util.h" #include "util.h"
#include "sg.h" #include "sg.h"
#include "structure.h" #include "structure.h"
#include "back_hacks.h"
/* ts A70107 : to get BE_CANCELLED */
#include "error.h"
#include "libdax_msgs.h" #include "libdax_msgs.h"
extern struct libdax_msgs *libdax_messenger; extern struct libdax_msgs *libdax_messenger;
@ -54,6 +56,7 @@ void burn_drive_free(struct burn_drive *d)
if (burn_drive_is_open(d)) if (burn_drive_is_open(d))
d->release(d); d->release(d);
free((void *) d->idata); free((void *) d->idata);
burn_mdata_free_subs(d->mdata);
free((void *) d->mdata); free((void *) d->mdata);
if(d->toc_entry != NULL) if(d->toc_entry != NULL)
free((void *) d->toc_entry); free((void *) d->toc_entry);
@ -135,54 +138,39 @@ unsigned int burn_drive_count(void)
return drivetop + 1; return drivetop + 1;
} }
int burn_drive_grab(struct burn_drive *d, int le)
/* ts A61125 : media status aspects of burn_drive_grab() */
int burn_drive_inquire_media(struct burn_drive *d)
{ {
int errcode;
int was_equal = 0, must_equal = 3, max_loop = 20;
/* ts A60907 */ /* ts A61225 : after loading the tray, mode page 2Ah can change */
int loop_count, old_speed = -1234567890, new_speed = -987654321; d->getcaps(d);
int old_erasable = -1234567890, new_erasable = -987654321;
if (!d->released) { /* ts A61020 : d->status was set to BURN_DISC_BLANK as pure guess */
burn_print(1, "can't grab - already grabbed\n");
return 0;
}
errcode = d->grab(d);
if (errcode == 0) {
burn_print(1, "low level drive grab failed\n");
return 0;
}
d->busy = BURN_DRIVE_GRABBING;
if (le)
d->load(d);
d->lock(d);
d->start_unit(d);
/* ts A61020 : this was BURN_DISC_BLANK as pure guess */
d->status = BURN_DISC_UNREADY;
if (d->mdata->cdr_write || d->mdata->cdrw_write || if (d->mdata->cdr_write || d->mdata->cdrw_write ||
d->mdata->dvdr_write || d->mdata->dvdram_write) { d->mdata->dvdr_write || d->mdata->dvdram_write) {
#ifdef Libburn_grab_release_and_grab_agaiN #define Libburn_knows_correct_state_after_loaD 1
#ifdef Libburn_knows_correct_state_after_loaD
d->read_disc_info(d); d->read_disc_info(d);
#else #else
/* ts A61227 : This repeated read_disc_info seems
to be obsoleted by above d->getcaps(d).
*/
/* ts A60908 */ /* ts A60908 */
/* Trying to stabilize the disc status after eventual load /* Trying to stabilize the disc status after eventual load
without closing and re-opening the drive */ without closing and re-opening the drive */
/* This seems to work for burn_disc_erasable() . /* This seems to work for burn_disc_erasable() .
Speed values on RIP-14 and LITE-ON 48125S are stable Speed values on RIP-14 and LITE-ON 48125S are stable
and false, nevertheless. So cdrskin -atip is still and false, nevertheless. */
forced to finish-initialize. */ int was_equal = 0, must_equal = 3, max_loop = 20;
/* int loop_count, old_speed = -1234567890, new_speed= -987654321;
fprintf(stderr,"libburn: experimental: read_disc_info()\n"); int old_erasable = -1234567890, new_erasable = -987654321;
*/
fprintf(stderr,"LIBBURN_DEBUG: read_disc_info()\n");
for (loop_count = 0; loop_count < max_loop; loop_count++){ for (loop_count = 0; loop_count < max_loop; loop_count++){
old_speed = new_speed; old_speed = new_speed;
old_erasable = new_erasable; old_erasable = new_erasable;
@ -202,20 +190,59 @@ int burn_drive_grab(struct burn_drive *d, int le)
was_equal = 0; was_equal = 0;
/* /*
if (loop_count >= 1 && was_equal == 0) if (loop_count >= 1 && was_equal == 0)
fprintf(stderr,"libburn: experimental: %d : speed %d:%d erasable %d:%d\n",
loop_count,old_speed,new_speed,old_erasable,new_erasable);
*/ */
fprintf(stderr,"LIBBURN_DEBUG: %d : speed %d:%d erasable %d:%d\n",
loop_count,old_speed,new_speed,old_erasable,new_erasable);
usleep(100000); usleep(100000);
} }
#endif /* ! Libburn_grab_release_and_grab_agaiN */ #endif /* ! Libburn_knows_correct_state_after_loaD */
} else { } else {
d->read_toc(d); if (d->current_profile == -1 || d->current_is_cd_profile)
d->read_toc(d);
} }
d->busy = BURN_DRIVE_IDLE;
return 1; return 1;
} }
int burn_drive_grab(struct burn_drive *d, int le)
{
int errcode;
/* ts A61125 - A61202 */
int ret, sose;
if (!d->released) {
burn_print(1, "can't grab - already grabbed\n");
return 0;
}
d->status = BURN_DISC_UNREADY;
errcode = d->grab(d);
if (errcode == 0) {
burn_print(1, "low level drive grab failed\n");
return 0;
}
d->busy = BURN_DRIVE_GRABBING;
if (le)
d->load(d);
d->lock(d);
/* ts A61118 */
d->start_unit(d);
/* ts A61202 : gave bit1 of le a meaning */
sose = d->silent_on_scsi_error;
if (!le)
d->silent_on_scsi_error = 1;
/* ts A61125 : outsourced media state inquiry aspects */
ret = burn_drive_inquire_media(d);
d->silent_on_scsi_error = sose;
d->busy = BURN_DRIVE_IDLE;
return ret;
}
struct burn_drive *burn_drive_register(struct burn_drive *d) struct burn_drive *burn_drive_register(struct burn_drive *d)
{ {
#ifdef Libburn_ticket_62_re_register_is_possiblE #ifdef Libburn_ticket_62_re_register_is_possiblE
@ -311,6 +338,28 @@ struct burn_drive *burn_drive_finish_enum(struct burn_drive *d)
} }
/* ts A61125 : model aspects of burn_drive_release */
int burn_drive_mark_unready(struct burn_drive *d)
{
/* ts A61020 : mark media info as invalid */
d->start_lba= -2000000000;
d->end_lba= -2000000000;
/* ts A61202 */
d->current_profile = -1;
d->status = BURN_DISC_UNREADY;
if (d->toc_entry != NULL)
free(d->toc_entry);
d->toc_entry = NULL;
d->toc_entries = 0;
if (d->disc != NULL) {
burn_disc_free(d->disc);
d->disc = NULL;
}
return 1;
}
void burn_drive_release(struct burn_drive *d, int le) void burn_drive_release(struct burn_drive *d, int le)
{ {
if (d->released) { if (d->released) {
@ -334,26 +383,14 @@ void burn_drive_release(struct burn_drive *d, int le)
return; return;
} }
/* ts A61020 : mark media info as invalid */
d->start_lba= -2000000000;
d->end_lba= -2000000000;
d->unlock(d); d->unlock(d);
if (le) if (le)
d->eject(d); d->eject(d);
d->release(d); d->release(d);
d->status = BURN_DISC_UNREADY;
d->released = 1; d->released = 1;
if (d->toc_entry != NULL)
free(d->toc_entry); /* ts A61125 : outsourced model aspects */
d->toc_entry = NULL; burn_drive_mark_unready(d);
d->toc_entries = 0;
if (d->disc != NULL) {
burn_disc_free(d->disc);
d->disc = NULL;
}
} }
@ -409,11 +446,6 @@ void burn_disc_erase_sync(struct burn_drive *d, int fast)
burn_print(1, "erasing drive %s %s\n", d->idata->vendor, burn_print(1, "erasing drive %s %s\n", d->idata->vendor,
d->idata->product); d->idata->product);
/* ts A60825 : allow on parole to blank appendable CDs */
if ( ! (d->status == BURN_DISC_FULL ||
(d->status == BURN_DISC_APPENDABLE &&
! libburn_back_hack_42) ) )
return;
d->cancel = 0; d->cancel = 0;
d->busy = BURN_DRIVE_ERASING; d->busy = BURN_DRIVE_ERASING;
d->erase(d, fast); d->erase(d, fast);
@ -431,12 +463,147 @@ void burn_disc_erase_sync(struct burn_drive *d, int fast)
while (!d->test_unit_ready(d) && d->get_erase_progress(d) == 0) while (!d->test_unit_ready(d) && d->get_erase_progress(d) == 0)
sleep(1); sleep(1);
while ((d->progress.sector = d->get_erase_progress(d)) > 0 || while ((d->progress.sector = d->get_erase_progress(d)) > 0 ||
!d->test_unit_ready(d)) !d->test_unit_ready(d))
sleep(1); sleep(1);
d->progress.sector = 0x10000; d->progress.sector = 0x10000;
/* ts A61125 : update media state records */
burn_drive_mark_unready(d);
burn_drive_inquire_media(d);
d->busy = BURN_DRIVE_IDLE; d->busy = BURN_DRIVE_IDLE;
} }
/*
@param flag: bit0 = fill formatted size with zeros
bit1, bit2 , bit4, bit7 - bit15 are for d->format_unit()
*/
void burn_disc_format_sync(struct burn_drive *d, off_t size, int flag)
{
int ret, buf_secs, err, i, stages = 1, pbase, pfill, pseudo_sector;
off_t num_bufs;
char msg[80];
struct buffer buf;
/* reset the progress */
d->progress.session = 0;
d->progress.sessions = 1;
d->progress.track = 0;
d->progress.tracks = 1;
d->progress.index = 0;
d->progress.indices = 1;
d->progress.start_sector = 0;
d->progress.sectors = 0x10000;
d->progress.sector = 0;
stages = 1 + ((flag & 1) && size > 1024 * 1024);
d->cancel = 0;
d->busy = BURN_DRIVE_FORMATTING;
ret = d->format_unit(d, size, flag & 0xff96); /* forward bits */
if (ret <= 0)
d->cancel = 1;
while (!d->test_unit_ready(d) && d->get_erase_progress(d) == 0)
sleep(1);
while ((pseudo_sector = d->get_erase_progress(d)) > 0 ||
!d->test_unit_ready(d)) {
d->progress.sector = pseudo_sector / stages;
sleep(1);
}
d->sync_cache(d);
if (size <= 0)
goto ex;
/* update media state records */
burn_drive_mark_unready(d);
burn_drive_inquire_media(d);
if (flag & 1) {
/* write size in zeros */;
pbase = 0x8000 + 0x7fff * (stages == 1);
pfill = 0xffff - pbase;
buf_secs = 16; /* Must not be more than 16 */
num_bufs = size / buf_secs / 2048;
if (num_bufs > 0x7fffffff) {
d->cancel = 1;
goto ex;
}
/* <<< */
sprintf(msg,
"Writing %.f sectors of zeros to formatted media",
(double) num_bufs * (double) buf_secs);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
msg, 0, 0);
d->buffer = &buf;
memset(d->buffer, 0, sizeof(struct buffer));
d->buffer->bytes = buf_secs * 2048;
d->buffer->sectors = buf_secs;
d->busy = BURN_DRIVE_WRITING;
for (i = 0; i < num_bufs; i++) {
d->nwa = i * buf_secs;
err = d->write(d, d->nwa, d->buffer);
if (err == BE_CANCELLED || d->cancel) {
d->cancel = 1;
break;
}
d->progress.sector = pbase
+ pfill * ((double) i / (double) num_bufs);
}
d->sync_cache(d);
if (d->current_profile == 0x13 || d->current_profile == 0x1a) {
/* DVD-RW or DVD+RW */
d->busy = BURN_DRIVE_CLOSING_SESSION;
/* CLOSE SESSION, 010b */
d->close_track_session(d, 1, 0);
d->busy = BURN_DRIVE_WRITING;
}
}
ex:;
d->progress.sector = 0x10000;
d->busy = BURN_DRIVE_IDLE;
d->buffer = NULL;
}
/* ts A70112 API */
int burn_disc_get_formats(struct burn_drive *d, int *status, off_t *size,
unsigned *bl_sas, int *num_formats)
{
int ret;
*status = 0;
*size = 0;
*bl_sas = 0;
*num_formats = 0;
ret = d->read_format_capacities(d, 0x00);
if (ret <= 0)
return 0;
*status = d->format_descr_type;
*size = d->format_curr_max_size;
*bl_sas = d->format_curr_blsas;
*num_formats = d->num_format_descr;
return 1;
}
/* ts A70112 API */
int burn_disc_get_format_descr(struct burn_drive *d, int index,
int *type, off_t *size, unsigned *tdp)
{
*type = 0;
*size = 0;
*tdp = 0;
if (index < 0 || index >= d->num_format_descr)
return 0;
*type = d->format_descriptors[index].type;
*size = d->format_descriptors[index].size;
*tdp = d->format_descriptors[index].tdp;
return 1;
}
enum burn_disc_status burn_disc_get_status(struct burn_drive *d) enum burn_disc_status burn_disc_get_status(struct burn_drive *d)
{ {
/* ts A61007 */ /* ts A61007 */
@ -1015,7 +1182,7 @@ int burn_drive_find_scsi_equiv(char *path, char adr[])
ret = burn_drive_obtain_scsi_adr(path, &bus_no, &host_no, &channel_no, ret = burn_drive_obtain_scsi_adr(path, &bus_no, &host_no, &channel_no,
&target_no, &lun_no); &target_no, &lun_no);
if(ret <= 0) { if(ret <= 0) {
sprintf(msg,"burn_drive_obtain_scsi_adr( %s ) returns %d\n", sprintf(msg,"burn_drive_obtain_scsi_adr( %s ) returns %d",
path, ret); path, ret);
burn_drive_adr_debug_msg(msg, NULL); burn_drive_adr_debug_msg(msg, NULL);
return 0; return 0;
@ -1102,7 +1269,7 @@ int burn_abort_pacifier(void *handle, int patience, int elapsed)
} }
/** Abort any running drive operation and finis libburn. /** Abort any running drive operation and finish libburn.
@param patience Maximum number of seconds to wait for drives to finish @param patience Maximum number of seconds to wait for drives to finish
@param pacifier_func Function to produce appeasing messages. See @param pacifier_func Function to produce appeasing messages. See
burn_abort_pacifier() for an example. burn_abort_pacifier() for an example.
@ -1200,8 +1367,13 @@ int burn_disc_read_atip(struct burn_drive *d)
0, 0); 0, 0);
return -1; return -1;
} }
d->read_atip(d); if (d->current_profile == -1 || d->current_is_cd_profile) {
/* >>> some control of success would be nice :) */ d->read_atip(d);
/* >>> some control of success would be nice :) */
} else {
/* mmc5r03c.pdf 6.26.3.6.3 : ATIP is undefined for non-CD */;
return 0;
}
return 1; return 1;
} }
@ -1233,3 +1405,127 @@ int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
return ret; return ret;
} }
/* ts A61202 : New API function */
int burn_disc_get_profile(struct burn_drive *d, int *pno, char name[80])
{
*pno = d->current_profile;
strcpy(name,d->current_profile_text);
return *pno >= 0;
}
/* ts A61223 : New API function */
int burn_drive_wrote_well(struct burn_drive *d)
{
return !d->cancel;
}
/* ts A61226 */
int burn_speed_descriptor_new(struct burn_speed_descriptor **s,
struct burn_speed_descriptor *prev,
struct burn_speed_descriptor *next, int flag)
{
struct burn_speed_descriptor *o;
(*s) = o = malloc(sizeof(struct burn_speed_descriptor));
if (o == NULL)
return -1;
o->source = 0;
o->profile_loaded = -2;
o->profile_name[0] = 0;
o->wrc = 0;
o->exact = 0;
o->mrw = 0;
o->end_lba = -1;
o->write_speed = 0;
o->read_speed = 0;
o->prev = prev;
if (prev != NULL) {
next = prev->next;
prev->next = o;
}
o->next = next;
if (next != NULL)
next->prev = o;
return 1;
}
/* ts A61226 */
/* @param flag bit0= destroy whole next-chain of descriptors */
int burn_speed_descriptor_destroy(struct burn_speed_descriptor **s, int flag)
{
struct burn_speed_descriptor *next, *o;
if ((*s) == NULL)
return 0;
if (flag&1)
for (o = (*s); o->prev != NULL; o = o->prev);
else
o = (*s);
next = o->next;
if (next != NULL)
next->prev = o->prev;
if (o->prev != NULL)
o->prev->next = next;
free((char *) (*s));
(*s) = NULL;
if (flag&1)
return burn_speed_descriptor_destroy(&next, flag&1);
return 1;
}
/* ts A61226 */
int burn_speed_descriptor_copy(struct burn_speed_descriptor *from,
struct burn_speed_descriptor *to, int flag)
{
to->source = from->source;
to->profile_loaded = from->profile_loaded;
strcpy(to->profile_name, from->profile_name);
to->wrc = from->wrc;
to->exact = from->exact;
to->mrw = from->mrw;
to->end_lba = from->end_lba;
to->write_speed = from->write_speed;
to->read_speed = from->read_speed;
return 1;
}
/* ts A61226 : free dynamically allocated sub data of struct scsi_mode_data */
int burn_mdata_free_subs(struct scsi_mode_data *m)
{
burn_speed_descriptor_destroy(&(m->speed_descriptors), 1);
return 1;
}
/* ts A61226 : API function */
int burn_drive_get_speedlist(struct burn_drive *d,
struct burn_speed_descriptor **speed_list)
{
int ret;
struct burn_speed_descriptor *sd, *csd = NULL;
(*speed_list) = NULL;
for (sd = d->mdata->speed_descriptors; sd != NULL; sd = sd->next) {
ret = burn_speed_descriptor_new(&csd, NULL, csd, 0);
if (ret <= 0)
return -1;
burn_speed_descriptor_copy(sd, csd, 0);
}
(*speed_list) = csd;
return (csd != NULL);
}
/* ts A61226 : API function */
int burn_drive_free_speedlist(struct burn_speed_descriptor **speed_list)
{
return burn_speed_descriptor_destroy(speed_list, 1);
}

View File

@ -10,6 +10,8 @@
struct burn_drive; struct burn_drive;
struct command; struct command;
struct mempage; struct mempage;
struct scsi_mode_data;
struct burn_speed_descriptor;
#define LEAD_IN 1 #define LEAD_IN 1
#define GAP 2 #define GAP 2
@ -69,5 +71,28 @@ int burn_setup_drive(struct burn_drive *d, char *fname);
*/ */
struct burn_drive *burn_drive_finish_enum(struct burn_drive *d); struct burn_drive *burn_drive_finish_enum(struct burn_drive *d);
/* ts A61125 : media status aspects of burn_drive_grab() */
int burn_drive_inquire_media(struct burn_drive *d);
/* ts A61125 : model aspects of burn_drive_release */
int burn_drive_mark_unready(struct burn_drive *d);
/* ts A61226 */
int burn_speed_descriptor_new(struct burn_speed_descriptor **s,
struct burn_speed_descriptor *prev,
struct burn_speed_descriptor *next, int flag);
/* ts A61226 */
/* @param flag bit0= destroy whole next-chain of descriptors */
int burn_speed_descriptor_destroy(struct burn_speed_descriptor **s, int flag);
/* ts A61226 : free dynamically allocated sub data of struct scsi_mode_data */
int burn_mdata_free_subs(struct scsi_mode_data *m);
/* ts A61230 */
void burn_disc_format_sync(struct burn_drive *d, off_t size, int flag);
#endif /* __DRIVE */ #endif /* __DRIVE */

View File

@ -209,8 +209,38 @@ ex:
int burn_builtin_abort_handler(void *handle, int signum, int flag) int burn_builtin_abort_handler(void *handle, int signum, int flag)
{ {
if(getpid() != abort_control_pid) if(getpid() != abort_control_pid) {
#ifdef Not_yeT
pthread_t thread_id;
/* >>> need better handling of self-induced SIGs
like SIGSEGV or SIGFPE.
Like bonking the control thread if it did not show up
after a short while.
*/
/* >>> if this is a non-fatal signal : return -2 */
thread_id = pthread_self();
/* >>> find thread_id in worker list of async.c */
/* >>> if owning a drive : mark idle and canceled
(can't do anything more) */
usleep(1000000); /* calm down */
/* forward signal to control thread */
if (abort_control_pid>1)
kill(abort_control_pid, signum);
/* >>> ??? end thread */;
#else
usleep(1000000); /* calm down */
return -2; return -2;
#endif /* ! Not_yeT */
}
Cleanup_set_handlers(NULL, NULL, 2); Cleanup_set_handlers(NULL, NULL, 2);
fprintf(stderr,"%sABORT : Trying to shut down drive and library\n", fprintf(stderr,"%sABORT : Trying to shut down drive and library\n",
abort_message_prefix); abort_message_prefix);

View File

@ -229,7 +229,11 @@ enum burn_drive_status
/** The drive is told to close a track (TAO only) */ /** The drive is told to close a track (TAO only) */
BURN_DRIVE_CLOSING_TRACK, BURN_DRIVE_CLOSING_TRACK,
/** The drive is told to close a session (TAO only) */ /** The drive is told to close a session (TAO only) */
BURN_DRIVE_CLOSING_SESSION BURN_DRIVE_CLOSING_SESSION,
/* ts A61223 */
/** The drive is formatting media */
BURN_DRIVE_FORMATTING
}; };
@ -410,6 +414,55 @@ struct burn_progress {
unsigned buffer_min_fill; unsigned buffer_min_fill;
}; };
/* ts A61226 */
/** 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
of the chain. This list is set up by burn_drive_scan() and gets updated
by burn_drive_grab().
A copy may be obtained by burn_drive_get_speedlist() and disposed by
burn_drive_free_speedlist().
For technical background info see SCSI specs MMC and SPC:
mode page 2Ah (from SPC 5Ah MODE SENSE) , mmc3r10g.pdf , 6.3.11 Table 364
ACh GET PERFORMANCE, Type 03h , mmc5r03c.pdf , 6.8.5.3 Table 312
*/
struct burn_speed_descriptor {
/** Where this info comes from :
0 = misc , 1 = mode page 2Ah , 2 = ACh GET PERFORMANCE */
int source;
/** The media type that was current at the time of report
-2 = state unknown, -1 = no media was loaded , else see
burn_disc_get_profile() */
int profile_loaded;
char profile_name[80];
/** The attributed capacity of appropriate media in logical block units
i.e. 2352 raw bytes or 2048 data bytes. -1 = capacity unknown. */
int end_lba;
/** Speed is given in 1000 bytes/s , 0 = invalid. The numbers
are supposed to be usable with burn_drive_set_speed() */
int write_speed;
int read_speed;
/** Expert info from ACh GET PERFORMANCE and/or mode page 2Ah.
Expect values other than 0 or 1 to get a meaning in future.*/
/* Rotational control: 0 = CLV/default , 1 = CAV */
int wrc;
/* 1 = drive promises reported performance over full media */
int exact;
/* 1 = suitable for mixture of read and write */
int mrw;
/** List chaining. Use .next until NULL to iterate over the list */
struct burn_speed_descriptor *prev;
struct burn_speed_descriptor *next;
};
/** Initialize the library. /** Initialize the library.
This must be called before using any other functions in the library. It This must be called before using any other functions in the library. It
may be called more than once with no effect. may be called more than once with no effect.
@ -441,6 +494,7 @@ void burn_finish(void);
@param patience Maximum number of seconds to wait for drives to finish @param patience Maximum number of seconds to wait for drives to finish
@param pacifier_func If not NULL: a function to produce appeasing messages. @param pacifier_func If not NULL: a function to produce appeasing messages.
See burn_abort_pacifier() for an example. See burn_abort_pacifier() for an example.
@param handle Opaque handle to be used with pacifier_func
@return 1 ok, all went well @return 1 ok, all went well
0 had to leave a drive in unclean state 0 had to leave a drive in unclean state
<0 severe error, do no use libburn again <0 severe error, do no use libburn again
@ -615,6 +669,11 @@ int burn_drive_convert_fs_adr(char *path, char adr[]);
then it is not decisive and the first enumerated address which matches then it is not decisive and the first enumerated address which matches
the >= 0 parameters is taken as result. the >= 0 parameters is taken as result.
Note: bus and (host,channel) are supposed to be redundant. Note: bus and (host,channel) are supposed to be redundant.
@param bus_no "Bus Number" (something like a virtual controller)
@param host_no "Host Number" (something like half a virtual controller)
@param channel_no "Channel Number" (other half of "Host Number")
@param target_no "Target Number" or "SCSI Id" (a device)
@param lun_no "Logical Unit Number" (a sub device)
@param adr An application provided array of at least BURN_DRIVE_ADR_LEN @param adr An application provided array of at least BURN_DRIVE_ADR_LEN
characters size. The persistent address gets copied to it. characters size. The persistent address gets copied to it.
@return 1 = success , 0 = failure , -1 = severe error @return 1 = success , 0 = failure , -1 = severe error
@ -715,11 +774,24 @@ int burn_drive_get_start_end_lba(struct burn_drive *drive,
@param d The drive to query. @param d The drive to query.
@param o If not NULL: write parameters to be set on drive before query @param o If not NULL: write parameters to be set on drive before query
@param trackno 0=next track to come, >0 number of existing track @param trackno 0=next track to come, >0 number of existing track
@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 @return 1=nwa is valid , 0=nwa is not valid , -1=error
*/ */
int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o, int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
int trackno, int *lba, int *nwa); int trackno, int *lba, int *nwa);
/* ts A61202 */
/** 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",
0x12 "DVD-RAM", 0x13 "DVD-RW restricted overwrite" or 0x1a "DVD+RW".
@param d The drive where the media is inserted.
@param pno Profile Number as of mmc5r03c.pdf, table 89
@param name Profile Name (e.g "CD-RW", unknown profiles have empty name)
@return 1 profile is valid, 0 no profile info available
*/
int burn_disc_get_profile(struct burn_drive *d, int *pno, char name[80]);
/** Tells whether a disc can be erased or not /** Tells whether a disc can be erased or not
@return Non-zero means erasable @return Non-zero means erasable
@ -747,7 +819,7 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive);
void burn_write_opts_free(struct burn_write_opts *opts); void burn_write_opts_free(struct burn_write_opts *opts);
/** Creates a read_opts struct for reading from the specified drive /** Creates a read_opts struct for reading from the specified drive
must be freed with burn_write_opts_free must be freed with burn_read_opts_free
@param drive The drive to read from @param drive The drive to read from
@return The read_opts @return The read_opts
*/ */
@ -769,7 +841,79 @@ void burn_read_opts_free(struct burn_read_opts *opts);
*/ */
void burn_disc_erase(struct burn_drive *drive, int fast); void burn_disc_erase(struct burn_drive *drive, int fast);
/* ts A61109 : this is defunct */
/* ts A70101 - A70112 */
/** 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.
@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.
@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
bit3= -reserved-
bit4= enforce re-format of (partly) formatted media
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.
If bit7 is set, bit4 is set automatically.
*/
void burn_disc_format(struct burn_drive *drive, off_t size, int flag);
/* ts A70112 */
/** Possible formatting status values */
#define BURN_FORMAT_IS_UNFORMATTED 1
#define BURN_FORMAT_IS_FORMATTED 2
#define BURN_FORMAT_IS_UNKNOWN 3
/** 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.
Media type can be determined via burn_disc_get_profile().
@param drive The drive with the disc to format.
@param status The current formatting status of the inserted media.
See BURN_FORMAT_IS_* macros. Note: "unknown" is the
legal status for quick formatted, yet unwritten DVD-RW.
@param size The size in bytes associated with status.
unformatted: the maximum achievable size of the media
formatted: the currently formatted capacity
unknown: maximum capacity of drive or of media
@param bl_sas Additional info "Block Length/Spare Area Size".
Expected to be constantly 2048 for non-BD media.
@param num_formats The number of available formats. To be used with
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
*/
int burn_disc_get_formats(struct burn_drive *drive, int *status, off_t *size,
unsigned *bl_sas, int *num_formats);
/** 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
parameter from burn_disc_get_formats() : num_formats - 1
@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
@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
*/
int burn_disc_get_format_descr(struct burn_drive *drive, int index,
int *type, off_t *size, unsigned *tdp);
/* ts A61109 : this was and is defunct */
/** Read a disc from the drive and write it to an fd pair. The drive must be /** Read a disc from the drive and write it to an fd pair. The drive must be
grabbed successfully BEFORE calling this function. Always ensure that the grabbed successfully BEFORE calling this function. Always ensure that the
drive reports a status of BURN_DISC_FULL before calling this function. drive reports a status of BURN_DISC_FULL before calling this function.
@ -793,6 +937,17 @@ void burn_disc_write(struct burn_write_opts *o, struct burn_disc *disc);
*/ */
void burn_drive_cancel(struct burn_drive *drive); void burn_drive_cancel(struct burn_drive *drive);
/* ts A61223 */
/** Inquire wether the most recent write run was successful. Reasons for
non-success may be: rejection of burn parameters, abort during fatal errors
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
*/
int burn_drive_wrote_well(struct burn_drive *d);
/** Convert a minute-second-frame (MSF) value to sector count /** Convert a minute-second-frame (MSF) value to sector count
@param m Minute component @param m Minute component
@param s Second component @param s Second component
@ -1044,13 +1199,26 @@ void burn_write_opts_set_mediacatalog(struct burn_write_opts *opts, unsigned cha
/* ts A61106 */ /* ts A61106 */
/* Sets the multi flag which eventually marks the emerging session as not being /** Sets the multi flag which eventually marks the emerging session as not
the last one and thus creating a BURN_DISC_APPENDABLE media. being the last one and thus creating a BURN_DISC_APPENDABLE media.
@param multi 1=media will be appendable, 0=media will be closed (default) @param multi 1=media will be appendable, 0=media will be closed (default)
*/ */
void burn_write_opts_set_multi(struct burn_write_opts *opts, int multi); void burn_write_opts_set_multi(struct burn_write_opts *opts, int multi);
/* ts A61222 */
/** Sets a start address for writing to media and write modes which allow to
choose this address at all (DVD+RW, DVD-RAM, DVD-RW only for now). The
address is given in bytes. If it is not -1 then a write run will fail if
choice of start address is not supported or if the block alignment of the
address is not suitable for media and write mode. (Alignment to 32 kB
blocks is advised with DVD media.)
@param opts The write opts to change
@param value The address in bytes (-1 = start at default address)
*/
void burn_write_opts_set_start_byte(struct burn_write_opts *opts, off_t value);
/** Sets whether to read in raw mode or not /** Sets whether to read in raw mode or not
@param opts The read opts to change @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 @param raw_mode If non-zero, reading will be done in raw mode, so that everything in the data tracks on the
@ -1106,7 +1274,9 @@ void burn_read_opts_transfer_damaged_blocks(struct burn_read_opts *opts,
void burn_read_opts_set_hardware_error_retries(struct burn_read_opts *opts, void burn_read_opts_set_hardware_error_retries(struct burn_read_opts *opts,
unsigned char hardware_error_retries); unsigned char hardware_error_retries);
/** Gets the maximum write speed for a drive /** Gets the maximum write speed for a drive and eventually loaded media.
The return value might change by the media type of already loaded media,
again by call burn_drive_grab() and again by call burn_disc_read_atip().
@param d Drive to query @param d Drive to query
@return Maximum write speed in K/s @return Maximum write speed in K/s
*/ */
@ -1114,8 +1284,9 @@ int burn_drive_get_write_speed(struct burn_drive *d);
/* ts A61021 */ /* ts A61021 */
/** Gets the minimum write speed for a drive. This might differ from /** Gets the minimum write speed for a drive and eventually loaded media.
burn_drive_get_write_speed() only after burn_disc_read_atip() The return value might change by the media type of already loaded media,
again by call burn_drive_grab() and again by call burn_disc_read_atip().
@param d Drive to query @param d Drive to query
@return Minimum write speed in K/s @return Minimum write speed in K/s
*/ */
@ -1128,6 +1299,31 @@ int burn_drive_get_min_write_speed(struct burn_drive *d);
*/ */
int burn_drive_get_read_speed(struct burn_drive *d); int burn_drive_get_read_speed(struct burn_drive *d);
/* ts A61226 */
/** Obtain a copy of the current speed descriptor list. The drive's list gets
updated on various occasions such as burn_drive_grab() but the copy
obtained here stays untouched. It has to be disposed via
burn_drive_free_speedlist() when it is not longer needed. Speeds
may appear several times in the list. The list content depends much on
drive and media type. It seems that .source == 1 applies mostly to CD media
whereas .source == 2 applies to any media.
@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
*/
int burn_drive_get_speedlist(struct burn_drive *d,
struct burn_speed_descriptor **speed_list);
/* ts A61226 */
/** Dispose a speed descriptor list copy which was obtained by
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
*/
int burn_drive_free_speedlist(struct burn_speed_descriptor **speed_list);
/** Gets a copy of the toc_entry structure associated with a track /** Gets a copy of the toc_entry structure associated with a track
@param t Track to get the entry from @param t Track to get the entry from
@param entry Struct for the library to fill out @param entry Struct for the library to fill out
@ -1205,9 +1401,10 @@ int burn_msgs_set_severities(char *queue_severity,
/** Obtain the oldest pending libburn message from the queue which has at /** Obtain the oldest pending libburn message from the queue which has at
least the given minimum_severity. This message and any older message of least the given minimum_severity. This message and any older message of
lower severity will get discarded from the queue and is then lost forever. lower severity will get discarded from the queue and is then lost forever.
Severity may be one of "NEVER", "FATAL", "SORRY", "WARNING", "HINT", @param minimum_severity may be one of "NEVER", "FATAL", "SORRY",
"NOTE", "UPDATE", "DEBUG", "ALL". To call with minimum_severity "NEVER" "WARNING", "HINT", "NOTE", "UPDATE", "DEBUG", "ALL".
will discard the whole queue. To call with minimum_severity "NEVER" will discard the
whole queue.
@param error_code Will become a unique error code as liste in @param error_code Will become a unique error code as liste in
libburn/libdax_msgs.h libburn/libdax_msgs.h
@param msg_text Must provide at least BURN_MSGS_MESSAGE_LEN bytes. @param msg_text Must provide at least BURN_MSGS_MESSAGE_LEN bytes.

View File

@ -334,7 +334,22 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
0x0002011a (NOTE,HIGH) = Padding up track to minimum size 0x0002011a (NOTE,HIGH) = Padding up track to minimum size
0x0002011b (FATAL,HIGH) = Attempt to read track info from ungrabbed drive 0x0002011b (FATAL,HIGH) = Attempt to read track info from ungrabbed drive
0x0002011c (FATAL,HIGH) = Attempt to read track info from busy drive 0x0002011c (FATAL,HIGH) = Attempt to read track info from busy drive
0x0002011d (FATAL,HIGH) = SCSI error condition on write 0x0002011d (FATAL,HIGH) = SCSI error on write
0x0002011e (SORRY,HIGH) = Unsuitable media detected
0x0002011f (SORRY,HIGH) = Burning is restricted to a single track
0x00020120 (NOTE,HIGH) = FORMAT UNIT ignored
0x00020121 (FATAL,HIGH) = Write preparation setup failed
0x00020122 (FATAL,HIGH) = SCSI error on format_unit
0x00020123 (SORRY,HIGH) = DVD Media are unsuitable for desired track type
0x00020124 (SORRY,HIGH) = SCSI error on set_streaming
0x00020125 (SORRY,HIGH) = Write start address not supported
0x00020126 (SORRY,HIGH) = Write start address not properly aligned
0x00020127 (NOTE,HIGH) = Write start address is ...
0x00020128 (FATAL,HIGH) = Unsupported inquiry_type with mmc_get_performance
0x00020129 (SORRY,HIGH) = Will not format media type
0x00020130 (SORRY,HIGH) = Drive and media state unsuitable for blanking
0x00020131 (SORRY,HIGH) = No suitable formatting type offered by drive
libdax_audioxtr: libdax_audioxtr:
0x00020200 (SORRY,HIGH) = Cannot open audio source file 0x00020200 (SORRY,HIGH) = Cannot open audio source file

File diff suppressed because it is too large Load Diff

View File

@ -51,4 +51,22 @@ int mmc_read_buffer_capacity(struct burn_drive *d);
*/ */
int mmc_setup_drive(struct burn_drive *d); int mmc_setup_drive(struct burn_drive *d);
/* ts A61219 : learned much from dvd+rw-tools-7.0: plus_rw_format()
and mmc5r03c.pdf, 6.5 FORMAT UNIT */
int mmc_format_unit(struct burn_drive *d, off_t size, int flag);
/* ts A61225 : obtain write speed descriptors via ACh GET PERFORMANCE */
int mmc_get_write_performance(struct burn_drive *d);
/* ts A61229 : outsourced from spc_select_write_params() */
/* Note: Page data is not zeroed here to allow preset defaults. Thus
memset(pd, 0, 2 + d->mdata->write_page_length);
is the eventual duty of the caller.
*/
int mmc_compose_mode_page_5(struct burn_drive *d,
const struct burn_write_opts *o,
unsigned char *pd);
#endif /*__MMC*/ #endif /*__MMC*/

View File

@ -32,6 +32,9 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive)
opts->simulate = 0; opts->simulate = 0;
opts->underrun_proof = drive->mdata->underrun_proof; opts->underrun_proof = drive->mdata->underrun_proof;
opts->perform_opc = 1; opts->perform_opc = 1;
opts->obs = -1;
opts->obs_pad = 0;
opts->start_byte = -1;
opts->has_mediacatalog = 0; opts->has_mediacatalog = 0;
opts->format = BURN_CDROM; opts->format = BURN_CDROM;
opts->multi = 0; opts->multi = 0;
@ -152,6 +155,7 @@ void burn_write_opts_set_mediacatalog(struct burn_write_opts *opts,
memcpy(opts->mediacatalog, &mediacatalog, 13); memcpy(opts->mediacatalog, &mediacatalog, 13);
} }
/* ts A61106 */ /* ts A61106 */
void burn_write_opts_set_multi(struct burn_write_opts *opts, int multi) void burn_write_opts_set_multi(struct burn_write_opts *opts, int multi)
{ {
@ -159,6 +163,12 @@ void burn_write_opts_set_multi(struct burn_write_opts *opts, int multi)
} }
/* ts A61222 */
void burn_write_opts_set_start_byte(struct burn_write_opts *opts, off_t value)
{
opts->start_byte = value;
}
void burn_read_opts_set_raw(struct burn_read_opts *opts, int raw) void burn_read_opts_set_raw(struct burn_read_opts *opts, int raw)
{ {

View File

@ -32,6 +32,15 @@ struct burn_write_opts
/** Perform calibration of the drive's laser before beginning the /** Perform calibration of the drive's laser before beginning the
write. */ write. */
unsigned int perform_opc:1; unsigned int perform_opc:1;
/* ts A61219 : Output block size to trigger buffer flush if hit.
-1 with CD, 32 kB with DVD */
int obs;
int obs_pad; /* 1=pad up last block to obs */
/* ts A61222 : Start address for media which allow a choice */
off_t start_byte;
/** A disc can have a media catalog number */ /** A disc can have a media catalog number */
int has_mediacatalog; int has_mediacatalog;
unsigned char mediacatalog[13]; unsigned char mediacatalog[13];

View File

@ -37,14 +37,15 @@
/** To list all signals which shall surely not be caught */ /** To list all signals which shall surely not be caught */
#define BURN_OS_NON_SIGNAL_MACRO_LIST \ #define BURN_OS_NON_SIGNAL_MACRO_LIST \
SIGKILL, SIGCHLD, SIGSTOP, SIGURG SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH
/* The number of above list items */ /* The number of above list items */
#define BURN_OS_NON_SIGNAL_COUNT 4 #define BURN_OS_NON_SIGNAL_COUNT 5
/* The maximum size for a (SCSI) i/o transaction */ /* The maximum size for a (SCSI) i/o transaction */
#define BURN_OS_TRANSPORT_BUFFER_SIZE 65536/2 /* Important : MUST be at least 32768 ! */
#define BURN_OS_TRANSPORT_BUFFER_SIZE 32768
/** To hold all state information of BSD device enumeration /** To hold all state information of BSD device enumeration

View File

@ -34,13 +34,14 @@
/** To list all signals which shall surely not be caught */ /** To list all signals which shall surely not be caught */
#define BURN_OS_NON_SIGNAL_MACRO_LIST \ #define BURN_OS_NON_SIGNAL_MACRO_LIST \
SIGKILL, SIGCHLD, SIGSTOP, SIGURG SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH
/* The number of above list items */ /* The number of above list items */
#define BURN_OS_NON_SIGNAL_COUNT 4 #define BURN_OS_NON_SIGNAL_COUNT 5
/* The maximum size for a (SCSI) i/o transaction */ /* The maximum size for a (SCSI) i/o transaction */
/* Important : MUST be at least 32768 ! */
#define BURN_OS_TRANSPORT_BUFFER_SIZE 65536 #define BURN_OS_TRANSPORT_BUFFER_SIZE 65536

View File

@ -217,7 +217,8 @@ static unsigned char *get_sector(struct burn_write_opts *opts,
return NULL; return NULL;
seclen += burn_subcode_length(outmode); seclen += burn_subcode_length(outmode);
if (out->bytes + (seclen) >= BUFFER_SIZE) { /* ts A61219 : opts->obs is eventually a 32k trigger for DVD */
if (out->bytes + (seclen) > BUFFER_SIZE || out->bytes == opts->obs) {
int err; int err;
err = d->write(d, d->nwa, out); err = d->write(d, d->nwa, out);
if (err == BE_CANCELLED) if (err == BE_CANCELLED)
@ -642,7 +643,10 @@ int sector_data(struct burn_write_opts *o, struct burn_track *t, int psub)
return 2; return 2;
} }
if (!t->source->read_sub) /* ts A61219 : allow track without .entry */
if (t->entry == NULL)
;
else if (!t->source->read_sub)
subcode_user(o, subs, t->entry->point, subcode_user(o, subs, t->entry->point,
t->entry->control, 1, &t->isrc, psub); t->entry->control, 1, &t->isrc, psub);
else if (!t->source->read_sub(t->source, subs, 96)) else if (!t->source->read_sub(t->source, subs, 96))

View File

@ -74,6 +74,70 @@ Hint: You should also look into sg-freebsd-port.c, which is a younger and
#include <scsi/sg.h> #include <scsi/sg.h>
#include <scsi/scsi.h> #include <scsi/scsi.h>
/* ts A61211 : to recognize CD devices on /dev/sr* */
#include <linux/cdrom.h>
/* ts A61211 : preparing for exploration of recent Linux ATA adventures */
/** PORTING : Device file families for bus scanning and drive access.
Both device families must support the following ioctls:
SG_IO,
SG_GET_SCSI_ID
SCSI_IOCTL_GET_BUS_NUMBER
SCSI_IOCTL_GET_IDLUN
as well as mutual exclusively locking with open(O_EXCL).
If a device family is left empty, then it will not be used.
To avoid misunderstandings: both families are used via identical
transport methods as soon as a device file is accepted as CD drive
by the family specific function <family>_enumerate().
One difference remains throughout usage: Host,Channel,Id,Lun and Bus
address parameters of ATA devices are considered invalid.
*/
/* Set this to 1 in order to get on stderr messages from sg_enumerate() */
static int linux_sg_enumerate_debug = 0;
/* The device file family to use for (emulated) generic SCSI transport.
This must be a printf formatter with one single placeholder for int
in the range of 0 to 31 . The resulting addresses must provide SCSI
address parameters Host, Channel, Id, Lun and also Bus.
E.g.: "/dev/sg%d"
*/
/* NEW INFO: If hard disks at /dev/sr allow ioctl(CDROM_DRIVE_STATUS), they
are in danger.
If you want it less dangerous:
#undef CDROM_DRIVE_STATUS
but then you might need linux_sg_accept_any_type = 1 which
is _more dangerous_.
*/
/* !!! DO NOT SET TO sr%d UNLESS YOU PROTECTED ALL INDISPENSIBLE DEVICES
by chmod -rw . A test wether non-CD devices are properly excluded would
be well needed though. Heroic disks, scanners, etc. wanted !!! */
static char linux_sg_device_family[80] = {"/dev/sg%d"};
/* Set this to 1 in order to accept any TYPE_* (see scsi/scsi.h) */
/* NEW INFO: Try with 0 first. There is hope via CDROM_DRIVE_STATUS. */
/* !!! DO NOT SET TO 1 UNLESS YOU PROTECTED ALL INDISPENSIBLE DEVICES
chmod -rw !!! */
static int linux_sg_accept_any_type = 0;
/* The device file family to use for SCSI transport over ATA.
This must be a printf formatter with one single placeholder for a
_single_ char in the range of 'a' to 'z'. This placeholder _must_ be
at the end of the formatter string.
E.g. "/dev/hd%c"
*/
static char linux_ata_device_family[80] = {"/dev/hd%c"};
/* Set this to 1 in order to get on stderr messages from ata_enumerate()
*/
static int linux_ata_enumerate_verbous = 0;
/** PORTING : ------ libburn portable headers and definitions ----- */ /** PORTING : ------ libburn portable headers and definitions ----- */
@ -285,7 +349,11 @@ static int sg_open_scsi_siblings(char *path, int driveno,
int i_host_no = -1, i_channel_no = -1, i_target_no = -1, i_lun_no = -1; int i_host_no = -1, i_channel_no = -1, i_target_no = -1, i_lun_no = -1;
char msg[161], fname[81]; char msg[161], fname[81];
static char tldev[][81]= {"/dev/sr%d", "/dev/scd%d", "/dev/st%d", ""}; static char tldev[][81]= {"/dev/sr%d", "/dev/scd%d", "/dev/st%d",
"/dev/sg%d", ""};
if (linux_sg_device_family[0] == 0)
return 1;
if(host_no < 0 || id_no < 0 || channel_no < 0 || lun_no < 0) if(host_no < 0 || id_no < 0 || channel_no < 0 || lun_no < 0)
return(2); return(2);
@ -293,6 +361,8 @@ static int sg_open_scsi_siblings(char *path, int driveno,
sg_release_siblings(sibling_fds, sibling_count); sg_release_siblings(sibling_fds, sibling_count);
for (tld = 0; tldev[tld][0] != 0; tld++) { for (tld = 0; tldev[tld][0] != 0; tld++) {
if (strcmp(tldev[tld], linux_sg_device_family)==0)
continue;
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
sprintf(fname, tldev[tld], i); sprintf(fname, tldev[tld], i);
ret = sg_obtain_scsi_adr(fname, &i_bus_no, &i_host_no, ret = sg_obtain_scsi_adr(fname, &i_bus_no, &i_host_no,
@ -327,7 +397,7 @@ static int sg_open_scsi_siblings(char *path, int driveno,
(*sibling_count)++; (*sibling_count)++;
} }
} }
return(1); return 1;
failed:; failed:;
sg_release_siblings(sibling_fds, sibling_count); sg_release_siblings(sibling_fds, sibling_count);
return 0; return 0;
@ -342,20 +412,39 @@ static void ata_enumerate(void)
int i, fd; int i, fd;
char fname[10]; char fname[10];
if (linux_ata_enumerate_verbous)
fprintf(stderr, "libburn_debug: linux_ata_device_family = %s\n",
linux_ata_device_family);
if (linux_ata_device_family[0] == 0)
return;
for (i = 0; i < 26; i++) { for (i = 0; i < 26; i++) {
sprintf(fname, "/dev/hd%c", 'a' + i); sprintf(fname, linux_ata_device_family, 'a' + i);
if (linux_ata_enumerate_verbous)
fprintf(stderr, "libburn_debug: %s : ", fname);
/* ts A51221 */ /* ts A51221 */
if (burn_drive_is_banned(fname)) if (burn_drive_is_banned(fname)) {
if (linux_ata_enumerate_verbous)
fprintf(stderr, "not in whitelist\n");
continue; continue;
}
fd = sg_open_drive_fd(fname, 1); fd = sg_open_drive_fd(fname, 1);
if (fd == -1) if (fd == -1) {
if (linux_ata_enumerate_verbous)
fprintf(stderr,"open failed, errno=%d '%s'\n",
errno, strerror(errno));
continue; continue;
}
/* found a drive */ /* found a drive */
ioctl(fd, HDIO_GET_IDENTITY, &tm); ioctl(fd, HDIO_GET_IDENTITY, &tm);
/* not atapi */ /* not atapi */
if (!(tm.config & 0x8000) || (tm.config & 0x4000)) { 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); sg_close_drive_fd(fname, -1, &fd, 0);
continue; continue;
} }
@ -363,11 +452,22 @@ static void ata_enumerate(void)
/* if SG_IO fails on an atapi device, we should stop trying to /* if SG_IO fails on an atapi device, we should stop trying to
use hd* devices */ use hd* devices */
if (sgio_test(fd) == -1) { 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); sg_close_drive_fd(fname, -1, &fd, 0);
return; return;
} }
if (sg_close_drive_fd(fname, -1, &fd, 1) <= 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));
continue; continue;
}
if (linux_ata_enumerate_verbous)
fprintf(stderr, "accepting as drive without SCSI address\n");
enumerate_common(fname, -1, -1, -1, -1, -1); enumerate_common(fname, -1, -1, -1, -1, -1);
} }
} }
@ -378,21 +478,66 @@ static void sg_enumerate(void)
{ {
struct sg_scsi_id sid; struct sg_scsi_id sid;
int i, fd, sibling_fds[LIBBURN_SG_MAX_SIBLINGS], sibling_count= 0, ret; int i, fd, sibling_fds[LIBBURN_SG_MAX_SIBLINGS], sibling_count= 0, ret;
int bus_no = -1; int sid_ret = 0;
int bus_no= -1, host_no= -1, channel_no= -1, target_no= -1, lun_no= -1;
char fname[10]; char fname[10];
if (linux_sg_enumerate_debug)
fprintf(stderr, "libburn_debug: linux_sg_device_family = %s\n",
linux_sg_device_family);
if (linux_sg_device_family[0] == 0)
return;
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
sprintf(fname, "/dev/sg%d", i); sprintf(fname, linux_sg_device_family, i);
if (linux_sg_enumerate_debug)
fprintf(stderr, "libburn_debug: %s : ", fname);
/* ts A51221 */ /* ts A51221 */
if (burn_drive_is_banned(fname)) if (burn_drive_is_banned(fname)) {
if (linux_sg_enumerate_debug)
fprintf(stderr, "not in whitelist\n");
continue; continue;
}
/* ts A60927 */ /* ts A60927 */
fd = sg_open_drive_fd(fname, 1); fd = sg_open_drive_fd(fname, 1);
if (fd == -1) if (fd == -1) {
if (linux_sg_enumerate_debug)
fprintf(stderr, "open failed, errno=%d '%s'\n",
errno, strerror(errno));
continue; continue;
}
/* found a drive */ /* found a drive */
ioctl(fd, SG_GET_SCSI_ID, &sid); 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));
#ifdef CDROM_DRIVE_STATUS
/* ts A61211 : not widening old acceptance range */
if (strcmp(linux_sg_device_family,"/dev/sg%d") != 0) {
/* http://developer.osdl.org/dev/robustmutexes/
src/fusyn.hg/Documentation/ioctl/cdrom.txt */
sid_ret = ioctl(fd, CDROM_DRIVE_STATUS, 0);
if(linux_sg_enumerate_debug)
fprintf(stderr,
"ioctl(CDROM_DRIVE_STATUS) = %d , ",
sid_ret);
if (sid_ret != -1 && sid_ret != CDS_NO_INFO)
sid.scsi_type = TYPE_ROM;
else
sid_ret = -1;
}
#endif /* CDROM_DRIVE_STATUS */
}
#ifdef SCSI_IOCTL_GET_BUS_NUMBER #ifdef SCSI_IOCTL_GET_BUS_NUMBER
/* Hearsay A61005 */ /* Hearsay A61005 */
@ -401,10 +546,37 @@ static void sg_enumerate(void)
#endif #endif
if (sg_close_drive_fd(fname, -1, &fd, if (sg_close_drive_fd(fname, -1, &fd,
sid.scsi_type == TYPE_ROM ) <= 0) sid.scsi_type == TYPE_ROM ) <= 0) {
if (linux_sg_enumerate_debug)
fprintf(stderr,
"cannot close properly, errno=%d '%s'\n",
errno, strerror(errno));
continue; continue;
if (sid.scsi_type != TYPE_ROM) }
if ( (sid_ret == -1 || sid.scsi_type != TYPE_ROM)
&& !linux_sg_accept_any_type) {
if (linux_sg_enumerate_debug)
fprintf(stderr, "sid.scsi_type = %d (!= TYPE_ROM)\n",
sid.scsi_type);
continue; continue;
}
if (sid_ret == -1 || sid.scsi_id < 0) {
/* ts A61211 : employ a more general ioctl */
ret = sg_obtain_scsi_adr(fname, &bus_no, &host_no,
&channel_no, &target_no, &lun_no);
if (ret>0) {
sid.host_no = host_no;
sid.channel = channel_no;
sid.scsi_id = target_no;
sid.lun = lun_no;
} else {
if (linux_sg_enumerate_debug)
fprintf(stderr,
"sg_obtain_scsi_adr() failed\n");
continue;
}
}
/* ts A60927 : trying to do locking with growisofs */ /* ts A60927 : trying to do locking with growisofs */
if(burn_sg_open_o_excl>1) { if(burn_sg_open_o_excl>1) {
@ -413,6 +585,8 @@ static void sg_enumerate(void)
sid.host_no, sid.channel, sid.host_no, sid.channel,
sid.scsi_id, sid.lun); sid.scsi_id, sid.lun);
if (ret<=0) { if (ret<=0) {
if (linux_sg_enumerate_debug)
fprintf(stderr, "cannot lock siblings\n");
sg_handle_busy_device(fname, 0); sg_handle_busy_device(fname, 0);
continue; continue;
} }
@ -425,6 +599,10 @@ static void sg_enumerate(void)
#else #else
bus_no = sid.host_no; bus_no = sid.host_no;
#endif #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, enumerate_common(fname, bus_no, sid.host_no, sid.channel,
sid.scsi_id, sid.lun); sid.scsi_id, sid.lun);
} }
@ -513,13 +691,18 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
int sg_give_next_adr(burn_drive_enumerator_t *idx, int sg_give_next_adr(burn_drive_enumerator_t *idx,
char adr[], int adr_size, int initialize) char adr[], int adr_size, int initialize)
{ {
/* sg.h : typedef int burn_drive_enumerator_t; */ /* os-linux.h : typedef int burn_drive_enumerator_t; */
static int sg_limit = 32, ata_limit = 26; static int sg_limit = 32, ata_limit = 26;
int baseno = 0; int baseno = 0;
if (initialize == -1) if (initialize == -1)
return 0; return 0;
if (linux_sg_device_family[0] == 0)
sg_limit = 0;
if (linux_ata_device_family[0] == 0)
ata_limit = 0;
if (initialize == 1) if (initialize == 1)
*idx = -1; *idx = -1;
(*idx)++; (*idx)++;
@ -527,7 +710,7 @@ int sg_give_next_adr(burn_drive_enumerator_t *idx,
goto next_ata; goto next_ata;
if (adr_size < 10) if (adr_size < 10)
return -1; return -1;
sprintf(adr, "/dev/sg%d", *idx); sprintf(adr, linux_sg_device_family, *idx);
return 1; return 1;
next_ata:; next_ata:;
baseno += sg_limit; baseno += sg_limit;
@ -535,7 +718,7 @@ next_ata:;
goto next_nothing; goto next_nothing;
if (adr_size < 9) if (adr_size < 9)
return -1; return -1;
sprintf(adr, "/dev/hd%c", 'a' + (*idx - baseno)); sprintf(adr, linux_ata_device_family, 'a' + (*idx - baseno));
return 1; return 1;
next_nothing:; next_nothing:;
baseno += ata_limit; baseno += ata_limit;
@ -851,14 +1034,15 @@ ex:;
int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no, int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no,
int *target_no, int *lun_no) int *target_no, int *lun_no)
{ {
int fd, ret; int fd, ret, l;
struct my_scsi_idlun { struct my_scsi_idlun {
int x; int x;
int host_unique_id; int host_unique_id;
}; };
struct my_scsi_idlun idlun; struct my_scsi_idlun idlun;
if (strncmp(path, "/dev/hd", 7) == 0 l = strlen(linux_ata_device_family) - 2;
if (l > 0 && strncmp(path, linux_ata_device_family, l) == 0
&& path[7] >= 'a' && path[7] <= 'z' && path[8] == 0) && path[7] >= 'a' && path[7] <= 'z' && path[8] == 0)
return 0; /* on RIP 14 all hdx return SCSI adr 0,0,0,0 */ return 0; /* on RIP 14 all hdx return SCSI adr 0,0,0,0 */

View File

@ -15,6 +15,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "libburn.h"
#include "transport.h" #include "transport.h"
#include "spc.h" #include "spc.h"
#include "mmc.h" #include "mmc.h"
@ -132,9 +133,13 @@ void spc_sense_caps(struct burn_drive *d)
{ {
struct buffer buf; struct buffer buf;
struct scsi_mode_data *m; struct scsi_mode_data *m;
int size; int size, page_length, num_write_speeds = 0, i, speed, ret;
unsigned char *page; unsigned char *page;
struct command c; struct command c;
struct burn_speed_descriptor *sd;
/* ts A61225 : 1 = report about post-MMC-1 speed descriptors */
static int speed_debug = 0;
memcpy(c.opcode, SPC_MODE_SENSE, sizeof(SPC_MODE_SENSE)); memcpy(c.opcode, SPC_MODE_SENSE, sizeof(SPC_MODE_SENSE));
c.retry = 1; c.retry = 1;
@ -150,6 +155,17 @@ void spc_sense_caps(struct burn_drive *d)
m = d->mdata; m = d->mdata;
page = c.page->data + 8; page = c.page->data + 8;
/* ts A61225 :
Although MODE SENSE indeed belongs to SPC, the returned code page
2Ah is part of MMC-1 to MMC-3. In MMC-1 5.2.3.4. it has 22 bytes,
in MMC-3 6.3.11 there are at least 28 bytes plus a variable length
set of speed descriptors. In MMC-5 E.11 it is declared "legacy".
*/
page_length = page[1];
m->valid = 0;
burn_mdata_free_subs(m);
m->buffer_size = page[12] * 256 + page[13]; m->buffer_size = page[12] * 256 + page[13];
m->dvdram_read = page[2] & 32; m->dvdram_read = page[2] & 32;
m->dvdram_write = page[3] & 32; m->dvdram_write = page[3] & 32;
@ -162,28 +178,83 @@ void spc_sense_caps(struct burn_drive *d)
m->cdr_read = page[2] & 1; m->cdr_read = page[2] & 1;
m->cdr_write = page[3] & 1; m->cdr_write = page[3] & 1;
m->c2_pointers = page[5] & 16;
m->underrun_proof = page[4] & 128;
/* ts A61021 : these fields are marked obsolete in MMC 3 */ /* ts A61021 : these fields are marked obsolete in MMC 3 */
m->max_read_speed = page[8] * 256 + page[9]; m->max_read_speed = page[8] * 256 + page[9];
m->cur_read_speed = page[14] * 256 + page[15]; m->cur_read_speed = page[14] * 256 + page[15];
/* in MMC-3 : see [30-31] and blocks beginning at [32] */
m->max_write_speed = page[18] * 256 + page[19]; m->max_write_speed = page[18] * 256 + page[19];
/* New field to be set by atip */
m->min_write_speed = m->max_write_speed;
/* in MMC-3 : [28-29] */
m->cur_write_speed = page[20] * 256 + page[21]; m->cur_write_speed = page[20] * 256 + page[21];
/* >>> ts A61021 : iterate over all speeds : /* ts A61021 : New field to be set by atip (or following MMC-3 info) */
data[30-31]: number of speed performance descriptor blocks m->min_write_speed = m->max_write_speed;
data[32-35]: block 0 : [+2-3] speed in kbytes/sec
*/ /* ts A61225 : for ACh GET PERFORMANCE, Type 03h */
m->min_end_lba = 0x7fffffff;
m->max_end_lba = 0;
m->c2_pointers = page[5] & 16;
m->valid = 1; m->valid = 1;
m->underrun_proof = page[4] & 128;
mmc_get_configuration(d);
/* ts A61225 : end of MMC-1 , begin of MMC-3 */
if (page_length < 32) /* no write speed descriptors ? */
goto try_mmc_get_performance;
m->cur_write_speed = page[28] * 256 + page[29];
if (speed_debug)
fprintf(stderr, "LIBBURN_DEBUG: cur_write_speed = %d\n",
m->cur_write_speed);
num_write_speeds = page[30] * 256 + page[31];
m->max_write_speed = m->min_write_speed = m->cur_write_speed;
for (i = 0; i < num_write_speeds; i++) {
speed = page[32 + 4*i + 2] * 256 + page[32 + 4*i + 3];
if (speed_debug)
fprintf(stderr,
"LIBBURN_DEBUG: write speed #%d = %d kB/s (rc %d)\n",
i, speed, page[32 + 4*i +1] & 7);
/* ts A61226 */
ret = burn_speed_descriptor_new(&(d->mdata->speed_descriptors),
NULL, d->mdata->speed_descriptors, 0);
if (ret > 0) {
sd = d->mdata->speed_descriptors;
sd->source = 1;
if (d->current_profile > 0) {
sd->profile_loaded = d->current_profile;
strcpy(sd->profile_name,
d->current_profile_text);
}
sd->wrc = (( page[32 + 4*i +1] & 7 ) == 1 );
sd->write_speed = speed;
}
if (speed > m->max_write_speed)
m->max_write_speed = speed;
if (speed < m->min_write_speed)
m->min_write_speed = speed;
}
if (speed_debug)
fprintf(stderr,
"LIBBURN_DEBUG: 5Ah,2Ah min_write_speed = %d , max_write_speed = %d\n",
m->min_write_speed, m->max_write_speed);
try_mmc_get_performance:;
ret = mmc_get_write_performance(d);
if (ret > 0 && speed_debug)
fprintf(stderr,
"LIBBURN_DEBUG: ACh min_write_speed = %d , max_write_speed = %d\n",
m->min_write_speed, m->max_write_speed);
} }
void spc_sense_error_params(struct burn_drive *d) void spc_sense_error_params(struct burn_drive *d)
{ {
struct buffer buf; struct buffer buf;
@ -274,6 +345,11 @@ void spc_sense_write_params(struct burn_drive *d)
mmc_read_disc_info(d); mmc_read_disc_info(d);
} }
/* ts A61229 */
#define Libburn_mmc_compose_mode_page_5 1
/* remark ts A61104 : /* remark ts A61104 :
Although command MODE SELECT is SPC, the content of the Although command MODE SELECT is SPC, the content of the
Write Parameters Mode Page (05h) is MMC (Table 108 in MMC-1). Write Parameters Mode Page (05h) is MMC (Table 108 in MMC-1).
@ -284,7 +360,9 @@ void spc_select_write_params(struct burn_drive *d,
{ {
struct buffer buf; struct buffer buf;
struct command c; struct command c;
#ifndef Libburn_mmc_compose_mode_page_5
int bufe, sim; int bufe, sim;
#endif
/* ts A61007 : All current callers are safe. */ /* ts A61007 : All current callers are safe. */
/* a ssert(o->drive == d); */ /* a ssert(o->drive == d); */
@ -309,11 +387,21 @@ void spc_select_write_params(struct burn_drive *d,
memset(c.page->data, 0, 8 + 2 + d->mdata->write_page_length); memset(c.page->data, 0, 8 + 2 + d->mdata->write_page_length);
c.page->bytes = 8 + 2 + d->mdata->write_page_length; c.page->bytes = 8 + 2 + d->mdata->write_page_length;
c.page->data[8] = 5;
c.page->data[9] = d->mdata->write_page_length;
burn_print(12, "using write page length %d (valid %d)\n", burn_print(12, "using write page length %d (valid %d)\n",
d->mdata->write_page_length, d->mdata->write_page_valid); d->mdata->write_page_length, d->mdata->write_page_valid);
#ifdef Libburn_mmc_compose_mode_page_5
/* ts A61229 */
if (mmc_compose_mode_page_5(d, o, c.page->data + 8) <= 0)
return;
#else
c.page->data[8] = 5;
c.page->data[9] = d->mdata->write_page_length;
bufe = o->underrun_proof; bufe = o->underrun_proof;
sim = o->simulate; sim = o->simulate;
c.page->data[10] = (bufe << 6) c.page->data[10] = (bufe << 6)
@ -332,7 +420,11 @@ void spc_select_write_params(struct burn_drive *d,
c.page->data[22] = 0; c.page->data[22] = 0;
c.page->data[23] = 150; /* audio pause length */ c.page->data[23] = 150; /* audio pause length */
/*XXX need session format! */ /*XXX need session format! */
#endif /* ! Libburn_mmc_compose_mode_page_5 */
c.dir = TO_DRIVE; c.dir = TO_DRIVE;
d->issue_command(d, &c); d->issue_command(d, &c);
} }
@ -342,6 +434,10 @@ void spc_getcaps(struct burn_drive *d)
spc_inquiry(d); spc_inquiry(d);
spc_sense_caps(d); spc_sense_caps(d);
spc_sense_error_params(d); spc_sense_error_params(d);
/* <<< for debugging. >>> ??? to be fixely included here ?
mmc_read_format_capacities(d, -1);
*/
} }
/* /*
@ -429,6 +525,8 @@ void spc_probe_write_modes(struct burn_drive *d)
} }
} }
/* ( ts A61229 : shouldn't this go to mmc.c too ?) */
/** @return -1 = error */ /** @return -1 = error */
int spc_block_type(enum burn_block_types b) int spc_block_type(enum burn_block_types b)
{ {
@ -502,6 +600,7 @@ int burn_scsi_setup_drive(struct burn_drive *d, int bus_no, int host_no,
d->idata->valid = 0; d->idata->valid = 0;
d->mdata = malloc(sizeof(struct scsi_mode_data)); d->mdata = malloc(sizeof(struct scsi_mode_data));
d->mdata->valid = 0; d->mdata->valid = 0;
d->mdata->speed_descriptors = NULL;
/* ts A61007 : obsolete Assert in drive_getcaps() */ /* ts A61007 : obsolete Assert in drive_getcaps() */
if(d->idata == NULL || d->mdata == NULL) { if(d->idata == NULL || d->mdata == NULL) {

View File

@ -386,13 +386,19 @@ int burn_disc_get_sectors(struct burn_disc *d)
void burn_track_get_entry(struct burn_track *t, struct burn_toc_entry *entry) void burn_track_get_entry(struct burn_track *t, struct burn_toc_entry *entry)
{ {
memcpy(entry, t->entry, sizeof(struct burn_toc_entry)); if (t->entry == NULL)
memset(entry, 0, sizeof(struct burn_toc_entry));
else
memcpy(entry, t->entry, sizeof(struct burn_toc_entry));
} }
void burn_session_get_leadout_entry(struct burn_session *s, void burn_session_get_leadout_entry(struct burn_session *s,
struct burn_toc_entry *entry) struct burn_toc_entry *entry)
{ {
memcpy(entry, s->leadout_entry, sizeof(struct burn_toc_entry)); if (s->leadout_entry == NULL)
memset(entry, 0, sizeof(struct burn_toc_entry));
else
memcpy(entry, s->leadout_entry, sizeof(struct burn_toc_entry));
} }
struct burn_session **burn_disc_get_sessions(struct burn_disc *d, int *num) struct burn_session **burn_disc_get_sessions(struct burn_disc *d, int *num)

View File

@ -36,7 +36,12 @@ struct params
struct buffer struct buffer
{ {
unsigned char data[BUFFER_SIZE]; /* ts A61219:
Added 4096 bytes reserve against possible buffer overflows.
(Changed in sector.c buffer flush test from >= to > BUFFER_SIZE .
This can at most cause a 1 sector overlap. Sometimes an offset
of 16 byte is applied to the output data (in some RAW mode). ) */
unsigned char data[BUFFER_SIZE + 4096];
int sectors; int sectors;
int bytes; int bytes;
}; };
@ -60,6 +65,7 @@ struct burn_scsi_inquiry_data
int valid; int valid;
}; };
struct scsi_mode_data struct scsi_mode_data
{ {
int buffer_size; int buffer_size;
@ -79,6 +85,12 @@ struct scsi_mode_data
/* ts A61021 */ /* ts A61021 */
int min_write_speed; int min_write_speed;
/* ts A61225 : Results from ACh GET PERFORMANCE, Type 03h
Speed values go into *_*_speed */
int min_end_lba;
int max_end_lba;
struct burn_speed_descriptor *speed_descriptors;
int cur_read_speed; int cur_read_speed;
int cur_write_speed; int cur_write_speed;
int retry_page_length; int retry_page_length;
@ -91,6 +103,20 @@ struct scsi_mode_data
}; };
/* ts A70112 : represents a single Formattable Capacity Descriptor as of
mmc5r03c.pdf 6.24.3.3 . There can at most be 32 of them. */
struct burn_format_descr {
/* format type: e.g 0x00 is "Full", 0x15 is "Quick" */
int type;
/* the size in bytes derived from Number of Blocks */
off_t size;
/* the Type Dependent Parameter (usually the write alignment size) */
unsigned tdp;
};
#define LIBBURN_SG_MAX_SIBLINGS 16 #define LIBBURN_SG_MAX_SIBLINGS 16
/** Gets initialized in enumerate_common() and burn_drive_register() */ /** Gets initialized in enumerate_common() and burn_drive_register() */
@ -119,6 +145,32 @@ struct burn_drive
enum burn_disc_status status; enum burn_disc_status status;
int erasable; int erasable;
/* ts A61201 from 46h GET CONFIGURATION */
int current_profile;
char current_profile_text[80];
int current_is_cd_profile;
int current_is_supported_profile;
/* ts A70114 : wether a DVD-RW media holds an incomplete session
(which could need closing after write) */
int dvd_minus_rw_incomplete;
/* ts A61218 from 46h GET CONFIGURATION */
int bg_format_status; /* 0=needs format start, 1=needs format restart*/
/* ts A70108 from 23h READ FORMAT CAPACITY mmc5r03c.pdf 6.24 */
int format_descr_type; /* 1=unformatted, 2=formatted, 3=unclear */
off_t format_curr_max_size; /* meaning depends on format_descr_type */
unsigned format_curr_blsas; /* meaning depends on format_descr_type */
int best_format_type;
off_t best_format_size;
/* The complete list of format descriptors as read with 23h */
int num_format_descr;
struct burn_format_descr format_descriptors[32];
volatile int released; volatile int released;
/* ts A61106 */ /* ts A61106 */
@ -200,6 +252,13 @@ struct burn_drive
/* ts A61023 : get size and free space of drive buffer */ /* ts A61023 : get size and free space of drive buffer */
int (*read_buffer_capacity) (struct burn_drive *d); int (*read_buffer_capacity) (struct burn_drive *d);
/* ts A61220 : format media (e.g. DVD+RW) */
int (*format_unit) (struct burn_drive *d, off_t size, int flag);
/* ts A70108 */
/* mmc5r03c.pdf 6.24 : get list of available formats */
int (*read_format_capacities) (struct burn_drive *d, int top_wanted);
}; };
/* end of generic 'drive' data structures */ /* end of generic 'drive' data structures */

View File

@ -580,6 +580,29 @@ ex:;
return ret; return ret;
} }
/* ts A61218 : outsourced from burn_write_track() */
int burn_disc_init_track_status(struct burn_write_opts *o,
struct burn_session *s, int tnum, int sectors)
{
struct burn_drive *d = o->drive;
/* Update progress */
d->progress.start_sector = d->nwa;
d->progress.sectors = sectors;
d->progress.sector = 0;
/* ts A60831: added tnum-line, extended print message on proposal
by bonfire-app@wanadoo.fr in http://libburn.pykix.org/ticket/58 */
d->progress.track = tnum;
/* ts A61102 */
d->busy = BURN_DRIVE_WRITING;
return 1;
}
int burn_write_track(struct burn_write_opts *o, struct burn_session *s, int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
int tnum) int tnum)
{ {
@ -637,20 +660,10 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
/* user data */ /* user data */
/* ts A61102 */
d->busy = BURN_DRIVE_WRITING;
sectors = burn_track_get_sectors(t); sectors = burn_track_get_sectors(t);
open_ended = burn_track_is_open_ended(t); open_ended = burn_track_is_open_ended(t);
/* Update progress */ burn_disc_init_track_status(o, s, tnum, sectors);
d->progress.start_sector = d->nwa;
d->progress.sectors = sectors;
d->progress.sector = 0;
/* ts A60831: added tnum-line, extended print message on proposal
by bonfire-app@wanadoo.fr in http://libburn.pykix.org/ticket/58 */
d->progress.track = tnum;
burn_print(12, "track %d is %d sectors long\n", tnum, sectors); burn_print(12, "track %d is %d sectors long\n", tnum, sectors);
@ -761,6 +774,402 @@ bad_track_mode_found:;
return 0; return 0;
} }
/* ts A61218 : outsourced from burn_disc_write_sync() */
int burn_disc_init_write_status(struct burn_write_opts *o,
struct burn_disc *disc)
{
struct burn_drive *d = o->drive;
d->cancel = 0;
/* init progress before showing the state */
d->progress.session = 0;
d->progress.sessions = disc->sessions;
d->progress.track = 0;
d->progress.tracks = disc->session[0]->tracks;
/* TODO: handle indices */
d->progress.index = 0;
d->progress.indices = disc->session[0]->track[0]->indices;
/* TODO: handle multissession discs */
/* XXX: sectors are only set during write track */
d->progress.start_sector = 0;
d->progress.sectors = 0;
d->progress.sector = 0;
d->progress.track = 0;
/* ts A61023 */
d->progress.buffer_capacity = 0;
d->progress.buffer_available = 0;
d->progress.buffered_bytes = 0;
d->progress.buffer_min_fill = 0xffffffff;
d->busy = BURN_DRIVE_WRITING;
return 1;
}
/* ts A61218 */
int burn_dvd_write_track(struct burn_write_opts *o,
struct burn_session *s, int tnum)
{
struct burn_track *t = s->track[tnum];
struct burn_drive *d = o->drive;
struct buffer *out = d->buffer;
int sectors;
int i, open_ended = 0, ret= 0;
sectors = burn_track_get_sectors(t);
open_ended = burn_track_is_open_ended(t);
/* >>> any type specific track preparations */;
burn_disc_init_track_status(o, s, tnum, sectors);
for (i = 0; open_ended || i < sectors; i++) {
/* From time to time inquire drive buffer */
if ((i%256)==0)
d->read_buffer_capacity(d);
/* transact a (CD sized) sector */
if (!sector_data(o, t, 0))
{ ret = 0; goto ex; }
if (open_ended) {
d->progress.sectors = sectors = i;
if (burn_track_is_data_done(t))
break;
}
/* update current progress */
d->progress.sector++;
}
/* Pad up buffer to next full 32 kB */
if (o->obs_pad && out->bytes > 0 && out->bytes < o->obs) {
memset(out->data + out->bytes, 0, o->obs - out->bytes);
out->sectors += (o->obs - out->bytes) / 2048;
out->bytes = o->obs;
}
ret = burn_write_flush(o, t);
if (ret <= 0)
goto ex;
/* >>> any other normal track finalizing */;
ret = 1;
ex:;
if (ret<=0) {
d->sync_cache(d); /* burn_write_flush() was not called */
}
return ret;
}
/* ts A61219 */
int burn_disc_close_session_dvd_plus_rw(struct burn_write_opts *o,
struct burn_session *s)
{
struct burn_drive *d = o->drive;
d->busy = BURN_DRIVE_CLOSING_SESSION;
/* This seems to be a quick end : "if (!dvd_compat)" */
/* >>> Stop de-icing (ongoing background format) quickly
by mmc_close() (but with opcode[2]=0).
Wait for unit to get ready.
return 1;
*/
/* Else: end eventual background format in a "DVD-RO" compatible way */
d->close_track_session(d, 1, 0); /* same as CLOSE SESSION for CD */
d->busy = BURN_DRIVE_WRITING;
return 1;
}
/* ts A61228 */
int burn_disc_close_session_dvd_minus_rw(struct burn_write_opts *o,
struct burn_session *s)
{
struct burn_drive *d = o->drive;
d->busy = BURN_DRIVE_CLOSING_SESSION;
if (d->current_profile == 0x13) {
d->close_track_session(d, 1, 0); /* CLOSE SESSION, 010b */
/* ??? under what circumstances to use close functiom 011b
"Finalize disc" ? */
}
d->busy = BURN_DRIVE_WRITING;
return 1;
}
/* ts A61218 */
int burn_dvd_write_session(struct burn_write_opts *o,
struct burn_session *s)
{
int i,ret;
struct burn_drive *d = o->drive;
for (i = 0; i < s->tracks; i++) {
ret = burn_dvd_write_track(o, s, i);
if (ret <= 0)
break;
}
if (d->current_profile == 0x1a) {
/* DVD+RW */
ret = burn_disc_close_session_dvd_plus_rw(o, s);
if (ret <= 0)
return 0;
} else if (d->current_profile == 0x13) {
/* DVD-RW restricted overwrite */
if (d->dvd_minus_rw_incomplete) {
ret = burn_disc_close_session_dvd_minus_rw(o, s);
if (ret <= 0)
return 0;
}
} else if (d->current_profile == 0x12) {
/* DVD-RAM */
/* ??? any finalization needed ? */;
}
return 1;
}
/* ts A61218 : learned much from dvd+rw-tools-7.0/growisofs_mmc.cpp */
int burn_disc_setup_dvd_plus_rw(struct burn_write_opts *o,
struct burn_disc *disc)
{
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;
/* start or re-start dvd_plus_rw formatting */
ret = d->format_unit(d, (off_t) 0, 0);
if (ret <= 0)
return 0;
d->busy = BURN_DRIVE_WRITING;
}
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 */;
/* >>> ? what else ? */;
return 1;
}
/* ts A61228 : learned much from dvd+rw-tools-7.0/growisofs_mmc.cpp */
int burn_disc_setup_dvd_minus_rw(struct burn_write_opts *o,
struct burn_disc *disc)
{
struct burn_drive *d = o->drive;
char msg[160];
int ret;
d->nwa = 0;
if (o->start_byte >= 0) {
d->nwa = o->start_byte / 32768; /* align to 32 kB */
sprintf(msg, "Write start address is %d * 32768", d->nwa);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020127,
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
msg, 0,0);
d->nwa *= 16; /* convert to 2048 block units */
}
if (d->current_profile == 0x13) { /* DVD-RW restricted overwrite */
/* ??? mmc5r03c.pdf 7.5.2 :
"For DVD-RW media ... If a medium is in Restricted overwrite
mode, this mode page shall not be used."
But growisofs composes a page 5 and sends it.
mmc5r03c.pdf 5.3.16 , table 127 specifies that mode page 5
shall be supported with feature 0026h Restricted Overwrite.
5.3.22 describes a feature 002Ch Rigid Restrictive Overwrite
which seems to apply to DVD-RW and does not mention page 5.
5.4.14 finally states that profile 0013h includes feature
002Ch rather than 0026h.
d->send_write_parameters(d, o);
*/
d->busy = BURN_DRIVE_FORMATTING;
/* "quick grow" to at least byte equivalent of d->nwa */
ret = d->format_unit(d, (off_t) d->nwa * (off_t) 2048,
(d->nwa > 0) << 3);
if (ret <= 0)
return 0;
d->busy = BURN_DRIVE_WRITING;
} else {
sprintf(msg, "Unsuitable media detected. Profile %4.4Xh %s",
d->current_profile, d->current_profile_text);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002011e,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0,0);
return 0;
}
/* >>> perform OPC if needed */;
/* >>> */;
return 1;
}
/* ts A61218 */
int burn_dvd_write_sync(struct burn_write_opts *o,
struct burn_disc *disc)
{
int i, ret, sx, tx, mode, exotic_track = 0;
struct burn_drive *d = o->drive;
char msg[160];
for (sx = 0; sx < disc->sessions; sx++)
for (tx = 0 ; tx < disc->session[sx]->tracks; tx++) {
mode = disc->session[sx]->track[tx]->mode;
if (disc->session[sx]->track[tx]->mode != BURN_MODE1)
exotic_track = 1;
}
if (exotic_track) {
sprintf(msg,"DVD Media are unsuitable for desired track type");
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020123,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0,0);
goto early_failure;
}
if (d->current_profile == 0x1a || d->current_profile == 0x13 ||
d->current_profile == 0x12) {
/* DVD+RW , DVD-RW Restricted Overwrite , DVD-RAM */
if (disc->sessions!=1 || disc->session[0]->tracks>1
|| o->multi ) {
sprintf(msg,
"Burning is restricted to a single track and no multi-session on %s",
d->current_profile_text);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002011f,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0,0);
goto early_failure;
}
}
if (d->current_profile == 0x1a || d->current_profile == 0x12) {
/* DVD+RW , DVD-RAM */
if (o->start_byte >= 0 && (o->start_byte % 2048)) {
sprintf(msg,
"Write start address not properly aligned to 2048");
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020125,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0,0);
goto early_failure;
}
ret = 1;
if (d->current_profile == 0x1a)
ret = burn_disc_setup_dvd_plus_rw(o, disc);
if (ret <= 0) {
sprintf(msg,
"Write preparation setup failed for DVD+RW");
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020121,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
msg, 0,0);
goto early_failure;
}
o->obs_pad = 0; /* no filling-up of track's last 32k buffer */
} else if (d->current_profile == 0x13) { /* DVD-RW Rest. Overwrite */
if (o->start_byte >= 0 && (o->start_byte % 32768)) {
sprintf(msg,
"Write start address not properly aligned to 32K");
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020125,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0,0);
goto early_failure;
}
ret = burn_disc_setup_dvd_minus_rw(o, disc);
if (ret <= 0) {
sprintf(msg,
"Write preparation setup failed for DVD-RW");
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020121,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
msg, 0,0);
goto early_failure;
}
/* ??? is this necessary ? */
o->obs_pad = 1; /* fill-up track's last 32k buffer */
} else {
sprintf(msg, "Unsuitable media detected. Profile %4.4Xh %s",
d->current_profile, d->current_profile_text);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002011e,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0,0);
goto early_failure;
}
o->obs = 32*1024; /* buffer flush trigger for sector.c:get_sector() */
for (i = 0; i < disc->sessions; i++) {
/* update progress */
d->progress.session = i;
d->progress.tracks = disc->session[i]->tracks;
ret = burn_dvd_write_session(o, disc->session[i]);
if (ret <= 0)
goto ex;
/* XXX: currently signs an end of session */
d->progress.sector = 0;
d->progress.start_sector = 0;
d->progress.sectors = 0;
}
/* >>> eventual normal finalization measures */
ret = 1;
ex:;
/* >>> eventual emergency finalization measures */
/* update media state records */
burn_drive_mark_unready(d);
burn_drive_inquire_media(d);
d->busy = BURN_DRIVE_IDLE;
return ret;
early_failure:;
return 0;
}
void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc) void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc)
{ {
struct cue_sheet *sheet; struct cue_sheet *sheet;
@ -774,14 +1183,33 @@ void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc)
burn_message_clear_queue(); burn_message_clear_queue();
*/ */
burn_print(1, "sync write of %d sessions\n", disc->sessions); /* ts A61224 */
burn_disc_init_write_status(o, disc); /* must be done very early */
d->buffer = &buf; d->buffer = &buf;
memset(d->buffer, 0, sizeof(struct buffer)); memset(d->buffer, 0, sizeof(struct buffer));
d->rlba = -150; d->rlba = -150;
d->toc_temp = 9; d->toc_temp = 9;
/* ts A61218 */
if (! d->current_is_cd_profile) {
ret = burn_dvd_write_sync(o, disc);
if (ret <= 0)
goto fail_wo_sync;
return;
}
if (o->start_byte >= 0) {
sprintf(msg, "Write start address not supported");
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020124,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0,0);
goto fail_wo_sync;
}
burn_print(1, "sync write of %d CD sessions\n", disc->sessions);
/* Apparently some drives require this command to be sent, and a few drives /* Apparently some drives require this command to be sent, and a few drives
return crap. so we send the command, then ignore the result. return crap. so we send the command, then ignore the result.
*/ */
@ -803,28 +1231,6 @@ return crap. so we send the command, then ignore the result.
msg,0,0); msg,0,0);
} }
/* init progress before showing the state */
d->progress.session = 0;
d->progress.sessions = disc->sessions;
d->progress.track = 0;
d->progress.tracks = disc->session[0]->tracks;
/* TODO: handle indices */
d->progress.index = 0;
d->progress.indices = disc->session[0]->track[0]->indices;
/* TODO: handle multissession discs */
/* XXX: sectors are only set during write track */
d->progress.start_sector = 0;
d->progress.sectors = 0;
d->progress.sector = 0;
/* ts A61023 */
d->progress.buffer_capacity = 0;
d->progress.buffer_available = 0;
d->progress.buffered_bytes = 0;
d->progress.buffer_min_fill = 0xffffffff;
d->busy = BURN_DRIVE_WRITING;
for (i = 0; i < disc->sessions; i++) { for (i = 0; i < disc->sessions; i++) {
/* update progress */ /* update progress */
d->progress.session = i; d->progress.session = i;
@ -920,6 +1326,10 @@ return crap. so we send the command, then ignore the result.
sleep(1); sleep(1);
/* ts A61125 : update media state records */
burn_drive_mark_unready(d);
burn_drive_inquire_media(d);
burn_print(1, "done\n"); burn_print(1, "done\n");
d->busy = BURN_DRIVE_IDLE; d->busy = BURN_DRIVE_IDLE;
@ -929,9 +1339,12 @@ return crap. so we send the command, then ignore the result.
fail: fail:
d->sync_cache(d); d->sync_cache(d);
fail_wo_sync:;
usleep(500001); /* ts A61222: to avoid a warning from remove_worker()*/
burn_print(1, "done - failed\n"); burn_print(1, "done - failed\n");
libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002010b, libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002010b,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Burn run failed", 0, 0); "Burn run failed", 0, 0);
d->cancel = 1;
d->busy = BURN_DRIVE_IDLE; d->busy = BURN_DRIVE_IDLE;
} }

View File

@ -7,10 +7,11 @@
/** Overview /** Overview
libburner is a minimal demo application for the library libburn as provided libburner is a minimal demo application for the library libburn as provided
on http://libburn.pykix.org . It can list the available devices, can on http://libburnia.pykix.org . It can list the available devices, can
blank a CD-RW and can burn to CD-R or CD-RW. blank a CD-RW, can format a DVD-RW, and can burn to CD-R, CD-RW, DVD+RW,
DVD-RAM or DVD-RW.
It's main purpose, nevertheless, is to show you how to use libburn and also It's main purpose, nevertheless, is to show you how to use libburn and also
to serve the libburn team as reference application. libburner.c does indeed to serve the libburnia team as reference application. libburner.c does indeed
define the standard way how above three gestures can be implemented and define the standard way how above three gestures can be implemented and
stay upward compatible for a good while. stay upward compatible for a good while.
@ -25,9 +26,9 @@
libburner_aquire_by_driveno() demonstrates a scan-and-choose approach libburner_aquire_by_driveno() demonstrates a scan-and-choose approach
With that aquired drive you can blank a CD-RW With that aquired drive you can blank a CD-RW
libburner_blank_disc() libburner_blank_disc()
Between blanking and burning one eventually has to reload the drive status or you can format a DVD-RW to profile "Restricted Overwrite" (needed once)
libburner_regrab() libburner_format_row()
With the aquired drive you can burn to CD-R or blank CD-RW With the aquired drive you can burn to CD-R, CD-RW, DVD+RW, DVD-RAM, DVD-RW
libburner_payload() libburner_payload()
When everything is done, main() releases the drive and shuts down libburn: When everything is done, main() releases the drive and shuts down libburn:
burn_drive_release(); burn_drive_release();
@ -70,6 +71,10 @@ static unsigned int drive_count;
finally released */ finally released */
static int drive_is_grabbed = 0; static int drive_is_grabbed = 0;
/** A number and a text describing the type of media in aquired drive */
static int current_profile= -1;
static char current_profile_name[80]= {""};
/* Some in-advance definitions to allow a more comprehensive ordering /* Some in-advance definitions to allow a more comprehensive ordering
of the functions and their explanations in here */ of the functions and their explanations in here */
@ -98,7 +103,13 @@ int libburner_aquire_drive(char *drive_adr, int *driveno)
ret = libburner_aquire_by_adr(drive_adr); ret = libburner_aquire_by_adr(drive_adr);
else else
ret = libburner_aquire_by_driveno(driveno); ret = libburner_aquire_by_driveno(driveno);
return ret; if (ret <= 0)
return ret;
burn_disc_get_profile(drive_list[0].drive, &current_profile,
current_profile_name);
if (current_profile_name[0])
printf("Detected media type: %s\n", current_profile_name);
return 1;
} }
@ -109,12 +120,21 @@ int libburner_aquire_drive(char *drive_adr, int *driveno)
int libburner_aquire_by_adr(char *drive_adr) int libburner_aquire_by_adr(char *drive_adr)
{ {
int ret; int ret;
char libburn_drive_adr[BURN_DRIVE_ADR_LEN];
printf("Aquiring drive '%s' ...\n",drive_adr);
ret = burn_drive_scan_and_grab(&drive_list,drive_adr,1); /* This tries to resolve links or alternative device files */
ret = burn_drive_convert_fs_adr(drive_adr, libburn_drive_adr);
if (ret<=0) {
fprintf(stderr,"Address does not lead to a CD burner: '%s'\n",
drive_adr);
return ret;
}
printf("Aquiring drive '%s' ...\n",libburn_drive_adr);
ret = burn_drive_scan_and_grab(&drive_list,libburn_drive_adr,1);
if (ret <= 0) { if (ret <= 0) {
fprintf(stderr,"FAILURE with persistent drive address '%s'\n", fprintf(stderr,"FAILURE with persistent drive address '%s'\n",
drive_adr); libburn_drive_adr);
} else { } else {
printf("Done\n"); printf("Done\n");
drive_is_grabbed = 1; drive_is_grabbed = 1;
@ -243,17 +263,13 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
struct burn_progress p; struct burn_progress p;
int percent = 1; int percent = 1;
while (burn_drive_get_status(drive, NULL) != BURN_DRIVE_IDLE) disc_state = burn_disc_get_status(drive);
usleep(1001);
while ((disc_state = burn_disc_get_status(drive)) == BURN_DISC_UNREADY)
usleep(1001);
printf( printf(
"Drive media status: %d (see libburn/libburn.h BURN_DISC_*)\n", "Drive media status: %d (see libburn/libburn.h BURN_DISC_*)\n",
disc_state); disc_state);
if (disc_state == BURN_DISC_BLANK) { if (disc_state == BURN_DISC_BLANK) {
fprintf(stderr, fprintf(stderr,
"IDLE: Blank CD media detected. Will leave it untouched\n"); "IDLE: Blank media detected. Will leave it untouched\n");
return 2; return 2;
} else if (disc_state == BURN_DISC_FULL || } else if (disc_state == BURN_DISC_FULL ||
disc_state == BURN_DISC_APPENDABLE) { disc_state == BURN_DISC_APPENDABLE) {
@ -263,7 +279,7 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
return 0; return 0;
} else { } else {
fprintf(stderr, fprintf(stderr,
"FATAL: Cannot recognize drive and media state\n"); "FATAL: Unsuitable drive and media state\n");
return 0; return 0;
} }
if(!burn_disc_erasable(drive)) { if(!burn_disc_erasable(drive)) {
@ -272,7 +288,7 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
return 0; return 0;
} }
printf( printf(
"Beginning to %s-blank CD media.\n", (blank_fast?"fast":"full")); "Beginning to %s-blank media.\n", (blank_fast?"fast":"full"));
burn_disc_erase(drive, blank_fast); burn_disc_erase(drive, blank_fast);
sleep(1); sleep(1);
while (burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) { while (burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) {
@ -287,24 +303,44 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
} }
/** This gesture is necessary to get the drive info after blanking. /** Persistently changes DVD-RW profile 0014h "Sequential Recording"
It opens a small gap for losing the drive to another libburn instance. to profile 0013h "Restricted Overwrite" which is usable with libburner.
We will work on closing this gap.
*/
int libburner_regrab(struct burn_drive *drive) {
int ret;
printf("Releasing and regrabbing drive ...\n"); Expect a behavior similar to blanking with unusual noises from the drive.
if (drive_is_grabbed) */
burn_drive_release(drive, 0); int libburner_format_row(struct burn_drive *drive)
drive_is_grabbed = 0; {
ret = burn_drive_grab(drive, 0); struct burn_progress p;
if (ret != 0) { int percent = 1;
drive_is_grabbed = 1;
printf("Done\n"); if (current_profile == 0x13) {
} else fprintf(stderr, "IDLE: DVD-RW media is already formatted\n");
printf("FAILED\n"); return 2;
return !!ret; } else if (current_profile != 0x14) {
fprintf(stderr, "FATAL: Can only format DVD-RW\n");
return 0;
}
printf("Beginning to format media.\n");
burn_disc_format(drive, (off_t) 0, 0);
sleep(1);
while (burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) {
if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */
percent = 1.0 + ((double) p.sector+1.0)
/ ((double) p.sectors) * 98.0;
printf("Formatting ( %d%% done )\n", percent);
sleep(1);
}
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) {
fprintf(stderr,
"FATAL: Failed to change media profile to desired value\n");
return 0;
}
return 1;
} }
@ -377,16 +413,12 @@ int libburner_payload(struct burn_drive *drive,
} }
burn_session_add_track(session, track, BURN_POS_END); burn_session_add_track(session, track, BURN_POS_END);
printf("Track %d : source is '%s'\n", trackno, adr); printf("Track %d : source is '%s'\n", trackno+1, adr);
burn_source_free(data_src); burn_source_free(data_src);
} /* trackno loop end */ } /* trackno loop end */
while (burn_drive_get_status(drive, NULL) != BURN_DRIVE_IDLE)
usleep(100001);
/* Evaluate drive and media */ /* Evaluate drive and media */
while ((disc_state = burn_disc_get_status(drive)) == BURN_DISC_UNREADY) disc_state = burn_disc_get_status(drive);
usleep(100001);
if (disc_state == BURN_DISC_APPENDABLE) { if (disc_state == BURN_DISC_APPENDABLE) {
write_mode_tao = 1; write_mode_tao = 1;
} else if (disc_state != BURN_DISC_BLANK) { } else if (disc_state != BURN_DISC_BLANK) {
@ -445,11 +477,12 @@ int libburner_payload(struct burn_drive *drive,
burn_track_free(tracklist[trackno]); burn_track_free(tracklist[trackno]);
burn_session_free(session); burn_session_free(session);
burn_disc_free(target_disc); burn_disc_free(target_disc);
if (multi) if (multi && current_profile != 0x1a && current_profile != 0x13 &&
current_profile != 0x12) /* not with DVD+RW, DVD-RW, DVD-RAM */
printf("NOTE: Media left appendable.\n"); printf("NOTE: Media left appendable.\n");
if (simulate_burn) if (simulate_burn)
printf("\n*** Did TRY to SIMULATE burning ***\n\n"); printf("\n*** Did TRY to SIMULATE burning ***\n\n");
return 0; return 1;
} }
@ -504,6 +537,9 @@ int libburner_setup(int argc, char **argv)
} }
strcpy(drive_adr, argv[i]); strcpy(drive_adr, argv[i]);
} }
} else if (!strcmp(argv[i], "--format_overwrite")) {
do_blank = 101;
} else if (!strcmp(argv[i], "--multi")) { } else if (!strcmp(argv[i], "--multi")) {
do_multi = 1; do_multi = 1;
@ -542,7 +578,8 @@ int libburner_setup(int argc, char **argv)
if (print_help || insuffient_parameters ) { if (print_help || insuffient_parameters ) {
printf("Usage: %s\n", argv[0]); printf("Usage: %s\n", argv[0]);
printf(" [--drive <address>|<driveno>|\"-\"] [--audio]\n"); printf(" [--drive <address>|<driveno>|\"-\"] [--audio]\n");
printf(" [--blank_fast|--blank_full] [--try_to_simulate]\n"); printf(" [--blank_fast|--blank_full|--format_overwrite]\n");
printf(" [--try_to_simulate]\n");
printf(" [--multi] [<one or more imagefiles>|\"-\"]\n"); printf(" [--multi] [<one or more imagefiles>|\"-\"]\n");
printf("Examples\n"); printf("Examples\n");
printf("A bus scan (needs rw-permissions to see a drive):\n"); printf("A bus scan (needs rw-permissions to see a drive):\n");
@ -553,15 +590,16 @@ int libburner_setup(int argc, char **argv)
printf(" %s --drive /dev/hdc my_image_file\n", argv[0]); printf(" %s --drive /dev/hdc my_image_file\n", argv[0]);
printf("Blank a used CD-RW (is combinable with burning in one run):\n"); printf("Blank a used CD-RW (is combinable with burning in one run):\n");
printf(" %s --drive /dev/hdc --blank_fast\n",argv[0]); printf(" %s --drive /dev/hdc --blank_fast\n",argv[0]);
printf("Burn two audio tracks\n"); printf("Format a DVD-RW once before first use with libburner:\n");
printf(" %s --drive /dev/hdc --format_overwrite\n", argv[0]);
printf("Burn two audio tracks:\n");
printf(" lame --decode -t /path/to/track1.mp3 track1.cd\n"); printf(" lame --decode -t /path/to/track1.mp3 track1.cd\n");
printf(" test/dewav /path/to/track2.wav -o track2.cd\n"); printf(" test/dewav /path/to/track2.wav -o track2.cd\n");
printf(" %s --drive /dev/hdc --audio track1.cd track2.cd\n", argv[0]); printf(" %s --drive /dev/hdc --audio track1.cd track2.cd\n", argv[0]);
printf("Burn a compressed afio archive on-the-fly:\n"); printf("Burn a compressed afio archive on-the-fly:\n");
printf(" ( cd my_directory ; find . -print | afio -oZ - ) | \\\n"); printf(" ( cd my_directory ; find . -print | afio -oZ - ) | \\\n");
printf(" %s --drive /dev/hdc -\n", argv[0]); printf(" %s --drive /dev/hdc -\n", argv[0]);
printf("To be read from *not mounted* CD via: afio -tvZ /dev/hdc\n"); printf("To be read from *not mounted* media via: afio -tvZ /dev/hdc\n");
printf("Program tar would need a clean EOF which our padded CD cannot deliver.\n");
if (insuffient_parameters) if (insuffient_parameters)
return 6; return 6;
} }
@ -577,7 +615,7 @@ int main(int argc, char **argv)
if (ret) if (ret)
exit(ret); exit(ret);
printf("Initializing libburn.pykix.org ...\n"); printf("Initializing libburnia.pykix.org ...\n");
if (burn_initialize()) if (burn_initialize())
printf("Done\n"); printf("Done\n");
else { else {
@ -602,17 +640,13 @@ int main(int argc, char **argv)
if (ret == 2) if (ret == 2)
{ ret = 0; goto release_drive; } { ret = 0; goto release_drive; }
if (do_blank) { if (do_blank) {
ret = libburner_blank_disc(drive_list[driveno].drive, if (do_blank > 100)
do_blank == 1); ret = libburner_format_row(drive_list[driveno].drive);
else
ret = libburner_blank_disc(drive_list[driveno].drive,
do_blank == 1);
if (ret<=0) if (ret<=0)
{ ret = 36; goto release_drive; } { ret = 36; goto release_drive; }
if (ret != 2 && source_adr_count > 0)
ret = libburner_regrab(drive_list[driveno].drive);
if (ret<=0) {
fprintf(stderr,
"FATAL: Cannot release and grab again drive after blanking\n");
{ ret = 37; goto finish_libburn; }
}
} }
if (source_adr_count > 0) { if (source_adr_count > 0) {
ret = libburner_payload(drive_list[driveno].drive, ret = libburner_payload(drive_list[driveno].drive,
@ -645,7 +679,7 @@ Be also invited to study the code of cdrskin/cdrskin.c et al.
Clarification in my name and in the name of Mario Danic, copyright holder Clarification in my name and in the name of Mario Danic, copyright holder
on toplevel of libburn. To be fully in effect after the remaining other on toplevel of libburnia. To be fully in effect after the remaining other
copyrighted code has been replaced by ours and by copyright-free contributions copyrighted code has been replaced by ours and by copyright-free contributions
of our friends: of our friends:

View File

@ -5,9 +5,9 @@
/** Overview /** Overview
telltoc is a minimal demo application for the library libburn as provided telltoc is a minimal demo application for the library libburn as provided
on http://libburn.pykix.org . It can list the available devices, can display on http://libburnia.pykix.org . It can list the available devices, can
some drive properties, the type of media, eventual table of content and display some drive properties, the type of media, eventual table of content
multisession info for mkisofs option -C . and multisession info for mkisofs option -C .
It's main purpose, nevertheless, is to show you how to use libburn and also It's main purpose, nevertheless, is to show you how to use libburn and also
to serve the libburn team as reference application. telltoc.c does indeed to serve the libburn team as reference application. telltoc.c does indeed
define the standard way how above gestures can be implemented and stay upward define the standard way how above gestures can be implemented and stay upward
@ -105,11 +105,20 @@ int telltoc_aquire_by_adr(char *drive_adr)
{ {
int ret; int ret;
fprintf(stderr,"Aquiring drive '%s' ...\n",drive_adr); char libburn_drive_adr[BURN_DRIVE_ADR_LEN];
ret = burn_drive_scan_and_grab(&drive_list,drive_adr,1);
/* This tries to resolve links or alternative device files */
ret = burn_drive_convert_fs_adr(drive_adr, libburn_drive_adr);
if (ret<=0) {
fprintf(stderr,"Address does not lead to a CD burner: '%s'\n",
drive_adr);
return ret;
}
fprintf(stderr,"Aquiring drive '%s' ...\n",libburn_drive_adr);
ret = burn_drive_scan_and_grab(&drive_list,libburn_drive_adr,1);
if (ret <= 0) { if (ret <= 0) {
fprintf(stderr,"FAILURE with persistent drive address '%s'\n", fprintf(stderr,"FAILURE with persistent drive address '%s'\n",
drive_adr); libburn_drive_adr);
} else { } else {
fprintf(stderr,"Done\n"); fprintf(stderr,"Done\n");
drive_is_grabbed = 1; drive_is_grabbed = 1;
@ -215,16 +224,32 @@ int telltoc_regrab(struct burn_drive *drive) {
int telltoc_media(struct burn_drive *drive) int telltoc_media(struct burn_drive *drive)
{ {
int ret, media_found = 0; int ret, media_found = 0, profile_no = -1;
double max_speed = 0.0, min_speed = 0.0; double max_speed = 0.0, min_speed = 0.0, speed_conv;
enum burn_disc_status s; enum burn_disc_status s;
char profile_name[80], speed_unit[40];
while (burn_drive_get_status(drive, NULL) != BURN_DRIVE_IDLE) printf("Media current: ");
usleep(100001); ret = burn_disc_get_profile(drive, &profile_no, profile_name);
while ((s = burn_disc_get_status(drive)) == BURN_DISC_UNREADY) if (profile_no > 0 && ret >0) {
usleep(100001); if (profile_name[0])
printf("%s\n", profile_name);
else
printf("%4.4Xh\n", profile_no);
} else
printf("is not recognizable\n");
speed_conv = 176.4;
strcpy(speed_unit,"176.4 kB/s (CD, data speed 150 KiB/s)");
if (strstr(profile_name, "DVD") == profile_name) {
speed_conv = 1385.0;
strcpy(speed_unit,"1385.0 kB/s (DVD)");
}
/* >>> libburn does not obtain full profile list yet */
printf("Media status : "); printf("Media status : ");
s = burn_disc_get_status(drive);
if (s==BURN_DISC_FULL) { if (s==BURN_DISC_FULL) {
printf("is written , is closed\n"); printf("is written , is closed\n");
media_found = 1; media_found = 1;
@ -239,7 +264,7 @@ int telltoc_media(struct burn_drive *drive)
else else
printf("is not recognizable\n"); printf("is not recognizable\n");
printf("Media type : "); printf("Media reuse : ");
if (media_found) { if (media_found) {
if (burn_disc_erasable(drive)) if (burn_disc_erasable(drive))
printf("is erasable\n"); printf("is erasable\n");
@ -248,41 +273,116 @@ int telltoc_media(struct burn_drive *drive)
} else } else
printf("is not recognizable\n"); printf("is not recognizable\n");
ret= burn_disc_read_atip(drive); ret= burn_drive_get_write_speed(drive);
max_speed = ((double ) ret) / speed_conv;
ret= burn_drive_get_min_write_speed(drive);
min_speed = ((double ) ret) / speed_conv;
if (!media_found)
printf("Drive speed : max=%.1f , min=%.1f\n",
max_speed, min_speed);
else
printf("Avail. speed : max=%.1f , min=%.1f\n",
max_speed, min_speed);
ret = 0;
if (media_found)
ret= burn_disc_read_atip(drive);
if(ret>0) { if(ret>0) {
ret= burn_drive_get_min_write_speed(drive); ret= burn_drive_get_min_write_speed(drive);
min_speed = ((double ) ret) / 176.0; min_speed = ((double ) ret) / speed_conv;
} ret= burn_drive_get_write_speed(drive);
ret= burn_drive_get_write_speed(drive); max_speed = ((double ) ret) / speed_conv;
max_speed = ((double ) ret) / 176.0; printf("Media speed : max=%.1f , min=%.1f\n",
if (!media_found)
printf("Drive speed : max=%.f\n", max_speed);
else if (min_speed<=0)
printf("Media speed : max=%.f\n", max_speed);
else
printf("Media speed : max=%.f , min=%.f\n",
max_speed, min_speed); max_speed, min_speed);
}
printf("Speed unit 1x: %s\n", speed_unit);
return 1; return 1;
} }
int telltoc_speedlist(struct burn_drive *drive)
{
int ret, has_modern_entries = 0;
struct burn_speed_descriptor *speed_list, *sd;
ret = burn_drive_get_speedlist(drive, &speed_list);
if (ret <= 0) {
fprintf(stderr, "SORRY: Cannot obtain speed list info\n");
return 2;
}
for (sd = speed_list; sd != NULL; sd = sd->next)
if (sd->source == 2)
has_modern_entries = 1;
for (sd = speed_list; sd != NULL; sd = sd->next) {
if (has_modern_entries && sd->source < 2)
continue;
if (sd->write_speed <= 0)
continue;
printf("Speed descr. : %d kB/s", sd->write_speed);
if (sd->end_lba >= 0)
printf(", %.1f MiB", ((double) sd->end_lba) / 512.0);
if (sd->profile_name[0])
printf(", %s", sd->profile_name);
printf("\n");
}
burn_drive_free_speedlist(&speed_list);
return 1;
}
int telltoc_formatlist(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];
ret = burn_disc_get_formats(drive, &status, &size, &dummy,
&num_formats);
if (ret <= 0) {
fprintf(stderr, "SORRY: Cannot obtain format list info\n");
return 2;
}
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)
sprintf(status_text, "formatted, with %.1f MiB",
((double) size) / 1024.0 / 1024.0);
else if(status == BURN_FORMAT_IS_UNKNOWN) {
burn_disc_get_profile(drive, &profile_no, profile_name);
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 descr.: %2.2Xh , %.1f MiB (%.fs)\n",
type, ((double) size) / 1024.0 / 1024.0,
((double) size) / 2048.0);
}
return 1;
}
int telltoc_toc(struct burn_drive *drive) int telltoc_toc(struct burn_drive *drive)
{ {
int num_sessions = 0 , num_tracks = 0 , lba = 0; int num_sessions = 0 , num_tracks = 0 , lba = 0;
int track_count = 0; int track_count = 0;
int session_no, track_no; int session_no, track_no;
enum burn_disc_status s;
struct burn_disc *disc= NULL; struct burn_disc *disc= NULL;
struct burn_session **sessions; struct burn_session **sessions;
struct burn_track **tracks; struct burn_track **tracks;
struct burn_toc_entry toc_entry; struct burn_toc_entry toc_entry;
while (burn_drive_get_status(drive, NULL) != BURN_DRIVE_IDLE)
usleep(100001);
while ((s = burn_disc_get_status(drive)) == BURN_DISC_UNREADY)
usleep(100001);
disc = burn_drive_get_disc(drive); disc = burn_drive_get_disc(drive);
if (disc==NULL) { if (disc==NULL) {
fprintf(stderr, "SORRY: Cannot obtain Table Of Content\n"); fprintf(stderr, "SORRY: Cannot obtain Table Of Content\n");
@ -337,10 +437,7 @@ int telltoc_msinfo(struct burn_drive *drive,
struct burn_toc_entry toc_entry; struct burn_toc_entry toc_entry;
struct burn_write_opts *o= NULL; struct burn_write_opts *o= NULL;
while (burn_drive_get_status(drive, NULL) != BURN_DRIVE_IDLE) s = burn_disc_get_status(drive);
usleep(100001);
while ((s = burn_disc_get_status(drive)) == BURN_DISC_UNREADY)
usleep(100001);
if (s!=BURN_DISC_APPENDABLE) { if (s!=BURN_DISC_APPENDABLE) {
if (!msinfo_explicit) if (!msinfo_explicit)
return 2; return 2;
@ -420,6 +517,7 @@ static int do_media = 0;
static int do_toc = 0; static int do_toc = 0;
static int do_msinfo = 0; static int do_msinfo = 0;
static int print_help = 0; static int print_help = 0;
static int do_capacities = 0;
/** Converts command line arguments into above setup parameters. /** Converts command line arguments into above setup parameters.
@ -456,6 +554,9 @@ int telltoc_setup(int argc, char **argv)
} else if (!strcmp(argv[i], "--msinfo")) { } else if (!strcmp(argv[i], "--msinfo")) {
do_msinfo = 1; do_msinfo = 1;
} else if (!strcmp(argv[i], "--capacities")) {
do_capacities = 1;
} else if (!strcmp(argv[i], "--toc")) { } else if (!strcmp(argv[i], "--toc")) {
do_toc = 1; do_toc = 1;
@ -472,7 +573,7 @@ int telltoc_setup(int argc, char **argv)
if (print_help) { if (print_help) {
printf("Usage: %s\n", argv[0]); printf("Usage: %s\n", argv[0]);
printf(" [--drive <address>|<driveno>|\"-\"]\n"); printf(" [--drive <address>|<driveno>|\"-\"]\n");
printf(" [--media] [--toc] [--msinfo]\n"); printf(" [--media] [--capacities] [--toc] [--msinfo]\n");
printf("Examples\n"); printf("Examples\n");
printf("A bus scan (needs rw-permissions to see a drive):\n"); printf("A bus scan (needs rw-permissions to see a drive):\n");
printf(" %s --drive -\n",argv[0]); printf(" %s --drive -\n",argv[0]);
@ -507,13 +608,14 @@ int main(int argc, char **argv)
msinfo_alone = 1; msinfo_alone = 1;
} }
/* Default option is to do everything if possible */ /* Default option is to do everything if possible */
if (do_media==0 && do_msinfo==0 && do_toc==0 && driveno!=-1) { if (do_media==0 && do_msinfo==0 && do_capacities==0 && do_toc==0
&& driveno!=-1) {
if(print_help) if(print_help)
exit(0); exit(0);
full_default = do_media = do_msinfo = do_toc = 1; full_default = do_media = do_msinfo = do_capacities= do_toc = 1;
} }
fprintf(stderr, "Initializing libburn.pykix.org ...\n"); fprintf(stderr, "Initializing libburnia.pykix.org ...\n");
if (burn_initialize()) if (burn_initialize())
fprintf(stderr, "Done\n"); fprintf(stderr, "Done\n");
else { else {
@ -538,6 +640,14 @@ int main(int argc, char **argv)
if (ret<=0) if (ret<=0)
{ret = 36; goto release_drive; } {ret = 36; goto release_drive; }
} }
if (do_capacities) {
ret = telltoc_speedlist(drive_list[driveno].drive);
if (ret<=0)
{ret = 39; goto release_drive; }
ret = telltoc_formatlist(drive_list[driveno].drive);
if (ret<=0)
{ret = 39; goto release_drive; }
}
if (do_toc) { if (do_toc) {
ret = telltoc_toc(drive_list[driveno].drive); ret = telltoc_toc(drive_list[driveno].drive);
if (ret<=0) if (ret<=0)