Compare commits

...

51 Commits

Author SHA1 Message Date
6718f0ab78 Documented changes and release timestamp 2010-10-20 12:12:23 +00:00
7fb96f4e76 Updated cdrskin tarball generator 2010-10-20 12:10:50 +00:00
89a2944dad Made number transition to 0.8.8 2010-10-20 12:08:30 +00:00
e2a085ef20 Branching for libburn release 0.8.8 2010-10-20 08:11:19 +00:00
0f622def33 Issueing messages with all cases of burn canceling 2010-10-19 16:59:34 +00:00
707d6153f7 Issue warning after writing a BD-R with more than 300 sessions 2010-10-15 19:17:37 +00:00
28ae78b4f1 Avoiding to inquire spare area of unsuitable media 2010-09-28 10:11:06 +00:00
7ceb67f0b0 Polished appearance of BD spare info with --list_formats 2010-09-24 10:05:05 +00:00
e18bfe50c1 Making new API call available in dynamic library 2010-09-24 09:26:06 +00:00
4083001548 Displaying eventual BD spare area information with --list_formats 2010-09-24 09:19:44 +00:00
45353dee67 Displaying eventual BD spare area information with -minfo 2010-09-24 09:07:58 +00:00
f14b66a09b New API call burn_disc_get_bd_spare_info() 2010-09-24 09:07:05 +00:00
38c029d5e3 Better default input file for test/offst_source.c 2010-09-22 18:17:10 +00:00
287b59cfd3 Temporarily added test program for burn_offst_source_new() 2010-09-22 18:09:50 +00:00
c49995b11a New API call burn_offst_source_new() 2010-09-22 17:51:26 +00:00
f2436351ef On Linux: Run ldconfig during make install,if not --disable-ldconfig-at-install 2010-09-22 10:54:56 +00:00
71844bf8b9 Documented changes and release timestamp 2010-09-17 08:02:52 +00:00
59e0824370 Updated cdrskin tarball generator 2010-09-17 08:01:21 +00:00
b7034abcbb Made number transition to 0.8.7 2010-09-17 07:54:34 +00:00
df390ae7d3 Meaningful change log file derived by George Danchev from web site 2010-09-15 06:23:37 +00:00
c1f4063193 Centralized interpretation of SCSI command outcome 2010-09-14 12:50:06 +00:00
4cc524097b Clarified the meaning of 0x0 and 0x30 signal handlers 2010-08-28 11:29:29 +00:00
fb159b8dbd Lifted test reservation on DVD-R DL media. Thanks to Kevin Kieffer for testing. 2010-08-21 09:56:16 +00:00
c693798571 Corrected typo in macro names (which shall never be defined anyway) 2010-08-13 11:42:49 +00:00
34847fff80 Hopefully silenced a warning of doxygen on Debian buildd 2010-08-08 09:13:53 +00:00
54651df146 New SCSI comand response "GO_ON" 2010-08-08 09:13:04 +00:00
d4e4607a84 Obeying burn_set_scsi_logging() with errors of class RETRY 2010-08-03 09:11:58 +00:00
98b2e06c21 Committed Solaris system adapter which was forgotten with rev 3345 2010-08-02 14:13:08 +00:00
d5ecb382aa Added error simulation code to Linux system adapter. 2010-08-02 13:20:33 +00:00
cdcda19384 Reporting sense data with burn_set_scsi_logging() 2010-08-02 10:07:09 +00:00
b96aeece99 Removed problematic DETAILS_AT_TOP to silence warning of Debian buildd 2010-07-30 16:05:26 +00:00
7bbf99384e Detached make target "doc" from target "all". 2010-07-29 16:41:45 +00:00
9f61db5378 Recognizing sense data format 0x72 if given instead of 0x70 2010-07-29 08:35:36 +00:00
2a48b34bcd Changed all malloc() to calloc() 2010-07-12 19:37:31 +00:00
15266fb310 Changed all malloc() to calloc() 2010-07-12 19:32:41 +00:00
e2bdd521d8 Mentioned that public API calls must be in libisofs/libisofs.ver 2010-07-06 11:34:38 +00:00
7a3b871c4e Let configure perform linker test with --version-script if enabled 2010-07-06 11:33:51 +00:00
713ec46f23 Mentioned new configure option --disable-versioned-libs 2010-07-04 17:29:17 +00:00
85eb091025 Hiding all non-API symbols from the linker by use of --version-script 2010-07-04 17:01:21 +00:00
c866b6bc35 Moved public part of libdax_audioxtr.h to libburn.h 2010-07-04 13:13:09 +00:00
0250a2831d Documented changes and release timestamp 2010-06-30 11:37:11 +00:00
4c47b81a9c Updated cdrskin tarball generator 2010-06-30 11:32:38 +00:00
bb88ba5861 Made number transition to 0.8.5 2010-06-30 11:31:22 +00:00
b30a2af7c7 Allowed 64 kB max output buffer size on all OSes 2010-06-16 08:25:57 +00:00
b10cfb3d22 Incremented LT_CURRENT and LT_AGE of libburn 2010-06-15 15:58:30 +00:00
a2df41713d Let general POSIX system adapters ignore SIGWINCH and SIGURG if defined 2010-06-15 15:57:11 +00:00
86ce32d170 Avoided compiler warning about unused variable on non-Solaris systems 2010-06-15 15:55:11 +00:00
7ba30596ce New less obtrusive implementation of sg_is_enumerable_adr for Solaris 2010-06-13 19:07:52 +00:00
2f8ad976ea Documented changes and release timestamp 2010-06-11 11:02:25 +00:00
d0d37af096 Updated cdrskin tarball generator 2010-06-11 11:01:44 +00:00
81768cd4b0 Made number transition to 0.8.3 2010-06-11 10:53:56 +00:00
49 changed files with 2428 additions and 414 deletions

269
ChangeLog
View File

@ -1 +1,268 @@
nothing here now SVN trunk (to become libburn-0.9.0.pl00.tar.gz)
===============================================================================
libburn-0.8.8.pl00.tar.gz Wed Oct 20 2010
===============================================================================
* New API call burn_offst_source_new()
* New API call burn_disc_get_bd_spare_info()
libburn-0.8.6.pl00.tar.gz Fri Sep 17 2010
===============================================================================
* Lifted test reservation on DVD-R DL media.
* Hiding all non-API symbols from the linker by use of --version-script
* Now with history of release notes in ./ChangeLog file.
libburn-0.8.4.pl00.tar.gz Wed Jun 30 2010
===============================================================================
* General POSIX system adapters ignore SIGWINCH and SIGURG if defined
* Allowed 64 kB max output buffer size on all OSes
libburn-0.8.2.pl00.tar.gz Fri Jun 11 2010
===============================================================================
* New system adapter for Solaris uscsi (tested on snv134, kernel 5.11)
* Bug fix: CD TOC was not read if the first track did not start at LBA 0
* Bug fix: CD-ROM media got attributed random lead-in and lead-out adresses
* Bug fix: SIGSEGV of experimental libcdio system adapter if drive list is
empty
libburn-0.8.0.pl00.tar.gz Fri Apr 09 2010
===============================================================================
* libburn now works with ahci driver on FreeBSD 8-STABLE.
libburn-0.7.8.pl00.tar.gz Wed Mar 10 2010
===============================================================================
* Bug fix: On FreeBSD, piped input was falsely attributed a small fixed size.
* Built-in abort handling is more suitable for FreeBSD now.
cdrskin novelties:
* Bug fix: Option fs=0 led to SIGSEGV. Regression introduced by version 0.7.4
in december 2009.
* Abort handling is more suitable for FreeBSD now.
libburn-0.7.6.pl00.tar.gz Sat Jan 23 2010
===============================================================================
* Bug fix: System adapter for generic X/Open was missing in libburn release
tarball
* Bug fix: with non-Linux adapters there were 0 readable bytes on block devices
* Made FreeBSD system adapter safe from mutal burn spoiling and drive deadlock
* Enabled FreeBSD system adapter for Debian kfreebsd
* Experimental SCSI transport adapter via GNU libcdio 0.83git
cdrskin novelties:
* none
libburn-0.7.4.pl01.tar.gz Sat Dec 26 2009
===============================================================================
* Bug fix: Added missing system adapter for generic X/Open to libburn release
tarball
Libburn 0.7.4.pl00 Mon Dec 07 2009
===============================================================================
* Bug fix: SIGSEGV from NULL pointer with media product id inquiry on LG
GH22LS30
* Bug fix: DVD DAO track size was rounded up much too generously
* Workaround for Pioneer DVR-216D which got stuck on DVD-R burns.
(already fixed in 0.7.2.pl01)
* Workaround for Pioneer DVR-216D refusal to eject.
(already fixed in 0.7.2.pl01)
* Configure options --enable-dvd-obs-64k, --enable-track-src-odirect
* New API calls burn_write_opts_set_dvd_obs(),
burn_write_opts_set_stdio_fsync()
* New API call burn_set_scsi_logging()
* New API calls burn_fifo_get_statistics(), burn_fifo_next_interval(),
burn_fifo_fill()
* Re-implemented ECMA-130 P-parity, Q-parity and scrambling for BURN_WRITE_RAW
cdrskin novelties:
* cdrskin option -V for logging of SCSI commands
* New cdrskin options dvd_obs= and stdio_fsync=
* New compile_cdrskin.sh option -dvd_obs_64k
libburn-0.7.2.pl01.tar.gz Fri Nov 13 2009
===============================================================================
* Workaround for Pioneer DVR-216D which got stuck on DVD-R burns.
* Workaround for Pioneer DVR-216D refusal to eject.
Libburn 0.7.2.pl00 Mon Oct 12 2009
===============================================================================
* Bug fix: CD TAO sessions with multiple tracks did not work in -dummy mode
* New API calls burn_get_media_product_id() , burn_guess_manufacturer() ,
burn_guess_cd_manufacturer()
* New API call burn_disc_get_cd_info()
* New API call burn_track_set_cdxa_conv()
cdrskin novelties:
* Better interpretation of options -mode2, -xa, -xa1, -xa2
* New option --xa1-ignore
* New -atip report lines "Product Id:" and "Producer:"
libburn-0.7.0.pl00.tar.gz Thu Aug 27 2009
===============================================================================
* New API calls burn_drive_get_all_profiles(), burn_obtain_profile_name() allow
to inquire and process the list of supported media types. cdrskin lists all
supported profiles with option -atip -v
* New API call burn_drive_snooze() allows to calm down a drive when no i/o is
expected for a while.
* Bug fix: Some SCSI commands stalled on U3 memory sticks which appear as a hub
with a memory stick and a CD-ROM drive containing a small CD. These commands
make not much sense with a CD-ROM and are now avoided for this media
situation.
libburn-0.6.8.pl00.tar.gz Tue Jul 14 2009
===============================================================================
* Bug fix: Old MMC-1 drives were rejected because of mode page 2Ah length.
* cdrskin -scanbus now works with high SCSI bus numbers.
libburn-0.6.6.pl00.tar.gz Fri May 8 2009
===============================================================================
* Bug fix: Improper abort handling with broken pipe during outputto a stdio:
pseudo-drive.
* Bug fix: Device scan stalled on FreeBSD with non-burner USB device
libburn-0.6.4.pl00.tar.gz Fri Mar 13 2009
===============================================================================
* New operating system adapter "dummy" for stdio on general X/Open systems
* New API function burn_drive_set_stream_recording() allows to write the
crucial start blocks of a filesystem with slow BD-RE Defect Management and to
write the bulk of data with full nominal speed.
libburn-0.6.2.pl00.tar.gz Fri Feb 20 2009
===============================================================================
* Improvements with build system for FreeBSD
libburn-0.6.0.pl01.tar.gz Wed Jan 07 2009
===============================================================================
* Bug fix: BD-R were not correctly finalized
libburn-0.6.0.pl00.tar.gz Sun Jan 04 2009
===============================================================================
* Formatting and writing of BD-R media
* New API function burn_get_read_capacity()
libburn-0.5.8.pl00.tar.gz Mon Dec 08 2008
===============================================================================
* Bug fix: A session without leadout entry on CD caused a SIGSEGV by NULL
* Improvements about BD-RE formatting
libburn-0.5.6.pl00.tar.gz Wed Nov 12 2008
===============================================================================
* Bug fix: libburn fifo thread was not aborted when burn run was aborted which
could lead to use of freed memory.
libburn-0.5.4.pl00.tar.gz Mon Oct 6 2008
===============================================================================
* Bug fix: On Linux 2.4 /dev/sr0 was accepted as enumerable address but then
failed to work.
libburn-0.5.2.pl00.tar.gz Wed Aug 20 2008
===============================================================================
* Larger set of possibly acceptable drive device file names
libburn-0.5.0.pl00.tar.gz Thu Jul 17 2008
===============================================================================
* Bug fix: cdrskin option drive_scsi_dev_family=scd lead to buffer overflow
* Ability to use /dev/scd as fallback if /dev/sr does not exist
* New API call burn_fifo_peek_data()
libburn-0.4.8.pl00.tar.gz Sat May 17 2008
===============================================================================
* Bug fix: Random access addressing for DVD-RAM and BD-RE did not work.
* cdrskin: Affected were options write_start_address= and
-- grow_overwriteable_iso on DVD-RAM or BD-RE.
* xorriso: Affected were sessions on DVD-RAM or BD-RE after the first one.
libburn-0.4.6.pl00.tar.gz Sun May 11 2008
===============================================================================
* Support for BD-RE media is now official
* New burn_write_opts_set_stream_recording() can speed up DVD-RAM and BD-RE
* New cdrskin option --list_formats
* New cdrskin blank types for expert formatting of DVD-RAM and BD-RE
* New cdrskin blank type blank=as_needed for automatic handling of media
libburn-0.4.4.tar.gz Thu April 10 2008
===============================================================================
* Support for DVD+R/DL media is now official
libburn-0.4.2.tar.gz Sun Feb 3 2008
===============================================================================
* Long term commitment to ABI libburn.so.4.
* ABI compatibility is guaranteed for any older feature set released since
libburn-0.3.2 about one year ago.
* libburn provides means for compile time and runtime checking of its version.
* Compile time check in cdrskin for proper version of libburn include file.
Required is at least 0.4.2.
* Runtime check in cdrskin prevents dynamic linking with outdated version of
libburn.so.4. Required is at least the version seen in the include file at
compile time.
libburn-0.4.0.tar.gz Mon Oct 29 2007
===============================================================================
* New option direct_write_amount=
* New option --grow_overwriteable_iso
* New option --allow_emulated_drives dev=stdio:<path>
* More cdrecord options supported: -format, -inq, -load, -lock, -immed, -waiti
* New option fallback_program=
* A lot of libburn API additions.
libburn-0.3.8.tar.gz Tue Jul 31 2007
===============================================================================
* Now able to cope with the peculiarities of Linux 2.4 USB
* Refusal to perform -dummy runs on media which cannot simulate burning
* New option modesty_on_drive= may help with hda -> hdb burns
* New option minbuf= , cdrecord compatible frontend of modesty_on_drive=
* New option --adjust_speed_to_drive
* Precautions against using the burner drive as track source
* Note: ABI has not been broken.
libburn-0.3.6.tar.gz Thu Apr 26 2007
===============================================================================
* On Linux kernel 2.6, /dev/sr* gets used rather than /dev/sg*.
* DVD+R now get finalized (if not -multi is given)
libburn-0.3.4.tar.gz Mon Mar 12 2007
===============================================================================
* Multi-session recording on DVD+R, including -toc, -msinfo
* Options --tell_media_space , assert_write_lba=
* Bug fix of rare multi track fifo stall
libburn-0.3.2.tar.gz Feb 11 2007
===============================================================================
* Burnfree enabled by default
* Multi-session recording on sequential DVD-R[W], including -toc, -msinfo
* DVD-R[W] Disk-at-once recording
libburn-0.3.0.1.tar.gz Tue Jan 30 2007
===============================================================================
* Improved recognition of unsuitable media types
* Replaced ban of chmod u+s by loud warning
* detailed man page for cdrskin
* Burning of DVD+RW and DVD-RAM media as single-track TAO-like initial session
* Formatting and then burning to DVD-RW like to DVD+RW
* New option -msifile=path from cdrkit/wodim
* 0.3.0.1 release notes *
* Bug fix enabling tracks >= 1.3 GB from disk file
libburn-0.2.6.3.tar.gz Fri Dec 29 2006
===============================================================================
* 0.2.6 release notes (Wed Nov 22 2006)
* After a lot of time with dedication to this project, we proudly present you
libburn 0.2.6. It is the first version of cdrskin and libburn after they have
been split from genisofs and libisofs. Main new features are write mode TAO
and support for multi session.
* 0.2.6.1 release notes (Fri Nov 24 2006)
* Point release to fix misleading version numbers in messages and documentation
* 0.2.6.2 release notes (Sat Dec 16 2006)
* cdrskin man page backported from development version 0.2.7.
* 0.2.6.3 release notes (Fri Dec 29 2006)
* Point release to fix build system problems people have experienced with the
past release.
libburn-0.2.3.snapshot02.tar.gz Thu Nov 02 2006
===============================================================================
* Stabilized snapshot including release 0.2.4.pl01 of cdrskin
* cdrskin 0.2.4 release notes
* Compatibility with cdrecord has been improved in respect to drive addresses,
audio extraction from .wav, -scanbus, -toc, drive buffer fill indicator.
* Note: The previous snapshot01 with the same source base is handicapped by a
broken ./configure setup. It works well on Intel compatible CPUs but is
supposed to be unusable on big-endian architectures.
libburn-0.2.2.tar.gz Wed Sep 20 2006
===============================================================================
Initial release of libburnia's libburn combined with cdrskin.

View File

@ -75,11 +75,15 @@ libburn_libburn_la_SOURCES = \
libinclude_HEADERS = \ libinclude_HEADERS = \
libburn/libburn.h libburn/libburn.h
install-exec-hook:
$(LIBBURNIA_LDCONFIG_CMD) "$(DESTDIR)$(libdir)" || echo 'NOTE: Explicite dynamic library configuration failed. If needed, configure manually for:' "$(DESTDIR)$(libdir)"
## ========================================================================= ## ## ========================================================================= ##
## Build test applications ## Build test applications
noinst_PROGRAMS = \ noinst_PROGRAMS = \
test/libburner \ test/libburner \
test/offst_source \
test/telltoc \ test/telltoc \
test/dewav \ test/dewav \
test/fake_au \ test/fake_au \
@ -94,6 +98,9 @@ LIBBURN_EXTRALIBS = $(LIBBURN_ARCH_LIBS) $(THREAD_LIBS)
test_libburner_CPPFLAGS = -Ilibburn test_libburner_CPPFLAGS = -Ilibburn
test_libburner_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS) test_libburner_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
test_libburner_SOURCES = test/libburner.c test_libburner_SOURCES = test/libburner.c
test_offst_source_CPPFLAGS = -Ilibburn
test_offst_source_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
test_offst_source_SOURCES = test/offst_source.c
test_telltoc_CPPFLAGS = -Ilibburn test_telltoc_CPPFLAGS = -Ilibburn
test_telltoc_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS) test_telltoc_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
test_telltoc_SOURCES = test/telltoc.c test_telltoc_SOURCES = test/telltoc.c
@ -110,9 +117,9 @@ test_structest_CPPFLAGS = -Ilibburn
test_structest_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS) test_structest_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
test_structest_SOURCES = test/structest.c test_structest_SOURCES = test/structest.c
## cdrskin construction site - ts A60816 - B00409 ## cdrskin construction site - ts A60816 - B01020
cdrskin_cdrskin_CPPFLAGS = -Ilibburn cdrskin_cdrskin_CPPFLAGS = -Ilibburn
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_8_1 cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_8_8
# cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS) # cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
# ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking # ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking
@ -143,7 +150,10 @@ doc/html: doc/doxygen.conf
doc-upload: doc/html doc-upload: doc/html
scp -r $</* $(webhost):$(webpath) scp -r $</* $(webhost):$(webpath)
all: doc ## ts B00729
## Not by default any more.
## It is unclear who is supposed to create file ./doc/doc.lock
# all: doc
install-data-local: install-data-local:
if [ -f ./doc/doc.lock ]; then \ if [ -f ./doc/doc.lock ]; then \
@ -199,6 +209,7 @@ EXTRA_DIST = \
cdrskin/wiki_plain.txt \ cdrskin/wiki_plain.txt \
cdrskin/cleanup.h \ cdrskin/cleanup.h \
cdrskin/cleanup.c \ cdrskin/cleanup.c \
libburn/libburn.ver \
libburn/os-dummy.h \ libburn/os-dummy.h \
libburn/os-freebsd.h \ libburn/os-freebsd.h \
libburn/os-linux.h \ libburn/os-linux.h \

61
README
View File

@ -11,7 +11,7 @@ Still containing parts of Libburn. By Derek Foreman <derek@signalmarketing.com>
and Ben Jansens <xor@orodu.net> and Ben Jansens <xor@orodu.net>
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
http://files.libburnia-project.org/releases/libburn-0.8.0.pl00.tar.gz http://files.libburnia-project.org/releases/libburn-0.8.8.pl00.tar.gz
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
@ -19,10 +19,10 @@ Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
From tarball From tarball
Obtain libburn-0.8.0.pl00.tar.gz, take it to a directory of your choice and do: Obtain libburn-0.8.8.pl00.tar.gz, take it to a directory of your choice and do:
tar xzf libburn-0.8.0.pl00.tar.gz tar xzf libburn-0.8.8.pl00.tar.gz
cd libburn-0.8.0 cd libburn-0.8.8
./configure --prefix=/usr ./configure --prefix=/usr
make make
@ -60,6 +60,11 @@ Warning: The trunk might contain experimental features which might not
Special ./configure options Special ./configure options
make install on GNU/Linux will try to run program ldconfig with the library
installation directory as only argument. Failure to do so will not abort
installation. One may disable ldconfig by ./configure option:
--disable-ldconfig-at-install
In some situations Linux may deliver a better write performance to drives if In some situations Linux may deliver a better write performance to drives if
the track input is read with O_DIRECT (see man 2 open). The API call the track input is read with O_DIRECT (see man 2 open). The API call
burn_os_open_track_src() and the input readers of cdrskin and libburn fifo burn_os_open_track_src() and the input readers of cdrskin and libburn fifo
@ -76,6 +81,12 @@ Alternatively the transport of SCSI commands can be done via libcdio-0.83.
You may install it and re-run libburn's ./configure with option You may install it and re-run libburn's ./configure with option
--enable-libcdio --enable-libcdio
By use of a version script, the libburn.so library exposes no other function
names but those of the API definition in libburn/libburn.h.
If -Wl,--version-script=... makes problems with the local compiler, then
disable this encapsulation feature by
--disable-versioned-libs
Make sure to re-compile all source files after running ./configure Make sure to re-compile all source files after running ./configure
make clean ; make make clean ; make
make install make install
@ -139,7 +150,8 @@ The project components (list subject to growth, hopefully):
- libisofs is the library to pack up hard disk files and directories into a - 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. ISO 9660 disk image. This may then be brought to CD via libburn.
libisofs is to be the foundation of our upcoming mkisofs emulation. An own ISO 9660 extension stores ACLs, xattr, and MD5 of file
content.
- libisoburn is an add-on to libburn and libisofs which coordinates both and - libisoburn is an add-on to libburn and libisofs which coordinates both and
also allows to grow ISO-9660 filesystem images on multi-session also allows to grow ISO-9660 filesystem images on multi-session
@ -164,8 +176,8 @@ The project components (list subject to growth, hopefully):
Rock Ridge extensions. Manipulation is not only adding or Rock Ridge extensions. Manipulation is not only adding or
overwriting of files but also deleting, renaming, attribute overwriting of files but also deleting, renaming, attribute
changing, incremental backups, activating boot images, and changing, incremental backups, activating boot images, and
extracting of files from ISO images to disk. An own ISO 9660 extracting of files from ISO images to disk. There is also a
extension stores ACLs, xattr, and MD5 of file content. sparse emulation of cdrecord and a more laborate one of mkisofs.
All features of xorriso are also available via a C language API All features of xorriso are also available via a C language API
of libisoburn. of libisoburn.
See xorriso/README for more. See xorriso/README for more.
@ -518,6 +530,41 @@ Project history as far as known to me:
- 09 Apr 2010 libburn-0.8.0 now works with ahci driver on FreeBSD 8-STABLE. - 09 Apr 2010 libburn-0.8.0 now works with ahci driver on FreeBSD 8-STABLE.
- 03 May 2010 Version 0.6.32 of libisofs is able to create ISO images with
multiple boot images. All boot catalog parameters described in El-Torito
specs can be set and inquired. This allows to use GRUB boot images for EFI.
- 04 May 2010 Release 0.5.6.pl00 of libisoburn makes use of the new libisofs
capabilities about boot images.
- 11 Jun 2010 libburn-0.8.2 now works on Solaris.
- 14 Jun 2010 By release 0.5.8.pl00 of libisoburn, xorriso becomes a public C
language API of libisoburn. The emulations of mkisofs and cdrecord have
been enhanced.
- Tue Jun 29 2010 Version 0.6.34 of libisofs provides new features about
hiding file names from directory trees.
- Wed Jun 30 2010 libburn-0.8.4 removes some restrictions on operating
systems other than Linux and FreeBSD.
- Fri Jul 02 2010 Release 0.6.0.pl00 of libisoburn adds more options to the
mkisofs emulation of xorriso. It also fixes minor bugs and shortcommings.
- Wed Sep 15 2010 Version 0.6.36 of libisofs can produce ISO images which
bear a partiton 1 with non-zero start address. They can be mounted from
USB stick via the main device file (e.g. /dev/sdb) as well as via the
partition device file (e.g. /dev/sdb1).
- Fri Sep 17 2010 libburn-0.8.6 lifts the test reservation on DVD-R DL media.
- Sat Sep 18 2010 Release 0.6.2.pl00 of libisoburn introduces a partition
with non-zero offset for ISO 9660 images on USB sticks, improves mkisofs
emulation, and fixes a regression which existed since version 0.4.2.
- Wed Oct 20 2010 libburn-0.8.8 brings minor improvements.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------

View File

@ -16,11 +16,13 @@ AC_DEFUN([TARGET_SHIZZLE],
AC_MSG_CHECKING([target operating system]) AC_MSG_CHECKING([target operating system])
LIBBURNIA_LDCONFIG_CMD="echo 'No ldconfig run performed. If needed, configure manually for:'"
case $target_os in case $target_os in
linux*) linux*)
ARCH=linux ARCH=linux
LIBBURN_ARCH_LIBS= LIBBURN_ARCH_LIBS=
LIBBURNIA_LDCONFIG_CMD=ldconfig
;; ;;
freebsd*) freebsd*)
ARCH=freebsd ARCH=freebsd
@ -42,6 +44,21 @@ AC_DEFUN([TARGET_SHIZZLE],
]) ])
dnl LIBBURN_ASSERT_VERS_LIBS is by Thomas Schmitt, libburnia project
dnl It tests whether -Wl,--version-script=... works with the compiler
AC_DEFUN([LIBBURN_ASSERT_VERS_LIBS],
[
libburnia_save_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS -Wl,--version-script=libburn/libburn.ver"
AC_TRY_LINK([#include <stdio.h>], [printf("Hello\n");],
[vers_libs_test="yes"], [vers_libs_test="no"])
if test x$vers_libs_test = xno
then
LDFLAGS="$libburnia_save_LDFLAGS"
fi
])
dnl LIBBURNIA_SET_PKGCONFIG determines the install directory for the *.pc file. dnl LIBBURNIA_SET_PKGCONFIG determines the install directory for the *.pc file.
dnl Important: Must be performed _after_ TARGET_SHIZZLE dnl Important: Must be performed _after_ TARGET_SHIZZLE
dnl dnl

View File

@ -4,7 +4,7 @@
cdrskin. By Thomas Schmitt <scdbackup@gmx.net> cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
Integrated sub project of libburnia-project.org but also published via: Integrated sub project of libburnia-project.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.8.1.tar.gz http://scdbackup.sourceforge.net/cdrskin-0.8.8.pl00.tar.gz
Copyright (C) 2006-2010 Thomas Schmitt, provided under GPL version 2 or later. Copyright (C) 2006-2010 Thomas Schmitt, provided under GPL version 2 or later.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
@ -26,10 +26,10 @@ By using this software you agree to the disclaimer at the end of this text
Compilation, First Glimpse, Installation Compilation, First Glimpse, Installation
Obtain cdrskin-0.8.1.tar.gz, take it to a directory of your choice and do: Obtain cdrskin-0.8.8.pl00.tar.gz, take it to a directory of your choice and do:
tar xzf cdrskin-0.8.1.tar.gz tar xzf cdrskin-0.8.8.pl00.tar.gz
cd cdrskin-0.8.1 cd cdrskin-0.8.8
Within that directory execute: Within that directory execute:
@ -109,7 +109,7 @@ On Linux, full and insecure enabling of both for everybody would look like
This is equivalent to the traditional setup chmod a+x,u+s cdrecord. This is equivalent to the traditional setup chmod a+x,u+s cdrecord.
On FreeBSD, device permissions are to be set in /etc/devfs.rules. On FreeBSD, device permissions are to be set in /etc/devfs.rules.
On Solaris, pfexec privileges may be restricted to "base,sys_devices". On Solaris, pfexec privileges may be restricted to "basic,sys_devices".
See below "System Dependend Drive Permission Examples". See below "System Dependend Drive Permission Examples".
I strongly discourage to run cdrskin with setuid root or via sudo ! I strongly discourage to run cdrskin with setuid root or via sudo !
@ -310,10 +310,11 @@ Add-on session (equivalent to growisofs -M):
cdrskin dev=/dev/sr0 --grow_overwriteable_iso ... - cdrskin dev=/dev/sr0 --grow_overwriteable_iso ... -
DVD-RW and DVD-R DVD-RW , DVD-R , DVD-R DL
DVD-RW are usable if formatted to state "Restricted Overwrite" or if in state DVD-RW are usable if formatted to state "Restricted Overwrite" or if in state
"Sequential Recording". DVD-R are always in sequential state. "Sequential Recording". DVD-R are always in sequential state. DVD-R DL are
always sequential and incapable of multi-session.
"Sequential" is the state of unused media and of media previously blanked "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. or written by cdrecord. dvd+rw-format -blank can also achieve this state.
@ -445,10 +446,18 @@ Accessing the optical drives requires privileges which usually are granted
only to the superuser. Linux, FreeBSD and Solaris offer quite different only to the superuser. Linux, FreeBSD and Solaris offer quite different
approaches for avoiding the need for unrestricted privileges. approaches for avoiding the need for unrestricted privileges.
First check whether some friendly system setting already allows you to
access the drives as normal user:
cdrskin --devices
Those drives of which you see address and type strings are already usable.
If there remain drives invisible which the superuser can see by the same
command, then the following examples might help:
--------------------- ---------------------
On all three systems: On all three systems:
--------------------- ---------------------
Add the authorized user of CD drives to group "floppy" in /etc/group. Add the authorized users of CD drives to group "floppy" in /etc/group.
If missing: create this group. If missing: create this group.
Changes to /etc/group often only affect new login sessions. So log out and in Changes to /etc/group often only affect new login sessions. So log out and in
before making the first tests. before making the first tests.
@ -465,7 +474,6 @@ edit distro dependent device configuration files for permanent settings.
----------- -----------
On FreeBSD: On FreeBSD:
----------- -----------
On FreeBSD:
Edit /etc/devfs.rules and make sure to have these lines Edit /etc/devfs.rules and make sure to have these lines
[localrules=10] [localrules=10]
add path 'acd*' mode 0664 group floppy add path 'acd*' mode 0664 group floppy

View File

@ -38,7 +38,7 @@ original="./libburn_svn_release.tgz"
# My changes are in $changes , mainly in $changes/cdrskin # My changes are in $changes , mainly in $changes/cdrskin
changes="./libburn-release" changes="./libburn-release"
skin_release="0.8.0" skin_release="0.8.8"
patch_level=".pl00" patch_level=".pl00"
skin_rev="$skin_release""$patch_level" skin_rev="$skin_release""$patch_level"

View File

@ -38,7 +38,7 @@ original="./libburn_svn.tgz"
# My changes are in $changes , mainly in $changes/cdrskin # My changes are in $changes , mainly in $changes/cdrskin
changes="./libburn-develop" changes="./libburn-develop"
skin_release="0.8.1" skin_release="0.8.9"
patch_level="" patch_level=""
skin_rev="$skin_release""$patch_level" skin_rev="$skin_release""$patch_level"

View File

@ -34,7 +34,7 @@
/* Macro for creation of arrays of objects (or single objects) */ /* Macro for creation of arrays of objects (or single objects) */
#define TSOB_FELD(typ,anz) (typ *) malloc((anz)*sizeof(typ)); #define TSOB_FELD(typ,anz) (typ *) calloc(anz, sizeof(typ));
#define Cdrfifo_buffer_chunK 2048 #define Cdrfifo_buffer_chunK 2048

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps .\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1) .\" other parameters are allowed: see man(7), man(1)
.TH CDRSKIN 1 "Jun 10, 2010" .TH CDRSKIN 1 "Aug 21, 2010"
.\" Please adjust this date whenever revising the manpage. .\" Please adjust this date whenever revising the manpage.
.\" .\"
.\" Some roff macros, for reference: .\" Some roff macros, for reference:
@ -47,7 +47,7 @@ Multi session on CD (follow-up sessions in TAO only)
.br .br
or on DVD-R[W] (in Incremental mode) or DVD+R[/DL] or BD-R. or on DVD-R[W] (in Incremental mode) or DVD+R[/DL] or BD-R.
.br .br
Single session on DVD-RW or DVD-R (Disk-at-once). Single session Disk-at-once on DVD-RW, DVD-R, DVD-R DL.
.br .br
Single session or emulated ISO-9660 multi-session Single session or emulated ISO-9660 multi-session
.br .br
@ -166,7 +166,7 @@ needed.
.SS .SS
.B Sequentially Recordable DVD or BD Media: .B Sequentially Recordable DVD or BD Media:
.br .br
Currently DVD-RW, DVD-R , DVD+R[/DL], and BD-R can be used for the Sequential Currently DVD-RW, DVD-R[DL], DVD+R[DL], and BD-R can be used for the Sequential
recording model. It resembles the model of CD media. Only DVD-RW can be recording model. It resembles the model of CD media. Only DVD-RW can be
blanked and re-used from scratch. blanked and re-used from scratch.
.br .br
@ -186,8 +186,8 @@ of recognizable size or the size has to be announced explicitly by options
or or
.B tao_to_sao_tsize= . .B tao_to_sao_tsize= .
.br .br
DAO is the only mode for media which do not offer feature 21h Incremental DAO is the only mode for DVD-R media which do not offer feature 21h Incremental
Streaming. DAO may also be selected explicitly by option Streaming (e.g. DVD-R DL). DAO may also be selected explicitly by option
.B -sao . .B -sao .
Program growisofs uses DAO on sequential DVD-R[W] media for maximum Program growisofs uses DAO on sequential DVD-R[W] media for maximum
DVD-ROM/-Video compatibility. DVD-ROM/-Video compatibility.
@ -198,7 +198,7 @@ Incremental Streaming may be selected explicitly by option
.B -tao .B -tao
as it resembles much CD TAO by allowing track sources of as it resembles much CD TAO by allowing track sources of
unpredicted length and to keep media appendable by option unpredicted length and to keep media appendable by option
.B -multi . .B -multi . It does not work with DVD-R DL and minimally blanked DVD-RW.
The only restriction towards CD-R[W] is the lack of support for -audio tracks. The only restriction towards CD-R[W] is the lack of support for -audio tracks.
Multiple tracks per session are permissible. Multiple tracks per session are permissible.
.br .br
@ -659,7 +659,8 @@ Without it the disc gets closed and may not be written any more - unless it
is a -RW and gets blanked which causes loss of its content. is a -RW and gets blanked which causes loss of its content.
.br .br
The following sessions can only be written in -tao mode. -multi is prohibited The following sessions can only be written in -tao mode. -multi is prohibited
with DVD-R[W] DAO write mode. Option --prodvd_cli_compatible eventually makes with DVD-R[W] DAO write mode and on DVD-R DL media.
Option --prodvd_cli_compatible eventually makes
-multi tolerable but cannot make it work. -multi tolerable but cannot make it work.
.br .br
In order to have all filesystem content accessible, the eventual ISO-9660 In order to have all filesystem content accessible, the eventual ISO-9660
@ -753,6 +754,8 @@ Mode -tao can be used with track sources of unpredictable size, like standard
input or named pipes. It is also the only mode that can be used for writing input or named pipes. It is also the only mode that can be used for writing
to appendable media which already hold data. With unformatted DVD-R[W] it is to appendable media which already hold data. With unformatted DVD-R[W] it is
the only mode which allows -multi. the only mode which allows -multi.
.br
Mode -tao is not usable for minimally blanked DVD-RW and for DVD-R DL.
.TP .TP
.BI \-toc .BI \-toc
Print the table of content (TOC) which describes the tracks recorded on disc. Print the table of content (TOC) which describes the tracks recorded on disc.
@ -1090,12 +1093,11 @@ This option is only needed for revoking eventual --ignore_signals or
.TP .TP
.BI \--allow_untested_media .BI \--allow_untested_media
Enable the use of media profiles which have been implemented but not yet Enable the use of media profiles which have been implemented but not yet
tested. Currently this applies to : tested. Currently this option is without effect because no media types are
under test reservation.
.br .br
Profile 0015h , DVD-R/DL Sequential (will not allow -multi). (If you really test experimental media, then please report the outcome on
.br libburn-hackers@pykix.org)
If you really test such media, then please report the outcome on
libburn-hackers@pykix.org
.TP .TP
.BI dev_translation= <sep><from><sep><to> .BI dev_translation= <sep><from><sep><to>
Set drive address alias. This was necessary before cdrskin-0.2.4 to manually Set drive address alias. This was necessary before cdrskin-0.2.4 to manually
@ -1265,7 +1267,7 @@ cdrskin -v dev=/dev/hdc speed=12 fs=8m \\
.br .br
blank=as_needed -eject padsize=300k my_image.iso blank=as_needed -eject padsize=300k my_image.iso
.SS .SS
.B Write compressed afio archive on-the-fly (not possible with minimally blanked DVD-RW): .B Write compressed afio archive on-the-fly (not possible with minimally blanked DVD-RW or DVD-R DL):
.br .br
find . | afio -oZ - | \\ find . | afio -oZ - | \\
.br .br

View File

@ -88,7 +88,7 @@ or
/** The official program version */ /** The official program version */
#ifndef Cdrskin_prog_versioN #ifndef Cdrskin_prog_versioN
#define Cdrskin_prog_versioN "0.8.1" #define Cdrskin_prog_versioN "0.8.8"
#endif #endif
/** The official libburn interface revision to use. /** The official libburn interface revision to use.
@ -101,7 +101,7 @@ or
#define Cdrskin_libburn_minoR 8 #define Cdrskin_libburn_minoR 8
#endif #endif
#ifndef Cdrskin_libburn_micrO #ifndef Cdrskin_libburn_micrO
#define Cdrskin_libburn_micrO 1 #define Cdrskin_libburn_micrO 8
#endif #endif
@ -135,13 +135,13 @@ or
#endif /* Cdrskin_libburn_cvs_A60220_tS */ #endif /* Cdrskin_libburn_cvs_A60220_tS */
#ifdef Cdrskin_libburn_0_8_0 #ifdef Cdrskin_libburn_0_8_8
#define Cdrskin_libburn_versioN "0.8.0" #define Cdrskin_libburn_versioN "0.8.8"
#define Cdrskin_libburn_from_pykix_svN 1 #define Cdrskin_libburn_from_pykix_svN 1
#endif /* Cdrskin_libburn_0_8_0 */ #endif /* Cdrskin_libburn_0_8_8 */
#ifdef Cdrskin_libburn_0_8_1 #ifdef Cdrskin_libburn_0_8_9
#define Cdrskin_libburn_versioN "0.8.1" #define Cdrskin_libburn_versioN "0.8.9"
#define Cdrskin_libburn_from_pykix_svN 1 #define Cdrskin_libburn_from_pykix_svN 1
/* Place novelty switch macros here. /* Place novelty switch macros here.
@ -153,29 +153,29 @@ or
*/ */
#endif /* Cdrskin_libburn_0_8_1 */ #endif /* Cdrskin_libburn_0_8_9 */
#ifndef Cdrskin_libburn_versioN #ifndef Cdrskin_libburn_versioN
#define Cdrskin_libburn_0_8_0 #define Cdrskin_libburn_0_8_8
#define Cdrskin_libburn_versioN "0.8.0" #define Cdrskin_libburn_versioN "0.8.8"
#define Cdrskin_libburn_from_pykix_svN 1 #define Cdrskin_libburn_from_pykix_svN 1
#endif #endif
#ifdef Cdrskin_libburn_0_8_0 #ifdef Cdrskin_libburn_0_8_8
#undef Cdrskin_libburn_majoR #undef Cdrskin_libburn_majoR
#undef Cdrskin_libburn_minoR #undef Cdrskin_libburn_minoR
#undef Cdrskin_libburn_micrO #undef Cdrskin_libburn_micrO
#define Cdrskin_libburn_majoR 0 #define Cdrskin_libburn_majoR 0
#define Cdrskin_libburn_minoR 8 #define Cdrskin_libburn_minoR 8
#define Cdrskin_libburn_micrO 0 #define Cdrskin_libburn_micrO 8
#endif #endif
#ifdef Cdrskin_libburn_0_8_1 #ifdef Cdrskin_libburn_0_8_9
#undef Cdrskin_libburn_majoR #undef Cdrskin_libburn_majoR
#undef Cdrskin_libburn_minoR #undef Cdrskin_libburn_minoR
#undef Cdrskin_libburn_micrO #undef Cdrskin_libburn_micrO
#define Cdrskin_libburn_majoR 0 #define Cdrskin_libburn_majoR 0
#define Cdrskin_libburn_minoR 8 #define Cdrskin_libburn_minoR 8
#define Cdrskin_libburn_micrO 1 #define Cdrskin_libburn_micrO 9
#endif #endif
@ -363,9 +363,6 @@ or
#include "../libburn/libburn.h" #include "../libburn/libburn.h"
#ifdef Cdrskin_libburn_has_audioxtR
#include "../libburn/libdax_audioxtr.h"
#endif
#ifdef Cdrskin_libburn_has_cleanup_handleR #ifdef Cdrskin_libburn_has_cleanup_handleR
#define Cleanup_set_handlers burn_set_signal_handling #define Cleanup_set_handlers burn_set_signal_handling
@ -423,7 +420,7 @@ static int Cdrskin_abort_leveL= 0;
/* Imported from scdbackup-0.8.5/src/cd_backup_planer.c */ /* Imported from scdbackup-0.8.5/src/cd_backup_planer.c */
/** Macro for creation of arrays of objects (or single objects) */ /** Macro for creation of arrays of objects (or single objects) */
#define TSOB_FELD(typ,anz) (typ *) malloc((anz)*sizeof(typ)); #define TSOB_FELD(typ,anz) (typ *) calloc(anz, sizeof(typ));
/** Convert a text so that eventual characters special to the shell are /** Convert a text so that eventual characters special to the shell are
@ -573,7 +570,7 @@ int Sfile_multi_read_argv(char *progname, char **filenames, int filename_count,
if(pass==0) if(pass==0)
maxl= strlen(progname)+1; maxl= strlen(progname)+1;
else { else {
(*argv)[0]= (char *) malloc(strlen(progname)+1); (*argv)[0]= (char *) calloc(1, strlen(progname)+1);
if((*argv)[0]==NULL) if((*argv)[0]==NULL)
{ret= -1; goto ex;} {ret= -1; goto ex;}
strcpy((*argv)[0],progname); strcpy((*argv)[0],progname);
@ -604,7 +601,7 @@ int Sfile_multi_read_argv(char *progname, char **filenames, int filename_count,
} else { } else {
if(argcount >= *argc) if(argcount >= *argc)
break; break;
(*argv)[argcount]= (char *) malloc(l+1); (*argv)[argcount]= (char *) calloc(1, l+1);
if((*argv)[argcount]==NULL) if((*argv)[argcount]==NULL)
{ret= -1; goto ex;} {ret= -1; goto ex;}
strcpy((*argv)[argcount],buf); strcpy((*argv)[argcount],buf);
@ -618,9 +615,9 @@ int Sfile_multi_read_argv(char *progname, char **filenames, int filename_count,
if(pass==0){ if(pass==0){
*argc= argcount; *argc= argcount;
if(argcount>0) { if(argcount>0) {
*argv= (char **) malloc(argcount*sizeof(char *)); *argv= (char **) calloc(argcount, sizeof(char *));
*argidx= (int *) malloc(argcount*sizeof(int)); *argidx= (int *) calloc(argcount, sizeof(int));
*arglno= (int *) malloc(argcount*sizeof(int)); *arglno= (int *) calloc(argcount, sizeof(int));
if(*argv==NULL || *argidx==NULL || *arglno==NULL) if(*argv==NULL || *argidx==NULL || *arglno==NULL)
{ret= -1; goto ex;} {ret= -1; goto ex;}
} }
@ -820,8 +817,8 @@ int Cdradrtrn_add(struct CdradrtrN *trn, char *from, char *to, int flag)
} }
if(strlen(from)>=Cdrskin_adrleN || strlen(to)>=Cdrskin_adrleN) if(strlen(from)>=Cdrskin_adrleN || strlen(to)>=Cdrskin_adrleN)
return(0); return(0);
trn->from_address[cnt]= malloc(strlen(from_pt)+1); trn->from_address[cnt]= calloc(1, strlen(from_pt)+1);
trn->to_address[cnt]= malloc(strlen(to_pt)+1); trn->to_address[cnt]= calloc(1, strlen(to_pt)+1);
if(trn->from_address[cnt]==NULL || if(trn->from_address[cnt]==NULL ||
trn->to_address[cnt]==NULL) trn->to_address[cnt]==NULL)
return(-2); return(-2);
@ -4744,8 +4741,8 @@ int Cdrskin_scanbus(struct CdrskiN *skin, int flag)
int *drives_busses= NULL; int *drives_busses= NULL;
struct stat stbuf; struct stat stbuf;
drives_shown= malloc(skin->n_drives+1); drives_shown= calloc(1, skin->n_drives+1);
drives_busses= malloc((skin->n_drives+1) * sizeof(int)); drives_busses= calloc((skin->n_drives+1), sizeof(int));
if(drives_shown == NULL || drives_busses == NULL) if(drives_shown == NULL || drives_busses == NULL)
{ret= -1; goto ex;} {ret= -1; goto ex;}
for(i=0;i<skin->n_drives;i++) for(i=0;i<skin->n_drives;i++)
@ -5146,7 +5143,7 @@ int Cdrskin_minfo(struct CdrskiN *skin, int flag)
#endif #endif
char media_class[80]; char media_class[80];
int nominal_sessions= 1, ftils= 1, ltils= 1, first_track= 1, read_capacity= 0; int nominal_sessions= 1, ftils= 1, ltils= 1, first_track= 1, read_capacity= 0;
int app_code, cd_info_valid, lra; int app_code, cd_info_valid, lra, alloc_blocks, free_blocks;
off_t avail, buf_count; off_t avail, buf_count;
char disc_type[80], bar_code[9], buf[2 * 2048]; char disc_type[80], bar_code[9], buf[2 * 2048];
unsigned int disc_id; unsigned int disc_id;
@ -5242,6 +5239,11 @@ int Cdrskin_minfo(struct CdrskiN *skin, int flag)
printf("Disk type: unrecognizable\n"); printf("Disk type: unrecognizable\n");
if(cd_info_valid & 2) if(cd_info_valid & 2)
printf("Disk id: 0x%-X\n", disc_id); printf("Disk id: 0x%-X\n", disc_id);
ret= burn_disc_get_bd_spare_info(drive, &alloc_blocks, &free_blocks, 0);
if(ret == 1) {
printf("BD Spare Area consumed: %d\n", alloc_blocks - free_blocks);
printf("BD Spare Area available: %d\n", free_blocks);
}
printf("\n"); printf("\n");
printf("Track Sess Type Start Addr End Addr Size\n"); printf("Track Sess Type Start Addr End Addr Size\n");
@ -5642,7 +5644,7 @@ ex:;
int Cdrskin_list_formats(struct CdrskiN *skin, int flag) int Cdrskin_list_formats(struct CdrskiN *skin, int flag)
{ {
struct burn_drive *drive; struct burn_drive *drive;
int ret, i, status, num_formats, profile_no, type; int ret, i, status, num_formats, profile_no, type, alloc_blocks, free_blocks;
off_t size; off_t size;
unsigned dummy; unsigned dummy;
char status_text[80], profile_name[90]; char status_text[80], profile_name[90];
@ -5689,6 +5691,10 @@ int Cdrskin_list_formats(struct CdrskiN *skin, int flag)
} else } else
sprintf(status_text, "illegal status according to MMC-5"); sprintf(status_text, "illegal status according to MMC-5");
printf("Format status: %s\n", status_text); printf("Format status: %s\n", status_text);
ret= burn_disc_get_bd_spare_info(drive, &alloc_blocks, &free_blocks, 0);
if(ret == 1)
printf("BD Spare Area: %d blocks consumed, %d blocks available\n",
alloc_blocks - free_blocks, free_blocks);
for (i = 0; i < num_formats; i++) { for (i = 0; i < num_formats; i++) {
ret= burn_disc_get_format_descr(drive, i, &type, &size, &dummy); ret= burn_disc_get_format_descr(drive, i, &type, &size, &dummy);
@ -6900,7 +6906,7 @@ int Cdrskin_direct_write(struct CdrskiN *skin, int flag)
if(ret<=0) if(ret<=0)
goto ex; goto ex;
} }
buf= malloc(max_chunksize); buf= calloc(1, max_chunksize);
if(buf==NULL) { if(buf==NULL) {
fprintf(stderr, fprintf(stderr,
"cdrskin: FATAL : Cannot allocate %d bytes of read buffer.\n", "cdrskin: FATAL : Cannot allocate %d bytes of read buffer.\n",

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, libburnia, burn, CD, DVD, linux, recording, burning, CD-R, CD-RW, DVD-R, DVD-RW, DVD+RW, DVD+R, DVD+R/DL, DVD-RAM, BD-RE, BD-R, cdrecord, compatible, scdbackup"> <META NAME="keywords" CONTENT="cdrskin, libburn, libburnia, burn, CD, DVD, linux, recording, burning, CD-R, CD-RW, DVD-R, DVD-R DL, DVD-RW, DVD+RW, DVD+R, DVD+R DL, DVD-RAM, BD-RE, BD-R, cdrecord, compatible, scdbackup">
<META NAME="robots" CONTENT="follow"> <META NAME="robots" CONTENT="follow">
<TITLE>cdrskin homepage english</TITLE> <TITLE>cdrskin homepage english</TITLE>
</HEAD> </HEAD>
@ -24,7 +24,8 @@
<P> <P>
<H2>Purpose:</H2> <H2>Purpose:</H2>
Burns preformatted data to CD, DVD, and BD media:<BR> Burns preformatted data to CD, DVD, and BD media:<BR>
CD-R, DVD-R, DVD+R, DVD+R/DL, BD-R, CD-RW, DVD-RW, DVD-RAM, DVD+RW, BD-RE CD-R, DVD-R, DVD-R DL, DVD+R, DVD+R DL, BD-R, CD-RW,
DVD-RW, DVD-RAM, DVD+RW, BD-RE
</P> </P>
<P> <P>
@ -38,8 +39,8 @@ About any CD, DVD, or BD recorder produced in the recent ten years.
<BR> <BR>
<A HREF="http://libburnia-project.org">libburn</A> <A HREF="http://libburnia-project.org">libburn</A>
supports recorders which are compliant to standards MMC-1 for CD and supports recorders which are compliant to standards MMC-1 for CD and
MMC-5 for DVD or BD. Linux and FreeBSD allow to access drives connected MMC-5 for DVD or BD. Linux, FreeBSD, and Solaris allow to access drives
via SCSI, PATA (aka IDE, ATA), USB, or SATA. connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
<BR> <BR>
</P> </P>
@ -52,6 +53,8 @@ via SCSI, PATA (aka IDE, ATA), USB, or SATA.
<DT>or FreeBSD (with libc, of course) :</DT> <DT>or FreeBSD (with libc, of course) :</DT>
<DD>ATA and SATA drives need atapicam running.</DD> <DD>ATA and SATA drives need atapicam running.</DD>
<DD>libcam has to be installed.</DD> <DD>libcam has to be installed.</DD>
<DT>or Solaris (with libc, of course) :</DT>
<DD>Tested on kernel 5.11, hopefully suitable for older ones too.</DD>
<DT>libpthread</DT> <DT>libpthread</DT>
<DD>is supposed to be a standard system component.</DD> <DD>is supposed to be a standard system component.</DD>
</DL> </DL>
@ -62,7 +65,7 @@ via SCSI, PATA (aka IDE, ATA), USB, or SATA.
GPL software included:<BR> GPL software included:<BR>
</H2> </H2>
<DL> <DL>
<DT>libburn-0.8.0</DT> <DT>libburn-0.8.8</DT>
<DD>(founded by Derek Foreman and Ben Jansens, <DD>(founded by Derek Foreman and Ben Jansens,
developed and maintained since August 2006 by developed and maintained since August 2006 by
Thomas Schmitt from team of libburnia-project.org) Thomas Schmitt from team of libburnia-project.org)
@ -72,8 +75,8 @@ Thomas Schmitt from team of libburnia-project.org)
</P> </P>
<P> <P>
This program system has been tested on Intel/AMD Linux and FreeBSD systems This program system has been tested on Intel/AMD with Linux, FreeBSD,
only.<BR> and OpenSolaris based operating systems.<BR>
Ports to other usable systems are appreciated. Reports are welcome. Ports to other usable systems are appreciated. Reports are welcome.
</P> </P>
@ -93,10 +96,11 @@ Ports to other usable systems are appreciated. Reports are welcome.
<DL> <DL>
<DT>The most common options of cdrecord for data and audio on CD media <DT>The most common options of cdrecord for data and audio on CD media
are provided in a compatible way.<BR> are provided in a compatible way.<BR>
On all DVD media except DVD-R DL, cdrskin is able to perform any recording job On all DVD media, cdrskin is able to perform any recording job
which is possible with cdrecord. which is possible with cdrecord.
Other than with cdrecord, option -multi is supported with many DVD types and Other than with cdrecord, option -multi is supported with many DVD types and
BD-R. Write mode -tao works with anything but quickly blanked DVD-RW. BD-R. Write mode -tao works with anything but quickly blanked DVD-RW and
DVD-R DL, which both support no -multi.
</DT> </DT>
<BR><BR> <BR><BR>
<DT>Get an overview of drives and their addresses</DT> <DT>Get an overview of drives and their addresses</DT>
@ -105,8 +109,9 @@ BD-R. Write mode -tao works with anything but quickly blanked DVD-RW.
<DD>#<KBD>&nbsp;cdrskin --devices</KBD></DD> <DD>#<KBD>&nbsp;cdrskin --devices</KBD></DD>
<DT>Being superuser avoids permission problems with /dev/srN resp. /dev/hdX . <DT>Being superuser avoids permission problems with /dev/srN resp. /dev/hdX .
</DT> </DT>
<DT>Ordinary users should then get granted rw access to the /dev files <DT>Ordinary users should then get granted access to the /dev files
as listed by option --devices.</DT> as listed by option --devices. Linux and FreeBSD demand rw-permission.
On Solaris it is r-permission and privileges "basic,sys_devices".</DT>
<DT>&nbsp;</DT> <DT>&nbsp;</DT>
<DT>Get info about a particular drive or loaded media:</DT> <DT>Get info about a particular drive or loaded media:</DT>
@ -128,7 +133,8 @@ as listed by option --devices.</DT>
<DD>$<KBD>&nbsp;cdrskin -v dev=/dev/hdc speed=12 fs=8m \</KBD></DD> <DD>$<KBD>&nbsp;cdrskin -v dev=/dev/hdc speed=12 fs=8m \</KBD></DD>
<DD><KBD>&nbsp;&nbsp;blank=as_needed -eject padsize=300k my_image.iso</KBD></DD> <DD><KBD>&nbsp;&nbsp;blank=as_needed -eject padsize=300k my_image.iso</KBD></DD>
<DT>Write compressed afio archive on-the-fly:</DT> <DT>Write compressed afio archive on-the-fly
(not DVD-R DL or minimally blanked DVD-RW):</DT>
<DD>$<KBD>&nbsp;find . | afio -oZ - | \</KBD></DD> <DD>$<KBD>&nbsp;find . | afio -oZ - | \</KBD></DD>
<DD><KBD>&nbsp;&nbsp;cdrskin -v dev=0,1,0 fs=32m speed=8 \</KBD></DD> <DD><KBD>&nbsp;&nbsp;cdrskin -v dev=0,1,0 fs=32m speed=8 \</KBD></DD>
<DD><KBD>&nbsp;&nbsp;blank=as_needed padsize=300k -</KBD></DD> <DD><KBD>&nbsp;&nbsp;blank=as_needed padsize=300k -</KBD></DD>
@ -194,8 +200,8 @@ Standalone ISO 9660 multi-session CD/DVD/BD tool
<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.8.0.pl00.tar.gz">cdrskin-0.8.0.pl00.tar.gz</A> <DD><A HREF="cdrskin-0.8.8.pl00.tar.gz">cdrskin-0.8.8.pl00.tar.gz</A>
(830 KB). (850 KB).
</DD> </DD>
<DD> <DD>
The cdrskin tarballs are source code identical with libburn releases The cdrskin tarballs are source code identical with libburn releases
@ -244,17 +250,17 @@ cdrskin_0.4.2.pl00-x86-suse9_0-static.tar.gz</A>, (310 KB), -static compiled,
<HR> <HR>
<P> <P>
Enhancements towards previous stable version cdrskin-0.7.8.pl00: Enhancements towards previous stable version cdrskin-0.8.6.pl00:
<UL> <UL>
<LI> <LI>
Now able to work with ahci driver of FreeBSD 8-STABLE Reporting spare area use of formatted BD media.
</LI> </LI>
<!-- <!--
<LI>none</LI> <LI>none</LI>
--> -->
</UL> </UL>
Bug fixes towards cdrskin-0.7.8.pl00: Bug fixes towards cdrskin-0.8.6.pl00:
<UL> <UL>
<LI>none</LI> <LI>none</LI>
<!-- <!--
@ -266,10 +272,10 @@ Bug fixes towards cdrskin-0.7.8.pl00:
<P> <P>
<DL> <DL>
<DT><H3>Development snapshot, version 0.8.1 :</H3></DT> <DT><H3>Development snapshot, version 0.8.9 :</H3></DT>
<DD>Enhancements towards current stable version 0.8.0.pl00: <DD>Enhancements towards current stable version 0.8.8.pl00:
<UL> <UL>
<LI>A new system adapter allows to burn CD, DVD and BD on OpenSolaris</LI> <LI>none yet</LI>
<!-- <!--
<LI>none yet</LI> <LI>none yet</LI>
--> -->
@ -277,14 +283,9 @@ Bug fixes towards cdrskin-0.7.8.pl00:
</UL> </UL>
</DD> </DD>
<DD>Bug fixes towards cdrskin-0.8.0.pl00: <DD>Bug fixes towards cdrskin-0.8.8.pl00:
<UL> <UL>
<LI> <LI>none yet</LI>
CD TOC was not read if the first track did not start at LBA 0
</LI>
<LI>
CD-ROM media got attributed random lead-in and lead-out adresses
</LI>
<!-- <!--
<LI>none yet</LI> <LI>none yet</LI>
--> -->
@ -292,10 +293,10 @@ CD-ROM media got attributed random lead-in and lead-out adresses
</DD> </DD>
<DD>&nbsp;</DD> <DD>&nbsp;</DD>
<DD><A HREF="README_cdrskin_devel">README 0.8.1</A> <DD><A HREF="README_cdrskin_devel">README 0.8.9</A>
<DD><A HREF="cdrskin__help_devel">cdrskin_0.8.1 --help</A></DD> <DD><A HREF="cdrskin__help_devel">cdrskin_0.8.9 --help</A></DD>
<DD><A HREF="cdrskin_help_devel">cdrskin_0.8.1 -help</A></DD> <DD><A HREF="cdrskin_help_devel">cdrskin_0.8.9 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 0.8.1)</A></DD> <DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 0.8.9)</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://libburnia-project.org"> libburnia-project.org</A></DT> <A HREF="http://libburnia-project.org"> libburnia-project.org</A></DT>
@ -315,8 +316,8 @@ admins with full system souvereignty.</DT>
<A HREF="README_cdrskin_devel">upcoming README</A> ): <A HREF="README_cdrskin_devel">upcoming README</A> ):
</DD> </DD>
<DD> <DD>
<A HREF="cdrskin-0.8.1.tar.gz">cdrskin-0.8.1.tar.gz</A> <A HREF="cdrskin-0.8.9.tar.gz">cdrskin-0.8.9.tar.gz</A>
(840 KB). (850 KB).
</DD> </DD>
<!-- This is not offered any more since spring 2008 <!-- This is not offered any more since spring 2008

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2010.06.10.170901" #define Cdrskin_timestamP "2010.10.20.120001"

View File

@ -8334,25 +8334,625 @@ Made number transition to 0.8.1
+ cdrskin/add_ts_changes_to_libburn_0_8_1 + cdrskin/add_ts_changes_to_libburn_0_8_1
Updated cdrskin tarball generator Updated cdrskin tarball generator
09 Apr 2010 [] 09 Apr 2010 [3162]
cdrskin/changelog.txt cdrskin/changelog.txt
Documented changes and release timestamp Documented changes and release timestamp
------------------------------------ cycle - cdrskin-0.8.1 - 2010.04.09.110341 09 Apr 2009 [3163]
------------------------------------ cycle - cdrskin-0.8.1 - svn move -m libburn release 0.8.0 is ready
http://svn.libburnia-project.org/libburn/branches/ZeroEightZero
http://svn.libburnia-project.org/libburn/tags/ZeroEightZero
------------------------------------ cycle - cdrskin-0.8.1 - 2010.04.09.110341
2010.04.30.180350 [3206]
libburn/mmc.c
Avoided to create track without toc_entry from "hidden first track" on CD
------------------------------------ cycle - cdrskin-0.8.1 - 2010.04.30.182846
* Bug fix: CD TOC was not read if the first track did not start at LBA 0
2010.05.01.082808 [3207]
libburn/util.c
libburn/mmc.c
Bug fix: CD-ROM media got attributed random lead-in and lead-out adresses
------------------------------------ cycle - cdrskin-0.8.1 - 2010.05.01.083316
* Bug fix: CD-ROM media got attributed random lead-in and lead-out adresses
2010.05.16.090624 [3219]
libburn/async.c
libburn/cleanup.c
libburn/crc.c
libburn/ddlpa.c
libburn/debug.c
libburn/drive.c
libburn/ecma130ab.c
libburn/file.c
libburn/init.c
libburn/libdax_audioxtr.c
libburn/libdax_msgs.c
libburn/mmc.c
libburn/null.c
libburn/options.c
libburn/read.c
libburn/sbc.c
libburn/sector.c
libburn/sg.c
libburn/sg-dummy.c
libburn/sg-freebsd.c
libburn/sg-freebsd-port.c
libburn/sg-libcdio.c
libburn/sg-linux.c
libburn/source.c
libburn/spc.c
libburn/structure.c
libburn/toc.c
libburn/util.c
libburn/write.c
Eventually including ../config.h generated by autotools
2010.05.29.074318 [3237]
libburn/sg-libcdio.c
Bug fix: SIGSEGV of libcdio system adapter if drive list is empty
2010.06.07.171552 [3239]
libburn/sg-libcdio.c
Avoiding to resolve /dev/rdsk/cXtYdZs2 drive addresses on Solaris libcdio
2010.06.07.171706 [3240]
libburn/init.c
cdrskin/cdrskin.c
Reacted on harmless compiler warnings on Solaris
2010.06.07.172925 [3241]
README
cdrskin/README
Makefile.am
libburn/os.h
libburn/sg.c
+ libburn/os-solaris.h
+ libburn/sg-solaris.c
libburn/libdax_msgs.h
cdrskin/cdrskin_eng.html
New system adapter for Solaris uscsi (tested on snv134, kernel 5.11)
2010.06.08.173156 [3244]
libburn/os-solaris.h
Corrected comment
2010.06.08.174946 [3245]
libburn/sg-solaris.c
Handled SCSI status "BUSY" on Solaris
------------------------------------ cycle - cdrskin-0.8.1 - 2010.06.08.175125
* Bug fix: SIGSEGV of libcdio system adapter if drive list is empty
* New system adapter for Solaris uscsi (tested on snv134, kernel 5.11)
2010.06.08.200313 [3246]
libburn/sg-libcdio.c
libburn/sg-solaris.c
Implemented block device capacity determination fo Solaris
2010.06.10.170901 [3247]
libburn/sg-solaris.c
Removed obsolete development remark
2010.06.10.171018 [3248]
README
cdrskin/README
cdrskin/cdrskin.1
Mentioned Solaris and system dependent drive permission settings
[]
svn copy -m "Branching for libburn release 0.8.2" \
http://svn.libburnia-project.org/libburn/trunk \
http://svn.libburnia-project.org/libburn/branches/ZeroEightTwo
2010.06.11.080001 [3251]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 0.8.2
11 Jun 2010 [3252]
- cdrskin/add_ts_changes_to_libburn_0_8_0
- cdrskin/add_ts_changes_to_libburn_0_8_1
+ cdrskin/add_ts_changes_to_libburn_0_8_2
+ cdrskin/add_ts_changes_to_libburn_0_8_3
Updated cdrskin tarball generator
11 Jun 2010 [3253]
cdrskin/changelog.txt
Documented changes and release timestamp
------------------------------ release - cdrskin-0.8.2.pl00 - 2010.06.11.080001
* Bug fix: CD TOC was not read if the first track did not start at LBA 0
* Bug fix: CD-ROM media got attributed random lead-in and lead-out adresses
* Bug fix: SIGSEGV of experimental libcdio system adapter if drive list is empty
* New system adapter for Solaris uscsi (tested on snv134, kernel 5.11)
2010.06.11.104830 [3254]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 0.8.3
11 Jun 2010 [3255]
- cdrskin/add_ts_changes_to_libburn_0_8_0
- cdrskin/add_ts_changes_to_libburn_0_8_1
+ cdrskin/add_ts_changes_to_libburn_0_8_2
+ cdrskin/add_ts_changes_to_libburn_0_8_3
Updated cdrskin tarball generator
11 Jun 2010 [3256]
cdrskin/changelog.txt
Documented changes and release timestamp
11 Jun 2010 [3257]
svn move -m libburn release 0.8.2 is ready
http://svn.libburnia-project.org/libburn/branches/ZeroEightTwo
http://svn.libburnia-project.org/libburn/tags/ZeroEightTwo
------------------------------------ cycle - cdrskin-0.8.3 - 2010.06.11.104830
2010.06.13.190707 [3267]
libburn/sg-solaris.c
New less obtrusive implementation of sg_is_enumerable_adr for Solaris
2010.06.15.155423 [3272]
libburn/sg-libcdio.c
Avoided compiler warning about unused variable on non-Solaris systems
2010.06.15.155625 [3273]
libburn/os-dummy.h
libburn/os-libcdio.h
Let general POSIX system adapters ignore SIGWINCH and SIGURG if defined
2010.06.15.155739 [3274]
configure.ac
Incremented LT_CURRENT and LT_AGE of libburn
2010.06.16.082457 [3277]
libburn/os-solaris.h
libburn/os-libcdio.h
libburn/os-freebsd.h
Allowed 64 kB max output buffer size on all OSes
30 Jun 2010 [3307]
svn copy -m "Branching for libburn release 0.8.4" \
http://svn.libburnia-project.org/libburn/trunk \
http://svn.libburnia-project.org/libburn/branches/ZeroEightFour
2010.06.30.100001 [3308]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 0.8.4
30 Jun 2010 [3309]
- cdrskin/add_ts_changes_to_libburn_0_8_2
- cdrskin/add_ts_changes_to_libburn_0_8_3
+ cdrskin/add_ts_changes_to_libburn_0_8_4
+ cdrskin/add_ts_changes_to_libburn_0_8_5
Updated cdrskin tarball generator
30 Jun 2010 [3310]
cdrskin/changelog.txt
Documented changes and release timestamp
------------------------------ release - cdrskin-0.8.4.pl00 - 2010.06.30.100001
* Let general POSIX system adapters ignore SIGWINCH and SIGURG if defined
* Allowed 64 kB max output buffer size on all OSes
2010.06.30.112709 [3311]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 0.8.5
30 Jun 2010 [3312]
- cdrskin/add_ts_changes_to_libburn_0_8_2
- cdrskin/add_ts_changes_to_libburn_0_8_3
+ cdrskin/add_ts_changes_to_libburn_0_8_4
+ cdrskin/add_ts_changes_to_libburn_0_8_5
Updated cdrskin tarball generator
30 Jun 2010 [3313]
cdrskin/changelog.txt
Documented changes and release timestamp
30 Jun 2010 [3314]
svn move -m libburn release 0.8.4 is ready \
http://svn.libburnia-project.org/libburn/branches/ZeroEightFour \
http://svn.libburnia-project.org/libburn/tags/ZeroEightFour
------------------------------------ cycle - cdrskin-0.8.5 - 2010.06.30.112709
2010.07.04.131219 [3323]
libburn/libburn.h
libburn/libdax_audioxtr.h
libburn/libdax_audioxtr.c
cdrskin/cdrskin.c
test/dewav.c
Moved public part of libdax_audioxtr.h to libburn.h
2010.07.04.170035 [3325]
configure.ac
Makefile.am
+ libburn/libburn.ver
Hiding all non-API symbols from the linker by use of --version-script
04 Jul [3326]
README
Mentioned new configure option --disable-versioned-libs
2010.07.06.113304 [3329]
configure.ac
acinclude.m4
Let configure perform linker test with --version-script if enabled
2010.07.06.113356 [3330]
libburn/libburn.h
Mentioned that public API calls must be in libisofs/libisofs.ver
2010.07.12.193201 [3334]
cdrskin/cdrskin.c
cdrskin/cdrfifo.c
Changed all malloc() to calloc()
2010.07.12.193644 [3335]
libburn/async.c
libburn/drive.c
libburn/file.c
libburn/libdax_audioxtr.c
libburn/libdax_msgs.c
libburn/mmc.c
libburn/null.c
libburn/options.c
libburn/read.c
libburn/sg-freebsd.c
libburn/sg-freebsd-port.c
libburn/util.c
libburn/write.c
Changed all malloc() to calloc()
2010.07.29.083453 [3336]
libburn/spc.h
libburn/spc.c
libburn/mmc.c
libburn/sg-freebsd.c
libburn/sg-solaris.c
libburn/sg-libcdio.c
Recognizing sense data format 0x72 if given instead of 0x70
2010.07.29.164100 [3337]
Makefile.am
Detached make target "doc" from target "all".
30 Jul 2010 [3341]
doc/doxygen.conf.in
Removed problematic DETAILS_AT_TOP to silence warning of Debian buildd
2010.08.02.100630 [3345]
libburn/spc.h
libburn/spc.c
libburn/sg-linux.c
libburn/sg-freebsd.c
libburn/sg-libcdio.c
Reporting sense data with burn_set_scsi_logging()
2010.08.02.131946 [3346]
libburn/sg-linux.c
Added error simulation code to Linux system adapter
2010.08.02.141233 [3347]
libburn/sg-solaris.c
Committed Solaris system adapter which was forgotten with rev 3345
------------------------------------ cycle - cdrskin-0.8.5 - 2010.08.02.141233
* Hiding all non-API symbols from the linker by use of --version-script
2010.08.03.191151 [3348]
libburn/sg-linux.c
libburn/sg-freebsd.c
libburn/sg-libcdio.c
libburn/sg-solaris.c
Obeying burn_set_scsi_logging() with errors of class RETRY
2010.08.08.091224 [3349]
libburn/spc.h
libburn/spc.c
libburn/sg-linux.c
libburn/sg-freebsd.c
libburn/sg-libcdio.c
libburn/sg-solaris.c
New SCSI comand response "GO_ON"
2010.08.08.091317 [3350]
libburn/libburn.h
Hopefully silenced a warning of doxygen on Debian buildd
2010.08.13.114139 [3352]
libburn/libdax_msgs.h
libburn/libdax_audioxtr.h
Corrected typo in macro names (which shall never be defined anyway)
2010.08.21.095456 [3356]
libburn/libburn.h
libburn/mmc.c
cdrskin/cdrskin.1
cdrskin/cdrskin_eng.html
Lifted test reservation on DVD-R DL media. Thanks to Kevin Kieffer for testing.
28 Aug 2010 [3358]
test/libburner.c
Clarified the meaning of 0x0 and 0x30 signal handlers
2010.09.14.124934 [3368]
libburn/spc.h
libburn/spc.c
libburn/sg-linux.c
libburn/sg-libcdio.c
libburn/sg-freebsd.c
libburn/sg-solaris.c
Centralized interpretation of SCSI command outcome
------------------------------------ cycle - cdrskin-0.8.5 - 2010.09.14.135405
* Lifted test reservation on DVD-R DL media.
15 Sep 2010 [3369]
ChangeLog
Meaningful change log file derived by George Danchev from web site
16 Sep 2010 [3373]
svn copy -m Branching for libburn release 0.8.6
http://svn.libburnia-project.org/libburn/trunk
http://svn.libburnia-project.org/libburn/branches/ZeroEightSix
2010.09.16.113001 [3374]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 0.8.6
16 Sep 2010 [3375]
- cdrskin/add_ts_changes_to_libburn_0_8_4
- cdrskin/add_ts_changes_to_libburn_0_8_5
+ cdrskin/add_ts_changes_to_libburn_0_8_6
+ cdrskin/add_ts_changes_to_libburn_0_8_7
Updated cdrskin tarball generator
16 Sep 2010 [3376]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
------------------------------ release - cdrskin-0.8.6.pl00 - 2010.09.16.113001
* Lifted test reservation on DVD-R DL media.
* Hiding all non-API symbols from the linker by use of --version-script
2010.09.17.073827 [3377]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 0.8.7
17 Sep 2010 [3378]
- cdrskin/add_ts_changes_to_libburn_0_8_4
- cdrskin/add_ts_changes_to_libburn_0_8_5
+ cdrskin/add_ts_changes_to_libburn_0_8_6
+ cdrskin/add_ts_changes_to_libburn_0_8_7
Updated cdrskin tarball generator
17 Sep 2010 [3379]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
17 Sep 2010 [3381]
svn move -m libburn release 0.8.6 is ready
http://svn.libburnia-project.org/libburn/branches/ZeroEightSix
http://svn.libburnia-project.org/libburn/tags/ZeroEightSix
------------------------------------ cycle - cdrskin-0.8.7 - 2010.09.17.082926
2010.09.22.105426 [3395]
acinclude.m4
configure.ac
Makefile.am
README
On Linux: Run ldconfig during make install,if not --disable-ldconfig-at-install
2010.09.22.175054 [3397]
libburn/libburn.h
libburn/libburn.ver
libburn/libdax_msgs.h
libburn/file.h
libburn/file.c
libburn/source.h
libburn/source.c
New API call burn_offst_source_new()
2010.09.22.180921 [3398]
Makefile.am
+ test/offst_source.c
Temporarily added test program for burn_offst_source_new()
22 Sep 2010 [3399]
test/offst_source.c
Better default input file for test/offst_source.c
2010.09.24.090631 [3401]
libburn/libburn.h
libburn/drive.c
libburn/mmc.h
libburn/mmc.c
ChangeLog
New API call burn_disc_get_bd_spare_info()
2010.09.24.090731 [3402]
cdrskin/cdrskin.c
Displaying eventual BD spare area information with -minfo
2010.09.24.091902 [3403]
cdrskin/cdrskin.c
Displaying eventual BD spare area information with --list_formats
2010.09.24.092535 [3404]
libburn/libburn.ver
Making new API call available in dynamic library
2010.09.24.100255 [3405]
cdrskin/cdrskin.c
Polished appearance of BD spare info with --list_formats
------------------------------------ cycle - cdrskin-0.8.7 - 2010.09.24.100255
* New API call burn_offst_source_new()
* New API call burn_disc_get_bd_spare_info()
2010.09.28.101043 [3408]
libburn/mmc.c
Avoiding to inquire spare area of unsuitable media
2010.10.15.191717 [3445]
libburn/write.c
libburn/libdax_msgs.h
Issue warning after writing a BD-R with more than 300 sessions
2010.10.19.165908 [3450]
libburn/async.c
libburn/write.c
libburn/libdax_msgs.h
Issueing messages with all cases of burn canceling
20 Oct 2010 [3453]
svn copy -m Branching for libburn release 0.8.8
http://svn.libburnia-project.org/libburn/trunk
http://svn.libburnia-project.org/libburn/branches/ZeroEightEight
2010.10.20.120001 [3454]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 0.8.8
20 Oct 2010 [3455]
- cdrskin/add_ts_changes_to_libburn_0_8_6
- cdrskin/add_ts_changes_to_libburn_0_8_7
+ cdrskin/add_ts_changes_to_libburn_0_8_8
+ cdrskin/add_ts_changes_to_libburn_0_8_9
Updated cdrskin tarball generator
20 Oct 2010 []
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
------------------------------ release - cdrskin-0.8.8.pl00 - 2010.10.20.120001
* New API call burn_offst_source_new()
* New API call burn_disc_get_bd_spare_info()
------------------------------------ cycle - cdrskin-0.8.9 -
------------------------------------ cycle - cdrskin-0.8.9 -
**********************************************************************
Important: When adding a public API function then add its name to file
libburn/libburn.ver
**********************************************************************
=============================================================================== ===============================================================================
TODO TODO
=============================================================================== ===============================================================================
- change all malloc() to calloc()
Better motivation of burn_set_signal_handling() in libburn.h.
-------------------------------- Solaris -----------------------------------
Locking of device files.
Unmounting.
Could need ioctl to obtain SCSI bus,target,lun from fd rather than name
(
Subject: Re: [osol-help] DHCP configuration with fixed addresses
pntadm -A 10.0.0.24 -f MANUAL -i 010008544255E7 -m 10.0.0.0 -y 10.0.0.0
)
----------------------------------------------------------------------------
- find out from where libburn/crc.c stems. What algorithm is crc_32() ? - find out from where libburn/crc.c stems. What algorithm is crc_32() ?
--------------------------------- bugs ------------------------------------- --------------------------------- bugs -------------------------------------
- recognise sense data format 0x72 rather than 0x70
Key=[1], ASC=[2], ASCQ=[3]
(check libcdio too)
- handle HD DVD profiles 0x50 "HD DVD-ROM", 0x51 "HD DVD-R", 0x52 "HD DVD-RAM" - handle HD DVD profiles 0x50 "HD DVD-ROM", 0x51 "HD DVD-R", 0x52 "HD DVD-RAM"
as readable. as readable.

View File

@ -8,7 +8,7 @@ debug_opts="-O2"
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"
fifo_opts="" fifo_opts=""
libvers="-DCdrskin_libburn_0_8_1" libvers="-DCdrskin_libburn_0_8_8"
# To be used if Makefile.am uses libburn_libburn_la_CFLAGS # To be used if Makefile.am uses libburn_libburn_la_CFLAGS
# burn="libburn/libburn_libburn_la-" # burn="libburn/libburn_libburn_la-"
@ -47,15 +47,15 @@ do
libdax_audioxtr_o= libdax_audioxtr_o=
libdax_msgs_o="$burn"message.o libdax_msgs_o="$burn"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_8_0" elif test "$i" = "-libburn_0_8_8"
then then
libvers="-DCdrskin_libburn_0_8_0" libvers="-DCdrskin_libburn_0_8_8"
libdax_audioxtr_o="$burn"libdax_audioxtr.o libdax_audioxtr_o="$burn"libdax_audioxtr.o
libdax_msgs_o="$burn"libdax_msgs.o libdax_msgs_o="$burn"libdax_msgs.o
cleanup_src_or_obj="$burn"cleanup.o cleanup_src_or_obj="$burn"cleanup.o
elif test "$i" = "-libburn_svn" elif test "$i" = "-libburn_svn"
then then
libvers="-DCdrskin_libburn_0_8_1" libvers="-DCdrskin_libburn_0_8_9"
libdax_audioxtr_o="$burn"libdax_audioxtr.o libdax_audioxtr_o="$burn"libdax_audioxtr.o
libdax_msgs_o="$burn"libdax_msgs.o libdax_msgs_o="$burn"libdax_msgs.o
cleanup_src_or_obj="$burn"cleanup.o cleanup_src_or_obj="$burn"cleanup.o
@ -109,7 +109,7 @@ do
echo "Options:" echo "Options:"
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 " -libburn_0_8_0 set macro to match libburn-0.8.0" echo " -libburn_0_8_8 set macro to match libburn-0.8.8"
echo " -libburn_svn set macro to match current libburn-SVN." echo " -libburn_svn set macro to match current libburn-SVN."
echo " -dvd_obs_64k 64 KB default size for DVD/BD writing." echo " -dvd_obs_64k 64 KB default size for DVD/BD writing."
echo " -use_libcdio link with -lcdio because libburn uses it." echo " -use_libcdio link with -lcdio because libburn uses it."

View File

@ -1,4 +1,4 @@
AC_INIT([libburn], [0.8.1], [http://libburnia-project.org]) AC_INIT([libburn], [0.8.8], [http://libburnia-project.org])
AC_PREREQ([2.50]) AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h]) dnl AC_CONFIG_HEADER([config.h])
@ -9,7 +9,7 @@ LIBBURNIA_SET_FLAGS
AM_INIT_AUTOMAKE([subdir-objects]) AM_INIT_AUTOMAKE([subdir-objects])
dnl Notes by ts A71207 - B00310 : dnl Notes by ts A71207 - B00630 :
dnl dnl
dnl Regrettably the meaning of the various version types was misunderstood dnl Regrettably the meaning of the various version types was misunderstood
dnl before version 0.4.1. dnl before version 0.4.1.
@ -81,6 +81,10 @@ dnl 0.7.4 = libburn.so.4.39.0
dnl 0.7.6 = libburn.so.4.41.0 dnl 0.7.6 = libburn.so.4.41.0
dnl 0.7.8 = libburn.so.4.43.0 dnl 0.7.8 = libburn.so.4.43.0
dnl 0.8.0 = libburn.so.4.45.0 dnl 0.8.0 = libburn.so.4.45.0
dnl 0.8.2 = libburn.so.4.47.0
dnl 0.8.4 = libburn.so.4.49.0
dnl 0.8.6 = libburn.so.4.51.0
dnl 0.8.8 = libburn.so.4.53.0
dnl dnl
dnl So LT_CURRENT, LT_REVISION and LT_AGE get set directly here. dnl So LT_CURRENT, LT_REVISION and LT_AGE get set directly here.
dnl SONAME of the emerging library is LT_CURRENT - LT_AGE. dnl SONAME of the emerging library is LT_CURRENT - LT_AGE.
@ -106,7 +110,7 @@ dnl
dnl As said: Only copies. Original in libburn/libburn.h : burn_header_version_* dnl As said: Only copies. Original in libburn/libburn.h : burn_header_version_*
BURN_MAJOR_VERSION=0 BURN_MAJOR_VERSION=0
BURN_MINOR_VERSION=8 BURN_MINOR_VERSION=8
BURN_MICRO_VERSION=1 BURN_MICRO_VERSION=8
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
AC_SUBST(BURN_MAJOR_VERSION) AC_SUBST(BURN_MAJOR_VERSION)
@ -117,15 +121,14 @@ AC_SUBST(BURN_VERSION)
dnl Libtool versioning dnl Libtool versioning
LT_RELEASE=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION LT_RELEASE=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
dnl dnl
dnl ts B00409 dnl This is the release version libburn-0.8.8
dnl ### This is the release version libburn-0.8.0 dnl ### This is the development version after above release version
dnl This is the development version after above release version
dnl LT_CURRENT++, LT_AGE++ has not yet happened. dnl LT_CURRENT++, LT_AGE++ has not yet happened.
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile. dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile.
dnl dnl
dnl SONAME = 49 - 45 = 4 . Linux library name = libburn.so.4.45.0 dnl SONAME = 57 - 53 = 4 . Linux library name = libburn.so.4.53.0
LT_CURRENT=49 LT_CURRENT=57
LT_AGE=45 LT_AGE=53
LT_REVISION=0 LT_REVISION=0
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE` LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
@ -187,7 +190,7 @@ CFLAGS="$CFLAGS $STATVFS_DEF"
dnl ts A91122 dnl ts A91122
AC_ARG_ENABLE(track-src-odirect, AC_ARG_ENABLE(track-src-odirect,
[ --enable-track-src-odirect Enable use of O_DIRECT with track input, default=no], [ --enable-track-src-odirect Enable use of O_DIRECT with track input, default=no],
, enable_track_src_odirect=no) , enable_track_src_odirect=no)
if test x$enable_track_src_odirect = xyes; then if test x$enable_track_src_odirect = xyes; then
LIBBURN_O_DIRECT_DEF="-DLibburn_read_o_direcT" LIBBURN_O_DIRECT_DEF="-DLibburn_read_o_direcT"
@ -202,7 +205,7 @@ CFLAGS="$CFLAGS $LIBBURN_O_DIRECT_DEF"
dnl ts A91116 dnl ts A91116
AC_ARG_ENABLE(dvd-obs-64k, AC_ARG_ENABLE(dvd-obs-64k,
[ --enable-dvd-obs-64k 64 KB default size for DVD/BD writing, default=no], [ --enable-dvd-obs-64k 64 KB default size for DVD/BD writing, default=no],
, enable_dvd_obs_64k=no) , enable_dvd_obs_64k=no)
if test x$enable_dvd_obs_64k = xyes; then if test x$enable_dvd_obs_64k = xyes; then
LIBBURN_DVD_OBS_64K="-DLibburn_dvd_obs_default_64K" LIBBURN_DVD_OBS_64K="-DLibburn_dvd_obs_default_64K"
@ -215,7 +218,7 @@ CFLAGS="$CFLAGS $LIBBURN_DVD_OBS_64K"
dnl ts A91218 dnl ts A91218
AC_ARG_ENABLE(libcdio, AC_ARG_ENABLE(libcdio,
[ --enable-libcdio Enable EXPERIMENTAL use of libcdio as system adapter, default=no], [ --enable-libcdio Enable EXPERIMENTAL use of libcdio as system adapter, default=no],
, enable_libcdio=no) , enable_libcdio=no)
if test x$enable_libcdio = xyes; then if test x$enable_libcdio = xyes; then
dnl Check whether there is libcdio-devel and libcdio-runtime. dnl Check whether there is libcdio-devel and libcdio-runtime.
@ -241,6 +244,38 @@ else
fi fi
dnl ts B00704
# Library versioning normally serves a complex purpose.
# Since libburn obeys strict ABI backward compatibility, it needs only the
# simple feature to declare function names "global:" or "local:". Only the
# global ones are visible to applications at library load time.
AC_ARG_ENABLE(versioned-libs,
[ --enable-versioned-libs Enable strict symbol encapsulation , default=yes],
, enable_versioned_libs=yes)
if test x$enable_versioned_libs = xyes; then
vers_libs_test=no
LIBBURN_ASSERT_VERS_LIBS
if test x$vers_libs_test = xno
then
echo "disabled strict symbol encapsulation (test failed)"
else
echo "enabled strict symbol encapsulation"
fi
else
echo "disabled strict symbol encapsulation"
fi
AC_ARG_ENABLE(ldconfig-at-install,
[ --enable-ldconfig-at-install On GNU/Linux run ldconfig, default=yes],
, ldconfig_at_install=yes)
if test x$ldconfig_at_install = xyes; then
dummy=dummy
else
LIBBURNIA_LDCONFIG_CMD="echo 'NOTE: ldconfig is disabled. If needed, configure manually for:'"
echo "disabled run of ldconfig during installation on GNU/Linux"
fi
AC_SUBST(LIBBURNIA_LDCONFIG_CMD)
dnl Add compiler-specific flags dnl Add compiler-specific flags

View File

@ -154,13 +154,6 @@ QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = YES MULTILINE_CPP_IS_BRIEF = YES
# If the DETAILS_AT_TOP tag is set to YES then Doxygen
# will output the detailed description near the top, like JavaDoc.
# If set to NO, the detailed description appears after the member
# documentation.
DETAILS_AT_TOP = YES
# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
# member inherits the documentation from any documented member that it # member inherits the documentation from any documented member that it
# re-implements. # re-implements.

View File

@ -143,7 +143,7 @@ static void add_worker(int w_type, struct burn_drive *d,
pthread_attr_t attr; pthread_attr_t attr;
#endif #endif
a = malloc(sizeof(struct w_list)); a = calloc(1, sizeof(struct w_list));
a->w_type = w_type; a->w_type = w_type;
a->drive = d; a->drive = d;
a->u = *(union w_list_data *)data; a->u = *(union w_list_data *)data;
@ -644,8 +644,13 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
d->cancel = 1; d->cancel = 1;
/* ts A70203 : people have been warned in API specs */ /* ts A70203 : people have been warned in API specs */
if (opts->write_type == BURN_WRITE_NONE) if (opts->write_type == BURN_WRITE_NONE) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002017c,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"No valid write type selected", 0, 0);
return; return;
}
if (d->drive_role == 0) { if (d->drive_role == 0) {
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,

View File

@ -12,9 +12,6 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
/* #include <m alloc.h> ts A61013 : not in GNU/Linux man 3 malloc */
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <signal.h> #include <signal.h>
@ -1297,7 +1294,7 @@ int burn_drive_add_whitelist(char *device_address)
if(enumeration_whitelist_top+1 >= BURN_DRIVE_WHITELIST_LEN) if(enumeration_whitelist_top+1 >= BURN_DRIVE_WHITELIST_LEN)
return 0; return 0;
enumeration_whitelist_top++; enumeration_whitelist_top++;
new_item = malloc(strlen(device_address) + 1); new_item = calloc(1, strlen(device_address) + 1);
if (new_item == NULL) if (new_item == NULL)
return -1; return -1;
strcpy(new_item, device_address); strcpy(new_item, device_address);
@ -2221,7 +2218,7 @@ int burn_speed_descriptor_new(struct burn_speed_descriptor **s,
{ {
struct burn_speed_descriptor *o; struct burn_speed_descriptor *o;
(*s) = o = malloc(sizeof(struct burn_speed_descriptor)); (*s) = o = calloc(1, sizeof(struct burn_speed_descriptor));
if (o == NULL) if (o == NULL)
return -1; return -1;
o->source = 0; o->source = 0;
@ -2392,7 +2389,7 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
if(s == BURN_DISC_UNGRABBED) if(s == BURN_DISC_UNGRABBED)
return -1; return -1;
*caps = o = (struct burn_multi_caps *) *caps = o = (struct burn_multi_caps *)
malloc(sizeof(struct burn_multi_caps)); calloc(1, sizeof(struct burn_multi_caps));
if(*caps == NULL) if(*caps == NULL)
return -1; return -1;
/* Default says nothing is available */ /* Default says nothing is available */
@ -2839,3 +2836,18 @@ int burn_disc_get_cd_info(struct burn_drive *d, char disc_type[80],
*valid = d->disc_info_valid; *valid = d->disc_info_valid;
return 1; return 1;
} }
/* ts B00924 : API */
int burn_disc_get_bd_spare_info(struct burn_drive *d,
int *alloc_blocks, int *free_blocks, int flag)
{
int ret;
if (burn_drive_get_drive_role(d) != 1)
return 0;
*alloc_blocks = *free_blocks = 0;
ret = mmc_get_bd_spare_info(d, alloc_blocks, free_blocks, 0);
return ret;
}

View File

@ -129,7 +129,7 @@ struct burn_source *burn_file_source_new(const char *path, const char *subpath)
return NULL; return NULL;
} }
} }
fs = malloc(sizeof(struct burn_source_file)); fs = calloc(1, sizeof(struct burn_source_file));
/* ts A70825 */ /* ts A70825 */
if (fs == NULL) { if (fs == NULL) {
@ -175,7 +175,7 @@ struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size)
if (datafd == -1) if (datafd == -1)
return NULL; return NULL;
fs = malloc(sizeof(struct burn_source_file)); fs = calloc(1, sizeof(struct burn_source_file));
if (fs == NULL) /* ts A70825 */ if (fs == NULL) /* ts A70825 */
return NULL; return NULL;
fs->datafd = datafd; fs->datafd = datafd;
@ -481,10 +481,11 @@ int burn_fifo_source_shoveller(struct burn_source *source, int flag)
int burn_fifo_cancel(struct burn_source *source) int burn_fifo_cancel(struct burn_source *source)
{ {
int ret;
struct burn_source_fifo *fs = source->data; struct burn_source_fifo *fs = source->data;
burn_source_cancel(fs->inp); ret = burn_source_cancel(fs->inp);
return(1); return ret;
} }
/* /*
@ -508,7 +509,7 @@ struct burn_source *burn_fifo_source_new(struct burn_source *inp,
"Desired fifo buffer too small", 0, 0); "Desired fifo buffer too small", 0, 0);
return NULL; return NULL;
} }
fs = malloc(sizeof(struct burn_source_fifo)); fs = calloc(1, sizeof(struct burn_source_fifo));
if (fs == NULL) if (fs == NULL)
return NULL; return NULL;
fs->is_started = 0; fs->is_started = 0;
@ -747,3 +748,162 @@ int burn_fifo_fill(struct burn_source *source, int bufsize, int flag)
1 | ((flag & 1) << 1)); 1 | ((flag & 1) << 1));
} }
/* ----------------------------- Offset source ----------------------------- */
/* ts B00922 */
static void offst_free(struct burn_source *source);
static struct burn_source_offst *offst_auth(struct burn_source *source)
{
if (source->free_data != offst_free) {
libdax_msgs_submit(libdax_messenger, -1, 0x0002017a,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Expected offset source object as parameter",
0, 0);
return NULL;
}
return (struct burn_source_offst *) source->data;
}
static off_t offst_get_size(struct burn_source *source)
{
struct burn_source_offst *fs;
if ((fs = offst_auth(source)) == NULL)
return (off_t) 0;
return fs->size;
}
static int offst_set_size(struct burn_source *source, off_t size)
{
struct burn_source_offst *fs;
if ((fs = offst_auth(source)) == NULL)
return 0;
fs->size = size;
return 1;
}
static void offst_free(struct burn_source *source)
{
struct burn_source_offst *fs;
if ((fs = offst_auth(source)) == NULL)
return;
if (fs->prev != NULL)
offst_auth(fs->prev)->next = fs->next;
if (fs->next != NULL)
offst_auth(fs->next)->prev = fs->prev;
if (fs->inp != NULL)
burn_source_free(fs->inp); /* i.e. decrement refcount */
free(source->data);
}
static int offst_read(struct burn_source *source, unsigned char *buffer,
int size)
{
int ret, to_read, todo;
struct burn_source_offst *fs;
if ((fs = offst_auth(source)) == NULL)
return -1;
/* Eventually skip bytes up to start position */;
if (!fs->running) {
if (fs->prev != NULL)
fs->pos = offst_auth(fs->prev)->pos;
fs->running= 1;
}
if(fs->pos < fs->start) {
todo = fs->start - fs->pos;
while (todo > 0) {
to_read = todo;
if (to_read > size)
to_read = size;
ret = burn_source_read(fs->inp, buffer, to_read);
if (ret <= 0)
return ret;
todo -= ret;
fs->pos += ret;
}
}
/* Produce EOF if source size is exhausted.
burn_source delivers no incomplete sector buffers.
*/
if (fs->pos + size > fs->start + fs->size)
return 0;
/* Read payload */
ret = burn_source_read(fs->inp, buffer, size);
if (ret > 0)
fs->pos += ret;
return ret;
}
static int offst_cancel(struct burn_source *source)
{
int ret;
struct burn_source_offst *fs;
if ((fs = offst_auth(source)) == NULL)
return -1;
ret = burn_source_cancel(fs->inp);
return ret;
}
struct burn_source *burn_offst_source_new(
struct burn_source *inp, struct burn_source *prev,
off_t start, off_t size, int flag)
{
struct burn_source *src;
struct burn_source_offst *fs, *prev_fs = NULL;
if (prev != NULL)
if ((prev_fs = offst_auth(prev)) == NULL)
return NULL; /* Not type burn_source_offst */
fs = calloc(1, sizeof(struct burn_source_offst));
if (fs == NULL)
return NULL;
src = burn_source_new();
if (src == NULL) {
free((char *) fs);
return NULL;
}
src->read = NULL;
src->read_sub = NULL;
src->get_size = offst_get_size;
src->set_size = offst_set_size;
src->free_data = offst_free;
src->data = fs;
src->version= 1;
src->read_xt = offst_read;
src->cancel= offst_cancel;
fs->inp = inp;
fs->prev = prev;
fs->next = NULL;
if (prev != NULL) {
if (prev_fs->next != NULL) {
offst_auth(prev_fs->next)->prev = src;
fs->next = prev_fs->next;
}
prev_fs->next = src;
if (prev_fs->start + prev_fs->size > start) {
libdax_msgs_submit(libdax_messenger, -1, 0x00020179,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Offset source start address is before end of previous source",
0, 0);
return NULL;
}
}
fs->start = start;
fs->size = size;
fs->running = 0;
fs->pos = 0;
inp->refcount++; /* make sure inp lives longer than src */
return src;
}

View File

@ -74,4 +74,22 @@ struct burn_source_fifo {
int burn_fifo_source_shoveller(struct burn_source *source, int flag); int burn_fifo_source_shoveller(struct burn_source *source, int flag);
/* ts B00922 */
struct burn_source_offst {
/* See burn_offst_source_new() */
struct burn_source *inp;
struct burn_source *prev;
off_t start;
off_t size;
/* To help offst_free() */
struct burn_source *next;
/* The current reading position */
int running;
off_t pos;
};
#endif /* LIBBURN__FILE_H */ #endif /* LIBBURN__FILE_H */

View File

@ -7,6 +7,9 @@
This is the official API definition of libburn. This is the official API definition of libburn.
*/ */
/* Important: If you add a public API function then add its name to file
libburn/libburn.ver
*/
#ifndef LIBBURN_H #ifndef LIBBURN_H
@ -825,7 +828,7 @@ void burn_preset_device_open(int exclusive, int blocking, int abort_on_busy);
/* ts A70223 */ /* ts A70223 */
/** Allows the use of media types which are implemented in libburn but not yet /** Allows the use of media types which are implemented in libburn but not yet
tested. The list of those untested profiles is subject to change. tested. The list of those untested profiles is subject to change.
Currently it contains: 0x15 "DVD-R/DL sequential recording", - Currently no media types are under test reservation -
If you really test such media, then please report the outcome on If you really test such media, then please report the outcome on
libburn-hackers@pykix.org libburn-hackers@pykix.org
If ever then this call should be done soon after burn_initialize() before If ever then this call should be done soon after burn_initialize() before
@ -1234,12 +1237,29 @@ char *burn_guess_cd_manufacturer(int m_li, int s_li, int f_li,
bit5= Disc is nominally erasable (Erasable bit) bit5= Disc is nominally erasable (Erasable bit)
This will be set with overwriteable media which This will be set with overwriteable media which
libburn normally considers to be unerasable blank. libburn normally considers to be unerasable blank.
@return 1 success, <= 0 an error occured
@since 0.7.2 @since 0.7.2
*/ */
int burn_disc_get_cd_info(struct burn_drive *d, char disc_type[80], int burn_disc_get_cd_info(struct burn_drive *d, char disc_type[80],
unsigned int *disc_id, char bar_code[9], int *app_code, unsigned int *disc_id, char bar_code[9], int *app_code,
int *valid); int *valid);
/* ts B00924 */
/** Read the current usage of the eventual BD Spare Area. This area gets
reserved on BD media during formatting. During writing it is used to
host replacements of blocks which failed the checkread immediately after
writing.
This call applies only to recordable BD media. I.e. profiles 0x41 to 0x43.
@param d The drive to query.
@param alloc_blocks Returns the number of blocks reserved as Spare Area
@param free_blocks Returns the number of yet unused blocks in that area
@param flag Bitfield for control purposes (unused yet, submit 0)
@return 1 = reply prarameters are valid,
<=0 = reply is invalid (e.g. because no BD profile)
@since 0.8.8
*/
int burn_disc_get_bd_spare_info(struct burn_drive *d,
int *alloc_blocks, int *free_blocks, int flag);
/* ts A61110 */ /* ts A61110 */
/** Read start lba and Next Writeable Address of a track from media. /** Read start lba and Next Writeable Address of a track from media.
@ -1293,20 +1313,25 @@ off_t burn_disc_available_space(struct burn_drive *d,
/** Tells the MMC Profile identifier of the loaded media. The drive must be /** Tells the MMC Profile identifier of the loaded media. The drive must be
grabbed in order to get a non-zero result. grabbed in order to get a non-zero result.
libburn currently writes only to profiles libburn currently writes only to profiles
0x09 "CD-R", 0x0a "CD-RW", 0x09 "CD-R"
0x11 "DVD-R sequential recording", 0x12 "DVD-RAM", 0x0a "CD-RW"
0x13 "DVD-RW restricted overwrite", 0x14 "DVD-RW sequential recording", 0x11 "DVD-R sequential recording"
0x1a "DVD+RW", 0x1b "DVD+R", 0x12 "DVD-RAM"
0x13 "DVD-RW restricted overwrite"
0x14 "DVD-RW sequential recording",
0x15 "DVD-R/DL sequential recording",
0x1a "DVD+RW"
0x1b "DVD+R",
0x2b "DVD+R/DL", 0x2b "DVD+R/DL",
0x41 "BD-R sequential recording", 0x43 "BD-RE", 0x41 "BD-R sequential recording",
0x43 "BD-RE",
0xffff "stdio file" 0xffff "stdio file"
Note: 0xffff is not a MMC profile but a libburn invention. Note: 0xffff is not a MMC profile but a libburn invention.
If enabled by burn_allow_untested_profiles() it also writes to profiles
0x15 "DVD-R/DL sequential recording",
Read-only are the profiles Read-only are the profiles
0x08 "CD-ROM", 0x10 "DVD-ROM", 0x08 "CD-ROM",
0x10 "DVD-ROM",
0x40 "BD-ROM", 0x40 "BD-ROM",
For now read-only is BD-R profile (testers wanted) Read-only for now is this BD-R profile (testers wanted)
0x42 "BD-R random recording" 0x42 "BD-R random recording"
@param d The drive where the media is inserted. @param d The drive where the media is inserted.
@param pno Profile Number. See also mmc5r03c.pdf, table 89 @param pno Profile Number. See also mmc5r03c.pdf, table 89
@ -1882,6 +1907,41 @@ int burn_os_free_buffer(void *buffer, size_t amount, int flag);
struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size); struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size);
/* ts B00922 */
/** Creates an offset source which shall provide a byte interval of a stream
to its consumer. It is supposed to be chain-linked with other offset
sources which serve neighboring consumers. The chronological sequence
of consumers and the sequence of offset sources must match. The intervals
of the sources must not overlap.
A chain of these burn_source objects may be used to feed multiple tracks
from one single stream of input bytes.
Each of the offset sources will skip the bytes up to its start address and
provide the prescribed number of bytes to the track. Skipping takes into
respect the bytes which have been processed by eventual predecessors in the
chain.
Important: It is not allowed to free an offset source before its successor
has ended its work. Best is to keep them all until all tracks
are done.
@param inp The burn_source object from which to read stream data.
E.g. created by burn_file_source_new().
@param prev The eventual offset source object which shall read data from
inp before the new offset source will begin its own work.
This must either be a result of burn_offst_source_new() or
it must be NULL.
@param start The byte address where to start reading bytes for the
consumer. inp bytes may get skipped to reach this address.
@param size The number of bytes to be delivered to the consumer.
@param flag Bitfield for control purposes (unused yet, submit 0).
@return Pointer to a burn_source object, later to be freed by
burn_source_free(). NULL indicates failure.
@since 0.8.8
*/
struct burn_source *burn_offst_source_new(
struct burn_source *inp, struct burn_source *prev,
off_t start, off_t size, int flag);
/* ts A70930 */ /* ts A70930 */
/** Creates a fifo which acts as proxy for an already existing data source. /** Creates a fifo which acts as proxy for an already existing data source.
The fifo provides a ring buffer which shall smoothen the data stream The fifo provides a ring buffer which shall smoothen the data stream
@ -2191,6 +2251,10 @@ 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 /** Sets the multi flag which eventually marks the emerging session as not
being the last one and thus creating a BURN_DISC_APPENDABLE media. being the last one and thus creating a BURN_DISC_APPENDABLE media.
Note: DVD-R[W] in write mode BURN_WRITE_SAO are not capable of this.
DVD-R DL are not capable of this at all.
libburn will refuse to write if burn_write_opts_set_multi() is
enabled under such conditions.
@param opts The option object to be manipulated @param opts The option object to be manipulated
@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)
@since 0.2.6 @since 0.2.6
@ -2628,7 +2692,7 @@ void burn_version(int *major, int *minor, int *micro);
*/ */
#define burn_header_version_major 0 #define burn_header_version_major 0
#define burn_header_version_minor 8 #define burn_header_version_minor 8
#define burn_header_version_micro 1 #define burn_header_version_micro 8
/** Note: /** Note:
Above version numbers are also recorded in configure.ac because libtool Above version numbers are also recorded in configure.ac because libtool
wants them as parameters at build time. wants them as parameters at build time.
@ -2682,8 +2746,8 @@ These two advises are mutually exclusive.
/** Obtain the id string of the SCSI transport interface. /** Obtain the id string of the SCSI transport interface.
This interface may be a system specific adapter module of libburn or This interface may be a system specific adapter module of libburn or
an adapter to a supporting library like libcdio. an adapter to a supporting library like libcdio.
@flag Bitfield for control puposes, submit 0 for now @param flag Bitfield for control puposes, submit 0 for now
@return A pointer to the id string. Do not alter the string content. @return A pointer to the id string. Do not alter the string content.
@since 0.7.6 @since 0.7.6
*/ */
char *burn_scsi_transport_id(int flag); char *burn_scsi_transport_id(int flag);
@ -2716,7 +2780,7 @@ int burn_msgs_set_severities(char *queue_severity,
"DEBUG", "ALL". "DEBUG", "ALL".
To call with minimum_severity "NEVER" will discard the To call with minimum_severity "NEVER" will discard the
whole queue. whole queue.
@param error_code Will become a unique error code as liste in @param error_code Will become a unique error code as listed 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.
@param os_errno Will become the eventual errno related to the message @param os_errno Will become the eventual errno related to the message
@ -2811,7 +2875,7 @@ typedef int (*burn_abort_handler_t)(void *handle, int signum, int flag);
But during burn_disc_write() onto real CD or DVD, FreeBSD 8.0 pauses the But during burn_disc_write() onto real CD or DVD, FreeBSD 8.0 pauses the
other threads until the signal handler returns. other threads until the signal handler returns.
The new actions try to avoid this deadlock. It is advised to use action 3 The new actions try to avoid this deadlock. It is advised to use action 3
at least during burn_disc_write(), burn_disc_rease(), burn_disc_format(): at least during burn_disc_write(), burn_disc_erase(), burn_disc_format():
burn_set_signal_handling(text, NULL, 0x30); burn_set_signal_handling(text, NULL, 0x30);
and to call burn_is_aborting(0) when the drive is BURN_DRIVE_IDLE. and to call burn_is_aborting(0) when the drive is BURN_DRIVE_IDLE.
If burn_is_aborting(0) returns 1, then call burn_abort() and exit(1). If burn_is_aborting(0) returns 1, then call burn_abort() and exit(1).
@ -2980,6 +3044,110 @@ int burn_drive_get_drive_role(struct burn_drive *d);
int burn_drive_equals_adr(struct burn_drive *d1, char *adr2, int drive_role2); int burn_drive_equals_adr(struct burn_drive *d1, char *adr2, int drive_role2);
/*
Audio track data extraction facility.
*/
/* Maximum size for address paths and fmt_info strings */
#define LIBDAX_AUDIOXTR_STRLEN 4096
/** Extractor object encapsulating intermediate states of extraction.
The clients of libdax_audioxtr shall only allocate pointers to this
struct and get a storage object via libdax_audioxtr_new().
Appropriate initial value for the pointer is NULL.
*/
struct libdax_audioxtr;
/** Open an audio file, check wether suitable, create extractor object.
@param xtr Opaque handle to extractor. Gets attached extractor object.
@param path Address of the audio file to extract. "-" is stdin (but might
be not suitable for all futurely supported formats).
@param flag Bitfield for control purposes (unused yet, submit 0)
@return >0 success
0 unsuitable format
-1 severe error
-2 path not found
@since 0.2.4
*/
int libdax_audioxtr_new(struct libdax_audioxtr **xtr, char *path, int flag);
/** Obtain identification parameters of opened audio source.
@param xtr Opaque handle to extractor
@param fmt Gets pointed to the audio file format id text: ".wav" , ".au"
@param fmt_info Gets pointed to a format info text telling parameters
@param num_channels e.g. 1=mono, 2=stereo, etc
@param sample_rate e.g. 11025, 44100
@param bits_per_sample e.g. 8= 8 bits per sample, 16= 16 bits ...
@param msb_first Byte order of samples: 0=Intel 1=Motorola
@param flag Bitfield for control purposes (unused yet, submit 0)
@return >0 success, <=0 failure
@since 0.2.4
*/
int libdax_audioxtr_get_id(struct libdax_audioxtr *xtr,
char **fmt, char **fmt_info,
int *num_channels, int *sample_rate,
int *bits_per_sample, int *msb_first, int flag);
/** Obtain a prediction about the extracted size based on internal information
of the formatted file.
@param xtr Opaque handle to extractor
@param size Gets filled with the predicted size
@param flag Bitfield for control purposes (unused yet, submit 0)
@return 1 prediction was possible , 0 no prediction could be made
@since 0.2.4
*/
int libdax_audioxtr_get_size(struct libdax_audioxtr *o, off_t *size, int flag);
/** Obtain next buffer full of extracted data in desired format (only raw audio
for now).
@param xtr Opaque handle to extractor
@param buffer Gets filled with extracted data
@param buffer_size Maximum number of bytes to be filled into buffer
@param flag Bitfield for control purposes
bit0= do not stop at predicted end of data
@return >0 number of valid buffer bytes,
0 End of file
-1 operating system reports error
-2 usage error by application
@since 0.2.4
*/
int libdax_audioxtr_read(struct libdax_audioxtr *xtr,
char buffer[], int buffer_size, int flag);
/** Try to obtain a file descriptor which will deliver extracted data
to normal calls of read(2). This may fail because the format is
unsuitable for that, but ".wav" is ok. If this call succeeds the xtr
object will have forgotten its file descriptor and libdax_audioxtr_read()
will return a usage error. One may use *fd after libdax_audioxtr_destroy()
and will have to close it via close(2) when done with it.
@param xtr Opaque handle to extractor
@param fd Eventually returns the file descriptor number
@param flag Bitfield for control purposes
bit0= do not dup(2) and close(2) but hand out original fd
@return 1 success, 0 cannot hand out fd , -1 severe error
@since 0.2.4
*/
int libdax_audioxtr_detach_fd(struct libdax_audioxtr *o, int *fd, int flag);
/** Clean up after extraction and destroy extractor object.
@param xtr Opaque handle to extractor, *xtr is allowed to be NULL,
*xtr is set to NULL by this function
@param flag Bitfield for control purposes (unused yet, submit 0)
@return 1 = destroyed object, 0 = was already destroyed
@since 0.2.4
*/
int libdax_audioxtr_destroy(struct libdax_audioxtr **xtr, int flag);
#ifndef DOXYGEN #ifndef DOXYGEN
BURN_END_DECLS BURN_END_DECLS

167
libburn/libburn.ver Normal file
View File

@ -0,0 +1,167 @@
LIBBURN4 {
global:
burn_abort;
burn_abort_pacifier;
burn_allow_untested_profiles;
burn_disc_add_session;
burn_disc_available_space;
burn_disc_create;
burn_disc_erasable;
burn_disc_erase;
burn_disc_format;
burn_disc_free;
burn_disc_free_multi_caps;
burn_disc_get_bd_spare_info;
burn_disc_get_cd_info;
burn_disc_get_format_descr;
burn_disc_get_formats;
burn_disc_get_media_id;
burn_disc_get_msc1;
burn_disc_get_multi_caps;
burn_disc_get_profile;
burn_disc_get_sectors;
burn_disc_get_sessions;
burn_disc_get_status;
burn_disc_pretend_blank;
burn_disc_pretend_full;
burn_disc_read;
burn_disc_read_atip;
burn_disc_remove_session;
burn_disc_track_lba_nwa;
burn_disc_write;
burn_drive_add_whitelist;
burn_drive_cancel;
burn_drive_clear_whitelist;
burn_drive_convert_fs_adr;
burn_drive_convert_scsi_adr;
burn_drive_d_get_adr;
burn_drive_equals_adr;
burn_drive_free_speedlist;
burn_drive_get_adr;
burn_drive_get_all_profiles;
burn_drive_get_best_speed;
burn_drive_get_disc;
burn_drive_get_drive_role;
burn_drive_get_min_write_speed;
burn_drive_get_read_speed;
burn_drive_get_speedlist;
burn_drive_get_start_end_lba;
burn_drive_get_status;
burn_drive_get_write_speed;
burn_drive_grab;
burn_drive_info_forget;
burn_drive_info_free;
burn_drive_is_enumerable_adr;
burn_drive_leave_locked;
burn_drive_obtain_scsi_adr;
burn_drive_probe_cd_write_modes;
burn_drive_release;
burn_drive_scan;
burn_drive_scan_and_grab;
burn_drive_set_buffer_waiting;
burn_drive_set_speed;
burn_drive_set_stream_recording;
burn_drive_snooze;
burn_drive_wrote_well;
burn_fd_source_new;
burn_fifo_fill;
burn_fifo_get_statistics;
burn_fifo_inquire_status;
burn_fifo_next_interval;
burn_fifo_peek_data;
burn_fifo_source_new;
burn_file_source_new;
burn_finish;
burn_get_read_capacity;
burn_guess_cd_manufacturer;
burn_guess_manufacturer;
burn_initialize;
burn_is_aborting;
burn_lba_to_msf;
burn_msf_to_lba;
burn_msf_to_sectors;
burn_msgs_obtain;
burn_msgs_set_severities;
burn_msgs_submit;
burn_obtain_profile_name;
burn_offst_source_new;
burn_os_alloc_buffer;
burn_os_free_buffer;
burn_os_open_track_src;
burn_precheck_write;
burn_preset_device_open;
burn_random_access_write;
burn_read_data;
burn_read_opts_free;
burn_read_opts_new;
burn_read_opts_read_subcodes_audio;
burn_read_opts_read_subcodes_data;
burn_read_opts_report_recovered_errors;
burn_read_opts_set_c2errors;
burn_read_opts_set_hardware_error_recovery;
burn_read_opts_set_hardware_error_retries;
burn_read_opts_set_raw;
burn_read_opts_transfer_damaged_blocks;
burn_scsi_transport_id;
burn_sectors_to_msf;
burn_session_add_track;
burn_session_create;
burn_session_free;
burn_session_get_hidefirst;
burn_session_get_leadout_entry;
burn_session_get_sectors;
burn_session_get_tracks;
burn_session_hide_first_track;
burn_session_remove_track;
burn_set_messenger;
burn_set_scsi_logging;
burn_set_signal_handling;
burn_set_verbosity;
burn_sev_to_text;
burn_source_free;
burn_structure_print_disc;
burn_structure_print_session;
burn_structure_print_track;
burn_text_to_sev;
burn_track_clear_isrc;
burn_track_create;
burn_track_define_data;
burn_track_free;
burn_track_get_counters;
burn_track_get_entry;
burn_track_get_mode;
burn_track_get_sectors;
burn_track_set_byte_swap;
burn_track_set_cdxa_conv;
burn_track_set_default_size;
burn_track_set_isrc;
burn_track_set_size;
burn_track_set_source;
burn_version;
burn_write_opts_auto_write_type;
burn_write_opts_free;
burn_write_opts_get_drive;
burn_write_opts_new;
burn_write_opts_set_dvd_obs;
burn_write_opts_set_fillup;
burn_write_opts_set_force;
burn_write_opts_set_format;
burn_write_opts_set_has_mediacatalog;
burn_write_opts_set_mediacatalog;
burn_write_opts_set_multi;
burn_write_opts_set_perform_opc;
burn_write_opts_set_simulate;
burn_write_opts_set_start_byte;
burn_write_opts_set_stdio_fsync;
burn_write_opts_set_stream_recording;
burn_write_opts_set_toc_entries;
burn_write_opts_set_underrun_proof;
burn_write_opts_set_write_type;
libdax_audioxtr_destroy;
libdax_audioxtr_detach_fd;
libdax_audioxtr_get_id;
libdax_audioxtr_get_size;
libdax_audioxtr_new;
libdax_audioxtr_read;
local: *;
};

View File

@ -25,7 +25,8 @@ extern struct libdax_msgs *libdax_messenger;
/* Only this single source module is entitled to do this */ /* Only this single source module is entitled to do this */
#define LIBDAX_AUDIOXTR_H_INTERNAL 1 #define LIBDAX_AUDIOXTR_H_INTERNAL 1
/* All clients of the extraction facility must do this */ /* All clients of the extraction facility must do this or include libburn.h */
#define LIBDAX_AUDIOXTR_H_PUBLIC 1
#include "libdax_audioxtr.h" #include "libdax_audioxtr.h"
@ -34,7 +35,7 @@ int libdax_audioxtr_new(struct libdax_audioxtr **xtr, char *path, int flag)
int ret= -1; int ret= -1;
struct libdax_audioxtr *o; struct libdax_audioxtr *o;
o= *xtr= (struct libdax_audioxtr *) malloc(sizeof(struct libdax_audioxtr)); o= *xtr= (struct libdax_audioxtr *) calloc(1, sizeof(struct libdax_audioxtr));
if(o==NULL) if(o==NULL)
return(-1); return(-1);
strncpy(o->path,path,LIBDAX_AUDIOXTR_STRLEN-1); strncpy(o->path,path,LIBDAX_AUDIOXTR_STRLEN-1);

View File

@ -7,6 +7,13 @@
#ifndef LIBDAX_AUDIOXTR_H_INCLUDED #ifndef LIBDAX_AUDIOXTR_H_INCLUDED
#define LIBDAX_AUDIOXTR_H_INCLUDED 1 #define LIBDAX_AUDIOXTR_H_INCLUDED 1
/* Normally this public API is defined in <libburn/libburn.h>
Macro LIBDAX_AUDIOXTR_H_PUBLIC enables the definition for programs
which only include this file.
*/
#ifdef LIBDAX_AUDIOXTR_H_PUBLIC
/* Public Macros */ /* Public Macros */
/* Maximum size for address paths and fmt_info strings */ /* Maximum size for address paths and fmt_info strings */
@ -110,15 +117,16 @@ int libdax_audioxtr_detach_fd(struct libdax_audioxtr *o, int *fd, int flag);
*/ */
int libdax_audioxtr_destroy(struct libdax_audioxtr **xtr, int flag); int libdax_audioxtr_destroy(struct libdax_audioxtr **xtr, int flag);
#endif /* LIBDAX_AUDIOXTR_H_PUBLIC */
#ifdef LIDBAX_AUDIOXTR________________ #ifdef LIBDAX_AUDIOXTR________________
-- place documentation text here --- -- place documentation text here ---
#endif /* LIDBAX_AUDIOXTR_________________ */ #endif /* LIBDAX_AUDIOXTR_________________ */

View File

@ -37,7 +37,7 @@ static int libdax_msgs_item_new(struct libdax_msgs_item **item,
struct timezone tz; struct timezone tz;
(*item)= o= (*item)= o=
(struct libdax_msgs_item *) malloc(sizeof(struct libdax_msgs_item)); (struct libdax_msgs_item *) calloc(1, sizeof(struct libdax_msgs_item));
if(o==NULL) if(o==NULL)
return(-1); return(-1);
o->timestamp= 0.0; o->timestamp= 0.0;
@ -140,7 +140,7 @@ int libdax_msgs_new(struct libdax_msgs **m, int flag)
{ {
struct libdax_msgs *o; struct libdax_msgs *o;
(*m)= o= (struct libdax_msgs *) malloc(sizeof(struct libdax_msgs)); (*m)= o= (struct libdax_msgs *) calloc(1, sizeof(struct libdax_msgs));
if(o==NULL) if(o==NULL)
return(-1); return(-1);
o->refcount= 1; o->refcount= 1;
@ -370,7 +370,7 @@ int libdax_msgs_submit(struct libdax_msgs *m, int origin, int error_code,
item->severity= severity; item->severity= severity;
item->priority= priority; item->priority= priority;
if(msg_text!=NULL) { if(msg_text!=NULL) {
item->msg_text= malloc(strlen(msg_text)+1); item->msg_text= calloc(1, strlen(msg_text)+1);
if(item->msg_text==NULL) if(item->msg_text==NULL)
goto failed; goto failed;
strcpy(item->msg_text,msg_text); strcpy(item->msg_text,msg_text);

View File

@ -395,7 +395,7 @@ int libdax_msgs_item_get_rank(struct libdax_msgs_item *item,
int *severity, int *priority, int flag); int *severity, int *priority, int flag);
#ifdef LIDBAX_MSGS_________________ #ifdef LIBDAX_MSGS_________________
/* Registered Error Codes */ /* Registered Error Codes */
@ -558,7 +558,11 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
0x00020176 (NOTE,HIGH) = Stream recording disabled because of small OS buffer 0x00020176 (NOTE,HIGH) = Stream recording disabled because of small OS buffer
0x00020177 (ABORT,HIGH) = Urged drive worker threads to do emergency halt 0x00020177 (ABORT,HIGH) = Urged drive worker threads to do emergency halt
0x00020178 (DEBUG,HIGH) = Write thread ended 0x00020178 (DEBUG,HIGH) = Write thread ended
0x00020179 (FAILURE,HIGH) = Offset source start address is before end of previous source
0x0002017a (FAILURE,HIGH) = Expected offset source object as parameter
0x0002017b (WARNING,HIGH) = Sequential BD-R media likely to soon fail writing
0x0002017c (FAILURE,HIGH) = No valid write type selected
0x0002017d (FATAL,HIGH) = Invalid file descriptor with stdio pseudo-drive
libdax_audioxtr: libdax_audioxtr:
0x00020200 (SORRY,HIGH) = Cannot open audio source file 0x00020200 (SORRY,HIGH) = Cannot open audio source file
@ -679,7 +683,7 @@ Range "libisoburn" : 0x00060000 to 0x00006ffff
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
#endif /* LIDBAX_MSGS_________________ */ #endif /* LIBDAX_MSGS_________________ */

View File

@ -813,7 +813,7 @@ int mmc_write(struct burn_drive *d, int start, struct buffer *buf)
{ {
int cancelled; int cancelled;
struct command c; struct command c;
int len; int len, key, asc, ascq;
#ifdef Libburn_log_in_and_out_streaM #ifdef Libburn_log_in_and_out_streaM
/* <<< ts A61031 */ /* <<< ts A61031 */
@ -892,33 +892,20 @@ int mmc_write(struct burn_drive *d, int start, struct buffer *buf)
d->pbf_altered = 1; d->pbf_altered = 1;
/* ts A61112 : react on eventual error condition */ /* ts A61112 : react on eventual error condition */
if (c.error && c.sense[2]!=0) { spc_decode_sense(c.sense, 0, &key, &asc, &ascq);
if (c.error && key != 0) {
/* >>> make this scsi_notify_error() when liberated */ /* >>> make this scsi_notify_error() when liberated */
if (c.sense[2]!=0) { char msg[256];
int key, asc, ascq;
#ifdef NIX sprintf(msg, "SCSI error on write(%d,%d): ", start, len);
char msg[160]; scsi_error_msg(d, c.sense, 14, msg + strlen(msg),
sprintf(msg,
"SCSI error on write(%d,%d): key=%X asc=%2.2Xh ascq=%2.2Xh",
start, len,
c.sense[2],c.sense[12],c.sense[13]);
#else /* NIX */
char msg[256];
int key, asc, ascq;
sprintf(msg, "SCSI error on write(%d,%d): ",
start, len);
scsi_error_msg(d, c.sense, 14, msg + strlen(msg),
&key, &asc, &ascq); &key, &asc, &ascq);
libdax_msgs_submit(libdax_messenger, d->global_index,
#endif /* !NIX */
libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002011d, 0x0002011d,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
}
d->cancel = 1; d->cancel = 1;
return BE_CANCELLED; return BE_CANCELLED;
} }
@ -1165,7 +1152,7 @@ int mmc_fake_toc(struct burn_drive *d)
if (d->disc == NULL) if (d->disc == NULL)
return -1; return -1;
d->toc_entries = d->last_track_no + d->complete_sessions; d->toc_entries = d->last_track_no + d->complete_sessions;
d->toc_entry = malloc(d->toc_entries * sizeof(struct burn_toc_entry)); d->toc_entry = calloc(d->toc_entries, sizeof(struct burn_toc_entry));
if (d->toc_entry == NULL) if (d->toc_entry == NULL)
return -1; return -1;
memset(d->toc_entry, 0,d->toc_entries * sizeof(struct burn_toc_entry)); memset(d->toc_entry, 0,d->toc_entries * sizeof(struct burn_toc_entry));
@ -1757,12 +1744,6 @@ static int mmc_read_disc_info_al(struct burn_drive *d, int *alloc_len)
d->erasable = 0; /* never erasable */ d->erasable = 0; /* never erasable */
} }
/* ts A80207 : DVD - R DL can normally be read but not be written */
if(d->current_profile == 0x15 && !burn_support_untested_profiles) {
disc_status = 2; /* always full and finalized */
d->erasable = 0; /* never erasable */
}
#ifdef Libburn_support_bd_r_readonlY #ifdef Libburn_support_bd_r_readonlY
/* <<< For now: declaring BD-R read-only /* <<< For now: declaring BD-R read-only
*/ */
@ -2334,7 +2315,8 @@ int mmc_set_streaming(struct burn_drive *d,
d->issue_command(d, &c); d->issue_command(d, &c);
if (c.error) { if (c.error) {
if (c.sense[2]!=0 && !d->silent_on_scsi_error) { spc_decode_sense(c.sense, 0, &key, &asc, &ascq);
if (key != 0 && !d->silent_on_scsi_error) {
sprintf(msg, sprintf(msg,
"SCSI error on set_streaming(%d): ", w_speed); "SCSI error on set_streaming(%d): ", w_speed);
scsi_error_msg(d, c.sense, 14, msg + strlen(msg), scsi_error_msg(d, c.sense, 14, msg + strlen(msg),
@ -2414,7 +2396,7 @@ static int mmc_get_configuration_al(struct burn_drive *d, int *alloc_len)
{ {
struct buffer buf; struct buffer buf;
int len, cp, descr_len = 0, feature_code, prf_number, only_current = 1; int len, cp, descr_len = 0, feature_code, prf_number, only_current = 1;
int old_alloc_len, only_current_profile = 0; int old_alloc_len, only_current_profile = 0, key, asc, ascq;
unsigned char *descr, *prf, *up_to, *prf_end; unsigned char *descr, *prf, *up_to, *prf_end;
struct command c; struct command c;
int phys_if_std = 0; int phys_if_std = 0;
@ -2449,6 +2431,7 @@ static int mmc_get_configuration_al(struct burn_drive *d, int *alloc_len)
#ifdef Libisofs_simulate_old_mmc1_drivE #ifdef Libisofs_simulate_old_mmc1_drivE
c.error = 1; c.error = 1;
c.sense[0] = 0x70; /* Fixed format sense data */
c.sense[2] = 0x5; c.sense[2] = 0x5;
c.sense[12] = 0x20; c.sense[12] = 0x20;
c.sense[13] = 0x0; c.sense[13] = 0x0;
@ -2456,8 +2439,8 @@ static int mmc_get_configuration_al(struct burn_drive *d, int *alloc_len)
if (c.error) { if (c.error) {
/* ts A90603 : MMC-1 drive do not know 46h GET CONFIGURATION */ /* ts A90603 : MMC-1 drive do not know 46h GET CONFIGURATION */
if (c.sense[2] == 0x5 && c.sense[12] == 0x20 && spc_decode_sense(c.sense, 0, &key, &asc, &ascq);
c.sense[13] == 0x0) { if (key == 0x5 && asc == 0x20 && ascq == 0x0) {
d->current_is_guessed_profile = 1; d->current_is_guessed_profile = 1;
/* Will yield a non-zero profile only after /* Will yield a non-zero profile only after
mmc_read_disc_info_al() was called */ mmc_read_disc_info_al() was called */
@ -2528,8 +2511,7 @@ static int mmc_get_configuration_al(struct burn_drive *d, int *alloc_len)
#ifdef Libburn_support_dvd_r_seQ #ifdef Libburn_support_dvd_r_seQ
if (cp == 0x11 || cp == 0x14) /* DVD-R, DVD-RW */ if (cp == 0x11 || cp == 0x14) /* DVD-R, DVD-RW */
d->current_is_supported_profile = 1; d->current_is_supported_profile = 1;
if (cp == 0x15) /* DVD-R/DL . */ if (cp == 0x15) /* DVD-R/DL */
/* Writeable only if burn_support_untested_profiles */
d->current_is_supported_profile = 1; d->current_is_supported_profile = 1;
#endif #endif
#ifdef Libburn_support_dvd_plus_R #ifdef Libburn_support_dvd_plus_R
@ -3608,24 +3590,11 @@ unsuitable_media:;
d->issue_command(d, &c); d->issue_command(d, &c);
if (c.error && !tolerate_failure) { if (c.error && !tolerate_failure) {
if (c.sense[2]!=0) { spc_decode_sense(c.sense, 0, &key, &asc, &ascq);
if (key != 0) {
#ifdef NIX
sprintf(msg,
"SCSI error on format_unit(%s): key=%X asc=%2.2Xh ascq=%2.2Xh",
descr,
c.sense[2],c.sense[12],c.sense[13]);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020122,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
#else /* NIX */
sprintf(msg, "SCSI error on format_unit(%s): ", descr); sprintf(msg, "SCSI error on format_unit(%s): ", descr);
scsi_error_msg(d, c.sense, 14, msg + strlen(msg), scsi_error_msg(d, c.sense, 14, msg + strlen(msg),
&key, &asc, &ascq); &key, &asc, &ascq);
#endif /* !NIX */
} }
return 0; return 0;
} else if ((!c.error) && (format_type == 0x13 || format_type == 0x15)) } else if ((!c.error) && (format_type == 0x13 || format_type == 0x15))
@ -3695,6 +3664,7 @@ static int mmc_get_write_performance_al(struct burn_drive *d,
#ifdef Libisofs_simulate_old_mmc1_drivE #ifdef Libisofs_simulate_old_mmc1_drivE
c.error = 1; c.error = 1;
c.sense[0] = 0x70; /* Fixed format sense data */
c.sense[2] = 0x5; c.sense[2] = 0x5;
c.sense[12] = 0x20; c.sense[12] = 0x20;
c.sense[13] = 0x0; c.sense[13] = 0x0;
@ -3906,6 +3876,11 @@ int mmc_compose_mode_page_5(struct burn_drive *d,
pd[4] = spc_block_type(o->block_type); pd[4] = spc_block_type(o->block_type);
/*
fprintf(stderr, "libburn_EXPERIMENTAL: block_type = %d, pd[4]= %u\n",
o->block_type, (unsigned int) pd[4]);
*/
/* ts A61104 */ /* ts A61104 */
if(!(o->control&4)) /* audio (MMC-1 table 61) */ if(!(o->control&4)) /* audio (MMC-1 table 61) */
if(o->write_type == BURN_WRITE_TAO) if(o->write_type == BURN_WRITE_TAO)
@ -3926,11 +3901,13 @@ int mmc_compose_mode_page_5(struct burn_drive *d,
int mmc_read_10(struct burn_drive *d, int start,int amount, struct buffer *buf) int mmc_read_10(struct burn_drive *d, int start,int amount, struct buffer *buf)
{ {
struct command c; struct command c;
char msg[256];
int key, asc, ascq;
mmc_start_if_needed(d, 0); mmc_start_if_needed(d, 0);
if (mmc_function_spy(d, "mmc_read_10") <= 0) if (mmc_function_spy(d, "mmc_read_10") <= 0)
return -1; return -1;
;
if (amount > BUFFER_SIZE / 2048) if (amount > BUFFER_SIZE / 2048)
return -1; return -1;
@ -3946,24 +3923,9 @@ int mmc_read_10(struct burn_drive *d, int start,int amount, struct buffer *buf)
c.dir = FROM_DRIVE; c.dir = FROM_DRIVE;
d->issue_command(d, &c); d->issue_command(d, &c);
if (c.error) { if (c.error) {
#ifdef NIX
char msg[160];
sprintf(msg,
"SCSI error on read_10(%d,%d): key=%X asc=%2.2Xh ascq=%2.2Xh",
start, amount,
c.sense[2],c.sense[12],c.sense[13]);
#else /* NIX */
char msg[256];
int key, asc, ascq;
sprintf(msg, "SCSI error on read_10(%d,%d): ", start, amount); sprintf(msg, "SCSI error on read_10(%d,%d): ", start, amount);
scsi_error_msg(d, c.sense, 14, msg + strlen(msg), scsi_error_msg(d, c.sense, 14, msg + strlen(msg),
&key, &asc, &ascq); &key, &asc, &ascq);
#endif /* !NIX */
if(!d->silent_on_scsi_error) if(!d->silent_on_scsi_error)
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020144, 0x00020144,
@ -4170,7 +4132,7 @@ static int mmc_set_product_id(char *reply,
/* ts A90903 */ /* ts A90903 */
/* MMC backend of API call burn_get_media_product_id() /* MMC backend of API call burn_disc_get_media_id()
See also doc/mediainfo.txt See also doc/mediainfo.txt
@param flag Bitfield for control purposes @param flag Bitfield for control purposes
bit0= do not escape " _/" (not suitable for bit0= do not escape " _/" (not suitable for
@ -4357,6 +4319,33 @@ ex:;
} }
/* ts B00924
MMC-5, 6.23.3.3.4 Format Code 0Ah: Spare Area Information
*/
int mmc_get_bd_spare_info(struct burn_drive *d,
int *alloc_blocks, int *free_blocks, int flag)
{
int ret, reply_len, prf;
char *reply = NULL;
prf = d->current_profile;
if (!(prf == 0x41 || prf == 0x43 || prf == 0x42))
return 0; /* Not a BD loaded */
ret = mmc_read_disc_structure(d, 1, 0, 0x0a, 12, &reply,
&reply_len, 0);
if (ret <= 0)
goto ex;
*alloc_blocks = mmc_four_char_to_int((unsigned char *) reply + 8);
*free_blocks = mmc_four_char_to_int((unsigned char *) reply + 4);
ret = 1;
ex:;
if (reply != NULL)
free(reply);
return ret;
}
/* ts A61021 : the mmc specific part of sg.c:enumerate_common() /* ts A61021 : the mmc specific part of sg.c:enumerate_common()
*/ */
int mmc_setup_drive(struct burn_drive *d) int mmc_setup_drive(struct burn_drive *d)

View File

@ -106,5 +106,8 @@ int mmc_function_spy(struct burn_drive *d, char * text);
/* ts A91118 */ /* ts A91118 */
int mmc_start_if_needed(struct burn_drive *d, int flag); int mmc_start_if_needed(struct burn_drive *d, int flag);
/* ts B00924 */
int mmc_get_bd_spare_info(struct burn_drive *d,
int *alloc_blocks, int *free_blocks, int flag);
#endif /*__MMC*/ #endif /*__MMC*/

View File

@ -24,7 +24,7 @@ struct burn_source *burn_null_source_new(void)
{ {
struct burn_source *src; struct burn_source *src;
src = malloc(sizeof(struct burn_source)); src = calloc(1, sizeof(struct burn_source));
src->refcount = 1; src->refcount = 1;
src->read = null_read; src->read = null_read;
src->read_sub = NULL; src->read_sub = NULL;

View File

@ -27,7 +27,7 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive)
{ {
struct burn_write_opts *opts; struct burn_write_opts *opts;
opts = malloc(sizeof(struct burn_write_opts)); opts = calloc(1, sizeof(struct burn_write_opts));
if (opts == NULL) { if (opts == NULL) {
libdax_msgs_submit(libdax_messenger, -1, 0x00020111, libdax_msgs_submit(libdax_messenger, -1, 0x00020111,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
@ -68,7 +68,7 @@ struct burn_read_opts *burn_read_opts_new(struct burn_drive *drive)
{ {
struct burn_read_opts *opts; struct burn_read_opts *opts;
opts = malloc(sizeof(struct burn_read_opts)); opts = calloc(1, sizeof(struct burn_read_opts));
opts->drive = drive; opts->drive = drive;
opts->refcount = 1; opts->refcount = 1;
opts->raw = 0; opts->raw = 0;
@ -125,7 +125,7 @@ void burn_write_opts_set_toc_entries(struct burn_write_opts *opts, int count,
struct burn_toc_entry *toc_entries) struct burn_toc_entry *toc_entries)
{ {
opts->toc_entries = count; opts->toc_entries = count;
opts->toc_entry = malloc(count * sizeof(struct burn_toc_entry)); opts->toc_entry = calloc(count, sizeof(struct burn_toc_entry));
memcpy(opts->toc_entry, &toc_entries, memcpy(opts->toc_entry, &toc_entries,
sizeof(struct burn_toc_entry) * count); sizeof(struct burn_toc_entry) * count);
} }

View File

@ -29,12 +29,37 @@
/* The number of above list items */ /* The number of above list items */
#define BURN_OS_SIGNAL_COUNT 16 #define BURN_OS_SIGNAL_COUNT 16
/** To list all signals which shall surely not be caught */ /** The list of all signals which shall surely not be caught.
It depends on the particular signal whether it can be ignored or whether
it will lead to sudden death of the process.
Some signals are not POSIX,
but nevertheless ought to be ignored if they are defined.
*/
#ifdef SIGWINCH
#define BURN_OS_SIG_WINCH ,SIGWINCH
#define BURN_OS_SIG_WINCH_CNT 1
#else
#define BURN_OS_SIG_WINCH
#define BURN_OS_SIG_WINCH_CNT 0
#endif
#ifdef SIGURG
#define BURN_OS_SIG_URG ,SIGURG
#define BURN_OS_SIG_URG_CNT 1
#else
#define BURN_OS_SIG_URG
#define BURN_OS_SIG_URG_CNT 0
#endif
/** The combined list of all signals which shall not be caught.
*/
#define BURN_OS_NON_SIGNAL_MACRO_LIST \ #define BURN_OS_NON_SIGNAL_MACRO_LIST \
SIGKILL, SIGCHLD, SIGSTOP SIGKILL, SIGCHLD, SIGSTOP BURN_OS_SIG_WINCH BURN_OS_SIG_URG
/* The number of above list items */ /* The number of above list items */
#define BURN_OS_NON_SIGNAL_COUNT 3 #define BURN_OS_NON_SIGNAL_COUNT \
( 3 + BURN_OS_SIG_WINCH_CNT + BURN_OS_SIG_URG_CNT )
/* The maximum size for a (SCSI) i/o transaction */ /* The maximum size for a (SCSI) i/o transaction */

View File

@ -4,7 +4,8 @@
by os.h in case of compilation for by os.h in case of compilation for
FreeBSD with CAM FreeBSD with CAM
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+ Copyright (C) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>,
provided under GPLv2+
*/ */
/** List of all signals which shall be caught by signal handlers and trigger /** List of all signals which shall be caught by signal handlers and trigger
@ -41,7 +42,11 @@ SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH
/* The maximum size for a (SCSI) i/o transaction */ /* The maximum size for a (SCSI) i/o transaction */
/* Important : MUST be at least 32768 ! */ /* Important : MUST be at least 32768 ! */
#define BURN_OS_TRANSPORT_BUFFER_SIZE 32768 /* Older BSD info says that 32 kB is maximum. But 64 kB seems to work well
on 8-STABLE. It is by default only used with BD in streaming mode.
So older systems should still be quite safe with this buffer max size.
*/
#define BURN_OS_TRANSPORT_BUFFER_SIZE 65536
/** To hold all state information of BSD device enumeration /** To hold all state information of BSD device enumeration

View File

@ -29,26 +29,49 @@
/* The number of above list items */ /* The number of above list items */
#define BURN_OS_SIGNAL_COUNT 16 #define BURN_OS_SIGNAL_COUNT 16
/** To list all signals which shall surely not be caught */
/** The list of all signals which shall surely not be caught.
It depends on the particular signal whether it can be ignored or whether
it will lead to sudden death of the process.
Some signals are not POSIX,
but nevertheless ought to be ignored if they are defined.
*/
#ifdef SIGWINCH
#define BURN_OS_SIG_WINCH ,SIGWINCH
#define BURN_OS_SIG_WINCH_CNT 1
#else
#define BURN_OS_SIG_WINCH
#define BURN_OS_SIG_WINCH_CNT 0
#endif
#ifdef SIGURG
#define BURN_OS_SIG_URG ,SIGURG
#define BURN_OS_SIG_URG_CNT 1
#else
#define BURN_OS_SIG_URG
#define BURN_OS_SIG_URG_CNT 0
#endif
/** The combined list of all signals which shall not be caught.
*/
#define BURN_OS_NON_SIGNAL_MACRO_LIST \ #define BURN_OS_NON_SIGNAL_MACRO_LIST \
SIGKILL, SIGCHLD, SIGSTOP SIGKILL, SIGCHLD, SIGSTOP BURN_OS_SIG_WINCH BURN_OS_SIG_URG
/* The number of above list items */ /* The number of above list items */
#define BURN_OS_NON_SIGNAL_COUNT 3 #define BURN_OS_NON_SIGNAL_COUNT \
( 3 + BURN_OS_SIG_WINCH_CNT + BURN_OS_SIG_URG_CNT )
/* The maximum size for a (SCSI) i/o transaction */ /* The maximum size for a (SCSI) i/o transaction */
/* Important : MUST be at least 32768 ! */
/* My Blu-ray burner LG GGW-H20 writes junk if stream recording is combined /* My Blu-ray burner LG GGW-H20 writes junk if stream recording is combined
with buffer size 32 kB. So stream recording is allowed only with size 64k. with buffer size 32 kB. So stream recording is allowed only with size 64k.
This makes it worth to have a special case for GNU/Linux buffer size here. Older BSD info says that 32 kB is maximum. But 64 kB seems to work well
on 8-STABLE. It is by default only used with BD in streaming mode.
So older systems should still be quite safe with this buffer max size.
*/ */
#ifdef __linux /* Important : MUST be at least 32768 ! */
#define BURN_OS_TRANSPORT_BUFFER_SIZE 65536 #define BURN_OS_TRANSPORT_BUFFER_SIZE 65536
#else
/* (It might be risky to use 64k. FreeBSD is said to can only 32k.) */
#define BURN_OS_TRANSPORT_BUFFER_SIZE 32768
#endif
/* To hold the position of the most recently delivered address from /* To hold the position of the most recently delivered address from

View File

@ -41,8 +41,6 @@ SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH
/* Important : MUST be at least 32768 ! */ /* Important : MUST be at least 32768 ! */
/* My Blu-ray burner LG GGW-H20 writes junk if stream recording is combined /* My Blu-ray burner LG GGW-H20 writes junk if stream recording is combined
with buffer size 32 kB. So stream recording is allowed only with size 64k. with buffer size 32 kB. So stream recording is allowed only with size 64k.
>>> ??? is 64 kB ok for Solaris uscsi ?
*/ */
#define BURN_OS_TRANSPORT_BUFFER_SIZE 65536 #define BURN_OS_TRANSPORT_BUFFER_SIZE 65536

View File

@ -9,9 +9,6 @@
#include "../config.h" #include "../config.h"
#endif #endif
/* #include <m alloc.h> ts A61013 : not in GNU/Linux man 3 malloc */
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <signal.h> #include <signal.h>

View File

@ -169,9 +169,10 @@ static int sg_init_enumerator(burn_drive_enumerator_t *idx)
idx->ccb.ccb_h.func_code = XPT_DEV_MATCH; idx->ccb.ccb_h.func_code = XPT_DEV_MATCH;
idx->bufsize = sizeof(struct dev_match_result) * 100; idx->bufsize = sizeof(struct dev_match_result) * 100;
idx->ccb.cdm.match_buf_len = idx->bufsize; idx->ccb.cdm.match_buf_len = idx->bufsize;
idx->ccb.cdm.matches = (struct dev_match_result *)malloc(idx->bufsize); idx->ccb.cdm.matches = (struct dev_match_result *)
calloc(1, idx->bufsize);
if (idx->ccb.cdm.matches == NULL) { if (idx->ccb.cdm.matches == NULL) {
warnx("can't malloc memory for matches"); warnx("cannot allocate memory for matches");
close(idx->fd); close(idx->fd);
return -1; return -1;
} }

View File

@ -160,15 +160,15 @@ static int sg_init_enumerator(burn_drive_enumerator_t *idx_)
struct burn_drive_enumeration_state *idx; struct burn_drive_enumeration_state *idx;
int bufsize; int bufsize;
idx = malloc(sizeof(*idx)); idx = calloc(1, sizeof(*idx));
if (idx == NULL) { if (idx == NULL) {
warnx("can't malloc memory for enumerator"); warnx("cannot allocate memory for enumerator");
return -1; return -1;
} }
idx->skip_device = 0; idx->skip_device = 0;
if ((idx->fd = open(XPT_DEVICE, O_RDWR)) == -1) { if ((idx->fd = open(XPT_DEVICE, O_RDWR)) == -1) {
warn("couldn't open %s", XPT_DEVICE); warn("could not open %s", XPT_DEVICE);
free(idx); free(idx);
idx = NULL; idx = NULL;
return -1; return -1;
@ -183,9 +183,9 @@ static int sg_init_enumerator(burn_drive_enumerator_t *idx_)
idx->ccb.ccb_h.func_code = XPT_DEV_MATCH; idx->ccb.ccb_h.func_code = XPT_DEV_MATCH;
bufsize = sizeof(struct dev_match_result) * 100; bufsize = sizeof(struct dev_match_result) * 100;
idx->ccb.cdm.match_buf_len = bufsize; idx->ccb.cdm.match_buf_len = bufsize;
idx->ccb.cdm.matches = (struct dev_match_result *)malloc(bufsize); idx->ccb.cdm.matches = (struct dev_match_result *) calloc(1, bufsize);
if (idx->ccb.cdm.matches == NULL) { if (idx->ccb.cdm.matches == NULL) {
warnx("can't malloc memory for matches"); warnx("cannot allocate memory for matches");
close(idx->fd); close(idx->fd);
free(idx); free(idx);
return -1; return -1;
@ -487,9 +487,9 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
out.close_session = mmc_close_session; out.close_session = mmc_close_session;
out.close_track_session = mmc_close; out.close_track_session = mmc_close;
out.read_buffer_capacity = mmc_read_buffer_capacity; out.read_buffer_capacity = mmc_read_buffer_capacity;
out.idata = malloc(sizeof(struct burn_scsi_inquiry_data)); out.idata = calloc(1, sizeof(struct burn_scsi_inquiry_data));
out.idata->valid = 0; out.idata->valid = 0;
out.mdata = malloc(sizeof(struct scsi_mode_data)); out.mdata = calloc(1, sizeof(struct scsi_mode_data));
out.mdata->valid = 0; out.mdata->valid = 0;
if (out.idata == NULL || out.mdata == NULL) { if (out.idata == NULL || out.mdata == NULL) {
libdax_msgs_submit(libdax_messenger, -1, 0x00020108, libdax_msgs_submit(libdax_messenger, -1, 0x00020108,
@ -759,13 +759,17 @@ int sg_release(struct burn_drive *d)
int sg_issue_command(struct burn_drive *d, struct command *c) int sg_issue_command(struct burn_drive *d, struct command *c)
{ {
int done = 0, err, sense_len = 0, ret, ignore_error, no_retry = 0; int done = 0, err, sense_len = 0, ret, ignore_error, no_retry = 0, i;
int cam_pass_err_recover = 0; int cam_pass_err_recover = 0, key, asc, ascq, timeout_ms;
union ccb *ccb; union ccb *ccb;
char buf[161]; char buf[161];
static FILE *fp = NULL; static FILE *fp = NULL;
time_t start_time;
snprintf(buf, sizeof (buf), "sg_issue_command d->cam=%p d->released=%d", #define Libburn_use_scsi_eval_cmd_outcomE yes
snprintf(buf, sizeof (buf),
"sg_issue_command d->cam=%p d->released=%d",
(void*)d->cam, d->released); (void*)d->cam, d->released);
mmc_function_spy(NULL, buf); mmc_function_spy(NULL, buf);
@ -854,7 +858,9 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
ccb->csio.dxfer_len = 0; ccb->csio.dxfer_len = 0;
} }
do { start_time = time(NULL);
timeout_ms = 200000;
for (i = 0; !done; i++) {
memset(c->sense, 0, sizeof(c->sense)); memset(c->sense, 0, sizeof(c->sense));
err = cam_send_ccb(d->cam, ccb); err = cam_send_ccb(d->cam, ccb);
@ -867,8 +873,9 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
if (sense_len > sizeof(c->sense)) if (sense_len > sizeof(c->sense))
sense_len = sizeof(c->sense); sense_len = sizeof(c->sense);
memcpy(c->sense, &ccb->csio.sense_data, sense_len); memcpy(c->sense, &ccb->csio.sense_data, sense_len);
if (sense_len >= 14 && cam_pass_err_recover && spc_decode_sense(c->sense, sense_len,
(c->sense[2] & 0x0f)) &key, &asc, &ascq);
if (sense_len >= 14 && cam_pass_err_recover && key)
ignore_error = 1; ignore_error = 1;
} }
@ -886,6 +893,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
fprintf(stderr, "libburn_EXPERIMENTAL: Emulating [2,3A,00] MEDIUM NOT PRESENT\n"); fprintf(stderr, "libburn_EXPERIMENTAL: Emulating [2,3A,00] MEDIUM NOT PRESENT\n");
#endif #endif
c->sense[0] = 0x70; /*Fixed format sense data*/
c->sense[2] = 0x02; c->sense[2] = 0x02;
c->sense[12] = 0x3A; c->sense[12] = 0x3A;
c->sense[13] = 0x00; c->sense[13] = 0x00;
@ -901,6 +909,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
fprintf(stderr, "libburn_EXPERIMENTAL: Emulating [2,04,00] LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE\n"); fprintf(stderr, "libburn_EXPERIMENTAL: Emulating [2,04,00] LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE\n");
#endif #endif
c->sense[0] = 0x70; /*Fixed format sense data*/
c->sense[2] = 0x02; c->sense[2] = 0x02;
c->sense[12] = 0x04; c->sense[12] = 0x04;
c->sense[13] = 0x00; c->sense[13] = 0x00;
@ -914,6 +923,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
fprintf(stderr, "libburn_EXPERIMENTAL: Emulating [5,24,00] INVALID FIELD IN CDB\n"); fprintf(stderr, "libburn_EXPERIMENTAL: Emulating [5,24,00] INVALID FIELD IN CDB\n");
#endif #endif
c->sense[0] = 0x70; /*Fixed format sense data*/
c->sense[2] = 0x05; c->sense[2] = 0x05;
c->sense[12] = 0x24; c->sense[12] = 0x24;
c->sense[13] = 0x00; c->sense[13] = 0x00;
@ -944,11 +954,23 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
fprintf(stderr, "libburn_EXPERIMENTAL: CAM_STATUS= %d .Emulating [2,04,00] LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE\n", (ccb->ccb_h.status & CAM_STATUS_MASK)); fprintf(stderr, "libburn_EXPERIMENTAL: CAM_STATUS= %d .Emulating [2,04,00] LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE\n", (ccb->ccb_h.status & CAM_STATUS_MASK));
#endif #endif
c->sense[0] = 0x70; /*Fixed format sense data*/
c->sense[2] = 0x02; c->sense[2] = 0x02;
c->sense[12] = 0x04; c->sense[12] = 0x04;
c->sense[13] = 0x00; c->sense[13] = 0x00;
no_retry = 1; no_retry = 1;
} }
#ifdef Libburn_use_scsi_eval_cmd_outcomE
done = scsi_eval_cmd_outcome(d, c, fp, c->sense,
sense_len, 0, start_time,
timeout_ms, i,
2 | !!ignore_error);
#else /* Libburn_use_scsi_eval_cmd_outcomE */
if (no_retry || ignore_error || !c->retry) { if (no_retry || ignore_error || !c->retry) {
c->error = 1; c->error = 1;
{ret = 1; goto ex;} {ret = 1; goto ex;}
@ -959,8 +981,9 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
if (burn_sg_log_scsi & 3) { if (burn_sg_log_scsi & 3) {
/* >>> Need own duration time /* >>> Need own duration time
measurement. Then remove bit1 */ measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0, scsi_log_err(c, fp, c->sense,
(c->error != 0) | 2); sense_len > 0 ? sense_len : 18,
0, 1 | 2);
scsi_log_cmd(c,fp,0); scsi_log_cmd(c,fp,0);
} }
break; break;
@ -968,19 +991,36 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
done = 1; done = 1;
c->error = 1; c->error = 1;
break; break;
case GO_ON:
if (burn_sg_log_scsi & 3)
/* >>> Need own duration time
measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense,
sense_len > 0 ? sense_len : 18,
0, 1 | 2);
{ret = 1; goto ex;}
} }
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
} else { } else {
done = 1; done = 1;
} }
} while (!done); } while (!done);
ret = 1; ret = 1;
ex:; ex:;
#ifndef Libburn_use_scsi_eval_cmd_outcomE
if (c->error) if (c->error)
scsi_notify_error(d, c, c->sense, 18, 0); scsi_notify_error(d, c, c->sense, 18, 0);
if (burn_sg_log_scsi & 3) if (burn_sg_log_scsi & 3)
/* >>> Need own duration time measurement. Then remove bit1 */ /* >>> Need own duration time measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0, (c->error != 0) | 2); scsi_log_err(c, fp, c->sense, sense_len > 0 ? sense_len : 18,
0, (c->error != 0) | 2);
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
cam_freeccb(ccb); cam_freeccb(ccb);
return ret; return ret;
@ -996,6 +1036,10 @@ int burn_os_is_2k_seekrw(char *path, int flag)
struct stat stbuf; struct stat stbuf;
char *spt; char *spt;
int i, e; int i, e;
#ifdef Libburn_DIOCGMEDIASIZE_ISBLK
int fd;
off_t add_size;
#endif
if (stat(path, &stbuf) == -1) if (stat(path, &stbuf) == -1)
return 0; return 0;
@ -1003,6 +1047,22 @@ int burn_os_is_2k_seekrw(char *path, int flag)
return 1; return 1;
if (!S_ISCHR(stbuf.st_mode)) if (!S_ISCHR(stbuf.st_mode))
return 0; return 0;
#ifdef Libburn_DIOCGMEDIASIZE_ISBLK
/* If it throws no error with DIOCGMEDIASIZE then it is a
'block device'
*/
fd = open(path, O_RDONLY);
if (fd == -1)
return 0;
ret = ioctl(fd, DIOCGMEDIASIZE, &add_size);
close(fd);
return 1;
#else /* Libburn_DIOCGMEDIASIZE_ISBLK */
spt = strrchr(path, '/'); spt = strrchr(path, '/');
if (spt == NULL) if (spt == NULL)
spt = path; spt = path;
@ -1025,6 +1085,9 @@ int burn_os_is_2k_seekrw(char *path, int flag)
if (strncmp(spt, "fla", e) == 0) /* Flash drive */ if (strncmp(spt, "fla", e) == 0) /* Flash drive */
return 1; return 1;
return 0; return 0;
#endif /* ! Libburn_DIOCGMEDIASIZE_ISBLK */
} }

View File

@ -429,8 +429,11 @@ int sg_dispose_drive(struct burn_drive *d, int flag)
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)
{ {
int ret, recursion_count = 0, l; int ret, recursion_count = 0;
char path[4096]; char path[4096];
#ifdef Libburn_is_on_solariS
int l;
#endif
ret = sg_give_next_adr_raw(idx, adr, adr_size, initialize); ret = sg_give_next_adr_raw(idx, adr, adr_size, initialize);
if (ret <= 0) if (ret <= 0)
@ -460,9 +463,12 @@ int sg_give_next_adr(burn_drive_enumerator_t *idx,
int scsi_enumerate_drives(void) int scsi_enumerate_drives(void)
{ {
burn_drive_enumerator_t idx; burn_drive_enumerator_t idx;
int initialize = 1, ret, i_bus_no = -1, recursion_count = 0, l; int initialize = 1, ret, i_bus_no = -1, recursion_count = 0;
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 buf[4096], target[4096]; char buf[4096], target[4096];
#ifdef Libburn_is_on_solariS
int l;
#endif
while(1) { while(1) {
ret = sg_give_next_adr_raw(&idx, buf, sizeof(buf), initialize); ret = sg_give_next_adr_raw(&idx, buf, sizeof(buf), initialize);
@ -580,6 +586,9 @@ int sg_release(struct burn_drive *d)
} }
#define Libburn_use_scsi_eval_cmd_outcomE yes
/** Sends a SCSI command to the drive, receives reply and evaluates wether /** Sends a SCSI command to the drive, receives reply and evaluates wether
the command succeeded or shall be retried or finally failed. the command succeeded or shall be retried or finally failed.
Returned SCSI errors shall not lead to a return value indicating failure. Returned SCSI errors shall not lead to a return value indicating failure.
@ -591,7 +600,8 @@ int sg_release(struct burn_drive *d)
*/ */
int sg_issue_command(struct burn_drive *d, struct command *c) int sg_issue_command(struct burn_drive *d, struct command *c)
{ {
int sense_valid = 0, i, usleep_time, timeout_ms, no_retry = 0; int sense_valid = 0, i, timeout_ms, no_retry = 0;
int key = 0, asc = 0, ascq = 0, done = 0;
time_t start_time; time_t start_time;
driver_return_code_t i_status; driver_return_code_t i_status;
unsigned int dxfer_len; unsigned int dxfer_len;
@ -601,6 +611,10 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
CdIo_t *p_cdio; CdIo_t *p_cdio;
unsigned char *sense_pt = NULL; unsigned char *sense_pt = NULL;
#ifndef Libburn_use_scsi_eval_cmd_outcomE
int usleep_time;
#endif
c->error = 0; c->error = 0;
if (d->p_cdio == NULL) { if (d->p_cdio == NULL) {
return 0; return 0;
@ -636,15 +650,18 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
/* retry-loop */ /* retry-loop */
start_time = time(NULL); start_time = time(NULL);
timeout_ms = 200000; timeout_ms = 200000;
for(i = 0; ; i++) { for(i = 0; !done; i++) {
i_status = mmc_run_cmd(p_cdio, timeout_ms, &cdb, e_direction, i_status = mmc_run_cmd(p_cdio, timeout_ms, &cdb, e_direction,
dxfer_len, c->page->data); dxfer_len, c->page->data);
sense_valid = mmc_last_cmd_sense(p_cdio, &sense_pt); sense_valid = mmc_last_cmd_sense(p_cdio, &sense_pt);
if (sense_valid >= 18) if (sense_valid >= 18) {
memcpy(c->sense, sense_pt, memcpy(c->sense, sense_pt,
sense_valid >= sizeof(c->sense) ? sense_valid >= sizeof(c->sense) ?
sizeof(c->sense) : sense_valid ); sizeof(c->sense) : sense_valid );
spc_decode_sense(c->sense, 0, &key, &asc, &ascq);
} else
key = asc = ascq = 0;
if (sense_pt != NULL) if (sense_pt != NULL)
free(sense_pt); free(sense_pt);
@ -666,22 +683,26 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
} }
*/ */
if ((!sense_valid) || if ((!sense_valid) || (key == 0 && asc == 0 && ascq == 0)) {
((c->sense[2] & 0x0f) == 0 && c->sense[12] == 0 &&
c->sense[13] == 0)) {
memset(c->sense, 0, sizeof(c->sense)); memset(c->sense, 0, sizeof(c->sense));
if (i_status != 0) { /* set dummy sense */ if (i_status != 0) { /* set dummy sense */
/*LOGICAL UNIT NOT READY, /*LOGICAL UNIT NOT READY,
CAUSE NOT REPORTABLE*/ CAUSE NOT REPORTABLE*/
c->sense[0] = 0x70; /*Fixed format sense data*/
c->sense[2] = 0x02; c->sense[2] = 0x02;
c->sense[12] = 0x04; c->sense[12] = 0x04;
no_retry = 1; no_retry = 1;
} }
} else }
c->sense[2] &= 15; if (i_status != 0 || (key || asc || ascq)) {
if (i_status != 0 || #ifdef Libburn_use_scsi_eval_cmd_outcomE
(c->sense[2] || c->sense[12] || c->sense[13])) {
done = scsi_eval_cmd_outcome(d, c, fp, c->sense, 18,
0, start_time, timeout_ms, i, 2);
#else /* Libburn_use_scsi_eval_cmd_outcomE */
if (no_retry || !c->retry) { if (no_retry || !c->retry) {
c->error = 1; c->error = 1;
goto ex; goto ex;
@ -691,14 +712,21 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
if (burn_sg_log_scsi & 3) { if (burn_sg_log_scsi & 3) {
/* >>> Need own duration time /* >>> Need own duration time
measurement. Then remove bit1 */ measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0, scsi_log_err(c, fp, c->sense, 18, 0,
(c->error != 0) | 2); 1 | 2);
scsi_log_cmd(c,fp,0); scsi_log_cmd(c,fp,0);
} }
break; break;
case FAIL: case FAIL:
c->error = 1; c->error = 1;
goto ex; goto ex;
case GO_ON:
if (burn_sg_log_scsi & 3)
/* >>> Need own duration time
measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 18, 0,
1 | 2);
goto ex;
} }
/* /*
Calming down retries and breaking up endless cycle Calming down retries and breaking up endless cycle
@ -711,17 +739,24 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
goto ex; goto ex;
} }
usleep(usleep_time); usleep(usleep_time);
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
} else } else
break; /* retry-loop */ done = 1;
} /* end of retry-loop */ } /* end of retry-loop */
#ifndef Libburn_use_scsi_eval_cmd_outcomE
ex:; ex:;
if (c->error) if (c->error)
scsi_notify_error(d, c, c->sense, 18, 0); scsi_notify_error(d, c, c->sense, 18, 0);
if (burn_sg_log_scsi & 3) if (burn_sg_log_scsi & 3)
/* >>> Need own duration time measurement. Then remove bit1 */ /* >>> Need own duration time measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0, (c->error != 0) | 2); scsi_log_err(c, fp, c->sense, 18, 0, (c->error != 0) | 2);
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
return 1; return 1;
} }

View File

@ -1773,36 +1773,6 @@ int sg_release(struct burn_drive *d)
} }
#ifdef NIX
/* <<< now in spc.c as scsi_log_err */
/** logs outcome of a sg command. flag&1 causes an error message */
static int sg_log_err(struct command *c, FILE *fp,
sg_io_hdr_t *s,
int flag)
{
if(fp != NULL && (fp == stderr || (burn_sg_log_scsi & 1))) {
if(flag & 1) {
fprintf(fp,
"+++ key=%X asc=%2.2Xh ascq=%2.2Xh (%6d ms)\n",
s->sbp[2], s->sbp[12], s->sbp[13],s->duration);
} else {
scsi_show_cmd_reply(c, fp, 0);
fprintf(fp,"%6d ms\n", s->duration);
}
if (burn_sg_log_scsi & 4)
fflush(fp);
}
if (fp == stderr || !(burn_sg_log_scsi & 2))
return 1;
sg_log_err(c, stderr, s, flag);
return 1;
}
#endif /* NIX */
/** Sends a SCSI command to the drive, receives reply and evaluates wether /** Sends a SCSI command to the drive, receives reply and evaluates wether
the command succeeded or shall be retried or finally failed. the command succeeded or shall be retried or finally failed.
Returned SCSI errors shall not lead to a return value indicating failure. Returned SCSI errors shall not lead to a return value indicating failure.
@ -1812,13 +1782,19 @@ static int sg_log_err(struct command *c, FILE *fp,
*/ */
int sg_issue_command(struct burn_drive *d, struct command *c) int sg_issue_command(struct burn_drive *d, struct command *c)
{ {
int done = 0, no_c_page = 0, usleep_time, i; int done = 0, no_c_page = 0, i;
int err; int err;
time_t start_time; time_t start_time;
sg_io_hdr_t s; sg_io_hdr_t s;
/* ts A61030 */ /* ts A61030 */
static FILE *fp= NULL; static FILE *fp= NULL;
#define Libburn_use_scsi_eval_cmd_outcomE yes
#ifndef Libburn_use_scsi_eval_cmd_outcomE
int usleep_time;
#endif
/* <<< ts A60821 /* <<< ts A60821
debug: for tracing calls which might use open drive fds */ debug: for tracing calls which might use open drive fds */
char buf[161]; char buf[161];
@ -1922,6 +1898,32 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
return -1; return -1;
} }
#ifdef NIX
/* <<< */
if(0){
static int erst= 1;
static unsigned char b00_sense[22]= {
0x72, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E,
0x09, 0x0C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
if (erst > 0) {
s.sb_len_wr= 22;
memcpy(s.sbp, b00_sense, s.sb_len_wr);
erst--;
}
}
/* <<< */
#endif /* NIX */
#ifdef Libburn_use_scsi_eval_cmd_outcomE
done = scsi_eval_cmd_outcome(d, c, fp, s.sbp, s.sb_len_wr,
s.duration, start_time, s.timeout, i, 0);
#else /* Libburn_use_scsi_eval_cmd_outcomE */
if (s.sb_len_wr) { if (s.sb_len_wr) {
if (!c->retry) { if (!c->retry) {
c->error = 1; c->error = 1;
@ -1933,8 +1935,8 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
case RETRY: case RETRY:
done = 0; done = 0;
if (burn_sg_log_scsi & 3) { if (burn_sg_log_scsi & 3) {
scsi_log_err(c, fp, s.sbp, s.duration, scsi_log_err(c, fp, s.sbp, s.sb_len_wr,
c->error != 0); s.duration, 1);
scsi_log_cmd(c,fp,0); scsi_log_cmd(c,fp,0);
} }
break; break;
@ -1942,6 +1944,11 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
done = 1; done = 1;
c->error = 1; c->error = 1;
break; break;
case GO_ON:
if (burn_sg_log_scsi & 3)
scsi_log_err(c, fp, s.sbp, s.sb_len_wr,
s.duration, 1);
goto ex;
} }
/* ts A90921 : /* ts A90921 :
@ -1958,14 +1965,28 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
} else { } else {
done = 1; done = 1;
} }
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
} }
/* ts A61106 */ /* ts A61106 */
#ifdef Libburn_use_scsi_eval_cmd_outcomE
if (s.host_status != Libburn_sg_host_oK ||
(s.driver_status != Libburn_sg_driver_oK && !c->error)) {
#else /* Libburn_use_scsi_eval_cmd_outcomE */
ex:; ex:;
if (c->error) { if (c->error) {
scsi_notify_error(d, c, s.sbp, s.sb_len_wr, 0); scsi_notify_error(d, c, s.sbp, s.sb_len_wr, 0);
} else if (s.host_status != Libburn_sg_host_oK || } else if (s.host_status != Libburn_sg_host_oK ||
s.driver_status != Libburn_sg_driver_oK) { s.driver_status != Libburn_sg_driver_oK) {
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
char msg[161]; char msg[161];
sprintf(msg, sprintf(msg,
@ -1980,9 +2001,13 @@ ex:;
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
} }
#ifndef Libburn_use_scsi_eval_cmd_outcomE
if (burn_sg_log_scsi & 3) if (burn_sg_log_scsi & 3)
/* <<< sg_log_err(c, fp, &s, c->error != 0); */ scsi_log_err(c, fp, s.sbp, s.sb_len_wr,
scsi_log_err(c, fp, s.sbp, s.duration, c->error != 0); s.duration, c->error != 0);
#endif
return 1; return 1;
} }

View File

@ -565,12 +565,17 @@ int sg_release(struct burn_drive *d)
*/ */
int sg_issue_command(struct burn_drive *d, struct command *c) int sg_issue_command(struct burn_drive *d, struct command *c)
{ {
int i, usleep_time, timeout_ms, no_retry = 0, ret; int i, timeout_ms, ret, key, asc, ascq, done = 0;
time_t start_time; time_t start_time;
struct uscsi_cmd cgc; struct uscsi_cmd cgc;
char msg[80]; char msg[80];
static FILE *fp = NULL; static FILE *fp = NULL;
#define Libburn_use_scsi_eval_cmd_outcomE yes
#ifndef Libburn_use_scsi_eval_cmd_outcomE
int usleep_time, no_retry = 0;
#endif
c->error = 0; c->error = 0;
memset(c->sense, 0, sizeof(c->sense)); memset(c->sense, 0, sizeof(c->sense));
if (d->fd == -1) if (d->fd == -1)
@ -616,7 +621,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
/* retry-loop */ /* retry-loop */
start_time = time(NULL); start_time = time(NULL);
timeout_ms = 200000; timeout_ms = 200000;
for(i = 0; ; i++) { for(i = 0; !done; i++) {
ret = ioctl(d->fd, USCSICMD, &cgc); ret = ioctl(d->fd, USCSICMD, &cgc);
@ -639,11 +644,29 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
return -1; return -1;
} }
c->sense[2] &= 15; #ifdef Libburn_use_scsi_eval_cmd_outcomE
/* >>> Should replace "18" by realistic sense length.
What's about following older remark ?
*/
/* >>> valid sense: cgc.uscsi_rqlen - cgc.uscsi_rqresid */;
spc_decode_sense(c->sense, 0, &key, &asc, &ascq);
if (key || asc || ascq) {
done = scsi_eval_cmd_outcome(d, c, fp, c->sense, 18, 0,
start_time, timeout_ms, i, 2);
} else
done = 1;
#else /* Libburn_use_scsi_eval_cmd_outcomE */
/* >>> valid sense: cgc.uscsi_rqlen - cgc.uscsi_rqresid */; /* >>> valid sense: cgc.uscsi_rqlen - cgc.uscsi_rqresid */;
if (c->sense[2] || c->sense[12] || c->sense[13]) { spc_decode_sense(c->sense, 0, &key, &asc, &ascq);
if (key || asc || ascq) {
if (no_retry || !c->retry) { if (no_retry || !c->retry) {
c->error = 1; c->error = 1;
goto ex; goto ex;
@ -653,14 +676,21 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
if (burn_sg_log_scsi & 3) { if (burn_sg_log_scsi & 3) {
/* >>> Need own duration time /* >>> Need own duration time
measurement. Then remove bit1 */ measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0, scsi_log_err(c, fp, c->sense, 18, 0,
(c->error != 0) | 2); 1 | 2);
scsi_log_cmd(c,fp,0); scsi_log_cmd(c,fp,0);
} }
break; break;
case FAIL: case FAIL:
c->error = 1; c->error = 1;
goto ex; goto ex;
case GO_ON:
if (burn_sg_log_scsi & 3)
/* >>> Need own duration time
measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 18, 0,
1 | 2);
goto ex;
} }
/* /*
Calming down retries and breaking up endless cycle Calming down retries and breaking up endless cycle
@ -675,15 +705,24 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
usleep(usleep_time); usleep(usleep_time);
} else } else
break; /* retry-loop */ break; /* retry-loop */
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
} /* end of retry-loop */ } /* end of retry-loop */
#ifndef Libburn_use_scsi_eval_cmd_outcomE
ex:; ex:;
if (c->error) if (c->error)
scsi_notify_error(d, c, c->sense, 18, 0); scsi_notify_error(d, c, c->sense, 18, 0);
if (burn_sg_log_scsi & 3) if (burn_sg_log_scsi & 3)
/* >>> Need own duration time measurement. Then remove bit1 */ /* >>> Need own duration time measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0, (c->error != 0) | 2); scsi_log_err(c, fp, c->sense, 18, 0, (c->error != 0) | 2);
#endif /* ! Libburn_use_scsi_eval_cmd_outcomE */
return 1; return 1;
} }
@ -717,6 +756,27 @@ int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no,
/** Tells wether a text is a persistent address as listed by the enumeration /** Tells wether a text is a persistent address as listed by the enumeration
functions. functions.
*/ */
#ifndef NIX
int sg_is_enumerable_adr(char* path)
{
int ret;
int bus_no, target_no, lun_no;
struct stat stbuf;
if (strncmp("/dev/rdsk/", path, 10) != 0)
return 0;
ret = decode_btl_solaris(path + 10, &bus_no, &target_no, &lun_no, 0);
if (ret <= 0)
return 0;
if (stat(path, &stbuf) == -1)
return 0;
return 1;
}
#else /* ! NIX */
int sg_is_enumerable_adr(char* adr) int sg_is_enumerable_adr(char* adr)
{ {
burn_drive_enumerator_t idx; burn_drive_enumerator_t idx;
@ -736,6 +796,8 @@ int sg_is_enumerable_adr(char* adr)
sg_give_next_adr(&idx, buf, sizeof(buf), -1); sg_give_next_adr(&idx, buf, sizeof(buf), -1);
return (0); return (0);
} }
#endif /* NIX */

View File

@ -63,3 +63,15 @@ int burn_source_cancel(struct burn_source *src)
return 1; return 1;
} }
/* ts B00922 */
int burn_source_read(struct burn_source *src, unsigned char *buffer, int size)
{
int ret;
if (src->read != NULL)
ret = src->read(src, buffer, size);
else
ret = src->read_xt(src, buffer, size);
return ret;
}

View File

@ -7,4 +7,6 @@ struct burn_source *burn_source_new(void);
int burn_source_cancel(struct burn_source *src); int burn_source_cancel(struct burn_source *src);
int burn_source_read(struct burn_source *src, unsigned char *buffer, int size);
#endif /*__SOURCE*/ #endif /*__SOURCE*/

View File

@ -75,6 +75,30 @@ int scsi_init_command(struct command *c, unsigned char *opcode, int oplen)
} }
/* ts B00728 */
int spc_decode_sense(unsigned char *sense, int senselen,
int *key, int *asc, int *ascq)
{
*key = *asc = *ascq = 0;
if ((sense[0] & 0x7f) == 0x72 || (sense[0] & 0x7f) == 0x73) {
if (senselen <= 0 || senselen > 1)
*key = sense[1] & 0x0f;
if (senselen <= 0 || senselen > 2)
*asc = sense[2];
if (senselen <= 0 || senselen > 3)
*ascq = sense[3];
return 1;
}
if (senselen <= 0 || senselen > 2)
*key = sense[2] & 0x0f;
if (senselen <= 0 || senselen > 12)
*asc = sense[12];
if (senselen <= 0 || senselen > 13)
*ascq = sense[13];
return 1;
}
int spc_test_unit_ready_r(struct burn_drive *d, int *key, int *asc, int *ascq) int spc_test_unit_ready_r(struct burn_drive *d, int *key, int *asc, int *ascq)
{ {
struct command c; struct command c;
@ -83,23 +107,23 @@ int spc_test_unit_ready_r(struct burn_drive *d, int *key, int *asc, int *ascq)
return 0; return 0;
scsi_init_command(&c, SPC_TEST_UNIT_READY,sizeof(SPC_TEST_UNIT_READY)); scsi_init_command(&c, SPC_TEST_UNIT_READY,sizeof(SPC_TEST_UNIT_READY));
/*
c.oplen = sizeof(SPC_TEST_UNIT_READY);
memcpy(c.opcode, SPC_TEST_UNIT_READY, sizeof(SPC_TEST_UNIT_READY));
c.page = NULL;
*/
c.retry = 0; c.retry = 0;
c.dir = NO_TRANSFER; c.dir = NO_TRANSFER;
d->issue_command(d, &c); d->issue_command(d, &c);
if (c.error) { if (c.error) {
*key= c.sense[2];
*asc= c.sense[12]; /*
*ascq= c.sense[13]; fprintf(stderr, "sense[0 - 2] = %2.2X %2.2X %2.2X",
return (c.sense[2] & 0xF) == 0; c.sense[0], c.sense[1], c.sense[2]);
*/
spc_decode_sense(c.sense, 0, key, asc, ascq);
return (key == 0);
} }
return 1; return 1;
} }
int spc_test_unit_ready(struct burn_drive *d) int spc_test_unit_ready(struct burn_drive *d)
{ {
int key,asc,ascq; int key,asc,ascq;
@ -151,6 +175,7 @@ handle_error:;
/* ts A90213 */ /* ts A90213 */
sprintf(msg, sprintf(msg,
"Asynchronous SCSI error on %s: ", cmd_text); "Asynchronous SCSI error on %s: ", cmd_text);
sense[0] = 0x70; /* Fixed format sense data */
sense[2] = key; sense[2] = key;
sense[12] = asc; sense[12] = asc;
sense[13] = ascq; sense[13] = ascq;
@ -249,7 +274,7 @@ void spc_inquiry(struct burn_drive *d)
memcpy(c.opcode, SPC_INQUIRY, sizeof(SPC_INQUIRY)); memcpy(c.opcode, SPC_INQUIRY, sizeof(SPC_INQUIRY));
c.oplen = sizeof(SPC_INQUIRY); c.oplen = sizeof(SPC_INQUIRY);
*/ */
c.dxfer_len= (c.opcode[3] << 8) | c.opcode[4]; c.dxfer_len = (c.opcode[3] << 8) | c.opcode[4];
c.retry = 1; c.retry = 1;
c.page = &buf; c.page = &buf;
c.page->bytes = 0; c.page->bytes = 0;
@ -803,9 +828,7 @@ void spc_probe_write_modes(struct burn_drive *d)
if (last_try) if (last_try)
break; break;
key = c.sense[2]; spc_decode_sense(c.sense, 0, &key, &asc, &ascq);
asc = c.sense[12];
ascq = c.sense[13];
if (key) if (key)
burn_print(7, "%d not supported\n", try_block_type); burn_print(7, "%d not supported\n", try_block_type);
else { else {
@ -958,6 +981,7 @@ enum response scsi_error_msg(struct burn_drive *d, unsigned char *sense,
int senselen, char msg_data[161], int senselen, char msg_data[161],
int *key, int *asc, int *ascq) int *key, int *asc, int *ascq)
{ {
int ret;
char *msg; char *msg;
static char key_def[16][40] = { static char key_def[16][40] = {
"(no specific error)", "(no specific error)",
@ -981,12 +1005,9 @@ enum response scsi_error_msg(struct burn_drive *d, unsigned char *sense,
msg= msg_data; msg= msg_data;
*key= *asc= *ascq= -1; *key= *asc= *ascq= -1;
if (senselen<=0 || senselen>2) ret = spc_decode_sense(sense, senselen, key, asc, ascq);
*key = sense[2] & 0x0f; if (ret <= 0)
if (senselen<=0 || senselen>12) *key= *asc= *ascq= -1;
*asc = sense[12];
if (senselen<=0 || senselen>13)
*ascq = sense[13];
sprintf(msg, "[%X %2.2X %2.2X] ", *key, *asc, *ascq); sprintf(msg, "[%X %2.2X %2.2X] ", *key, *asc, *ascq);
msg= msg + strlen(msg); msg= msg + strlen(msg);
@ -996,8 +1017,10 @@ enum response scsi_error_msg(struct burn_drive *d, unsigned char *sense,
switch (*asc) { switch (*asc) {
case 0x00: case 0x00:
if (*key > 0 || *ascq > 0)
break; /* Fall through to unknown error */
sprintf(msg, "(No error reported by SCSI transaction)"); sprintf(msg, "(No error reported by SCSI transaction)");
return RETRY; return GO_ON;
case 0x02: case 0x02:
sprintf(msg, "Not ready"); sprintf(msg, "Not ready");
@ -1203,6 +1226,12 @@ enum response scsi_error_msg(struct burn_drive *d, unsigned char *sense,
sprintf(msg, "Medium not present"); sprintf(msg, "Medium not present");
d->status = BURN_DISC_EMPTY; d->status = BURN_DISC_EMPTY;
return FAIL; return FAIL;
case 0x3E:
if (*ascq == 1)
sprintf(msg, "Logical unit failure");
else if (*ascq == 2)
sprintf(msg, "Timeout on logical unit");
return FAIL;
case 0x57: case 0x57:
if (*key != 3 || *ascq != 0) if (*key != 3 || *ascq != 0)
break; break;
@ -1379,28 +1408,10 @@ int scsi_notify_error(struct burn_drive *d, struct command *c,
sprintf(msg, "SCSI error condition on command %2.2Xh %s: ", sprintf(msg, "SCSI error condition on command %2.2Xh %s: ",
c->opcode[0], c->opcode[0],
scsi_command_name((unsigned int) c->opcode[0], 0)); scsi_command_name((unsigned int) c->opcode[0], 0));
#ifdef NIX
if (key>=0)
sprintf(msg+strlen(msg), " key=%Xh", key);
if (asc>=0)
sprintf(msg+strlen(msg), " asc=%2.2Xh", asc);
if (ascq>=0)
sprintf(msg+strlen(msg), " ascq=%2.2Xh", ascq);
ret = libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002010f,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, msg,0,0);
if (ret < 0)
return ret;
ret = libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002010f,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
scsi_msg,0,0);
#else
strcat(msg, scsi_msg); strcat(msg, scsi_msg);
ret = libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002010f, ret = libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002010f,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, msg,0,0); LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, msg,0,0);
#endif /* NIX */
return ret; return ret;
} }
@ -1493,19 +1504,31 @@ int scsi_log_cmd(struct command *c, void *fp_in, int flag)
bit1 do not print duration bit1 do not print duration
*/ */
int scsi_log_err(struct command *c, void *fp_in, unsigned char sense[18], int scsi_log_err(struct command *c, void *fp_in, unsigned char sense[18],
int duration, int flag) int sense_len, int duration, int flag)
{ {
char durtxt[20]; char durtxt[20];
FILE *fp = fp_in; FILE *fp = fp_in;
int key, asc, ascq, i, l;
if(fp != NULL && (fp == stderr || (burn_sg_log_scsi & 1))) { if (fp != NULL && (fp == stderr || (burn_sg_log_scsi & 1))) {
if(flag & 1) { if (flag & 1) {
l = 18;
if ((sense[0] & 0x7f) == 0x72 ||
(sense[0] & 0x7f) == 0x73)
l = sense[7] + 7 + 1; /* SPC-5 4.5.2. */
if (l > sense_len)
l = sense_len;
fprintf(fp, "+++ sense data =");
for (i = 0 ; i < l; i++)
fprintf(fp, " %2.2X", sense[i]);
fprintf(fp, "\n");
durtxt[0] = 0; durtxt[0] = 0;
if (!(flag & 2)) if (!(flag & 2))
sprintf(durtxt, " (%6d ms)\n",duration); sprintf(durtxt, " (%6d ms)", duration);
spc_decode_sense(sense, 0, &key, &asc, &ascq);
fprintf(fp, "+++ key=%X asc=%2.2Xh ascq=%2.2Xh%s\n", fprintf(fp, "+++ key=%X asc=%2.2Xh ascq=%2.2Xh%s\n",
sense[2], sense[12], sense[13], durtxt); (unsigned int) key, (unsigned int) asc,
(unsigned int) ascq, durtxt);
} else { } else {
scsi_show_cmd_reply(c, fp, 0); scsi_show_cmd_reply(c, fp, 0);
if (!(flag & 2)) if (!(flag & 2))
@ -1516,7 +1539,55 @@ int scsi_log_err(struct command *c, void *fp_in, unsigned char sense[18],
} }
if (fp == stderr || !(burn_sg_log_scsi & 2)) if (fp == stderr || !(burn_sg_log_scsi & 2))
return 1; return 1;
scsi_log_err(c, stderr, sense, duration, flag); scsi_log_err(c, stderr, sense, sense_len, duration, flag);
return 1; return 1;
} }
/* ts B00808 */
/*
@param flag bit0 = do not retry
bit1 = do not print duration
@return 0 = not yet done , 1 = done , -1 = error
*/
int scsi_eval_cmd_outcome(struct burn_drive *d, struct command *c, void *fp,
unsigned char *sense, int sense_len,
int duration, time_t start_time, int timeout_ms,
int loop_count, int flag)
{
enum response outcome;
int done = -1, usleep_time;
if (sense_len <= 0)
return 1;
if (burn_sg_log_scsi & 3)
scsi_log_err(c, fp, sense, sense_len, duration,
1 | (flag & 2));
outcome = scsi_error(d, sense, sense_len);
if (outcome == RETRY && c->retry && !(flag & 1)) {
/* Calming down retries and breaking up endless cycle
*/
usleep_time = Libburn_scsi_retry_usleeP +
loop_count * Libburn_scsi_retry_incR;
if (time(NULL) + usleep_time / 1000000 - start_time >
timeout_ms / 1000 + 1) {
done = 1;
goto ex;
}
usleep(usleep_time);
if (burn_sg_log_scsi & 3)
scsi_log_cmd(c, fp, 0);
return 0;
} else if (outcome == RETRY) {
done = 1;
} else if (outcome == GO_ON) {
return 1;
} else if (outcome == FAIL) {
done = 1;
}
ex:;
c->error = 1;
scsi_notify_error(d, c, sense, sense_len, 0);
return done;
}

View File

@ -49,7 +49,7 @@ int burn_scsi_setup_drive(struct burn_drive *d, int bus_no, int host_no,
int channel_no, int target_no, int lun_no, int flag); int channel_no, int target_no, int lun_no, int flag);
/* ts A61115 moved from sg-*.h */ /* ts A61115 moved from sg-*.h */
enum response { RETRY, FAIL }; enum response { RETRY, FAIL, GO_ON };
enum response scsi_error(struct burn_drive *, unsigned char *, int); enum response scsi_error(struct burn_drive *, unsigned char *, int);
/* ts A61122 */ /* ts A61122 */
@ -78,7 +78,29 @@ int scsi_log_cmd(struct command *c, void *fp, int flag);
/* ts A91221 (former sg_log_err ts A91108) */ /* ts A91221 (former sg_log_err ts A91108) */
/** Logs outcome of a sg command. */ /** Logs outcome of a sg command. */
int scsi_log_err(struct command *c, void *fp, unsigned char sense[18], int scsi_log_err(struct command *c, void *fp, unsigned char sense[18],
int duration, int flag); int sense_len, int duration, int flag);
/* ts B00728 */
int spc_decode_sense(unsigned char *sense, int senselen,
int *key, int *asc, int *ascq);
/* ts B00808 */
/** Evaluates outcome of a single SCSI command, eventually logs sense data,
and issues DEBUG error message in case the command is evaluated as done.
@param flag bit1 = do not print duration
@return 0 = not yet done , 1 = done , -1 = error
*/
int scsi_eval_cmd_outcome(struct burn_drive *d, struct command *c, void *fp_in,
unsigned char *sense, int sense_len,
int duration, time_t start_time, int timeout_ms,
int loop_count, int flag);
/* The waiting time before eventually retrying a failed SCSI command.
Before each retry wait Libburn_scsi_retry_incR longer than with
the previous one.
*/
#define Libburn_scsi_retry_usleeP 100000
#define Libburn_scsi_retry_incR 100000
#endif /*__SPC*/ #endif /*__SPC*/

View File

@ -34,7 +34,7 @@ char *burn_strdup(char *s)
return NULL; return NULL;
l = strlen(s) + 1; l = strlen(s) + 1;
ret = malloc(l); ret = calloc(1, l);
memcpy(ret, s, l); memcpy(ret, s, l);
return ret; return ret;
@ -52,7 +52,7 @@ char *burn_strndup(char *s, int n)
return NULL; return NULL;
l = strlen(s); l = strlen(s);
ret = malloc(l < n ? l : n); ret = calloc(1, l < n ? l : n);
memcpy(ret, s, l < n - 1 ? l : n - 1); memcpy(ret, s, l < n - 1 ? l : n - 1);
ret[n - 1] = '\0'; ret[n - 1] = '\0';

View File

@ -385,9 +385,9 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
runtime = nwa-150; runtime = nwa-150;
#endif #endif
sheet = malloc(sizeof(struct cue_sheet)); sheet = calloc(1, sizeof(struct cue_sheet));
/* ts A61009 : react on failures of malloc(), add_cue_sheet() /* ts A61009 : react on failures of calloc(), add_cue_sheet()
type_to_form() */ type_to_form() */
if (sheet == NULL) { if (sheet == NULL) {
libdax_msgs_submit(libdax_messenger, -1, 0x00020111, libdax_msgs_submit(libdax_messenger, -1, 0x00020111,
@ -2006,7 +2006,13 @@ ex:;
burn_drive_mark_unready(d); burn_drive_mark_unready(d);
burn_drive_inquire_media(d); burn_drive_inquire_media(d);
/* <<< d->busy = BURN_DRIVE_IDLE; */ if (d->current_profile == 0x41 && d->complete_sessions >= 300) {
sprintf(msg, "Sequential BD-R media now contains %d sessions. It is likely to soon fail writing.", d->complete_sessions);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002017b, LIBDAX_MSGS_SEV_WARNING,
LIBDAX_MSGS_PRIO_ZERO, msg, 0, 0);
}
return ret; return ret;
early_failure:; early_failure:;
return 0; return 0;
@ -2114,9 +2120,11 @@ int burn_stdio_mmc_write(struct burn_drive *d, int start, struct buffer *buf)
if (d->cancel) if (d->cancel)
return BE_CANCELLED; return BE_CANCELLED;
if (d->stdio_fd < 0) { if (d->stdio_fd < 0) {
libdax_msgs_submit(libdax_messenger, d->global_index,
/* >>> program error */; 0x0002017d,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Invalid file descriptor with stdio pseudo-drive",
0, 0);
d->cancel = 1; d->cancel = 1;
return BE_CANCELLED; return BE_CANCELLED;
} }
@ -2164,9 +2172,11 @@ int burn_stdio_mmc_dummy_write(struct burn_drive *d, int start,
int burn_stdio_sync_cache(int fd, struct burn_drive *d, int flag) int burn_stdio_sync_cache(int fd, struct burn_drive *d, int flag)
{ {
if (fd < 0) { if (fd < 0) {
libdax_msgs_submit(libdax_messenger, d->global_index,
/* >>> program error */; 0x0002017d,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Invalid file descriptor with stdio pseudo-drive",
0, 0);
d->cancel = 1; d->cancel = 1;
return 0; return 0;
} }

View File

@ -25,18 +25,19 @@
#include "../libburn/libdax_msgs.h" #include "../libburn/libdax_msgs.h"
struct libdax_msgs *libdax_messenger= NULL; struct libdax_msgs *libdax_messenger= NULL;
/* The API for .wav extraction */
#define LIBDAX_AUDIOXTR_H_PUBLIC 1
#include "../libburn/libdax_audioxtr.h"
#else /* Dewav_without_libburN */ #else /* Dewav_without_libburN */
/* This build environment uses libdax_msgs via libburn */ /* This build environment uses libdax_msgs and libdax_audioxtr via libburn */
/* Thus the API header of libburn */ /* Thus the API header of libburn */
#include "../libburn/libburn.h" #include "../libburn/libburn.h"
#endif /* ! Dewav_without_libburN */ #endif /* ! Dewav_without_libburN */
/* The API for .wav extraction */
#include "../libburn/libdax_audioxtr.h"
int main(int argc, char **argv) int main(int argc, char **argv)
{ {

View File

@ -20,31 +20,37 @@
Before you can do anything, you have to initialize libburn by Before you can do anything, you have to initialize libburn by
burn_initialize() burn_initialize()
and provide some signal and abort handling, e.g. by the builtin handler, by and provide some signal and abort handling, e.g. by the builtin handler, by
burn_set_signal_handling() burn_set_signal_handling("libburner : ", NULL, 0x0)
as it is done in main() at the end of this file. Then you aquire a as it is done in main() at the end of this file.
drive in an appropriate way conforming to the API. The two main Then you aquire a drive in an appropriate way conforming to the API. The twoi
approaches are shown here in application functions: main approaches are shown here in application functions:
libburner_aquire_by_adr() demonstrates usage as of cdrecord traditions libburner_aquire_by_adr() demonstrates usage as of cdrecord traditions
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 or DVD-RW
With that aquired drive you can blank a CD-RW or DVD-RW as shown in
libburner_blank_disc() libburner_blank_disc()
or you can format a DVD-RW to profile "Restricted Overwrite" (needed once) or you can format a DVD-RW to profile "Restricted Overwrite" (needed once)
or an unused BD to default size with spare blocks or an unused BD to default size with spare blocks
libburner_format() libburner_format()
With the aquired drive you can burn to CD, DVD, BD With the aquired drive you can burn to CD, DVD, BD. See
libburner_payload() libburner_payload()
These three functions switch temporarily to a non-fatal signal handler
while they are waiting for the drive to become idle again:
burn_set_signal_handling("libburner : ", NULL, 0x30)
After the waiting loop ended, they check for eventual abort events by
burn_is_aborting(0)
The 0x30 handler will eventually execute
burn_abort()
but not wait for the drive to become idle and not call exit().
This is needed because the worker threads might block as long as the signal
handler has not returned. The 0x0 handler would wait for them to finish.
Take this into respect when implementing own signal handlers.
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();
burn_finish() burn_finish()
FreeBSD does not work well with the convenient synchronous signal handler. So
the waiting loops for blanking, formatting, and writing use the asynchronous
mode of the libburn signal handler. It will not shutdown the library and
abort the program, but rather tell the ongoing drive operation to stop as
soon as possible. After the loops and at the end of the program there is a
call to determine whether an abort happened:
burn_is_aborting()
Applications must use 64 bit off_t. E.g. by defining Applications must use 64 bit off_t. E.g. by defining
#define _LARGEFILE_SOURCE #define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64 #define _FILE_OFFSET_BITS 64
@ -60,7 +66,7 @@
/* This program insists in the own headerfile. */ /* This program insists in the own headerfile. */
#include "../libburn/libburn.h" #include "../libburn/libburn.h"
/* libburn is intended for Linux systems with kernel 2.4 or 2.6 for now */ /* libburn works on Linux systems with kernel 2.4 or 2.6, FreeBSD, Solaris */
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <sys/types.h> #include <sys/types.h>
@ -333,7 +339,7 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
if (burn_is_aborting(0) > 0) if (burn_is_aborting(0) > 0)
return -1; return -1;
/* Back to synchronous handling */ /* Back to synchronous handling */
burn_set_signal_handling("libburner : ", NULL, 0); burn_set_signal_handling("libburner : ", NULL, 0x0);
printf("Done\n"); printf("Done\n");
return 1; return 1;
} }
@ -401,7 +407,7 @@ int libburner_format(struct burn_drive *drive)
} }
if (burn_is_aborting(0) > 0) if (burn_is_aborting(0) > 0)
return -1; return -1;
burn_set_signal_handling("libburner : ", NULL, 0); burn_set_signal_handling("libburner : ", NULL, 0x0);
burn_disc_get_profile(drive_list[0].drive, &current_profile, burn_disc_get_profile(drive_list[0].drive, &current_profile,
current_profile_name); current_profile_name);
if (current_profile == 0x14 || current_profile == 0x13) if (current_profile == 0x14 || current_profile == 0x13)
@ -757,7 +763,7 @@ int main(int argc, char **argv)
/* Activate the synchronous signal handler which eventually will try to /* Activate the synchronous signal handler which eventually will try to
properly shutdown drive and library on aborting events. */ properly shutdown drive and library on aborting events. */
burn_set_signal_handling("libburner : ", NULL, 0); burn_set_signal_handling("libburner : ", NULL, 0x0);
/** Note: driveno might change its value in this call */ /** Note: driveno might change its value in this call */
ret = libburner_aquire_drive(drive_adr, &driveno); ret = libburner_aquire_drive(drive_adr, &driveno);

134
test/offst_source.c Normal file
View File

@ -0,0 +1,134 @@
/*
cc -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS -g -o test/offst_source test/offst_source.c -lburn
*/
#include "../libburn/libburn.h"
/* Just everything from test/libburner.c */
#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
static int create_original(struct burn_source **original, char *path, int flag)
{
printf("create_original: path='%s'\n", path);
*original = burn_file_source_new(path, NULL);
if (*original == NULL)
return 0;
return 1;
}
static int set_up_offst_sources(struct burn_source *original,
struct burn_source *offsetters[],
int count, int flag)
{
int i;
off_t start = 3, size = 10, gap = 7;
for (i = 0; i < count; i++) {
offsetters[i] = burn_offst_source_new(original,
i > 0 ? offsetters[i - 1] : NULL,
start, size, 0);
if (offsetters[i] == NULL)
return 0;
printf("set_up_offst_sources: idx=%d, start=%d\n",
i, (int) start);
start += size + gap;
}
return 1;
}
static int consume_source(struct burn_source *src, int flag)
{
int ret, count = 0;
unsigned char buf[1];
while (1) {
ret = src->read_xt(src, buf, 1);
if (ret < 0) {
printf("\n");
fprintf(stderr, "consume_source: count=%d, ret=%d\n",
count, ret);
return 0;
}
if (ret == 0)
break;
printf("%u ", buf[0]);
count++;
}
printf(" count=%d\n", count);
return 1;
}
static int consume_all_sources(struct burn_source *offsetters[],
int count, int flag)
{
int i, ret;
for (i = 0; i < count; i++) {
printf("consume_source: idx=%d\n", i);
ret = consume_source(offsetters[i], 0);
if (ret <= 0)
return ret;
}
return 1;
}
static int free_all_sources(struct burn_source *original,
struct burn_source *offsetters[],
int count, int flag)
{
int i;
for (i = 0; i < count; i++)
burn_source_free(offsetters[i]);
burn_source_free(original);
return 1;
}
int main(int argc, char **argv)
{
int ret;
char *path = "./COPYRIGHT";
struct burn_source *original = NULL, *offsetters[4];
if (argc > 1)
path = argv[1];
if (burn_initialize() == 0)
exit(1);
ret = create_original(&original, path, 0);
if (ret <= 0)
exit(2);
ret = set_up_offst_sources(original, offsetters, 4, 0);
if (ret <= 0)
exit(3);
ret = consume_all_sources(offsetters, 4, 0);
if (ret <= 0)
exit(4);
ret = free_all_sources(original, offsetters, 4, 0);
if (ret <= 0)
exit(5);
burn_finish();
exit(0);
}