Compare commits

..

4 Commits

74 changed files with 3894 additions and 7616 deletions

View File

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

328
ChangeLog
View File

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

View File

@ -6,7 +6,6 @@ pkgconfigdir=$(LIBBURNIA_PKGCONFDIR)
libincludedir=$(includedir)/libburn libincludedir=$(includedir)/libburn
lib_LTLIBRARIES = libburn/libburn.la lib_LTLIBRARIES = libburn/libburn.la
ACLOCAL_AMFLAGS = -I ./
## ========================================================================= ## ## ========================================================================= ##
@ -76,15 +75,11 @@ 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 \
@ -99,9 +94,6 @@ 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
@ -118,9 +110,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 - B10808 ## cdrskin construction site - ts A60816 - B00611
cdrskin_cdrskin_CPPFLAGS = -Ilibburn cdrskin_cdrskin_CPPFLAGS = -Ilibburn
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_1_8 cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_8_2
# 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
@ -151,10 +143,7 @@ doc/html: doc/doxygen.conf
doc-upload: doc/html doc-upload: doc/html
scp -r $</* $(webhost):$(webpath) scp -r $</* $(webhost):$(webpath)
## ts B00729 all: doc
## 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 \
@ -197,8 +186,6 @@ EXTRA_DIST = \
version.h.in \ version.h.in \
doc/comments \ doc/comments \
doc/doxygen.conf.in \ doc/doxygen.conf.in \
doc/cookbook.txt \
doc/mediainfo.txt \
README \ README \
AUTHORS \ AUTHORS \
CONTRIBUTORS \ CONTRIBUTORS \
@ -212,7 +199,6 @@ 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 \

159
README
View File

@ -6,12 +6,12 @@ This all is under GPL.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
libburn-project.org libburn-project.org
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net> By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006-2011 Mario Danic, Thomas Schmitt Copyright (C) 2006-2010 Mario Danic, Thomas Schmitt
Still containing parts of Libburn. By Derek Foreman <derek@signalmarketing.com> 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-1.1.8.tar.gz http://files.libburnia-project.org/releases/libburn-0.8.2.pl00.tar.gz
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
@ -19,10 +19,10 @@ Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
From tarball From tarball
Obtain libburn-1.1.8.tar.gz, take it to a directory of your choice and do: Obtain libburn-0.8.2.pl00.tar.gz, take it to a directory of your choice and do:
tar xzf libburn-1.1.8.tar.gz tar xzf libburn-0.8.2.pl00.tar.gz
cd libburn-1.1.8 cd libburn-0.8.2
./configure --prefix=/usr ./configure --prefix=/usr
make make
@ -60,11 +60,6 @@ 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
@ -81,32 +76,11 @@ 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
Linux only:
libburn tries to avoid a collision with udev's drive examination by waiting
0.1 seconds before opening the device file for a longer time, after udev
might have been alarmed by drive scanning activities.
The waiting time can be set at ./configure time with microsecond granularity.
E.g. 2 seconds:
CFLAGS="$CFLAGS -DLibburn_udev_wait_useC=2000000"
./configure ...options...
Waiting can be disabled by zero waiting time:
CFLAGS="$CFLAGS -DLibburn_udev_wait_useC=0"
Alternatively, libburn can try to be nice by opening the device file,
closing it immediately, waiting, and only then opening it for real:
CFLAGS="$CFLAGS -DLibburn_udev_extra_open_cyclE -DLibburn_udev_wait_useC=500000"
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
An important part of the project, libisofs, is hosted in a bzr repository at An important part of the project, libisofs, is hosted in a bzr repository at
@ -125,7 +99,7 @@ See README files there.
libburnia-project.org is an open-source software project for reading, mastering libburnia-project.org is an open-source software project for reading, mastering
and writing optical discs. and writing optical discs.
For now this means CD media, all DVD media, all BD media. For now this means CD media, all DVD media except DVD-R DL, all BD media.
The project comprises of several more or less interdependent parts which The project comprises of several more or less interdependent parts which
together strive to be a usable foundation for application development. together strive to be a usable foundation for application development.
@ -165,8 +139,7 @@ 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.
An own ISO 9660 extension stores ACLs, xattr, and MD5 of file libisofs is to be the foundation of our upcoming mkisofs emulation.
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
@ -191,12 +164,11 @@ 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. There is also a extracting of files from ISO images to disk. An own ISO 9660
sparse emulation of cdrecord and a more laborate one of mkisofs. extension stores ACLs, xattr, and MD5 of file content.
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.
A static compilation of xorriso and the libraries is dedicated See xorriso/README for more.
to the GNU Operating System. See xorriso/README_gnu_xorriso .
- "test" is a collection of application gestures and examples given by the - "test" is a collection of application gestures and examples given by the
authors of the library features. The burn API example of libburn authors of the library features. The burn API example of libburn
@ -555,117 +527,6 @@ Project history as far as known to me:
- 11 Jun 2010 libburn-0.8.2 now works on Solaris. - 11 Jun 2010 libburn-0.8.2 now works on Solaris.
- 14 Jun 2010 By release 0.5.8.pl00 of libisoburn, xorriso becomes a public C
language API of libisoburn. The emulations of mkisofs and cdrecord have
been enhanced.
- Tue Jun 29 2010 Version 0.6.34 of libisofs provides new features about
hiding file names from directory trees.
- Wed Jun 30 2010 libburn-0.8.4 removes some restrictions on operating
systems other than Linux and FreeBSD.
- Fri Jul 02 2010 Release 0.6.0.pl00 of libisoburn adds more options to the
mkisofs emulation of xorriso. It also fixes minor bugs and shortcommings.
- Wed Sep 15 2010 Version 0.6.36 of libisofs can produce ISO images which
bear a partiton 1 with non-zero start address. They can be mounted from
USB stick via the main device file (e.g. /dev/sdb) as well as via the
partition device file (e.g. /dev/sdb1).
- Fri Sep 17 2010 libburn-0.8.6 lifts the test reservation on DVD-R DL media.
- Sat Sep 18 2010 Release 0.6.2.pl00 of libisoburn introduces a partition
with non-zero offset for ISO 9660 images on USB sticks, improves mkisofs
emulation, and fixes a regression which existed since version 0.4.2.
- Wed Oct 20 2010 libburn-0.8.8 can report the used amount of BD spare blocks.
- Sat Oct 23 2010 Version 0.6.38 of libisofs can use libjte to produce jigdo
files along with the ISO image. Further filesystem images may be appended
as MBR partitions 1 to 4. The capability was added to produce boot blocks
for computers with MIPS CPU.
- Tue Oct 26 2010 Release 0.6.4.pl00 of libisoburn and xorriso makes use of
the new libisofs capabilities.
- Wed Dec 08 2010 libburn-0.9.0 fixes a regression with SCSI command logging.
- Fri Dec 10 2010 Version 0.6.40 of libisofs makes the prediction of the
emerging image size less expensive and is able to make images bootable
for SUN SPARC systems.
- Sun Dec 12 2010 Release 0.6.6.pl00 of libisoburn and xorriso can read ISO
images which were copied to a different start address than they were prepared
for.
- Mon Jan 17 2011 we go for release 1.0.0. This does not indicate a
technological overhaul but shall emphasize the maturity of the software.
libisofs-1.0.0 fixes a bug about the length of ECMA-119 directory names and
is ready to allow untranslated ECMA-119 names (violating the specs).
libburn-1.0.0.pl00 allows umask to create stdio-drive files with
rw-permissions for all. cdrskin now refuses to burn if the foreseeable size
exceeds media capacity
libisoburn-1.0.0.pl00 allows to create an ISO 9660:1999 directory tree,
improved the emulation fidelity of command -as mkisofs, lowered the default
abort threshold for xorriso batch mode, and increased that threshold for
xorriso dialog mode.
- Wed Feb 23 2011 release 1.0.2:
libisofs fixes several bugs and introduces the capability to copy files
inside the ISO filesystem.
libburn removed a compilation obstacle on Solaris 9 and improved recognition
of stdio pseudo-drives.
libisoburn and xorriso fix bugs and make use of the new libisofs capability.
xorriso improves its mkisofs emulation.
- Thu Mar 10 2011 release 1.0.4:
Several bugs were fixed in the libraries and in the mkisofs emulation of
xorriso. This emulation xorrisofs has now an own man page and info document.
- Sat Apr 09 2011 release 1.0.6:
libburn refined its representation of emulated drives. The size alignment
of DVD DAO is now 2 kB rather than 32 kB. libisofs produces Joliet names of
up to 103 characters. xorriso fixes two bugs and makes use of the library
improvements.
- Thu Apr 14 2011 release libisoburn-1.0.8:
A bug in the mkisofs emulation of xorriso could cause options to be ignored.
The problem was freshly introduced with libisoburn-1.0.6.
- Fri May 13 2011 release libisofs-1.0.8:
Fixes a few rarely occurring bugs that have been found during the last month.
- Sat Jun 18 2011 release 1.1.0:
The consumption of stack memory was reduced. Statical program analysis found
some rarely occuring memory leaks. Several small bugs were fixed.
The suffix .plXY was dropped from tarball names of libburn and libisoburn.
- Mon Jun 20 2011 patch release libburn-1.1.0.pl01:
libburn-1.1.0 compiled only on Linux, FreeBSD, and Solaris, but not on
other X/Open compliant systems.
- Fri Jul 08 2011 release libisofs-1.1.2 and libisoburn-1.1.2:
A severe regression was fixed in libisoburn and xorriso, which was introduced
with version 1.0.6. It caused ISO 9660 images to be unreadable if they were
written to a write-only random-access file. E.g. by: xorrisofs ... >image.iso
- Mon Aug 08 2011 release 1.1.4:
Several bugs were fixed in libburn. The most severe of them prevented xorriso
on some drives from burning mountable ISO 9660 images to CD media.
New means to list drives by their udev symbolic links help to deal with
the non-persistent drive addresses on modern GNU/Linux.
- Tue Sep 27 2011 release 1.1.6:
libisoburn now comes with a test suite. See releng/README. Bugs were fixed
in several rarely used features. Processing of ACL and extattr was enabled
on FreeBSD. Workarounds try to cope with vanishing udev links on GNU/Linux.
- Mon Nov 21 2011 release libburn-1.1.8 and libisoburn-1.1.8:
libburn avoids to close and open drive device files while operating on them.
xorriso emulation mode xorrecord now has an own manual. libburn and xorriso
were prepared to operate on qemu virtio-blk-pci devices.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------

View File

@ -16,13 +16,11 @@ 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
@ -44,21 +42,6 @@ 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

@ -1,6 +1,6 @@
#!/bin/sh -x #!/bin/sh -x
aclocal -I . aclocal
libtoolize --copy --force libtoolize --copy --force
autoconf autoconf

View File

@ -4,9 +4,9 @@
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-1.1.8.tar.gz http://scdbackup.sourceforge.net/cdrskin-0.8.2.pl00.tar.gz
Copyright (C) 2006-2011 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-1.1.8.tar.gz, take it to a directory of your choice and do: Obtain cdrskin-0.8.2.pl00.tar.gz, take it to a directory of your choice and do:
tar xzf cdrskin-1.1.8.tar.gz tar xzf cdrskin-0.8.2.pl00.tar.gz
cd cdrskin-1.1.8 cd cdrskin-0.8.2
Within that directory execute: Within that directory execute:
@ -310,11 +310,10 @@ Add-on session (equivalent to growisofs -M):
cdrskin dev=/dev/sr0 --grow_overwriteable_iso ... - cdrskin dev=/dev/sr0 --grow_overwriteable_iso ... -
DVD-RW , DVD-R , DVD-R DL DVD-RW and DVD-R
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. DVD-R DL are "Sequential Recording". DVD-R are always in sequential state.
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.
@ -438,22 +437,6 @@ It will not read startup files, will abort on option dev_translation= ,
will not have a fifo buffer, and will not be able to put out help texts or will not have a fifo buffer, and will not be able to put out help texts or
debugging messages. debugging messages.
Linux only:
libburn tries to avoid a collision with udev's drive examination by waiting
0.1 seconds before opening the device file for a longer time, after udev
might have been alarmed by drive scanning activities.
The waiting time can be set at ./configure time with microsecond granularity.
E.g. 2 seconds:
CFLAGS="$CFLAGS -DLibburn_udev_wait_useC=2000000"
./configure ...options...
Waiting can be disabled by zero waiting time:
CFLAGS="$CFLAGS -DLibburn_udev_wait_useC=0"
Alternatively, libburn can try to be nice by opening the device file,
closing it immediately, waiting, and only then opening it for real:
CFLAGS="$CFLAGS -DLibburn_udev_extra_open_cyclE -DLibburn_udev_wait_useC=500000"
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
System Dependend Drive Permission Examples System Dependend Drive Permission Examples
@ -576,7 +559,7 @@ contributions in a due way.
Based on and sub project of: Based on and sub project of:
libburnia-project.org libburnia-project.org
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net> By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006-2011 Mario Danic, Thomas Schmitt Copyright (C) 2006-2010 Mario Danic, Thomas Schmitt
libburnia-project.org is inspired by and in other components still containing libburnia-project.org is inspired by and in other components still containing
parts of parts of

View File

@ -38,9 +38,8 @@ 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="1.1.8" skin_release="0.8.2"
patch_level="" patch_level=".pl00"
# patch_level=".pl00"
skin_rev="$skin_release""$patch_level" skin_rev="$skin_release""$patch_level"
# The result directory and the name of the result tarballs # The result directory and the name of the result tarballs

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="1.1.9" skin_release="0.8.3"
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 *) calloc(anz, sizeof(typ)); #define TSOB_FELD(typ,anz) (typ *) malloc((anz)*sizeof(typ));
#define Cdrfifo_buffer_chunK 2048 #define Cdrfifo_buffer_chunK 2048
@ -634,7 +634,7 @@ return: <0 = error , 0 = idle , 1 = did some work
*/ */
{ {
double buffer_space; double buffer_space;
int can_read,can_write= 0,ret,did_work= 0,idx,sod, eop_idx; int can_read,can_write= 0,ret,did_work= 0,idx,sod,eop_is_near,eop_idx;
buffer_space= Cdrfifo_tell_buffer_space(o,0); buffer_space= Cdrfifo_tell_buffer_space(o,0);
if(o->dest_fd>=0) if(FD_ISSET((o->dest_fd),wts)) { if(o->dest_fd>=0) if(FD_ISSET((o->dest_fd),wts)) {
@ -644,7 +644,7 @@ return: <0 = error , 0 = idle , 1 = did some work
if(o->read_idx+can_write > o->buffer_size) if(o->read_idx+can_write > o->buffer_size)
can_write= o->buffer_size - o->read_idx; can_write= o->buffer_size - o->read_idx;
if(o->follow_up_fd_idx>=0) { if(o->follow_up_fd_idx>=0) {
Cdrfifo_eop_adjust(o,&can_write,&eop_idx,0); eop_is_near= Cdrfifo_eop_adjust(o,&can_write,&eop_idx,0);
if(can_write<=0) if(can_write<=0)
goto after_write; goto after_write;
} }
@ -1039,9 +1039,9 @@ int Test_mixed_bs(char **paths, int path_count,
bit0= debugging verbousity bit0= debugging verbousity
*/ */
{ {
int fd_in[100],fd_out[100],ret,pipe_fds[100][2]; int fd_in[100],fd_out[100],ret,pipe_fds[100][2],real_out[100];
int i,iv,stall_counter= 0,cycle_counter= 0.0; int i,iv,stall_counter= 0,cycle_counter= 0.0;
char target_path[80]; char buf[10240], target_path[80];
double in_counter, out_counter, prev_in= -1.0, prev_out= -1.0; double in_counter, out_counter, prev_in= -1.0, prev_out= -1.0;
struct CdrfifO *ff_in= NULL, *ff_out= NULL; struct CdrfifO *ff_in= NULL, *ff_out= NULL;
@ -1109,8 +1109,9 @@ int Test_multi(int fs_size, double speed_limit, double interval, int flag)
bit0= debugging verbousity bit0= debugging verbousity
*/ */
{ {
int fd_in[4],fd_out[4],ret,pipe_fds[4][2]; int fd_in[4],fd_out[4],ret,pipe_fds[4][2],real_out[4],pipe_idx;
int i,iv; int i,iv;
char buf[10240];
struct CdrfifO *ff1= NULL,*ff2= NULL; struct CdrfifO *ff1= NULL,*ff2= NULL;
/* open four pairs of fds */ /* open four pairs of fds */

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 "Jul 28, 2011" .TH CDRSKIN 1 "Jun 10, 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 Disk-at-once on DVD-RW, DVD-R, DVD-R DL. Single session on DVD-RW or DVD-R (Disk-at-once).
.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[DL], DVD+R[DL], and BD-R can be used for the Sequential Currently DVD-RW, DVD-R , 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 DVD-R media which do not offer feature 21h Incremental DAO is the only mode for media which do not offer feature 21h Incremental
Streaming (e.g. DVD-R DL). DAO may also be selected explicitly by option Streaming. 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 . It does not work with DVD-R DL and minimally blanked DVD-RW. .B -multi .
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
@ -256,7 +256,7 @@ that it has to be formatted again. If in doubt, just give it a try.
.br .br
The drives, CD, DVD, or BD burners, are accessed via addresses which The drives, CD, DVD, or BD burners, are accessed via addresses which
are specific to libburn and the operating system. Those addresses get listed are specific to libburn and the operating system. Those addresses get listed
by a run of \fBcdrskin --devices\fP or \fBcdrskin --device_links\fP. by a run of \fBcdrskin --devices\fP.
.br .br
On Linux, they are device files which traditionally do not offer On Linux, they are device files which traditionally do not offer
w-permissions for normal users. Because libburn needs rw-permission, w-permissions for normal users. Because libburn needs rw-permission,
@ -512,7 +512,7 @@ cdrskin will not write CD-ROM XA but rather strip the header bytes and write as
.TP .TP
.BI dev= target .BI dev= target
Set the address of the drive to use. Valid are at least the Set the address of the drive to use. Valid are at least the
addresses listed with options --devices or --device_links, addresses listed with option --devices,
X,Y,Z addresses listed with option -scanbus, X,Y,Z addresses listed with option -scanbus,
ATA:X,Y,Z addresses listed with options dev=ATA -scanbus, ATA:X,Y,Z addresses listed with options dev=ATA -scanbus,
and volatile libburn drive numbers (numbering starts at "0"). and volatile libburn drive numbers (numbering starts at "0").
@ -554,9 +554,6 @@ which appear to be in the desired blank or format state already.
This option enables a burn run with option -dummy even if libburn believes This option enables a burn run with option -dummy even if libburn believes
that drive and media will not simulate the write mode but will write for real. that drive and media will not simulate the write mode but will write for real.
.br .br
It enables a burn run where cdrskin expects to exceed the available media
capacity.
.br
.B Caution: .B Caution:
Use this only when in urgent need. Use this only when in urgent need.
.TP .TP
@ -662,8 +659,7 @@ 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 and on DVD-R DL media. with DVD-R[W] DAO write mode. Option --prodvd_cli_compatible eventually makes
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
@ -757,8 +753,6 @@ 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.
@ -881,17 +875,6 @@ Number dev='Devicefile' rw-Permissions : 'Vendor' 'Model'
Number and Devicefile can both be used with option dev=, but number is Number and Devicefile can both be used with option dev=, but number is
volatile (numbering changes if drives become busy). volatile (numbering changes if drives become busy).
.TP .TP
.BI \--device_links
Like --devices, but presenting the drives with addresses of symbolic links
which point to the actual device files.
.br
Modern GNU/Linux systems may shuffle drive addresses from boot to boot.
The udev daemon is supposed to create links which always point to the
same drive, regardless of its system address.
Option --device_links shows the addresses of such links if they begin
by "/dev/dvd" or "/dev/cd".
Precedence is: "dvdrw", "cdrw", "dvd", "cdrom", "cd".
.TP
.BI direct_write_amount= size .BI direct_write_amount= size
Do not write a session with tracks but rather make an appropriate number of Do not write a session with tracks but rather make an appropriate number of
direct write operations with no preparations. Flushing the drive buffer will direct write operations with no preparations. Flushing the drive buffer will
@ -1107,11 +1090,12 @@ 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 option is without effect because no media types are tested. Currently this applies to :
under test reservation.
.br .br
(If you really test experimental media, then please report the outcome on Profile 0015h , DVD-R/DL Sequential (will not allow -multi).
libburn-hackers@pykix.org) .br
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
@ -1147,7 +1131,7 @@ Wether this leads to senseful behavior depends on operating system and kernel.
.TP .TP
.BI drive_scsi_dev_family= sr | scd | sg .BI drive_scsi_dev_family= sr | scd | sg
Linux specific: Select a SCSI device file family to be scanned for by Linux specific: Select a SCSI device file family to be scanned for by
options --devices, --device_links and -scanbus. options --devices and -scanbus.
Normally this is /dev/sgN on kernel versions < 2.6 and /dev/srN Normally this is /dev/sgN on kernel versions < 2.6 and /dev/srN
on kernels >= 2.6 . This option allows to explicitly override that default on kernels >= 2.6 . This option allows to explicitly override that default
in order to meet other programs at a common device file for each drive. in order to meet other programs at a common device file for each drive.
@ -1253,7 +1237,7 @@ cdrskin -scanbus
.br .br
cdrskin dev=ATA -scanbus cdrskin dev=ATA -scanbus
.br .br
cdrskin --device_links cdrskin --devices
.SS .SS
.B Get info about a particular drive or loaded media: .B Get info about a particular drive or loaded media:
.br .br
@ -1281,7 +1265,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 or DVD-R DL): .B Write compressed afio archive on-the-fly (not possible with minimally blanked DVD-RW):
.br .br
find . | afio -oZ - | \\ find . | afio -oZ - | \\
.br .br

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
<HEAD> <HEAD>
<META NAME="description" CONTENT="cdrskin, a limited cdrecord compatibility wrapper for libburn"> <META NAME="description" CONTENT="cdrskin, a limited cdrecord compatibility wrapper for libburn">
<META NAME="keywords" CONTENT="cdrskin, libburn, libburnia, burn, CD, DVD, BD, linux, recording, burning, CD-R, CD-RW, DVD-R, DVD-R DL, DVD-RW, DVD+RW, DVD+R, DVD+R DL, DVD-RAM, BD-RE, BD-R, cdrecord, compatible, scdbackup"> <META NAME="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="robots" CONTENT="follow"> <META NAME="robots" CONTENT="follow">
<TITLE>cdrskin homepage english</TITLE> <TITLE>cdrskin homepage english</TITLE>
</HEAD> </HEAD>
@ -24,8 +24,7 @@
<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 DL, DVD+R, DVD+R DL, BD-R, CD-RW, CD-R, DVD-R, DVD+R, DVD+R/DL, BD-R, CD-RW, DVD-RW, DVD-RAM, DVD+RW, BD-RE
DVD-RW, DVD-RAM, DVD+RW, BD-RE
</P> </P>
<P> <P>
@ -65,7 +64,7 @@ connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
GPL software included:<BR> GPL software included:<BR>
</H2> </H2>
<DL> <DL>
<DT>libburn-1.1.8</DT> <DT>libburn-0.8.2</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)
@ -96,11 +95,10 @@ 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, cdrskin is able to perform any recording job On all DVD media except DVD-R DL, cdrskin is able to perform any recording job
which is possible with cdrecord. 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 and BD-R. Write mode -tao works with anything but quickly blanked DVD-RW.
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>
@ -133,8 +131,7 @@ On Solaris it is r-permission and privileges "basic,sys_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>Write compressed afio archive on-the-fly:</DT>
(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>
@ -200,15 +197,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-1.1.8.tar.gz">cdrskin-1.1.8.tar.gz</A> <DD><A HREF="cdrskin-0.8.2.pl00.tar.gz">cdrskin-0.8.2.pl00.tar.gz</A>
(870 KB). (845 KB).
</DD>
<DD><A HREF="cdrskin-1.1.8.tar.gz.sig">cdrskin-1.1.8.tar.gz.sig</A></DD>
<DD>
(detached GPG signature for verification by
<KBD>gpg --verify cdrskin-1.1.8.tar.gz.sig cdrskin-1.1.8.tar.gz</KBD>
<BR>
after <KBD>gpg --keyserver keys.gnupg.net --recv-keys ABC0A854</KBD>).
</DD> </DD>
<DD> <DD>
The cdrskin tarballs are source code identical with libburn releases The cdrskin tarballs are source code identical with libburn releases
@ -257,23 +247,24 @@ 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-1.1.6: Enhancements towards previous stable version cdrskin-0.8.0.pl00:
<UL> <UL>
<LI> <LI>A new system adapter allows to burn CD, DVD and BD on OpenSolaris</LI>
Avoiding to intermediately close and open drive device file
</LI>
<LI>
Enabled recognition of QEMU DVD-ROM 0.12
</LI>
<!-- <!--
<LI>none</LI> <LI>none</LI>
--> -->
</UL> </UL>
Bug fixes towards cdrskin-1.1.6: Bug fixes towards cdrskin-0.8.0.pl00:
<UL> <UL>
<LI> <LI>
Misinterpreted mode page 2A if block descriptors are present 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>
SIGSEGV of experimental libcdio system adapter if drive list is empty
</LI> </LI>
<!-- <!--
<LI>none</LI> <LI>none</LI>
@ -284,8 +275,8 @@ Misinterpreted mode page 2A if block descriptors are present
<P> <P>
<DL> <DL>
<DT><H3>Development snapshot, version 1.1.9 :</H3></DT> <DT><H3>Development snapshot, version 0.8.3 :</H3></DT>
<DD>Enhancements towards current stable version 1.1.8: <DD>Enhancements towards current stable version 0.8.2.pl00:
<UL> <UL>
<LI>none yet</LI> <LI>none yet</LI>
<!-- <!--
@ -295,7 +286,7 @@ Misinterpreted mode page 2A if block descriptors are present
</UL> </UL>
</DD> </DD>
<DD>Bug fixes towards cdrskin-1.1.8: <DD>Bug fixes towards cdrskin-0.8.2.pl00:
<UL> <UL>
<LI>none yet</LI> <LI>none yet</LI>
<!-- <!--
@ -305,10 +296,10 @@ Misinterpreted mode page 2A if block descriptors are present
</DD> </DD>
<DD>&nbsp;</DD> <DD>&nbsp;</DD>
<DD><A HREF="README_cdrskin_devel">README 1.1.9</A> <DD><A HREF="README_cdrskin_devel">README 0.8.3</A>
<DD><A HREF="cdrskin__help_devel">cdrskin-1.1.9 --help</A></DD> <DD><A HREF="cdrskin__help_devel">cdrskin_0.8.3 --help</A></DD>
<DD><A HREF="cdrskin_help_devel">cdrskin-1.1.9 -help</A></DD> <DD><A HREF="cdrskin_help_devel">cdrskin_0.8.3 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.1.9)</A></DD> <DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 0.8.3)</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>
@ -328,8 +319,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-1.1.9.tar.gz">cdrskin-1.1.9.tar.gz</A> <A HREF="cdrskin-0.8.3.tar.gz">cdrskin-0.8.3.tar.gz</A>
(870 KB). (845 KB).
</DD> </DD>
<!-- This is not offered any more since spring 2008 <!-- This is not offered any more since spring 2008
@ -478,11 +469,10 @@ First of all: this relationship is single sided, as cdrskin has to be aware of
cdrecord but not vice versa. cdrecord but not vice versa.
<BR> <BR>
<BR> <BR>
I was a long time user of cdrecord and it worked fine for me. I am a long time user of cdrecord and it works fine for me.
Especially i do appreciate its write mode -tao which allows to pipe arbitrary Especially i do appreciate its write mode -tao which allows to pipe arbitrary
data on CD and CD-RW via stdin. cdrecord is reliable, versatile and well data on CD and CD-RW via stdin. cdrecord is reliable, versatile and well
maintained. So for me - there would be no problem with using it for maintained. So for me - there would be no problem with it.
burning CDs.
<BR> <BR>
But the author of cdrecord and the Linux kernel people foster a very hostile But the author of cdrecord and the Linux kernel people foster a very hostile
relationship. Ok, that's their business, not mine (or ours if you are with me). relationship. Ok, that's their business, not mine (or ours if you are with me).

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2011.11.20.100001" #define Cdrskin_timestamP "2010.06.11.080001"

File diff suppressed because it is too large Load Diff

View File

@ -200,10 +200,9 @@ main()
Cleanup_set_handlers(&demoapp,(Cleanup_app_handler_T) Demo_app_handler,0); Cleanup_set_handlers(&demoapp,(Cleanup_app_handler_T) Demo_app_handler,0);
if(1) { /* change to 0 in order to wait for external signals */ if(1) { /* change to 0 in order to wait for external signals */
char *cpt= NULL, c= ' '; char *cpt= NULL,c;
printf("Intentionally provoking SIGSEGV ...\n"); printf("Intentionally provoking SIGSEGV ...\n");
c= *cpt; c= *cpt;
printf("Strange: The system ignored a SIGSEGV: c= %u\n", (unsigned int) c);
} else { } else {
printf("killme: %d\n",getpid()); printf("killme: %d\n",getpid());
sleep(3600); sleep(3600);

View File

@ -1,14 +1,14 @@
#!/bin/sh #!/bin/sh
# compile_cdrskin.sh # compile_cdrskin.sh
# Copyright 2005 - 2011 Thomas Schmitt, scdbackup@gmx.net, GPL # Copyright 2005 - 2010 Thomas Schmitt, scdbackup@gmx.net, GPL
# to be executed within ./libburn-* resp ./cdrskin-* # to be executed within ./libburn-* resp ./cdrskin-*
debug_opts="-O2" 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_1_1_8" libvers="-DCdrskin_libburn_0_8_2"
# 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-"
@ -19,7 +19,7 @@ libdax_msgs_o="$burn"libdax_msgs.o
libdax_audioxtr_o="$burn"libdax_audioxtr.o libdax_audioxtr_o="$burn"libdax_audioxtr.o
do_strip=0 do_strip=0
static_opts= static_opts=
warn_opts="-Wall -Wextra -Wno-unused-parameter" warn_opts="-Wall"
libcdio= libcdio=
fifo_source="cdrskin/cdrfifo.c" fifo_source="cdrskin/cdrfifo.c"
compile_cdrskin=1 compile_cdrskin=1
@ -41,21 +41,31 @@ do
elif test "$i" = "-compile_dewav" elif test "$i" = "-compile_dewav"
then then
compile_dewav=1 compile_dewav=1
elif test "$i" = "-libburn_1_1_8" elif test "$i" = "-cvs_A60220"
then then
libvers="-DCdrskin_libburn_1_1_8" libvers="-DCdrskin_libburn_cvs_A60220_tS"
libdax_audioxtr_o=
libdax_msgs_o="$burn"message.o
cleanup_src_or_obj="-DCleanup_has_no_libburn_os_H cdrskin/cleanup.c"
elif test "$i" = "-libburn_0_8_2"
then
libvers="-DCdrskin_libburn_0_8_2"
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_1_1_9" libvers="-DCdrskin_libburn_0_8_3"
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" = "-newapi" -o "$i" = "-experimental" elif test "$i" = "-newapi" -o "$i" = "-experimental"
then then
def_opts="$def_opts -DCdrskin_new_api_tesT" def_opts="$def_opts -DCdrskin_new_api_tesT"
elif test "$i" = "-oldfashioned"
then
def_opts="$def_opts -DCdrskin_oldfashioned_api_usE"
cleanup_src_or_obj="-DCleanup_has_no_libburn_os_H cdrskin/cleanup.c"
elif test "$i" = "-no_largefile" elif test "$i" = "-no_largefile"
then then
largefile_opts= largefile_opts=
@ -99,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_1_1_8 set macro to match libburn-1.1.8" echo " -libburn_0_8_2 set macro to match libburn-0.8.2"
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."
@ -107,6 +117,7 @@ do
echo " -use_no_libburn_fifo use cdrfifo even for single track non-CD" echo " -use_no_libburn_fifo use cdrfifo even for single track non-CD"
echo " -use_no_cdrfifo always use fifo of libburn and never cdrfifo" echo " -use_no_cdrfifo always use fifo of libburn and never cdrfifo"
echo " -experimental use newly introduced libburn features." echo " -experimental use newly introduced libburn features."
echo " -oldfashioned use pre-0.2.2 libburn features only."
echo " -do_diet produce capability reduced lean version." echo " -do_diet produce capability reduced lean version."
echo " -do_strip apply program strip to compiled programs." echo " -do_strip apply program strip to compiled programs."
echo " -g produce debuggable programm." echo " -g produce debuggable programm."

View File

@ -59,7 +59,6 @@ then
-e 's/<\/body>/<BR><HR><FONT SIZE=-1><CENTER>(HTML generated from '"$manpage"'.1 on '"$(date)"' by '$(basename "$0")' )<\/CENTER><\/FONT><\/body>/' \ -e 's/<\/body>/<BR><HR><FONT SIZE=-1><CENTER>(HTML generated from '"$manpage"'.1 on '"$(date)"' by '$(basename "$0")' )<\/CENTER><\/FONT><\/body>/' \
-e 's/See section FILES/See section <A HREF="#FILES">FILES<\/A>/' \ -e 's/See section FILES/See section <A HREF="#FILES">FILES<\/A>/' \
-e 's/See section EXAMPLES/See section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \ -e 's/See section EXAMPLES/See section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \
-e 's/&minus;/-/g' \
<"$2" >"$htmlpage" <"$2" >"$htmlpage"
set +x set +x

View File

@ -1,4 +1,4 @@
AC_INIT([libburn], [1.1.8], [http://libburnia-project.org]) AC_INIT([libburn], [0.8.2], [http://libburnia-project.org])
AC_PREREQ([2.50]) AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h]) dnl AC_CONFIG_HEADER([config.h])
@ -8,9 +8,8 @@ AC_CANONICAL_TARGET
LIBBURNIA_SET_FLAGS LIBBURNIA_SET_FLAGS
AM_INIT_AUTOMAKE([subdir-objects]) AM_INIT_AUTOMAKE([subdir-objects])
AC_CONFIG_MACRO_DIR([./])
dnl Notes about version numbers and .so numbers: dnl Notes by ts A71207 - B00611 :
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.
@ -83,18 +82,6 @@ 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.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 0.9.0 = libburn.so.4.55.0
dnl 1.0.0 = libburn.so.4.57.0
dnl 1.0.2 = libburn.so.4.59.0
dnl 1.0.4 = libburn.so.4.61.0
dnl 1.0.6 = libburn.so.4.63.0
dnl 1.1.0 = libburn.so.4.65.0
dnl 1.1.4 = libburn.so.4.67.0
dnl 1.1.6 = libburn.so.4.69.0
dnl 1.1.8 = libburn.so.4.71.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.
@ -118,9 +105,9 @@ dnl
dnl If BURN_*_VERSION changes, be sure to change AC_INIT above to match. dnl If BURN_*_VERSION changes, be sure to change AC_INIT above to match.
dnl 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=1 BURN_MAJOR_VERSION=0
BURN_MINOR_VERSION=1 BURN_MINOR_VERSION=8
BURN_MICRO_VERSION=8 BURN_MICRO_VERSION=2
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)
@ -131,14 +118,15 @@ 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 This is the release version libburn-1.1.8 dnl ts B00409
dnl This is the release version libburn-0.8.2
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 = 75 - 71 = 4 . Linux library name = libburn.so.4.71.0 dnl SONAME = 51 - 47 = 4 . Linux library name = libburn.so.4.47.0
LT_CURRENT=75 LT_CURRENT=51
LT_AGE=71 LT_AGE=47
LT_REVISION=0 LT_REVISION=0
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE` LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
@ -196,11 +184,11 @@ AC_CHECK_HEADER(sys/statvfs.h, X=, STATVFS_DEF=)
AC_CHECK_FUNC([statvfs], X=, STATVFS_DEF=) AC_CHECK_FUNC([statvfs], X=, STATVFS_DEF=)
dnl If this would be done more specifically in Makefile.am dnl If this would be done more specifically in Makefile.am
dnl via libburn_libburn_la_CFLAGS then undesired .o file names would emerge dnl via libburn_libburn_la_CFLAGS then undesired .o file names would emerge
CFLAGS="$STATVFS_DEF $CFLAGS" 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"
@ -211,11 +199,11 @@ else
fi fi
dnl Avoid the need for libburn_libburn_la_CFLAGS in Makefile.am (ugly .o names) dnl Avoid the need for libburn_libburn_la_CFLAGS in Makefile.am (ugly .o names)
dnl ### AC_SUBST(LIBBURN_O_DIRECT_DEF) dnl ### AC_SUBST(LIBBURN_O_DIRECT_DEF)
CFLAGS="$LIBBURN_O_DIRECT_DEF $CFLAGS" 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"
@ -224,11 +212,11 @@ else
LIBBURN_DVD_OBS_64K= LIBBURN_DVD_OBS_64K=
echo "disabled write size default 64 KB on DVD and BD" echo "disabled write size default 64 KB on DVD and BD"
fi fi
CFLAGS="$LIBBURN_DVD_OBS_64K $CFLAGS" 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.
@ -247,45 +235,13 @@ then
fi fi
else else
echo "enabled EXPERIMENTAL use of libcdio as system adapter" echo "enabled EXPERIMENTAL use of libcdio as system adapter"
CFLAGS="$LIBCDIO_DEF $CFLAGS" CFLAGS="$CFLAGS $LIBCDIO_DEF"
LIBCDIO_REQUIRED=0.83 LIBCDIO_REQUIRED=0.83
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED) PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
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
@ -295,15 +251,15 @@ AC_ARG_ENABLE(debug,
, enable_debug=yes) , enable_debug=yes)
if test x$enable_debug != xyes; then if test x$enable_debug != xyes; then
if test x$GCC = xyes; then if test x$GCC = xyes; then
CFLAGS="-O3 $CFLAGS" CFLAGS="$CFLAGS -O3"
CFLAGS="-fexpensive-optimizations $CFLAGS" CFLAGS="$CFLAGS -fexpensive-optimizations"
fi fi
CFLAGS="-DNDEBUG $CFLAGS" CFLAGS="$CFLAGS -DNDEBUG"
else else
if test x$GCC = xyes; then if test x$GCC = xyes; then
CFLAGS="-g -pedantic -Wall -Wextra -Wno-unused-parameter $CFLAGS" CFLAGS="$CFLAGS -g -pedantic -Wall"
fi fi
CFLAGS="-DDEBUG $CFLAGS" CFLAGS="$CFLAGS -DDEBUG"
fi fi
dnl Determine target directory for libburn-*.pc dnl Determine target directory for libburn-*.pc

View File

@ -8,13 +8,14 @@
Libburnia is an open-source project for reading, mastering and writing Libburnia is an open-source project for reading, mastering and writing
optical discs. This page is about its capability to handle optical media. optical discs. This page is about its capability to handle optical media.
For now this means CD-R, CD-RW, DVD-RAM, DVD+RW, DVD+R, DVD+R/DL, DVD-RW, For now this means CD-R, CD-RW, DVD-RAM, DVD+RW, DVD+R, DVD+R/DL, DVD-RW,
DVD-R, DVD-R/DL, BD-R, BD-RE. DVD-R, BD-R, BD-RE.
Our scope is currently Linux 2.4 and 2.6, or FreeBSD, or Solaris . For ports Not supported yet are DVD-R/DL. Testers wanted.
to other systems we would need : login on a development machine resp.
an OS ithat is installable on an AMD 64-bit PC, advise from a system person Our scope is currently Linux 2.4 and 2.6, or FreeBSD . For ports to other
about the equivalent of Linux sg or FreeBSD CAM, volunteers for testing of systems we would need : login on a development machine resp. a live OS on CD
realistic use cases. or DVD, advise from a system person about the equivalent of Linux sg or FreeBSD
CAM, volunteers for testing of realistic use cases.
libburn is the library by which preformatted data get onto optical media. libburn is the library by which preformatted data get onto optical media.
Its code is independent of cdrecord. Its DVD capabilities are learned from Its code is independent of cdrecord. Its DVD capabilities are learned from

View File

@ -1,9 +1,3 @@
-------------------------------------------------------------------------------
Note: This is about how libburn operates optical drives. Not about how to
operate libburn. The libburn API is described in libburn/libburn.h
-------------------------------------------------------------------------------
libburnia-project.org Optical Media Rotisserie Recipes as of January 2010 libburnia-project.org Optical Media Rotisserie Recipes as of January 2010
Content: Content:

View File

@ -154,6 +154,13 @@ 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.
@ -1145,8 +1152,7 @@ HIDE_UNDOC_RELATIONS = YES
# toolkit from AT&T and Lucent Bell Labs. The other options in this section # toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default) # have no effect if this option is set to NO (the default)
# ts B10415: dot causes sigsegv on Debian buildd HAVE_DOT = YES
HAVE_DOT = NO
# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and # will generate a graph for each documented class showing the direct and

View File

@ -1,10 +1,4 @@
-------------------------------------------------------------------------------
Note: This is about how libburn operates optical drives. Not about how to
operate libburn. The libburn API is described in libburn/libburn.h
-------------------------------------------------------------------------------
Overview of class specific or individual media information Overview of class specific or individual media information
especially manufacturer and exact product type especially manufacturer and exact product type
@ -178,9 +172,6 @@ BD-R and BD-RE:
Table 288 says that Media Type Code (byte 1 of CDB) for BD media is 1. Table 288 says that Media Type Code (byte 1 of CDB) for BD media is 1.
Table 446 says that Disc Information is preceeded by 4 bytes of header. Table 446 says that Disc Information is preceeded by 4 bytes of header.
Table 448 says that bytes 0 to 1 are Disc Information Identifier "DI". Table 448 says that bytes 0 to 1 are Disc Information Identifier "DI".
that bytes 8 to 10 are Disc Type Identifier
BDO for BD-ROM, BDW for BD-RE,
BDR for BD-R
that bytes 100 to 105 are Disc Manufactuer ID that bytes 100 to 105 are Disc Manufactuer ID
that bytes 106 to 108 are Media Type ID that bytes 106 to 108 are Media Type ID
that byte 111 is Product Revision Number that byte 111 is Product Revision Number
@ -942,7 +933,6 @@ CMCMAG CN2 CMC Magnetics Corporation 1-2X HTL 25GB(12cm) [Blu]
DAXON 016 DAXON 8X [Hij] DAXON 016 DAXON 8X [Hij]
DAXON AZ3 DAXON 16X [Hij] DAXON AZ3 DAXON 16X [Hij]
DAXON CY3 DAXON 12X [Hij] DAXON CY3 DAXON 12X [Hij]
DAXON D42/52 (user reported DVD+RW)
Daxon R2X Daxon Technology Inc. 1-2X HTL 25GB(12cm) [Blu] Daxon R2X Daxon Technology Inc. 1-2X HTL 25GB(12cm) [Blu]
Daxon R4X Daxon Technology Inc. 1-4X HTL 25GB(12cm) [Blu] Daxon R4X Daxon Technology Inc. 1-4X HTL 25GB(12cm) [Blu]
@ -1182,7 +1172,6 @@ TTH02 TDK 12X [Hij]
TYG01 TAIYO YUDEN 4X [Hij] TYG01 TAIYO YUDEN 4X [Hij]
TYG02 TAIYO YUDEN 12X [Hij] TYG02 TAIYO YUDEN 12X [Hij]
TYG03 TAIYO YUDEN 16X [Hij] TYG03 TAIYO YUDEN 16X [Hij]
TYG11 TAIYO YUDEN DVD-R DL 8x
TYG-BD Y01 TAIYO YUDEN Co., Ltd. 1-2X LTH [Blu] TYG-BD Y01 TAIYO YUDEN Co., Ltd. 1-2X LTH [Blu]
TYG-BD Y03 TAIYO YUDEN Co., Ltd. 1-4X LTH [Blu] TYG-BD Y03 TAIYO YUDEN Co., Ltd. 1-4X LTH [Blu]

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -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 = calloc(1, sizeof(struct w_list)); a = malloc(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;
@ -183,6 +183,11 @@ static void remove_worker(pthread_t th)
{ {
struct w_list *a, *l = NULL; struct w_list *a, *l = NULL;
#ifdef Libburn_detach_done_workeR
int ret;
char msg[80];
#endif
for (a = workers; a; l = a, a = a->next) for (a = workers; a; l = a, a = a->next)
if (a->thread == th) { if (a->thread == th) {
if (l) if (l)
@ -195,12 +200,8 @@ static void remove_worker(pthread_t th)
/* Alternative : threads get detached and thus should /* Alternative : threads get detached and thus should
dispose themselves. dispose themselves.
*/ */
pthread_detach(th);
/*
int ret;
char msg[80];
ret = pthread_detach(th); ret = pthread_detach(th);
/*
sprintf(msg, sprintf(msg,
"remove_workers(): pid= %lu pthread_detach(%lu)= %d", "remove_workers(): pid= %lu pthread_detach(%lu)= %d",
(unsigned long) getpid(), (unsigned long) th, ret); (unsigned long) getpid(), (unsigned long) th, ret);
@ -354,7 +355,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
/* a ssert(!find_worker(drive)); */ /* a ssert(!find_worker(drive)); */
if((drive == NULL)) { if((drive == NULL)) {
libdax_msgs_submit(libdax_messenger, -1, libdax_msgs_submit(libdax_messenger, drive->global_index,
0x00020104, 0x00020104,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"NULL pointer caught in burn_disc_erase", 0, 0); "NULL pointer caught in burn_disc_erase", 0, 0);
@ -382,9 +383,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
/* ts A70909 : the willingness to burn any BURN_DISC_FULL media is /* ts A70909 : the willingness to burn any BURN_DISC_FULL media is
inappropriate. One would rather need a -force option inappropriate. One would rather need a -force option
Note: keep this in sync with mmc_read_disc_info() */ Note: keep this in sync with mmc_read_disc_info() */
/* ts B10321 : Allowed role 5 to be blanked */ if ((drive->current_profile != 0x0a &&
if ((drive->drive_role == 1 &&
drive->current_profile != 0x0a &&
drive->current_profile != 0x13 && drive->current_profile != 0x13 &&
drive->current_profile != 0x14 && drive->current_profile != 0x14 &&
drive->status != BURN_DISC_FULL) drive->status != BURN_DISC_FULL)
@ -393,7 +392,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
drive->status != BURN_DISC_APPENDABLE && drive->status != BURN_DISC_APPENDABLE &&
drive->status != BURN_DISC_BLANK) drive->status != BURN_DISC_BLANK)
|| ||
(drive->drive_role != 1 && drive->drive_role != 5) (drive->drive_role != 1)
) { ) {
libdax_msgs_submit(libdax_messenger, drive->global_index, libdax_msgs_submit(libdax_messenger, drive->global_index,
0x00020130, 0x00020130,
@ -444,7 +443,7 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag)
{ {
struct format_opts o; struct format_opts o;
int ok = 0, ret; int ok = 0, ret;
char msg[40]; char msg[160];
reset_progress(drive, 1, 1, 1, 0x10000, 0); reset_progress(drive, 1, 1, 1, 0x10000, 0);
@ -518,6 +517,42 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag)
return; return;
} }
if ((flag & 6) != 6 || (flag & 128)) {
if ((flag & 64) && !(drive->current_feat23h_byte4 & 2)) {
if (drive->current_feat23h_byte4 & 1) {
libdax_msgs_submit(libdax_messenger,
drive->global_index, 0x00020165,
LIBDAX_MSGS_SEV_WARNING,
LIBDAX_MSGS_PRIO_HIGH,
"Drive does not support fast formatting",
0, 0);
flag &= ~64;
} else {
no_non_default_bd_re:;
libdax_msgs_submit(libdax_messenger,
drive->global_index, 0x00020167,
LIBDAX_MSGS_SEV_SORRY,
LIBDAX_MSGS_PRIO_HIGH,
"Drive does not support non-default formatting",
0, 0);
drive->cancel = 1;
return;
}
}
if ((!(flag & 64)) && !(drive->current_feat23h_byte4 & 1)){
if (drive->current_feat23h_byte4 & 2) {
libdax_msgs_submit(libdax_messenger,
drive->global_index, 0x00020166,
LIBDAX_MSGS_SEV_WARNING,
LIBDAX_MSGS_PRIO_HIGH,
"Drive does not support full formatting",
0, 0);
flag |= 64;
} else
goto no_non_default_bd_re;
}
}
} }
if (!ok) { if (!ok) {
@ -585,7 +620,7 @@ static void *write_disc_worker_func(struct w_list *w)
void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc) void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
{ {
struct write_opts o; struct write_opts o;
char *reasons= NULL; char reasons[BURN_REASONS_LEN+80];
struct burn_drive *d; struct burn_drive *d;
d = opts->drive; d = opts->drive;
@ -609,13 +644,8 @@ 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,
@ -624,14 +654,6 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
"Drive is a virtual placeholder (null-drive)", 0, 0); "Drive is a virtual placeholder (null-drive)", 0, 0);
return; return;
} }
if (d->drive_role == 4) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020181,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Pseudo-drive is a read-only file. Cannot write.",
0, 0);
return;
}
/* ts A61007 : obsolete Assert in spc_select_write_params() */ /* ts A61007 : obsolete Assert in spc_select_write_params() */
if (d->drive_role == 1 && d->mdata->valid <= 0) { if (d->drive_role == 1 && d->mdata->valid <= 0) {
@ -645,8 +667,6 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
/* ts A70219 : intended to replace all further tests here and many /* ts A70219 : intended to replace all further tests here and many
tests in burn_*_write_sync() tests in burn_*_write_sync()
*/ */
BURN_ALLOC_MEM_VOID(reasons, char, BURN_REASONS_LEN + 80);
strcpy(reasons, "Write job parameters are unsuitable:\n"); strcpy(reasons, "Write job parameters are unsuitable:\n");
if (burn_precheck_write(opts, disc, reasons + strlen(reasons), 1) if (burn_precheck_write(opts, disc, reasons + strlen(reasons), 1)
<= 0) { <= 0) {
@ -654,9 +674,8 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
d->global_index, 0x00020139, d->global_index, 0x00020139,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
reasons, 0, 0); reasons, 0, 0);
goto ex; return;
} }
BURN_FREE_MEM(reasons); reasons= NULL;
/* ts A90106 : early catching of unformatted BD-RE */ /* ts A90106 : early catching of unformatted BD-RE */
if (d->current_profile == 0x43) if (d->current_profile == 0x43)
@ -680,9 +699,6 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
add_worker(Burnworker_type_writE, d, add_worker(Burnworker_type_writE, d,
(WorkerFunc) write_disc_worker_func, &o); (WorkerFunc) write_disc_worker_func, &o);
ex:;
BURN_FREE_MEM(reasons);
} }

View File

@ -1,5 +1,5 @@
/* /*
cleanup.c , Copyright 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> cleanup.c , Copyright 2006 Thomas Schmitt <scdbackup@gmx.net>
A signal handler which cleans up an application and exits. A signal handler which cleans up an application and exits.
@ -205,10 +205,9 @@ main()
Cleanup_set_handlers(&demoapp,(Cleanup_app_handler_T) Demo_app_handler,0); Cleanup_set_handlers(&demoapp,(Cleanup_app_handler_T) Demo_app_handler,0);
if(1) { /* change to 0 in order to wait for external signals */ if(1) { /* change to 0 in order to wait for external signals */
char *cpt= NULL, c= ' '; char *cpt= NULL,c;
printf("Intentionally provoking SIGSEGV ...\n"); printf("Intentionally provoking SIGSEGV ...\n");
c= *cpt; c= *cpt;
printf("Strange: The system ignored a SIGSEGV: c= %u\n", (unsigned int) c);
} else { } else {
printf("killme: %d\n",getpid()); printf("killme: %d\n",getpid());
sleep(3600); sleep(3600);

View File

@ -25,4 +25,20 @@ void burn_set_verbosity(int v)
burn_verbosity = v; burn_verbosity = v;
} }
void burn_print(int level, const char *a, ...)
{
#ifdef WIN32
char debug_string_data[256];
#endif
va_list vl;
if (level <= burn_verbosity) {
va_start(vl, a);
#ifdef WIN32
vsprintf(debug_string_data, a, vl);
OutputDebugString(debug_string_data);
#else
vfprintf(stderr, a, vl);
#endif
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -12,7 +12,6 @@
#include "libburn.h" #include "libburn.h"
#include "toc.h" #include "toc.h"
#include "structure.h" #include "structure.h"
#include <pthread.h>
struct burn_drive; struct burn_drive;
struct command; struct command;
@ -85,7 +84,7 @@ struct burn_drive *burn_drive_finish_enum(struct burn_drive *d);
int burn_drive_inquire_media(struct burn_drive *d); int burn_drive_inquire_media(struct burn_drive *d);
/* ts A61125 : model aspects of burn_drive_release */ /* ts A61125 : model aspects of burn_drive_release */
int burn_drive_mark_unready(struct burn_drive *d, int flag); int burn_drive_mark_unready(struct burn_drive *d);
/* ts A61226 */ /* ts A61226 */
@ -151,8 +150,4 @@ int burn_abort_5(int patience,
int (*pacifier_func)(void *handle, int patience, int elapsed), int (*pacifier_func)(void *handle, int patience, int elapsed),
void *handle, int elapsed, int flag); void *handle, int elapsed, int flag);
/* ts B10730 */
/* Send a default mode page 05 to CD and DVD-R-oids */
int burn_drive_send_default_page_05(struct burn_drive *d, int flag);
#endif /* __DRIVE */ #endif /* __DRIVE */

View File

@ -129,7 +129,7 @@ struct burn_source *burn_file_source_new(const char *path, const char *subpath)
return NULL; return NULL;
} }
} }
fs = calloc(1, sizeof(struct burn_source_file)); fs = malloc(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 = calloc(1, sizeof(struct burn_source_file)); fs = malloc(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;
@ -211,10 +211,9 @@ struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size)
static int fifo_sleep(int flag) static int fifo_sleep(int flag)
{ {
static unsigned long sleeptime = 50000; /* 50 ms */ static struct timespec sleeptime = { 0, 50000000}; /* 50 ms */
usleep(sleeptime); return nanosleep(&sleeptime, NULL);
return 0;
} }
@ -482,11 +481,10 @@ 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;
ret = burn_source_cancel(fs->inp); burn_source_cancel(fs->inp);
return ret; return(1);
} }
/* /*
@ -510,7 +508,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 = calloc(1, sizeof(struct burn_source_fifo)); fs = malloc(sizeof(struct burn_source_fifo));
if (fs == NULL) if (fs == NULL)
return NULL; return NULL;
fs->is_started = 0; fs->is_started = 0;
@ -625,9 +623,7 @@ void burn_fifo_next_interval(struct burn_source *source,
*interval_min_fill = fs->interval_min_fill; *interval_min_fill = fs->interval_min_fill;
ret = burn_fifo_inquire_status(source, ret = burn_fifo_inquire_status(source,
&size, &free_bytes, &status_text); &size, &free_bytes, &status_text);
if (ret < 0)
return;
fs->interval_min_fill = size - free_bytes - 1; fs->interval_min_fill = size - free_bytes - 1;
} }
@ -751,162 +747,3 @@ 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,22 +74,4 @@ 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

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -105,14 +105,6 @@ int burn_support_untested_profiles = 0;
*/ */
int burn_sg_log_scsi = 0; int burn_sg_log_scsi = 0;
/* ts B10312 :
Whether to map random-access readonly files to drive role 4.
Else it is role 2 overwriteable drive
*/
int burn_drive_role_4_allowed = 0;
/* ts A60925 : ticket 74 */ /* ts A60925 : ticket 74 */
/** Create the messenger object for libburn. */ /** Create the messenger object for libburn. */
int burn_msgs_initialize(void) int burn_msgs_initialize(void)
@ -177,8 +169,6 @@ void burn_finish(void)
sg_shutdown(0); sg_shutdown(0);
burn_drive_clear_whitelist();
burn_running = 0; burn_running = 0;
} }
@ -354,7 +344,7 @@ char *burn_util_thread_id(pid_t pid, pthread_t tid, char text[80])
sprintf(text, "[%lu,", (unsigned long int) getpid()); sprintf(text, "[%lu,", (unsigned long int) getpid());
l= strlen(text); l= strlen(text);
for(i= 0; i < ((int) sizeof(pthread_t)) && 2 * i < 80 - l - 3; i++) for(i= 0; i < sizeof(pthread_t) && 2 * i < 80 - l - 3; i++)
sprintf(text + l + 2 * i, sprintf(text + l + 2 * i,
"%2.2X", ((unsigned char *) &tid)[i]); "%2.2X", ((unsigned char *) &tid)[i]);
@ -575,25 +565,3 @@ void burn_set_scsi_logging(int flag)
{ {
burn_sg_log_scsi = flag & 7; burn_sg_log_scsi = flag & 7;
} }
/* ts B10312 API */
void burn_allow_drive_role_4(int allowed)
{
burn_drive_role_4_allowed = (allowed & 0xf);
}
/* ts B10606 */
void *burn_alloc_mem(size_t size, size_t count, int flag)
{
void *pt;
pt = calloc(size, count);
if(pt == NULL)
libdax_msgs_submit(libdax_messenger, -1, 0x00000003,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Out of virtual memory", 0, 0);
return pt;
}

View File

@ -27,25 +27,5 @@ extern volatile int burn_builtin_triggered_action; /* burn_is_aborting() */
*/ */
int burn_init_catch_on_abort(int flag); int burn_init_catch_on_abort(int flag);
/* ts B10606 */
void *burn_alloc_mem(size_t size, size_t count, int flag);
#define BURN_ALLOC_MEM(pt, typ, count) { \
pt= (typ *) burn_alloc_mem(sizeof(typ), (size_t) (count), 0); \
if(pt == NULL) { \
ret= -1; goto ex; \
} }
#define BURN_ALLOC_MEM_VOID(pt, typ, count) { \
pt= (typ *) burn_alloc_mem(sizeof(typ), (size_t) (count), 0); \
if(pt == NULL) { \
goto ex; \
} }
#define BURN_FREE_MEM(pt) { \
if(pt != NULL) \
free((char *) pt); \
}
#endif /* BURN__INIT_H */ #endif /* BURN__INIT_H */

View File

@ -1,15 +1,12 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
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
@ -561,9 +558,9 @@ struct burn_drive_info
char revision[5]; char revision[5];
/** Invalid: Was: "Location of the drive in the filesystem." */ /** Invalid: Was: "Location of the drive in the filesystem." */
/** This string has no meaning any more. Once it stored the drive /** This string has no meaning any more. Once it stored the persistent
device file address. Now always use function burn_drive_d_get_adr() drive address. Now always use function burn_drive_d_get_adr() to
to inquire a device file address. ^^^^^ ALWAYS ^^^^^^^*/ inquire a persistent address. ^^^^^^ ALWAYS ^^^^^^^^ */
char location[17]; char location[17];
/** Can the drive read DVD-RAM discs */ /** Can the drive read DVD-RAM discs */
@ -782,7 +779,7 @@ int burn_abort_pacifier(void *handle, int patience, int elapsed);
void burn_set_verbosity(int level); void burn_set_verbosity(int level);
/* ts A91111 */ /* ts A91111 */
/** Enable resp. disable logging of SCSI commands. /** Enable resp. disable logging of SCSI commands (currently GNU/Linux only).
This call can be made at any time - even before burn_initialize(). This call can be made at any time - even before burn_initialize().
It is in effect for all active drives and currently not very thread It is in effect for all active drives and currently not very thread
safe for multiple drives. safe for multiple drives.
@ -828,7 +825,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 no media types are under test reservation - Currently it contains: 0x15 "DVD-R/DL sequential recording",
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
@ -840,7 +837,7 @@ void burn_allow_untested_profiles(int yes);
/* ts A60823 */ /* ts A60823 */
/** Aquire a drive with known device file address. /** Aquire a drive with known persistent address.
This is the sysadmin friendly way to open one drive and to leave all This is the sysadmin friendly way to open one drive and to leave all
others untouched. It bundles the following API calls to form a others untouched. It bundles the following API calls to form a
@ -912,7 +909,7 @@ void burn_allow_untested_profiles(int yes);
when it is no longer needed. when it is no longer needed.
This is a result from call burn_drive_scan(). See there. This is a result from call burn_drive_scan(). See there.
Use with driveno 0 only. Use with driveno 0 only.
@param adr The device file address of the desired drive. Either once @param adr The persistent address of the desired drive. Either once
obtained by burn_drive_d_get_adr() or composed skillfully by obtained by burn_drive_d_get_adr() or composed skillfully by
application resp. its user. E.g. "/dev/sr0". application resp. its user. E.g. "/dev/sr0".
Consider to preprocess it by burn_drive_convert_fs_adr(). Consider to preprocess it by burn_drive_convert_fs_adr().
@ -994,25 +991,25 @@ void burn_drive_info_free(struct burn_drive_info drive_infos[]);
/* ts A60823 */ /* ts A60823 */
/* @since 0.2.2 */ /* @since 0.2.2 */
/** Maximum length+1 to expect with a drive device file address string */ /** Maximum length+1 to expect with a persistent drive address string */
#define BURN_DRIVE_ADR_LEN 1024 #define BURN_DRIVE_ADR_LEN 1024
/* ts A70906 */ /* ts A70906 */
/** Inquire the device file address of the given drive. /** Inquire the persistent address of the given drive.
@param drive The drive to inquire. @param drive The drive to inquire.
@param adr An application provided array of at least BURN_DRIVE_ADR_LEN @param adr An application provided array of at least BURN_DRIVE_ADR_LEN
characters size. The device file address gets copied to it. characters size. The persistent address gets copied to it.
@return >0 success , <=0 error (due to libburn internal problem) @return >0 success , <=0 error (due to libburn internal problem)
@since 0.4.0 @since 0.4.0
*/ */
int burn_drive_d_get_adr(struct burn_drive *drive, char adr[]); int burn_drive_d_get_adr(struct burn_drive *drive, char adr[]);
/* A60823 */ /* A60823 */
/** Inquire the device file address of a drive via a given drive_info object. /** Inquire the persistent address of a drive via a given drive_info object.
(Note: This is a legacy call.) (Note: This is a legacy call.)
@param drive_info The drive to inquire.Usually some &(drive_infos[driveno]) @param drive_info The drive to inquire.Usually some &(drive_infos[driveno])
@param adr An application provided array of at least BURN_DRIVE_ADR_LEN @param adr An application provided array of at least BURN_DRIVE_ADR_LEN
characters size. The device file address gets copied to it. characters size. The persistent address gets copied to it.
@return >0 success , <=0 error (due to libburn internal problem) @return >0 success , <=0 error (due to libburn internal problem)
@since 0.2.6 @since 0.2.6
*/ */
@ -1020,23 +1017,21 @@ int burn_drive_get_adr(struct burn_drive_info *drive_info, char adr[]);
/* ts A60922 ticket 33 */ /* ts A60922 ticket 33 */
/** Evaluate whether the given address would be a drive device file address /** Evaluate whether the given address would be a possible persistent drive
which could be listed by a run of burn_drive_scan(). No check is made address of libburn.
whether a device file with this address exists or whether it leads
to a usable MMC drive.
@return 1 means yes, 0 means no @return 1 means yes, 0 means no
@since 0.2.6 @since 0.2.6
*/ */
int burn_drive_is_enumerable_adr(char *adr); int burn_drive_is_enumerable_adr(char *adr);
/* ts A60922 ticket 33 */ /* ts A60922 ticket 33 */
/** Try to convert a given existing filesystem address into a drive device file /** Try to convert a given existing filesystem address into a persistent drive
address. This succeeds with symbolic links or if a hint about the drive's address. This succeeds with symbolic links or if a hint about the drive's
system address can be read from the filesystem object and a matching drive system address can be read from the filesystem object and a matching drive
is found. is found.
@param path The address of an existing file system object @param path The address of an existing file system object
@param adr An application provided array of at least BURN_DRIVE_ADR_LEN @param adr An application provided array of at least BURN_DRIVE_ADR_LEN
characters size. The device file address gets copied to it. characters size. The persistent address gets copied to it.
@return 1 = success , 0 = failure , -1 = severe error @return 1 = success , 0 = failure , -1 = severe error
@since 0.2.6 @since 0.2.6
*/ */
@ -1044,7 +1039,7 @@ int burn_drive_convert_fs_adr(char *path, char adr[]);
/* ts A60923 */ /* ts A60923 */
/** Try to convert a given SCSI address of bus,host,channel,target,lun into /** Try to convert a given SCSI address of bus,host,channel,target,lun into
a drive device file address. If a SCSI address component parameter is < 0 a persistent drive address. If a SCSI address component parameter is < 0
then it is not decisive and the first enumerated address which matches then it is not decisive and the first enumerated address which matches
the >= 0 parameters is taken as result. the >= 0 parameters is taken as result.
Note: bus and (host,channel) are supposed to be redundant. Note: bus and (host,channel) are supposed to be redundant.
@ -1054,50 +1049,17 @@ int burn_drive_convert_fs_adr(char *path, char adr[]);
@param target_no "Target Number" or "SCSI Id" (a device) @param target_no "Target Number" or "SCSI Id" (a device)
@param lun_no "Logical Unit Number" (a sub device) @param lun_no "Logical Unit Number" (a sub device)
@param adr An application provided array of at least BURN_DRIVE_ADR_LEN @param adr An application provided array of at least BURN_DRIVE_ADR_LEN
characters size. The device file address gets copied to it. characters size. The persistent address gets copied to it.
@return 1 = success , 0 = failure , -1 = severe error @return 1 = success , 0 = failure , -1 = severe error
@since 0.2.6 @since 0.2.6
*/ */
int burn_drive_convert_scsi_adr(int bus_no, int host_no, int channel_no, int burn_drive_convert_scsi_adr(int bus_no, int host_no, int channel_no,
int target_no, int lun_no, char adr[]); int target_no, int lun_no, char adr[]);
/* ts B10728 */
/** Try to convert a given drive device file address into the address of a
symbolic link that points to this drive address.
Modern GNU/Linux systems may shuffle drive addresses from boot to boot.
The udev daemon is supposed to create links which always point to the
same drive, regardless of its system address.
This call tries to find such links.
@param dev_adr Should contain a drive address as returned by
burn_drive_scan().
@param link_adr An application provided array of at least
BURN_DRIVE_ADR_LEN characters size. The found link
address gets copied to it.
@param dir_adr The address of the directory where to look for links.
Normally: "/dev"
@param templ An array of pointers to name templates, which
links have to match. A symbolic link in dir_adr matches
a name template if it begins by that text. E.g.
link address "/dev/dvdrw1" matches template "dvdrw".
If templ is NULL, then the default array gets used:
{"dvdrw", "cdrw", "dvd", "cdrom", "cd"}
If several links would match, then a link will win,
which matches the template with the lowest array index.
Among these candidates, the one with the lowest strcmp()
rank will be chosen as link_adr.
@param num_templ Number of array elements in templ.
@param flag Bitfield for control purposes. Unused yet. Submit 0.
@return <0 severe error, 0 failed to search, 2 nothing found
1 success, link_adr is valid
@since 1.1.4
*/
int burn_lookup_device_link(char *dev_adr, char link_adr[],
char *dir_adr, char **templ, int num_templ, int flag);
/* ts A60923 - A61005 */ /* ts A60923 - A61005 */
/** Try to obtain bus,host,channel,target,lun from path. If there is an SCSI /** Try to obtain bus,host,channel,target,lun from path. If there is an SCSI
address at all, then this call should succeed with a drive device file address at all, then this call should succeed with a persistent
address obtained via burn_drive_d_get_adr(). It is also supposed to drive address obtained via burn_drive_d_get_adr(). It is also supposed to
succeed with any device file of a (possibly emulated) SCSI device. succeed with any device file of a (possibly emulated) SCSI device.
@return 1 = success , 0 = failure , -1 = severe error @return 1 = success , 0 = failure , -1 = severe error
@since 0.2.6 @since 0.2.6
@ -1146,17 +1108,6 @@ int burn_drive_probe_cd_write_modes(struct burn_drive_info *drive_info);
int burn_drive_snooze(struct burn_drive *d, int flag); int burn_drive_snooze(struct burn_drive *d, int flag);
/** Re-assess drive and media status. This should be done after a drive
underwent a status change and shall be further used without intermediate
burn_drive_release(), burn_drive_grab(). E.g. after blanking or burning.
@param drive The already grabbed drive to re-assess.
@param flag Unused yet. Submit 0.
@return 1 success , <= 0 could not determine drive and media state
@since 1.1.8
*/
int burn_drive_re_assess(struct burn_drive *d, int flag);
/** Release a drive. This should not be done until the drive is no longer /** Release a drive. This should not be done until the drive is no longer
busy (see burn_drive_get_status). busy (see burn_drive_get_status).
@param drive The drive to release. @param drive The drive to release.
@ -1283,50 +1234,12 @@ 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 B10801 */
/** Retrieve some media information which is mainly specific to media of
the DVD-R family: DVD-R , DVD-RW , DVD-R DL , HD DVD-R
Currently the information cannot be retrieved from other media types.
@param d The drive to query.
@param disk_category returns DVD Book to which the media complies
@param book_name returns a pointer to the book name of disk_category.
This memory is static. Do not alter or free it !
@param part_version returns the Media Version in the DVD Book
@param num_layers returns the number of media layers
@param num_blocks returns the number of blocks between pysical start
and physical end of the media
@param flag Bitfield for control purposes (unused yet, submit 0)
@return 1 = reply prarameters are valid,
<=0 = reply is invalid (e.g. because no DVD-R)
@since 1.1.4
*/
int burn_disc_get_phys_format_info(struct burn_drive *d, int *disk_category,
char **book_name, int *part_version, int *num_layers,
int *num_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.
@ -1346,45 +1259,6 @@ int burn_disc_get_phys_format_info(struct burn_drive *d, int *disk_category,
int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o, int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
int trackno, int *lba, int *nwa); int trackno, int *lba, int *nwa);
/* ts B10525 */
/** Tells whether a previous attempt to determine the Next Writeable Address
of the upcomming track reveiled that the READ TRACK INFORMATION Damage Bit
is set for this track, resp. that no valid writable address is available.
See MMC-5 6.27.3.7 Damage Bit, 6.27.3.11 NWA_V (NWA valid)
@param d The drive to query.
@param flag Bitfield for control purposes (unused yet, submit 0)
@return 0= Looks ok: Damage Bit is not set, NWA_V is set
1= Damaged and theoretically writable (NWA_V is set)
2= Not writable: NWA_V is not set
3= Damaged and not writable (NWA_V is not set),
@since 1.1.0
*/
int burn_disc_next_track_is_damaged(struct burn_drive *d, int flag);
/* ts B10527 */
/** Try to close the last track and session of media which have bit0 set in
the return value of call burn_disc_next_track_is_damaged().
Whether it helps depends much on the reason why the media is reported
as damaged by the drive.
This call works only for profiles 0x09 CD-R, 0x0a CD-RW, 0x11 DVD-R,
0x14 DVD-RW sequential, 0x1b DVD+R, 0x2b DVD+R DL, 0x41 BD-R sequential.
Note: After writing it is advised to give up the drive and to grab it again
in order to learn about its view on the new media state.
@param o Write options created by burn_write_opts_new() and
manipulated by burn_write_opts_set_multi().
burn_write_opts_set_write_type() should be set to
BURN_WRITE_TAO, burn_write_opts_set_simulate() should be
set to 0.
@param flag Bitfield for control purposes
bit0= force close, even if no damage was seen
@return <=0 media not marked as damaged, or media type not suitable,
or closing attempted but failed
1= attempt finished without error indication
@since 1.1.0
*/
int burn_disc_close_damaged(struct burn_write_opts *o, int flag);
/* ts A70131 */ /* ts A70131 */
/** Read start lba of the first track in the last complete session. /** Read start lba of the first track in the last complete session.
This is the first parameter of mkisofs option -C. The second parameter This is the first parameter of mkisofs option -C. The second parameter
@ -1406,9 +1280,6 @@ int burn_disc_get_msc1(struct burn_drive *d, int *start_lba);
An eventual start address from burn_write_opts_set_start_byte() will be An eventual start address from burn_write_opts_set_start_byte() will be
subtracted from the obtained capacity estimation. Negative results get subtracted from the obtained capacity estimation. Negative results get
defaulted to 0. defaulted to 0.
If the drive is actually a file in a large filesystem or a large block
device, then the capacity is curbed to a maximum of 0x7ffffff0 blocks
= 4 TB - 32 KB.
@param d The drive to query. @param d The drive to query.
@param o If not NULL: write parameters to be set on drive before query @param o If not NULL: write parameters to be set on drive before query
@return number of most probably available free bytes @return number of most probably available free bytes
@ -1417,29 +1288,25 @@ int burn_disc_get_msc1(struct burn_drive *d, int *start_lba);
off_t burn_disc_available_space(struct burn_drive *d, off_t burn_disc_available_space(struct burn_drive *d,
struct burn_write_opts *o); struct burn_write_opts *o);
/* ts A61202 */ /* ts A61202 */
/** 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" 0x09 "CD-R", 0x0a "CD-RW",
0x0a "CD-RW" 0x11 "DVD-R sequential recording", 0x12 "DVD-RAM",
0x11 "DVD-R sequential recording" 0x13 "DVD-RW restricted overwrite", 0x14 "DVD-RW sequential recording",
0x12 "DVD-RAM" 0x1a "DVD+RW", 0x1b "DVD+R",
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", 0x41 "BD-R sequential recording", 0x43 "BD-RE",
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", 0x08 "CD-ROM", 0x10 "DVD-ROM",
0x10 "DVD-ROM",
0x40 "BD-ROM", 0x40 "BD-ROM",
Read-only for now is this BD-R profile (testers wanted) For now read-only is 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
@ -1556,8 +1423,6 @@ void burn_read_opts_free(struct burn_read_opts *opts);
cancellable, as control of the operation is passed wholly to the drive and cancellable, as control of the operation is passed wholly to the drive and
there is no way to interrupt it safely. there is no way to interrupt it safely.
@param drive The drive with which to erase a disc. @param drive The drive with which to erase a disc.
Only drive roles 1 (MMC) and 5 (stdio random write-only)
support erasing.
@param fast Nonzero to do a fast erase, where only the disc's headers are @param fast Nonzero to do a fast erase, where only the disc's headers are
erased; zero to erase the entire disc. erased; zero to erase the entire disc.
With DVD-RW, fast blanking yields media capable only of DAO. With DVD-RW, fast blanking yields media capable only of DAO.
@ -1702,13 +1567,8 @@ int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc,
of data and audio tracks. You must use BURN_WRITE_TAO for such sessions. of data and audio tracks. You must use BURN_WRITE_TAO for such sessions.
To be set by burn_write_opts_set_write_type(). To be set by burn_write_opts_set_write_type().
Note: This function is not suitable for overwriting data in the middle of Note: This function is not suitable for overwriting data in the middle of
a valid data area because it is allowed to append trailing data. a valid data area because it is allowed to append trailing data.
For exact random access overwriting use burn_random_access_write(). For exact random access overwriting use burn_random_access_write().
Note: After writing it is advised to give up the drive and to grab it again
in order to learn about its view on the new media state.
Note: Before mounting the written media it might be necessary to eject
and reload in order to allow the operating system to notice the new
media state.
@param o The options for the writing operation. @param o The options for the writing operation.
@param disc The struct burn_disc * that described the disc to be created @param disc The struct burn_disc * that described the disc to be created
*/ */
@ -2022,41 +1882,6 @@ 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
@ -2272,11 +2097,7 @@ int burn_drive_set_buffer_waiting(struct burn_drive *d, int enable,
int min_percent, int max_percent); int min_percent, int max_percent);
/* these are for my [Derek Foreman's ?] debugging, they will disappear */ /* these are for my debugging, they will disappear */
/* ts B11012 :
Of course, API symbols will not disappear. But these functions are of
few use, as they only print DEBUG messages.
*/
void burn_structure_print_disc(struct burn_disc *d); void burn_structure_print_disc(struct burn_disc *d);
void burn_structure_print_session(struct burn_session *s); void burn_structure_print_session(struct burn_session *s);
void burn_structure_print_track(struct burn_track *t); void burn_structure_print_track(struct burn_track *t);
@ -2333,7 +2154,7 @@ void burn_write_opts_set_format(struct burn_write_opts *opts, int format);
This corresponds to the Test Write bit in MMC mode page 05h. Several media This corresponds to the Test Write bit in MMC mode page 05h. Several media
types do not support this. See struct burn_multi_caps.might_simulate for types do not support this. See struct burn_multi_caps.might_simulate for
actual availability of this feature. actual availability of this feature.
If the media is suitable, the drive will perform burn_disc_write() as a If the media is suitable, the drive will perform burn_write_disc() as a
simulation instead of effective write operations. This means that the simulation instead of effective write operations. This means that the
media content and burn_disc_get_status() stay unchanged. media content and burn_disc_get_status() stay unchanged.
Note: With stdio-drives, the target file gets eventually created, opened, Note: With stdio-drives, the target file gets eventually created, opened,
@ -2370,10 +2191,6 @@ 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
@ -2809,9 +2626,9 @@ void burn_version(int *major, int *minor, int *micro);
} }
*/ */
#define burn_header_version_major 1 #define burn_header_version_major 0
#define burn_header_version_minor 1 #define burn_header_version_minor 8
#define burn_header_version_micro 8 #define burn_header_version_micro 2
/** 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.
@ -2865,8 +2682,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.
@param flag Bitfield for control puposes, submit 0 for now @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);
@ -2899,7 +2716,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 listed in @param error_code Will become a unique error code as liste in
libburn/libdax_msgs.h libburn/libdax_msgs.h
@param msg_text Must provide at least BURN_MSGS_MESSAGE_LEN bytes. @param msg_text Must provide at least BURN_MSGS_MESSAGE_LEN bytes.
@param os_errno Will become the eventual errno related to the message @param os_errno Will become the eventual errno related to the message
@ -2994,7 +2811,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_erase(), burn_disc_format(): at least during burn_disc_write(), burn_disc_rease(), 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).
@ -3087,8 +2904,6 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
can be read via burn_read_data() although some of them may never have been can be read via burn_read_data() although some of them may never have been
recorded. If tracks are recognizable then it is better to only read recorded. If tracks are recognizable then it is better to only read
LBAs which are part of some track. LBAs which are part of some track.
If the drive is actually a large file or block device, then the capacity
is curbed to a maximum of 0x7ffffff0 blocks = 4 TB - 32 KB.
@param d The drive from which to read @param d The drive from which to read
@param capacity Will return the result if valid @param capacity Will return the result if valid
@param flag Bitfield for control purposes: Unused yet, submit 0. @param flag Bitfield for control purposes: Unused yet, submit 0.
@ -3117,20 +2932,15 @@ int burn_get_read_capacity(struct burn_drive *d, int *capacity, int flag);
bit0= - reserved - bit0= - reserved -
bit1= do not submit error message if read error bit1= do not submit error message if read error
bit2= on error do not try to read a second time bit2= on error do not try to read a second time
with single block steps. with single block steps. @since 0.5.2
@since 0.5.2
bit3= return -2 on permission denied error rather than
issueing a warning message.
@since 1.0.6
@return 1=sucessful , <=0 an error occured @return 1=sucessful , <=0 an error occured
with bit3: -2= permission denied error
@since 0.4.0 @since 0.4.0
*/ */
int burn_read_data(struct burn_drive *d, off_t byte_address, int burn_read_data(struct burn_drive *d, off_t byte_address,
char data[], off_t data_size, off_t *data_count, int flag); char data[], off_t data_size, off_t *data_count, int flag);
/* ts A70904 */ /* A70904 */
/** Inquire whether the drive object is a real MMC drive or a pseudo-drive /** Inquire whether the drive object is a real MMC drive or a pseudo-drive
created by a stdio: address. created by a stdio: address.
@param d The drive to inquire @param d The drive to inquire
@ -3138,49 +2948,11 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
1= real MMC drive 1= real MMC drive
2= stdio-drive, random access, read-write 2= stdio-drive, random access, read-write
3= stdio-drive, sequential, write-only 3= stdio-drive, sequential, write-only
4= stdio-drive, random access, read-only
(only if enabled by burn_allow_drive_role_4())
5= stdio-drive, random access, write-only
(only if enabled by burn_allow_drive_role_4())
@since 0.4.0 @since 0.4.0
*/ */
int burn_drive_get_drive_role(struct burn_drive *d); int burn_drive_get_drive_role(struct burn_drive *d);
/* ts B10312 */
/** Allow drive role 4 "random access read-only"
and drive role 5 "random access write-only".
By default a random access file assumes drive role 2 "read-write"
regardless whether it is actually readable or writeable.
If enabled, random-access file objects which recognizably allow no
writing will be classified as role 4 and those which allow no reading
will get role 5.
Candidates are drive addresses of the form stdio:/dev/fd/# , where # is
the integer number of an open file descriptor. If this descriptor was
opened read-only resp. write-only, then it gets role 4 resp. role 5.
Other paths may get tested by an attempt to open them for read-write
(role 2) resp. read-only (role 4) resp. write-only (role 5). See bit1.
@param allowed Bitfield for control purposes:
bit0= Enable roles 4 and 5 for drives which get
aquired after this call
bit1= with bit0:
Test whether the file can be opened for
read-write resp. read-only resp. write-only.
Classify as roles 2 resp. 4 resp. 5.
bit2= with bit0 and bit1:
Classify files which cannot be opened at all
as role 0 : useless dummy.
Else classify as role 2.
bit3= Classify non-empty role 5 drives as
BURN_DISC_APPENDABLE with Next Writeable Address
after the end of the file. It is nevertheless
possible to change this address by call
burn_write_opts_set_start_byte().
@since 1.0.6
*/
void burn_allow_drive_role_4(int allowed);
/* ts A70923 */ /* ts A70923 */
/** Find out whether a given address string would lead to the given drive /** Find out whether a given address string would lead to the given drive
object. This should be done in advance for track source addresses object. This should be done in advance for track source addresses
@ -3208,110 +2980,6 @@ void burn_allow_drive_role_4(int allowed);
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

View File

@ -1,173 +0,0 @@
LIBBURN4 {
global:
burn_abort;
burn_abort_pacifier;
burn_allow_drive_role_4;
burn_allow_untested_profiles;
burn_disc_add_session;
burn_disc_available_space;
burn_disc_close_damaged;
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_phys_format_info;
burn_disc_get_profile;
burn_disc_get_sectors;
burn_disc_get_sessions;
burn_disc_get_status;
burn_disc_next_track_is_damaged;
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_re_assess;
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_lookup_device_link;
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,8 +25,7 @@ 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 or include libburn.h */ /* All clients of the extraction facility must do this */
#define LIBDAX_AUDIOXTR_H_PUBLIC 1
#include "libdax_audioxtr.h" #include "libdax_audioxtr.h"
@ -35,7 +34,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 *) calloc(1, sizeof(struct libdax_audioxtr)); o= *xtr= (struct libdax_audioxtr *) malloc(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,13 +7,6 @@
#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 */
@ -117,16 +110,15 @@ 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 LIBDAX_AUDIOXTR________________ #ifdef LIDBAX_AUDIOXTR________________
-- place documentation text here --- -- place documentation text here ---
#endif /* LIBDAX_AUDIOXTR_________________ */ #endif /* LIDBAX_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 *) calloc(1, sizeof(struct libdax_msgs_item)); (struct libdax_msgs_item *) malloc(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 *) calloc(1, sizeof(struct libdax_msgs)); (*m)= o= (struct libdax_msgs *) malloc(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= calloc(1, strlen(msg_text)+1); item->msg_text= malloc(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

@ -1,7 +1,7 @@
/* libdax_msgs /* libdax_msgs
Message handling facility of libburn and libisofs. Message handling facility of libdax.
Copyright (C) 2006-2011 Thomas Schmitt <scdbackup@gmx.net>, Copyright (C) 2006-2010 Thomas Schmitt <scdbackup@gmx.net>,
provided under GPL version 2 or later. provided under GPL version 2 or later.
*/ */
@ -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 LIBDAX_MSGS_________________ #ifdef LIDBAX_MSGS_________________
/* Registered Error Codes */ /* Registered Error Codes */
@ -519,7 +519,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
0x0002014d (SORRY,HIGH) = Asynchromous SCSI error 0x0002014d (SORRY,HIGH) = Asynchromous SCSI error
0x0002014f (SORRY,HIGH) = Timeout with asynchromous SCSI command 0x0002014f (SORRY,HIGH) = Timeout with asynchromous SCSI command
0x00020150 (DEBUG,LOW) = Reporting asynchronous waiting time 0x00020150 (DEBUG,LOW) = Reporting asynchronous waiting time
0x00020151 (FAILURE,HIGH) = Read attempt on write-only drive 0x00020151 (FATAL,HIGH) = Read attempt on write-only drive
0x00020152 (FATAL,HIGH) = Cannot start fifo thread 0x00020152 (FATAL,HIGH) = Cannot start fifo thread
0x00020153 (SORRY,HIGH) = Read error on fifo input 0x00020153 (SORRY,HIGH) = Read error on fifo input
0x00020154 (NOTE,HIGH) = Forwarded input error ends output 0x00020154 (NOTE,HIGH) = Forwarded input error ends output
@ -558,23 +558,7 @@ 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
0x0002017e (FAILURE,HIGH) = Failed to close track, session, or disc
0x0002017f (FAILURE,HIGH) = Failed to synchronize drive cache
0x00020180 (FAILURE,HIGH) = Premature end of input encountered
0x00020181 (FAILURE,HIGH) = Pseudo-drive is a read-only file. Cannot write.
0x00020182 (FAILURE,HIGH) = Cannot truncate disk file for pseudo blanking
0x00020183 (WARNING,HIGH) = Failed to open device (a pseudo-drive) for reading
0x00020184 (WARNING,HIGH) = No Next-Writable-Address
0x00020185 (WARNING,HIGH) = Track damaged, not closed and not writable
0x00020186 (WARNING,HIGH) = Track damaged and not closed
0x00020187 (NOTE,HIGH) = Track not marked as damaged. No action taken.
0x00020188 (FAILURE,HIGH) = Cannot close damaged track on given media type
0x00020189 (FATAL,HIGH) = Drive is already grabbed by libburn
libdax_audioxtr: libdax_audioxtr:
0x00020200 (SORRY,HIGH) = Cannot open audio source file 0x00020200 (SORRY,HIGH) = Cannot open audio source file
@ -695,7 +679,7 @@ Range "libisoburn" : 0x00060000 to 0x00006ffff
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
#endif /* LIBDAX_MSGS_________________ */ #endif /* LIDBAX_MSGS_________________ */

File diff suppressed because it is too large Load Diff

View File

@ -106,13 +106,5 @@ 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);
/* ts B10801 */
int mmc_get_phys_format_info(struct burn_drive *d, int *disk_category,
char **book_name, int *part_version, int *num_layers,
int *num_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 = calloc(1, sizeof(struct burn_source)); src = malloc(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 = calloc(1, sizeof(struct burn_write_opts)); opts = malloc(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 = calloc(1, sizeof(struct burn_read_opts)); opts = malloc(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 = calloc(count, sizeof(struct burn_toc_entry)); opts->toc_entry = malloc(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,37 +29,12 @@
/* The number of above list items */ /* The number of above list items */
#define BURN_OS_SIGNAL_COUNT 16 #define BURN_OS_SIGNAL_COUNT 16
/** The list of all signals which shall surely not be caught. /** To list 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 BURN_OS_SIG_WINCH BURN_OS_SIG_URG SIGKILL, SIGCHLD, SIGSTOP
/* The number of above list items */ /* The number of above list items */
#define BURN_OS_NON_SIGNAL_COUNT \ #define BURN_OS_NON_SIGNAL_COUNT 3
( 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,8 +4,7 @@
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 - 2010 Thomas Schmitt <scdbackup@gmx.net>, Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
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
@ -42,11 +41,7 @@ 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 ! */
/* Older BSD info says that 32 kB is maximum. But 64 kB seems to work well #define BURN_OS_TRANSPORT_BUFFER_SIZE 32768
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,49 +29,26 @@
/* 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 BURN_OS_SIG_WINCH BURN_OS_SIG_URG SIGKILL, SIGCHLD, SIGSTOP
/* The number of above list items */ /* The number of above list items */
#define BURN_OS_NON_SIGNAL_COUNT \ #define BURN_OS_NON_SIGNAL_COUNT 3
( 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.
Older BSD info says that 32 kB is maximum. But 64 kB seems to work well This makes it worth to have a special case for GNU/Linux buffer size here.
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.
*/ */
/* Important : MUST be at least 32768 ! */ #ifdef __linux
#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,6 +41,8 @@ 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

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -9,6 +9,9 @@
#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>
@ -54,7 +57,7 @@ void burn_disc_read(struct burn_drive *d, const struct burn_read_opts *o)
int drive_lba; int drive_lba;
unsigned short crc; unsigned short crc;
unsigned char fakesub[96]; unsigned char fakesub[96];
struct buffer page; <- needs to become dynamic memory struct buffer page;
int speed; int speed;
/* ts A61007 : if this function gets revived, then these /* ts A61007 : if this function gets revived, then these
@ -115,6 +118,7 @@ drive, or only store a subset of the _opts structs in drives */
while (1) { while (1) {
seclen = burn_sector_length_read(d, o); seclen = burn_sector_length_read(d, o);
burn_print(12, "received %d blocks\n", page.sectors);
for (i = 0; i < page.sectors; i++) { for (i = 0; i < page.sectors; i++) {
burn_packet_process(d, page.data + seclen * i, o); burn_packet_process(d, page.data + seclen * i, o);
d->track_end--; d->track_end--;
@ -122,6 +126,7 @@ drive, or only store a subset of the _opts structs in drives */
} }
if ((d->cancel) || (drive_lba == LAST_SESSION_END(d))) { if ((d->cancel) || (drive_lba == LAST_SESSION_END(d))) {
burn_print(1, "finished or cancelled\n");
d->busy = BURN_DRIVE_IDLE; d->busy = BURN_DRIVE_IDLE;
if (!d->cancel) if (!d->cancel)
d->toc->complete = 1; d->toc->complete = 1;
@ -135,14 +140,16 @@ drive, or only store a subset of the _opts structs in drives */
if (d->currtrack > if (d->currtrack >
d->toc->session[d->currsession].lasttrack) { d->toc->session[d->currsession].lasttrack) {
d->currsession++; d->currsession++;
/* session switch to d->currsession */ burn_print(12, "session switch to %d\n",
/* skipping a lead out */ d->currsession);
burn_print(12, "skipping a lead out\n");
drive_lba = CURRENT_SESSION_START(d); drive_lba = CURRENT_SESSION_START(d);
burn_print(12, "new lba %d\n", drive_lba);
/* XXX more of the same /* XXX more of the same
end = burn_track_end(d, d->currsession, end = burn_track_end(d, d->currsession,
d->currtrack); d->currtrack);
*/ */ }
} burn_print(12, "track switch to %d\n", d->currtrack);
} }
page.sectors = 0; page.sectors = 0;
@ -197,21 +204,23 @@ static int bitcount(unsigned char *data, int n)
return count; return count;
} }
void burn_packet_process(struct burn_drive *d, unsigned char *data, void burn_packet_process(struct burn_drive *d, unsigned char *data,
const struct burn_read_opts *o) const struct burn_read_opts *o)
{ {
unsigned char sub[96]; unsigned char sub[96];
unsigned short crc;
int ptr = 2352, i, j, code, fb; int ptr = 2352, i, j, code, fb;
int audio = 1; int audio = 1;
#ifndef Libburn_no_crc_C
unsigned short crc;
#endif
if (o->c2errors) { if (o->c2errors) {
fb = bitcount(data + ptr, 294); fb = bitcount(data + ptr, 294);
if (fb) { if (fb) {
/* bitcount(data + ptr, 294) damaged bits */; burn_print(1, "%d damaged bits\n",
bitcount(data + ptr, 294));
burn_print(1, "sending error on %s %s\n",
d->idata->vendor, d->idata->product);
/* XXX send a burn_message! burn_message_error(d,
something); */
} }
ptr += 294; ptr += 294;
} }
@ -247,17 +256,16 @@ void burn_packet_process(struct burn_drive *d, unsigned char *data,
} }
} }
} }
crc = (*(sub + 22) << 8) + *(sub + 23);
#ifndef Libburn_no_crc_C #ifndef Libburn_no_crc_C
crc = (*(sub + 22) << 8) + *(sub + 23);
if (crc != crc_ccitt(sub + 12, 10)) { if (crc != crc_ccitt(sub + 12, 10)) {
/*
burn_print(1, "sending error on %s %s\n", burn_print(1, "sending error on %s %s\n",
d->idata->vendor, d->idata->product); d->idata->vendor, d->idata->product);
e = burn_error(); /* e = burn_error();
e->drive = d; e->drive = d;
*/
burn_print(1, "crc mismatch in Q\n"); burn_print(1, "crc mismatch in Q\n");
*/;
} }
#endif #endif
@ -281,12 +289,8 @@ void burn_packet_process(struct burn_drive *d, unsigned char *data,
/* so yeah, when you uncomment these, make them write zeros insted of crap /* so yeah, when you uncomment these, make them write zeros insted of crap
static void write_empty_sector(int fd) static void write_empty_sector(int fd)
{ {
static char sec[2352], initialized = 0; char sec[2352];
if (!initialized) {
memset(sec, 0, 2352);
initialized = 1;
}
burn_print(1, "writing an 'empty' sector\n"); burn_print(1, "writing an 'empty' sector\n");
write(fd, sec, 2352); write(fd, sec, 2352);
} }
@ -338,7 +342,7 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
int alignment = 2048, start, upto, chunksize = 1, err, cpy_size, i; int alignment = 2048, start, upto, chunksize = 1, err, cpy_size, i;
int sose_mem = 0, fd = -1, ret; int sose_mem = 0, fd = -1, ret;
char msg[81], *wpt; char msg[81], *wpt;
struct buffer *buf = NULL, *buffer_mem = d->buffer; struct buffer buf, *buffer_mem = d->buffer;
/* /*
#define Libburn_read_data_adr_logginG 1 #define Libburn_read_data_adr_logginG 1
@ -352,7 +356,7 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
fprintf(log_fp, "%d\n", (int) (byte_address / 2048)); fprintf(log_fp, "%d\n", (int) (byte_address / 2048));
#endif /* Libburn_read_data_logginG */ #endif /* Libburn_read_data_logginG */
BURN_ALLOC_MEM(buf, struct buffer, 1);
*data_count = 0; *data_count = 0;
sose_mem = d->silent_on_scsi_error; sose_mem = d->silent_on_scsi_error;
@ -361,20 +365,20 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
d->global_index, 0x00020142, d->global_index, 0x00020142,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Drive is not grabbed on random access read", 0, 0); "Drive is not grabbed on random access read", 0, 0);
{ret = 0; goto ex;} return 0;
} }
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,
0x00020146, 0x00020146,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Drive is a virtual placeholder (null-drive)", 0, 0); "Drive is a virtual placeholder (null-drive)", 0, 0);
{ret = 0; goto ex;} return 0;
} else if (d->drive_role == 3) { } else if (d->drive_role == 3) {
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020151, 0x00020151,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Read attempt on write-only drive", 0, 0); "Read attempt on write-only drive", 0, 0);
{ret = 0; goto ex;} return 0;
} }
if ((byte_address % alignment) != 0) { if ((byte_address % alignment) != 0) {
sprintf(msg, sprintf(msg,
@ -384,7 +388,7 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
0x00020143, 0x00020143,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
{ret = 0; goto ex;} return 0;
} }
if (d->media_read_capacity != 0x7fffffff && byte_address >= if (d->media_read_capacity != 0x7fffffff && byte_address >=
((off_t) d->media_read_capacity + (off_t) 1) * (off_t) 2048) { ((off_t) d->media_read_capacity + (off_t) 1) * (off_t) 2048) {
@ -398,7 +402,7 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
} }
{ret = 0; goto ex;} return 0;
} }
if (d->busy != BURN_DRIVE_IDLE) { if (d->busy != BURN_DRIVE_IDLE) {
@ -406,7 +410,7 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
d->global_index, 0x00020145, d->global_index, 0x00020145,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Drive is busy on attempt to read data", 0, 0); "Drive is busy on attempt to read data", 0, 0);
{ret = 0; goto ex;} return 0;
} }
if (d->drive_role != 1) { if (d->drive_role != 1) {
@ -422,41 +426,28 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
d->stdio_fd = fd = d->stdio_fd = fd =
open(d->devname, O_RDONLY | O_LARGEFILE); open(d->devname, O_RDONLY | O_LARGEFILE);
if (fd == -1) { if (fd == -1) {
if (errno == EACCES && (flag & 2)) { if (errno != ENOENT || !(flag & 2))
if (!(flag & 8))
libdax_msgs_submit(libdax_messenger,
d->global_index, 0x00020183,
LIBDAX_MSGS_SEV_WARNING,
LIBDAX_MSGS_PRIO_HIGH,
"Failed to open device (a pseudo-drive) for reading",
errno, 0);
} else if (errno!= ENOENT || !(flag & 2))
libdax_msgs_submit(libdax_messenger, libdax_msgs_submit(libdax_messenger,
d->global_index, 0x00020005, d->global_index,
0x00020005,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"Failed to open device (a pseudo-drive) for reading", "Failed to open device (a pseudo-drive) for reading",
errno, 0); errno, 0);
ret = 0; ret = 0; goto ex;
if (errno == EACCES && (flag & 8))
ret= -2;
goto ex;
} }
if (lseek(fd, byte_address, SEEK_SET) == -1) { if (lseek(fd, byte_address, SEEK_SET) == -1) {
if (!(flag & 2)) { if (!(flag & 2))
sprintf(msg, "Cannot address start byte %.f",
(double) byte_address);
libdax_msgs_submit(libdax_messenger, libdax_msgs_submit(libdax_messenger,
d->global_index, d->global_index,
0x00020147, 0x00020147,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, errno, 0); "Cannot address start byte", errno, 0);
}
ret = 0; goto ex; ret = 0; goto ex;
} }
} }
d->busy = BURN_DRIVE_READING_SYNC; d->busy = BURN_DRIVE_READING_SYNC;
d->buffer = buf; d->buffer = &buf;
start = byte_address / 2048; start = byte_address / 2048;
upto = start + data_size / 2048; upto = start + data_size / 2048;
@ -523,7 +514,10 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
ret = 1; ret = 1;
ex:; ex:;
BURN_FREE_MEM(buf); /* <<< let it open until drive is given up or writing shall happen
if (fd != -1)
close(fd);
*/
d->buffer = buffer_mem; d->buffer = buffer_mem;
d->busy = BURN_DRIVE_IDLE; d->busy = BURN_DRIVE_IDLE;
return ret; return ret;

View File

@ -54,21 +54,20 @@ static unsigned char SBC_STOP_UNIT[] = { 0x1b, 0, 0, 0, 0, 0 };
void sbc_load(struct burn_drive *d) void sbc_load(struct burn_drive *d)
{ {
struct command *c; struct command c;
c = &(d->casual_command);
if (mmc_function_spy(d, "load") <= 0) if (mmc_function_spy(d, "load") <= 0)
return; return;
scsi_init_command(c, SBC_LOAD, sizeof(SBC_LOAD)); scsi_init_command(&c, SBC_LOAD, sizeof(SBC_LOAD));
c->retry = 1; c.retry = 1;
/* ts A70921 : Had to revoke Immed because of LG GSA-4082B */ /* ts A70921 : Had to revoke Immed because of LG GSA-4082B */
/* c->opcode[1] |= 1; / * ts A70918 : Immed */ /* c.opcode[1] |= 1; / * ts A70918 : Immed */
c->dir = NO_TRANSFER; c.dir = NO_TRANSFER;
d->issue_command(d, c); d->issue_command(d, &c);
if (c->error) if (c.error)
return; return;
/* ts A70923 : Needed regardless of Immed bit. Was once 1 minute, now /* ts A70923 : Needed regardless of Immed bit. Was once 1 minute, now
5 minutes for loading. If this does not suffice then other commands 5 minutes for loading. If this does not suffice then other commands
@ -78,21 +77,20 @@ void sbc_load(struct burn_drive *d)
void sbc_eject(struct burn_drive *d) void sbc_eject(struct burn_drive *d)
{ {
struct command *c; struct command c;
c = &(d->casual_command);
if (mmc_function_spy(d, "eject") <= 0) if (mmc_function_spy(d, "eject") <= 0)
return; return;
scsi_init_command(c, SBC_UNLOAD, sizeof(SBC_UNLOAD)); scsi_init_command(&c, SBC_UNLOAD, sizeof(SBC_UNLOAD));
/* c->opcode[1] |= 1; / * ts A70918 : Immed , ts B00109 : revoked */ /* c.opcode[1] |= 1; / * ts A70918 : Immed , ts B00109 : revoked */
c->page = NULL; c.page = NULL;
c->dir = NO_TRANSFER; c.dir = NO_TRANSFER;
d->issue_command(d, c); d->issue_command(d, &c);
/* ts A70918 : Wait long. A late eject could surprise or hurt user. /* ts A70918 : Wait long. A late eject could surprise or hurt user.
ts B00109 : Asynchronous eject revoked, as one cannot reliably ts B00109 : Asynchronous eject revoked, as one cannot reliably
distinguish out from unready. distinguish out from unready.
if (c->error) if (c.error)
return; return;
spc_wait_unit_attention(d, 1800, "STOP UNIT (+ EJECT)", 0); spc_wait_unit_attention(d, 1800, "STOP UNIT (+ EJECT)", 0);
*/ */
@ -104,19 +102,18 @@ void sbc_eject(struct burn_drive *d)
*/ */
int sbc_start_unit_flag(struct burn_drive *d, int flag) int sbc_start_unit_flag(struct burn_drive *d, int flag)
{ {
struct command *c; struct command c;
int ret; int ret;
c = &(d->casual_command);
if (mmc_function_spy(d, "start_unit") <= 0) if (mmc_function_spy(d, "start_unit") <= 0)
return 0; return 0;
scsi_init_command(c, SBC_START_UNIT, sizeof(SBC_START_UNIT)); scsi_init_command(&c, SBC_START_UNIT, sizeof(SBC_START_UNIT));
c->retry = 1; c.retry = 1;
c->opcode[1] |= (flag & 1); /* ts A70918 : Immed */ c.opcode[1] |= (flag & 1); /* ts A70918 : Immed */
c->dir = NO_TRANSFER; c.dir = NO_TRANSFER;
d->issue_command(d, c); d->issue_command(d, &c);
if (c->error) if (c.error)
return 0; return 0;
if (!(flag & 1)) if (!(flag & 1))
return 1; return 1;
@ -147,19 +144,18 @@ int sbc_start_unit(struct burn_drive *d)
/* ts A90824 : Trying to reduce drive noise */ /* ts A90824 : Trying to reduce drive noise */
int sbc_stop_unit(struct burn_drive *d) int sbc_stop_unit(struct burn_drive *d)
{ {
struct command *c; struct command c;
int ret; int ret;
c = &(d->casual_command);
if (mmc_function_spy(d, "stop_unit") <= 0) if (mmc_function_spy(d, "stop_unit") <= 0)
return 0; return 0;
scsi_init_command(c, SBC_STOP_UNIT, sizeof(SBC_STOP_UNIT)); scsi_init_command(&c, SBC_STOP_UNIT, sizeof(SBC_STOP_UNIT));
c->retry = 0; c.retry = 0;
c->opcode[1] |= 1; /* Immed */ c.opcode[1] |= 1; /* Immed */
c->dir = NO_TRANSFER; c.dir = NO_TRANSFER;
d->issue_command(d, c); d->issue_command(d, &c);
if (c->error) if (c.error)
return 0; return 0;
ret = spc_wait_unit_attention(d, 1800, "STOP UNIT", 0); ret = spc_wait_unit_attention(d, 1800, "STOP UNIT", 0);
d->is_stopped = 1; d->is_stopped = 1;

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -179,22 +179,10 @@ static void get_bytes(struct burn_track *track, int count, unsigned char *data)
if (!shortage) if (!shortage)
goto ex; goto ex;
/* ts A61031 - B10103 */ /* ts A61031 */
if (shortage >= count) if (shortage >= count)
track->track_data_done = 1; track->track_data_done = 1;
if (track->end_on_premature_eoi && shortage >= count && if (track->open_ended)
!track->open_ended) {
char msg[80];
/* Memorize that premature end of input happened */
sprintf(msg,
"Premature end of input encountered. Missing: %d bytes",
shortage);
libdax_msgs_submit(libdax_messenger, -1, 0x00020180,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
msg, 0,0);
track->end_on_premature_eoi = 2;
}
if (track->open_ended || track->end_on_premature_eoi)
goto ex; goto ex;
/* If we're still short, and there's a "next" pointer, we pull from that. /* If we're still short, and there's a "next" pointer, we pull from that.
@ -700,7 +688,7 @@ int sector_data(struct burn_write_opts *o, struct burn_track *t, int psub)
return 0; return 0;
/* ts A61031 */ /* ts A61031 */
if ((t->open_ended || t->end_on_premature_eoi) && t->track_data_done) { if (t->open_ended && t->track_data_done) {
unget_sector(o, t->mode); unget_sector(o, t->mode);
return 2; return 2;
} }

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* /*
Copyright (c) 2009 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2009 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -44,7 +44,6 @@ Present implementation: default dummy which enables libburn only to work
#include "debug.h" #include "debug.h"
#include "toc.h" #include "toc.h"
#include "util.h" #include "util.h"
#include "init.h"
#include "libdax_msgs.h" #include "libdax_msgs.h"
extern struct libdax_msgs *libdax_messenger; extern struct libdax_msgs *libdax_messenger;
@ -252,13 +251,12 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
struct statvfs vfsbuf; struct statvfs vfsbuf;
#endif #endif
char *testpath = NULL, *cpt; char testpath[4096], *cpt;
long blocks;
off_t add_size = 0; off_t add_size = 0;
int ret;
BURN_ALLOC_MEM(testpath, char, 4096);
testpath[0] = 0; testpath[0] = 0;
blocks = *bytes / 512;
if (stat(path, &stbuf) == -1) { if (stat(path, &stbuf) == -1) {
strcpy(testpath, path); strcpy(testpath, path);
cpt = strrchr(testpath, '/'); cpt = strrchr(testpath, '/');
@ -269,21 +267,18 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
else else
*cpt = 0; *cpt = 0;
if (stat(testpath, &stbuf) == -1) if (stat(testpath, &stbuf) == -1)
{ret = -1; goto ex;} return -1;
#ifdef Libburn_if_this_was_linuX #ifdef Libburn_if_this_was_linuX
} else if(S_ISBLK(stbuf.st_mode)) { } else if(S_ISBLK(stbuf.st_mode)) {
long blocks;
blocks = *bytes / 512;
fd = open(path, open_mode); fd = open(path, open_mode);
if (fd == -1) if (fd == -1)
{ret = -2; goto ex;} return -2;
ret = ioctl(fd, BLKGETSIZE, &blocks); ret = ioctl(fd, BLKGETSIZE, &blocks);
close(fd); close(fd);
if (ret == -1) if (ret == -1)
{ret = -2; goto ex;} return -2;
*bytes = ((off_t) blocks) * (off_t) 512; *bytes = ((off_t) blocks) * (off_t) 512;
#endif /* Libburn_if_this_was_linuX */ #endif /* Libburn_if_this_was_linuX */
@ -292,28 +287,25 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
add_size = stbuf.st_blocks * (off_t) 512; add_size = stbuf.st_blocks * (off_t) 512;
strcpy(testpath, path); strcpy(testpath, path);
} else } else
{ret = 0; goto ex;} return 0;
if (testpath[0]) { if (testpath[0]) {
#ifdef Libburn_os_has_statvfS #ifdef Libburn_os_has_statvfS
if (statvfs(testpath, &vfsbuf) == -1) if (statvfs(testpath, &vfsbuf) == -1)
{ret = -2; goto ex;} return -2;
*bytes = add_size + ((off_t) vfsbuf.f_frsize) * *bytes = add_size + ((off_t) vfsbuf.f_frsize) *
(off_t) vfsbuf.f_bavail; (off_t) vfsbuf.f_bavail;
#else /* Libburn_os_has_statvfS */ #else /* Libburn_os_has_statvfS */
{ret = 0; goto ex;} return 0;
#endif /* ! Libburn_os_has_stavtfS */ #endif /* ! Libburn_os_has_stavtfS */
} }
ret = 1; return 1;
ex:;
BURN_FREE_MEM(testpath);
return ret;
} }

View File

@ -1,14 +1,11 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* /*
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
/* THIS CODE IS NOT FUNCTIONAL YET !!! */
/* /*
This is the main operating system dependent SCSI part of libburn. It implements This is the main operating system dependent SCSI part of libburn. It implements
@ -163,7 +160,7 @@ static int sg_init_enumerator(burn_drive_enumerator_t *idx)
return -1; return -1;
} }
memset(&(idx->ccb), 0, sizeof(union ccb)); bzero(&(idx->ccb), sizeof(union ccb));
idx->ccb.ccb_h.path_id = CAM_XPT_PATH_ID; idx->ccb.ccb_h.path_id = CAM_XPT_PATH_ID;
idx->ccb.ccb_h.target_id = CAM_TARGET_WILDCARD; idx->ccb.ccb_h.target_id = CAM_TARGET_WILDCARD;
@ -172,10 +169,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;
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 *) idx->ccb.cdm.matches = (struct dev_match_result *)malloc(idx->bufsize);
calloc(1, idx->bufsize);
if (idx->ccb.cdm.matches == NULL) { if (idx->ccb.cdm.matches == NULL) {
warnx("cannot allocate memory for matches"); warnx("can't malloc memory for matches");
close(idx->fd); close(idx->fd);
return -1; return -1;
} }
@ -493,8 +489,10 @@ int sg_grab(struct burn_drive *d)
*/ */
int sg_release(struct burn_drive *d) int sg_release(struct burn_drive *d)
{ {
if (d->cam == NULL) if (d->cam == NULL) {
burn_print(1, "release an ungrabbed drive. die\n");
return 0; return 0;
}
sg_close_drive(d); sg_close_drive(d);
return 0; return 0;
} }
@ -721,12 +719,13 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
{ {
struct stat stbuf; struct stat stbuf;
struct statvfs vfsbuf; struct statvfs vfsbuf;
char *testpath = NULL, *cpt; char testpath[4096], *cpt;
long blocks;
int open_mode = O_RDWR, fd, ret;
off_t add_size = 0; off_t add_size = 0;
int fd, ret;
BURN_ALLOC_MEM(testpath, char, 4096);
testpath[0] = 0; testpath[0] = 0;
blocks = *bytes / 512;
if (stat(path, &stbuf) == -1) { if (stat(path, &stbuf) == -1) {
strcpy(testpath, path); strcpy(testpath, path);
cpt = strrchr(testpath, '/'); cpt = strrchr(testpath, '/');
@ -737,54 +736,38 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
else else
*cpt = 0; *cpt = 0;
if (stat(testpath, &stbuf) == -1) if (stat(testpath, &stbuf) == -1)
{ret = -1; goto ex;} return -1;
#ifdef Libburn_if_this_was_linuX #ifdef Libburn_if_this_was_linuX
} else if(S_ISBLK(stbuf.st_mode)) { } else if(S_ISBLK(stbuf.st_mode)) {
int open_mode = O_RDWR, fd, ret;
long blocks;
blocks = *bytes / 512;
if(burn_sg_open_o_excl) if(burn_sg_open_o_excl)
open_mode |= O_EXCL; open_mode |= O_EXCL;
fd = open(path, open_mode); fd = open(path, open_mode);
if (fd == -1) if (fd == -1)
{ret = -2; goto ex;} return -2;
ret = ioctl(fd, BLKGETSIZE, &blocks); ret = ioctl(fd, BLKGETSIZE, &blocks);
close(fd); close(fd);
if (ret == -1) if (ret == -1)
{ret = -2; goto ex;} return -2;
*bytes = ((off_t) blocks) * (off_t) 512; *bytes = ((off_t) blocks) * (off_t) 512;
#endif /* Libburn_if_this_was_linuX */ #endif /* Libburn_if_this_was_linuX */
} else if(S_ISCHR(stbuf.st_mode)) {
fd = open(path, O_RDONLY);
if (fd == -1)
{ret = -2; goto ex;}
ret = ioctl(fd, DIOCGMEDIASIZE, &add_size);
close(fd);
if (ret == -1)
{ret = -2; goto ex;}
*bytes = add_size;
} else if(S_ISREG(stbuf.st_mode)) { } else if(S_ISREG(stbuf.st_mode)) {
add_size = stbuf.st_blocks * (off_t) 512; add_size = stbuf.st_blocks * (off_t) 512;
strcpy(testpath, path); strcpy(testpath, path);
} else } else
{ret = 0; goto ex;} return 0;
if (testpath[0]) { if (testpath[0]) {
if (statvfs(testpath, &vfsbuf) == -1) if (statvfs(testpath, &vfsbuf) == -1)
{ret = -2; goto ex;} return -2;
*bytes = add_size + ((off_t) vfsbuf.f_frsize) * *bytes = add_size + ((off_t) vfsbuf.f_frsize) *
(off_t) vfsbuf.f_bavail; (off_t) vfsbuf.f_bavail;
} }
ret = 1; return 1;
ex:
BURN_FREE_MEM(testpath);
return ret;
} }

View File

@ -1,9 +1,8 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* /*
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later Provided under GPL version 2 or later.
and under FreeBSD license revised, i.e. without advertising clause.
*/ */
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
@ -55,7 +54,6 @@
#include "debug.h" #include "debug.h"
#include "toc.h" #include "toc.h"
#include "util.h" #include "util.h"
#include "init.h"
#include "libdax_msgs.h" #include "libdax_msgs.h"
extern struct libdax_msgs *libdax_messenger; extern struct libdax_msgs *libdax_messenger;
@ -162,21 +160,21 @@ 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 = calloc(1, sizeof(*idx)); idx = malloc(sizeof(*idx));
if (idx == NULL) { if (idx == NULL) {
warnx("cannot allocate memory for enumerator"); warnx("can't malloc 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("could not open %s", XPT_DEVICE); warn("couldn't open %s", XPT_DEVICE);
free(idx); free(idx);
idx = NULL; idx = NULL;
return -1; return -1;
} }
memset(&(idx->ccb), 0, sizeof(union ccb)); bzero(&(idx->ccb), sizeof(union ccb));
idx->ccb.ccb_h.path_id = CAM_XPT_PATH_ID; idx->ccb.ccb_h.path_id = CAM_XPT_PATH_ID;
idx->ccb.ccb_h.target_id = CAM_TARGET_WILDCARD; idx->ccb.ccb_h.target_id = CAM_TARGET_WILDCARD;
@ -185,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 *) calloc(1, bufsize); idx->ccb.cdm.matches = (struct dev_match_result *)malloc(bufsize);
if (idx->ccb.cdm.matches == NULL) { if (idx->ccb.cdm.matches == NULL) {
warnx("cannot allocate memory for matches"); warnx("can't malloc memory for matches");
close(idx->fd); close(idx->fd);
free(idx); free(idx);
return -1; return -1;
@ -489,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 = calloc(1, sizeof(struct burn_scsi_inquiry_data)); out.idata = malloc(sizeof(struct burn_scsi_inquiry_data));
out.idata->valid = 0; out.idata->valid = 0;
out.mdata = calloc(1, sizeof(struct scsi_mode_data)); out.mdata = malloc(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,
@ -508,9 +506,12 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
/* try to get the drive info */ /* try to get the drive info */
if (t->grab(t)) { if (t->grab(t)) {
burn_print(2, "getting drive info\n");
t->getcaps(t); t->getcaps(t);
t->unlock(t); t->unlock(t);
t->released = 1; t->released = 1;
} else {
burn_print(2, "unable to grab new located drive\n");
} }
/* ts A60821 /* ts A60821
@ -672,9 +673,8 @@ static int freebsd_dev_lock(int dev_fd, char *devname,
static int sg_lock(struct burn_drive *d, int flag) static int sg_lock(struct burn_drive *d, int flag)
{ {
int ret, os_errno, pass_dev_no = -1, flock_fd = -1; int ret, os_errno, pass_dev_no = -1, flock_fd = -1;
char *msg = NULL; char msg[4096];
BURN_ALLOC_MEM(msg, char, 4096);
ret = freebsd_dev_lock(d->cam->fd, d->devname, ret = freebsd_dev_lock(d->cam->fd, d->devname,
&os_errno, &pass_dev_no, &flock_fd, msg, 0); &os_errno, &pass_dev_no, &flock_fd, msg, 0);
if (ret <= 0) { if (ret <= 0) {
@ -683,15 +683,12 @@ static int sg_lock(struct burn_drive *d, int flag)
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, os_errno, 0); msg, os_errno, 0);
sg_close_drive(d); sg_close_drive(d);
{ret = 0; goto ex;} return 0;
} }
if (d->lock_fd > 0) if (d->lock_fd > 0)
close(d->lock_fd); close(d->lock_fd);
d->lock_fd = flock_fd; d->lock_fd = flock_fd;
ret = 1; return 1;
ex:;
BURN_FREE_MEM(msg);
return ret;
} }
@ -748,8 +745,10 @@ int sg_release(struct burn_drive *d)
if (mmc_function_spy(d, "sg_release") <= 0) if (mmc_function_spy(d, "sg_release") <= 0)
return 0; return 0;
if (d->cam == NULL) if (d->cam == NULL) {
burn_print(1, "release an ungrabbed drive. die\n");
return 0; return 0;
}
mmc_function_spy(NULL, "sg_release ----------- closing."); mmc_function_spy(NULL, "sg_release ----------- closing.");
@ -760,13 +759,15 @@ 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, i; int done = 0, err, sense_len = 0, ret, ignore_error, no_retry = 0;
int cam_pass_err_recover = 0, key, asc, ascq, timeout_ms; int cam_pass_err_recover = 0;
union ccb *ccb; union ccb *ccb;
char buf[161];
static FILE *fp = NULL; static FILE *fp = NULL;
time_t start_time;
mmc_function_spy(NULL, "sg_issue_command"); snprintf(buf, sizeof (buf), "sg_issue_command d->cam=%p d->released=%d",
(void*)d->cam, d->released);
mmc_function_spy(NULL, buf);
if (d->cam == NULL) { if (d->cam == NULL) {
c->error = 0; c->error = 0;
@ -853,9 +854,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
ccb->csio.dxfer_len = 0; ccb->csio.dxfer_len = 0;
} }
start_time = time(NULL); do {
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);
@ -865,12 +864,11 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
/* ts B00110 */ /* ts B00110 */
/* Better curb sense_len */ /* Better curb sense_len */
sense_len = ccb->csio.sense_len; sense_len = ccb->csio.sense_len;
if (sense_len > (int) 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);
spc_decode_sense(c->sense, sense_len, if (sense_len >= 14 && cam_pass_err_recover &&
&key, &asc, &ascq); (c->sense[2] & 0x0f))
if (sense_len >= 14 && cam_pass_err_recover && key)
ignore_error = 1; ignore_error = 1;
} }
@ -888,7 +886,6 @@ 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;
@ -904,7 +901,6 @@ 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;
@ -918,7 +914,6 @@ 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;
@ -949,26 +944,44 @@ 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;
done = 1; no_retry = 1;
}
if (no_retry || ignore_error || !c->retry) {
c->error = 1;
{ret = 1; goto ex;}
}
switch (scsi_error(d, c->sense, 0)) {
case RETRY:
done = 0;
if (burn_sg_log_scsi & 3) {
/* >>> Need own duration time
measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0,
(c->error != 0) | 2);
scsi_log_cmd(c,fp,0);
}
break;
case FAIL:
done = 1;
c->error = 1;
break;
} }
/* >>> Need own duration time measurement.
Then remove bit1 from flag.
*/
done = scsi_eval_cmd_outcome(d, c, fp, c->sense,
sense_len, 0, start_time,
timeout_ms, i,
2 | !!ignore_error);
} else { } else {
done = 1; done = 1;
} }
} while (!done); } while (!done);
ret = 1; ret = 1;
ex:; ex:;
if (c->error)
scsi_notify_error(d, c, c->sense, 18, 0);
if (burn_sg_log_scsi & 3)
/* >>> Need own duration time measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0, (c->error != 0) | 2);
cam_freeccb(ccb); cam_freeccb(ccb);
return ret; return ret;
} }
@ -981,13 +994,8 @@ ex:;
int burn_os_is_2k_seekrw(char *path, int flag) int burn_os_is_2k_seekrw(char *path, int flag)
{ {
struct stat stbuf; struct stat stbuf;
#ifdef Libburn_DIOCGMEDIASIZE_ISBLK
int fd, ret;
off_t add_size;
#else
char *spt; char *spt;
int i, e; int i, e;
#endif /* ! Libburn_DIOCGMEDIASIZE_ISBLK */
if (stat(path, &stbuf) == -1) if (stat(path, &stbuf) == -1)
return 0; return 0;
@ -995,22 +1003,6 @@ 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 (ret != -1);
#else /* Libburn_DIOCGMEDIASIZE_ISBLK */
spt = strrchr(path, '/'); spt = strrchr(path, '/');
if (spt == NULL) if (spt == NULL)
spt = path; spt = path;
@ -1033,9 +1025,6 @@ 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 */
} }
@ -1053,12 +1042,13 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
{ {
struct stat stbuf; struct stat stbuf;
struct statvfs vfsbuf; struct statvfs vfsbuf;
char *testpath = NULL, *cpt; char testpath[4096], *cpt;
long blocks;
off_t add_size = 0; off_t add_size = 0;
int fd, ret; int fd, ret;
BURN_ALLOC_MEM(testpath, char, 4096);
testpath[0] = 0; testpath[0] = 0;
blocks = *bytes / 512;
if (stat(path, &stbuf) == -1) { if (stat(path, &stbuf) == -1) {
strcpy(testpath, path); strcpy(testpath, path);
cpt = strrchr(testpath, '/'); cpt = strrchr(testpath, '/');
@ -1069,24 +1059,22 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
else else
*cpt = 0; *cpt = 0;
if (stat(testpath, &stbuf) == -1) if (stat(testpath, &stbuf) == -1)
{ret = -1; goto ex;} return -1;
#ifdef Libburn_if_this_was_linuX #ifdef Libburn_if_this_was_linuX
} else if(S_ISBLK(stbuf.st_mode)) { } else if(S_ISBLK(stbuf.st_mode)) {
int open_mode = O_RDWR, fd, ret; int open_mode = O_RDWR, fd, ret;
long blocks;
blocks = *bytes / 512;
if(burn_sg_open_o_excl) if(burn_sg_open_o_excl)
open_mode |= O_EXCL; open_mode |= O_EXCL;
fd = open(path, open_mode); fd = open(path, open_mode);
if (fd == -1) if (fd == -1)
{ret = -2; goto ex;} return -2;
ret = ioctl(fd, BLKGETSIZE, &blocks); ret = ioctl(fd, BLKGETSIZE, &blocks);
close(fd); close(fd);
if (ret == -1) if (ret == -1)
{ret = -2; goto ex;} return -2;
*bytes = ((off_t) blocks) * (off_t) 512; *bytes = ((off_t) blocks) * (off_t) 512;
#endif /* Libburn_if_this_was_linuX */ #endif /* Libburn_if_this_was_linuX */
@ -1095,28 +1083,25 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
} else if(S_ISCHR(stbuf.st_mode)) { } else if(S_ISCHR(stbuf.st_mode)) {
fd = open(path, O_RDONLY); fd = open(path, O_RDONLY);
if (fd == -1) if (fd == -1)
{ret = -2; goto ex;} return -2;
ret = ioctl(fd, DIOCGMEDIASIZE, &add_size); ret = ioctl(fd, DIOCGMEDIASIZE, &add_size);
close(fd); close(fd);
if (ret == -1) if (ret == -1)
{ret = -2; goto ex;} return -2;
*bytes = add_size; *bytes = add_size;
} else if(S_ISREG(stbuf.st_mode)) { } else if(S_ISREG(stbuf.st_mode)) {
add_size = stbuf.st_blocks * (off_t) 512; add_size = stbuf.st_blocks * (off_t) 512;
strcpy(testpath, path); strcpy(testpath, path);
} else } else
{ret = 0; goto ex;} return 0;
if (testpath[0]) { if (testpath[0]) {
if (statvfs(testpath, &vfsbuf) == -1) if (statvfs(testpath, &vfsbuf) == -1)
{ret = -2; goto ex;} return -2;
*bytes = add_size + ((off_t) vfsbuf.f_frsize) * *bytes = add_size + ((off_t) vfsbuf.f_frsize) *
(off_t) vfsbuf.f_bavail; (off_t) vfsbuf.f_bavail;
} }
ret = 1; return 1;
ex:
BURN_FREE_MEM(testpath);
return ret;
} }

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* /*
Copyright (c) 2009 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -142,9 +142,6 @@ Send feedback to libburn-hackers@pykix.org .
#define Libburn_is_on_solariS 1 #define Libburn_is_on_solariS 1
#endif #endif
/* Proposal by Rocky Bernstein to avoid macro clashes with cdio_config.h */
#define __CDIO_CONFIG_H__ 1
#include <cdio/cdio.h> #include <cdio/cdio.h>
#include <cdio/logging.h> #include <cdio/logging.h>
#include <cdio/mmc.h> #include <cdio/mmc.h>
@ -171,7 +168,6 @@ Send feedback to libburn-hackers@pykix.org .
#include "debug.h" #include "debug.h"
#include "toc.h" #include "toc.h"
#include "util.h" #include "util.h"
#include "init.h"
#include "libdax_msgs.h" #include "libdax_msgs.h"
extern struct libdax_msgs *libdax_messenger; extern struct libdax_msgs *libdax_messenger;
@ -262,7 +258,7 @@ try_next:;
} }
#endif #endif
if ((ssize_t) strlen(*(idx->pos)) >= adr_size) if (strlen(*(idx->pos)) >= adr_size)
return -1; return -1;
strcpy(adr, *(idx->pos)); strcpy(adr, *(idx->pos));
(idx->pos)++; (idx->pos)++;
@ -433,18 +429,14 @@ 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, path_size = 4096; int ret, recursion_count = 0, l;
char *path = NULL; char path[4096];
#ifdef Libburn_is_on_solariS
int l;
#endif
BURN_ALLOC_MEM(path, char, path_size);
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)
goto ex; return ret;
if ((ssize_t) strlen(adr) >= path_size) if (strlen(adr) >= sizeof(path))
goto ex; return ret;
#ifdef Libburn_is_on_solariS #ifdef Libburn_is_on_solariS
/* >>> provisory : preserve Solaris /dev/rdsk/cXtYdZs2 addresses */ /* >>> provisory : preserve Solaris /dev/rdsk/cXtYdZs2 addresses */
@ -452,16 +444,13 @@ int sg_give_next_adr(burn_drive_enumerator_t *idx,
if (l >= 18) if (l >= 18)
if (strncmp(adr, "/dev/rdsk/c", 11) == 0 && adr[11] >= '0' && if (strncmp(adr, "/dev/rdsk/c", 11) == 0 && adr[11] >= '0' &&
adr[11] <= '9' && strcmp(adr + (l - 2), "s2") == 0) adr[11] <= '9' && strcmp(adr + (l - 2), "s2") == 0)
{ret = 1; goto ex;} return 1;
#endif /* Libburn_is_on_solariS */ #endif /* Libburn_is_on_solariS */
ret = burn_drive_resolve_link(adr, path, &recursion_count, 2); ret = burn_drive_resolve_link(adr, path, &recursion_count, 2);
if(ret > 0 && (ssize_t) strlen(path) < adr_size) if(ret > 0 && strlen(path) < adr_size)
strcpy(adr, path); strcpy(path, adr);
ret = (ret >= 0); return (ret >= 0);
ex:
BURN_FREE_MEM(path);
return ret;
} }
@ -471,19 +460,12 @@ ex:
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; int initialize = 1, ret, i_bus_no = -1, recursion_count = 0, l;
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;
int buf_size = 4096; char buf[4096], target[4096];
char *buf = NULL, *target = NULL;
#ifdef Libburn_is_on_solariS
int l;
#endif
BURN_ALLOC_MEM(buf, char, buf_size);
BURN_ALLOC_MEM(target, char, buf_size);
while(1) { while(1) {
ret = sg_give_next_adr_raw(&idx, buf, buf_size, initialize); ret = sg_give_next_adr_raw(&idx, buf, sizeof(buf), initialize);
initialize = 0; initialize = 0;
if (ret <= 0) if (ret <= 0)
break; break;
@ -513,12 +495,8 @@ int scsi_enumerate_drives(void)
i_bus_no, i_host_no, i_channel_no, i_bus_no, i_host_no, i_channel_no,
i_target_no, i_lun_no); i_target_no, i_lun_no);
} }
sg_give_next_adr(&idx, buf, buf_size, -1); sg_give_next_adr(&idx, buf, sizeof(buf), -1);
ret = 1; return 1;
ex:;
BURN_FREE_MEM(buf);
BURN_FREE_MEM(target);
return ret;
} }
@ -542,12 +520,12 @@ int sg_drive_is_open(struct burn_drive * d)
int sg_grab(struct burn_drive *d) int sg_grab(struct burn_drive *d)
{ {
CdIo_t *p_cdio; CdIo_t *p_cdio;
char *am_eff, *msg = NULL, *am_wanted; char *am_eff, msg[4096], *am_wanted;
int os_errno, second_try = 0, ret; int os_errno, second_try = 0;
if (d->p_cdio != NULL) { if (d->p_cdio != NULL) {
d->released = 0; d->released = 0;
{ret = 1; goto ex;} return 1;
} }
if (d->libcdio_name[0] == 0) /* just to be sure it is initialized */ if (d->libcdio_name[0] == 0) /* just to be sure it is initialized */
strcpy(d->libcdio_name, d->devname); strcpy(d->libcdio_name, d->devname);
@ -555,14 +533,13 @@ int sg_grab(struct burn_drive *d)
try_to_open:; try_to_open:;
p_cdio = cdio_open_am(d->libcdio_name, DRIVER_DEVICE, am_wanted); p_cdio = cdio_open_am(d->libcdio_name, DRIVER_DEVICE, am_wanted);
if (p_cdio == NULL) { if (p_cdio == NULL) {
BURN_ALLOC_MEM(msg, char, 4096);
os_errno = errno; os_errno = errno;
sprintf(msg, "Could not grab drive '%s'", d->devname); sprintf(msg, "Could not grab drive '%s'", d->devname);
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020003, 0x00020003,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, os_errno, 0); msg, os_errno, 0);
{ret = 0; goto ex;} return 0;
} }
am_eff = (char *) cdio_get_arg(p_cdio, "access-mode"); am_eff = (char *) cdio_get_arg(p_cdio, "access-mode");
if (strncmp(am_eff, "MMC_RDWR", 8) != 0) { if (strncmp(am_eff, "MMC_RDWR", 8) != 0) {
@ -577,15 +554,12 @@ try_to_open:;
0x00020003, 0x00020003,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"libcdio provides no MMC_RDWR access mode", 0, 0); "libcdio provides no MMC_RDWR access mode", 0, 0);
{ret = 0; goto ex;} return 0;
} }
d->p_cdio = p_cdio; d->p_cdio = p_cdio;
d->released = 0; d->released = 0;
ret = 1; return 1;
ex:;
BURN_FREE_MEM(msg);
return ret;
} }
@ -597,8 +571,10 @@ ex:;
*/ */
int sg_release(struct burn_drive *d) int sg_release(struct burn_drive *d)
{ {
if (d->p_cdio == NULL) if (d->p_cdio == NULL) {
burn_print(1, "release an ungrabbed drive. die\n");
return 0; return 0;
}
sg_close_drive(d); sg_close_drive(d);
return 0; return 0;
} }
@ -615,8 +591,7 @@ 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, timeout_ms, sense_len; int sense_valid = 0, i, usleep_time, 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;
@ -624,7 +599,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
mmc_cdb_t cdb = {{0, }}; mmc_cdb_t cdb = {{0, }};
cdio_mmc_direction_t e_direction; cdio_mmc_direction_t e_direction;
CdIo_t *p_cdio; CdIo_t *p_cdio;
cdio_mmc_request_sense_t *sense_pt = NULL; unsigned char *sense_pt = NULL;
c->error = 0; c->error = 0;
if (d->p_cdio == NULL) { if (d->p_cdio == NULL) {
@ -661,18 +636,15 @@ 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; !done; i++) { for(i = 0; ; 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, (unsigned char *) sense_pt, memcpy(c->sense, sense_pt,
(size_t) sense_valid >= sizeof(c->sense) ? sense_valid >= sizeof(c->sense) ?
sizeof(c->sense) : (size_t) 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);
@ -694,26 +666,62 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
} }
*/ */
if ((!sense_valid) || (key == 0 && asc == 0 && ascq == 0)) { if ((!sense_valid) ||
((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;
done = 1; no_retry = 1;
} }
} } else
if (key || asc || ascq) c->sense[2] &= 15;
sense_len = 18;
else if (i_status != 0 ||
sense_len = 0; (c->sense[2] || c->sense[12] || c->sense[13])) {
done = scsi_eval_cmd_outcome(d, c, fp, c->sense, sense_len, if (no_retry || !c->retry) {
0, start_time, timeout_ms, i, 2); c->error = 1;
goto ex;
}
switch (scsi_error(d, c->sense, 18)) {
case RETRY:
if (burn_sg_log_scsi & 3) {
/* >>> Need own duration time
measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0,
(c->error != 0) | 2);
scsi_log_cmd(c,fp,0);
}
break;
case FAIL:
c->error = 1;
goto ex;
}
/*
Calming down retries and breaking up endless cycle
*/
usleep_time = Libburn_sg_libcdio_retry_usleeP +
i * Libburn_sg_libcdio_retry_incR;
if (time(NULL) + usleep_time / 1000000 - start_time >
timeout_ms / 1000 + 1) {
c->error = 1;
goto ex;
}
usleep(usleep_time);
} else
break; /* retry-loop */
} /* end of retry-loop */ } /* end of retry-loop */
ex:;
if (c->error)
scsi_notify_error(d, c, c->sense, 18, 0);
if (burn_sg_log_scsi & 3)
/* >>> Need own duration time measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0, (c->error != 0) | 2);
return 1; return 1;
} }
@ -861,12 +869,12 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
struct statvfs vfsbuf; struct statvfs vfsbuf;
#endif #endif
char *testpath = NULL, *cpt; char testpath[4096], *cpt;
long blocks;
off_t add_size = 0; off_t add_size = 0;
int ret;
BURN_ALLOC_MEM(testpath, char, 4096);
testpath[0] = 0; testpath[0] = 0;
blocks = *bytes / 512;
if (stat(path, &stbuf) == -1) { if (stat(path, &stbuf) == -1) {
strcpy(testpath, path); strcpy(testpath, path);
cpt = strrchr(testpath, '/'); cpt = strrchr(testpath, '/');
@ -877,23 +885,21 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
else else
*cpt = 0; *cpt = 0;
if (stat(testpath, &stbuf) == -1) if (stat(testpath, &stbuf) == -1)
{ret = -1; goto ex;} return -1;
#ifdef __linux #ifdef __linux
/* GNU/Linux specific determination of block device size */ /* GNU/Linux specific determination of block device size */
} else if(S_ISBLK(stbuf.st_mode)) { } else if(S_ISBLK(stbuf.st_mode)) {
int open_mode = O_RDONLY, fd; int open_mode = O_RDONLY, fd, ret;
long blocks;
blocks = *bytes / 512;
fd = open(path, open_mode); fd = open(path, open_mode);
if (fd == -1) if (fd == -1)
{ret = -2; goto ex;} return -2;
ret = ioctl(fd, BLKGETSIZE, &blocks); ret = ioctl(fd, BLKGETSIZE, &blocks);
close(fd); close(fd);
if (ret == -1) if (ret == -1)
{ret = -2; goto ex;} return -2;
*bytes = ((off_t) blocks) * (off_t) 512; *bytes = ((off_t) blocks) * (off_t) 512;
#endif /* __linux */ #endif /* __linux */
@ -901,15 +907,15 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
#ifdef Libburn_is_on_freebsD #ifdef Libburn_is_on_freebsD
} else if(S_ISCHR(stbuf.st_mode)) { } else if(S_ISCHR(stbuf.st_mode)) {
int fd; int fd, ret;
fd = open(path, O_RDONLY); fd = open(path, O_RDONLY);
if (fd == -1) if (fd == -1)
{ret = -2; goto ex;} return -2;
ret = ioctl(fd, DIOCGMEDIASIZE, &add_size); ret = ioctl(fd, DIOCGMEDIASIZE, &add_size);
close(fd); close(fd);
if (ret == -1) if (ret == -1)
{ret = -2; goto ex;} return -2;
*bytes = add_size; *bytes = add_size;
#endif /* Libburn_is_on_freebsD */ #endif /* Libburn_is_on_freebsD */
@ -921,12 +927,12 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
fd = open(path, open_mode); fd = open(path, open_mode);
if (fd == -1) if (fd == -1)
{ret = -2; goto ex;} return -2;
*bytes = lseek(fd, 0, SEEK_END); *bytes = lseek(fd, 0, SEEK_END);
close(fd); close(fd);
if (*bytes == -1) { if (*bytes == -1) {
*bytes = 0; *bytes = 0;
{ret = 0; goto ex;} return 0;
} }
#endif /* Libburn_is_on_solariS */ #endif /* Libburn_is_on_solariS */
@ -935,28 +941,25 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
add_size = stbuf.st_blocks * (off_t) 512; add_size = stbuf.st_blocks * (off_t) 512;
strcpy(testpath, path); strcpy(testpath, path);
} else } else
{ret = 0; goto ex;} return 0;
if (testpath[0]) { if (testpath[0]) {
#ifdef Libburn_os_has_statvfS #ifdef Libburn_os_has_statvfS
if (statvfs(testpath, &vfsbuf) == -1) if (statvfs(testpath, &vfsbuf) == -1)
{ret = -2; goto ex;} return -2;
*bytes = add_size + ((off_t) vfsbuf.f_frsize) * *bytes = add_size + ((off_t) vfsbuf.f_frsize) *
(off_t) vfsbuf.f_bavail; (off_t) vfsbuf.f_bavail;
#else /* Libburn_os_has_statvfS */ #else /* Libburn_os_has_statvfS */
{ret = 0; goto ex;} return 0;
#endif /* ! Libburn_os_has_stavtfS */ #endif /* ! Libburn_os_has_stavtfS */
} }
ret = 1; return 1;
ex:;
BURN_FREE_MEM(testpath);
return ret;
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* /*
Copyright (c) 2010 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -140,7 +140,6 @@ Send feedback to libburn-hackers@pykix.org .
#include "debug.h" #include "debug.h"
#include "toc.h" #include "toc.h"
#include "util.h" #include "util.h"
#include "init.h"
#include "libdax_msgs.h" #include "libdax_msgs.h"
extern struct libdax_msgs *libdax_messenger; extern struct libdax_msgs *libdax_messenger;
@ -250,14 +249,12 @@ static int start_enum_cXtYdZs2(burn_drive_enumerator_t *idx, int flag)
static int next_enum_cXtYdZs2(burn_drive_enumerator_t *idx, static int next_enum_cXtYdZs2(burn_drive_enumerator_t *idx,
char adr[], int adr_size, int flag) char adr[], int adr_size, int flag)
{ {
int busno, tgtno, lunno, ret, fd = -1, volpath_size = 160; int busno, tgtno, lunno, ret, fd = -1;
char *volpath = NULL; char volpath[160];
struct dirent *entry; struct dirent *entry;
struct dk_cinfo cinfo; struct dk_cinfo cinfo;
DIR *dir; DIR *dir;
BURN_ALLOC_MEM(volpath, char, volpath_size);
dir = idx->dir; dir = idx->dir;
while (1) { while (1) {
errno = 0; errno = 0;
@ -269,11 +266,11 @@ static int next_enum_cXtYdZs2(burn_drive_enumerator_t *idx,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Cannot enumerate next device. readdir() from \"/dev/rdsk\" failed.", "Cannot enumerate next device. readdir() from \"/dev/rdsk\" failed.",
errno, 0); errno, 0);
{ret = -1; goto ex;} return -1;
} }
break; break;
} }
if (strlen(entry->d_name) > (size_t) (volpath_size - 11)) if (strlen(entry->d_name) > sizeof(volpath) - 11)
continue; continue;
ret = decode_btl_solaris(entry->d_name, ret = decode_btl_solaris(entry->d_name,
&busno, &tgtno, &lunno, 0); &busno, &tgtno, &lunno, 0);
@ -294,15 +291,12 @@ static int next_enum_cXtYdZs2(burn_drive_enumerator_t *idx,
continue; continue;
if (cinfo.dki_ctype != DKC_CDROM) if (cinfo.dki_ctype != DKC_CDROM)
continue; continue;
if (adr_size <= (int) strlen(volpath)) if (adr_size <= strlen(volpath))
{ret = -1; goto ex;} return -1;
strcpy(adr, volpath); strcpy(adr, volpath);
{ret = 1; goto ex;} return 1;
} }
ret = 0; return 0;
ex:;
BURN_FREE_MEM(volpath);
return ret;
} }
@ -463,14 +457,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, buf_size = 4096; int initialize = 1, ret, i_bus_no = -1;
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 = NULL; char buf[4096];
BURN_ALLOC_MEM(buf, char, buf_size);
while(1) { while(1) {
ret = sg_give_next_adr(&idx, buf, buf_size, initialize); ret = sg_give_next_adr(&idx, buf, sizeof(buf), initialize);
initialize = 0; initialize = 0;
if (ret <= 0) if (ret <= 0)
break; break;
@ -482,11 +474,8 @@ int scsi_enumerate_drives(void)
i_bus_no, i_host_no, i_channel_no, i_bus_no, i_host_no, i_channel_no,
i_target_no, i_lun_no); i_target_no, i_lun_no);
} }
sg_give_next_adr(&idx, buf, buf_size, -1); sg_give_next_adr(&idx, buf, sizeof(buf), -1);
ret = 1; return 1;
ex:;
BURN_FREE_MEM(buf);
return ret;
} }
@ -509,15 +498,13 @@ int sg_drive_is_open(struct burn_drive * d)
*/ */
int sg_grab(struct burn_drive *d) int sg_grab(struct burn_drive *d)
{ {
char *msg = NULL; char msg[4096];
int os_errno, ret; int os_errno, ret;
struct dk_cinfo cinfo; struct dk_cinfo cinfo;
BURN_ALLOC_MEM(msg, char, 4096);
if (d->fd != -1) { if (d->fd != -1) {
d->released = 0; d->released = 0;
{ret = 1; goto ex;} return 1;
} }
d->fd = open(d->devname, O_RDONLY | O_NDELAY); d->fd = open(d->devname, O_RDONLY | O_NDELAY);
if (d->fd == -1) { if (d->fd == -1) {
@ -527,7 +514,7 @@ int sg_grab(struct burn_drive *d)
0x00020003, 0x00020003,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, os_errno, 0); msg, os_errno, 0);
{ret = 0; goto ex;} return 0;
} }
ret = ioctl(d->fd, DKIOCINFO, &cinfo); ret = ioctl(d->fd, DKIOCINFO, &cinfo);
if (ret < 0) if (ret < 0)
@ -538,7 +525,7 @@ int sg_grab(struct burn_drive *d)
/* >>> obtain eventual locks */; /* >>> obtain eventual locks */;
d->released = 0; d->released = 0;
{ret = 1; goto ex;} return 1;
revoke:; revoke:;
sprintf(msg, "Could not grab drive '%s'. Not a CDROM device.", sprintf(msg, "Could not grab drive '%s'. Not a CDROM device.",
d->devname); d->devname);
@ -546,10 +533,7 @@ revoke:;
0x00020003, 0x00020003,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
ret = 0; return 0;
ex:;
BURN_FREE_MEM(msg);
return ret;
} }
@ -561,8 +545,10 @@ ex:;
*/ */
int sg_release(struct burn_drive *d) int sg_release(struct burn_drive *d)
{ {
if (d->fd < 0) if (d->fd < 0) {
burn_print(1, "release an ungrabbed drive. die\n");
return 0; return 0;
}
sg_close_drive(d); sg_close_drive(d);
return 0; return 0;
} }
@ -579,7 +565,7 @@ 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, timeout_ms, ret, key, asc, ascq, done = 0, sense_len; int i, usleep_time, timeout_ms, no_retry = 0, ret;
time_t start_time; time_t start_time;
struct uscsi_cmd cgc; struct uscsi_cmd cgc;
char msg[80]; char msg[80];
@ -630,7 +616,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; !done; i++) { for(i = 0; ; i++) {
ret = ioctl(d->fd, USCSICMD, &cgc); ret = ioctl(d->fd, USCSICMD, &cgc);
@ -653,22 +639,51 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
return -1; return -1;
} }
c->sense[2] &= 15;
/* >>> Should replace "18" by realistic sense length.
What's about following older remark ?
*/
/* >>> valid sense: cgc.uscsi_rqlen - cgc.uscsi_rqresid */; /* >>> valid sense: cgc.uscsi_rqlen - cgc.uscsi_rqresid */;
spc_decode_sense(c->sense, 0, &key, &asc, &ascq); if (c->sense[2] || c->sense[12] || c->sense[13]) {
if (key || asc || ascq) if (no_retry || !c->retry) {
sense_len = 18; c->error = 1;
else goto ex;
sense_len = 0; }
done = scsi_eval_cmd_outcome(d, c, fp, c->sense, sense_len, 0, switch (scsi_error(d, c->sense, 18)) {
start_time, timeout_ms, i, 2); case RETRY:
if (burn_sg_log_scsi & 3) {
/* >>> Need own duration time
measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0,
(c->error != 0) | 2);
scsi_log_cmd(c,fp,0);
}
break;
case FAIL:
c->error = 1;
goto ex;
}
/*
Calming down retries and breaking up endless cycle
*/
usleep_time = Libburn_sg_solaris_retry_usleeP +
i * Libburn_sg_solaris_retry_incR;
if (time(NULL) + usleep_time / 1000000 - start_time >
timeout_ms / 1000 + 1) {
c->error = 1;
goto ex;
}
usleep(usleep_time);
} else
break; /* retry-loop */
} /* end of retry-loop */ } /* end of retry-loop */
ex:;
if (c->error)
scsi_notify_error(d, c, c->sense, 18, 0);
if (burn_sg_log_scsi & 3)
/* >>> Need own duration time measurement. Then remove bit1 */
scsi_log_err(c, fp, c->sense, 0, (c->error != 0) | 2);
return 1; return 1;
} }
@ -702,27 +717,6 @@ 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;
@ -742,8 +736,6 @@ 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 */
@ -777,18 +769,17 @@ int burn_os_is_2k_seekrw(char *path, int flag)
int burn_os_stdio_capacity(char *path, off_t *bytes) int burn_os_stdio_capacity(char *path, off_t *bytes)
{ {
struct stat stbuf; struct stat stbuf;
int ret;
#ifdef Libburn_os_has_statvfS #ifdef Libburn_os_has_statvfS
struct statvfs vfsbuf; struct statvfs vfsbuf;
#endif #endif
char *testpath = NULL, *cpt; char testpath[4096], *cpt;
long blocks;
off_t add_size = 0; off_t add_size = 0;
BURN_ALLOC_MEM(testpath, char, 4096);
testpath[0] = 0; testpath[0] = 0;
blocks = *bytes / 512;
if (stat(path, &stbuf) == -1) { if (stat(path, &stbuf) == -1) {
strcpy(testpath, path); strcpy(testpath, path);
cpt = strrchr(testpath, '/'); cpt = strrchr(testpath, '/');
@ -799,47 +790,44 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
else else
*cpt = 0; *cpt = 0;
if (stat(testpath, &stbuf) == -1) if (stat(testpath, &stbuf) == -1)
{ret = -1; goto ex;} return -1;
} else if(S_ISBLK(stbuf.st_mode)) { } else if(S_ISBLK(stbuf.st_mode)) {
int open_mode = O_RDONLY, fd; int open_mode = O_RDONLY, fd;
fd = open(path, open_mode); fd = open(path, open_mode);
if (fd == -1) if (fd == -1)
{ret = -2; goto ex;} return -2;
*bytes = lseek(fd, 0, SEEK_END); *bytes = lseek(fd, 0, SEEK_END);
close(fd); close(fd);
if (*bytes == -1) { if (*bytes == -1) {
*bytes = 0; *bytes = 0;
{ret = 0; goto ex;} return 0;
} }
} else if(S_ISREG(stbuf.st_mode)) { } else if(S_ISREG(stbuf.st_mode)) {
add_size = stbuf.st_blocks * (off_t) 512; add_size = stbuf.st_blocks * (off_t) 512;
strcpy(testpath, path); strcpy(testpath, path);
} else } else
{ret = 0; goto ex;} return 0;
if (testpath[0]) { if (testpath[0]) {
#ifdef Libburn_os_has_statvfS #ifdef Libburn_os_has_statvfS
if (statvfs(testpath, &vfsbuf) == -1) if (statvfs(testpath, &vfsbuf) == -1)
{ret = -2; goto ex;} return -2;
*bytes = add_size + ((off_t) vfsbuf.f_frsize) * *bytes = add_size + ((off_t) vfsbuf.f_frsize) *
(off_t) vfsbuf.f_bavail; (off_t) vfsbuf.f_bavail;
#else /* Libburn_os_has_statvfS */ #else /* Libburn_os_has_statvfS */
{ret = 0; goto ex;} return 0;
#endif /* ! Libburn_os_has_stavtfS */ #endif /* ! Libburn_os_has_stavtfS */
} }
ret = 1; return 1;
ex:;
BURN_FREE_MEM(testpath);
return ret;
} }

View File

@ -23,20 +23,12 @@
#else #else
#ifdef __FreeBSD__ #ifdef __FreeBSD__
#ifdef Libburn_use_sg_freebsd_porT
#include "sg-freebsd-port.c"
#else
#include "sg-freebsd.c" #include "sg-freebsd.c"
#endif
#else #else
#ifdef __FreeBSD_kernel__ #ifdef __FreeBSD_kernel__
#ifdef Libburn_use_sg_freebsd_porT
#include "sg-freebsd-port.c"
#else
#include "sg-freebsd.c" #include "sg-freebsd.c"
#endif
#else #else
#ifdef __linux #ifdef __linux
@ -58,11 +50,11 @@
static int intentional_compiler_warning(void) static int intentional_compiler_warning(void)
{ {
int INTENTIONAL_COMPILER_WARNING_; int INTENTIONAL_COMPILER_WARNING_;
int Cannot_recognize_GNU_Linux_nor_FreeBSD_nor_Solaris_; int Cannot_recognize_GNU_Linux_nor_FreeBSD_;
int Have_to_use_dummy_MMC_transport_adapter_; int Have_to_use_dummy_MMC_transport_adapter_;
int This_libburn_will_not_be_able_to_operate_on_real_CD_drives; int This_libburn_will_not_be_able_to_operate_on_real_CD_drives;
int Have_to_use_dummy_MMC_transport_adapter; int Have_to_use_dummy_MMC_transport_adapter;
int Cannot_recognize_GNU_Linux_nor_FreeBSD_nor_Solaris; int Cannot_recognize_GNU_Linux_nor_FreeBSD;
int INTENTIONAL_COMPILER_WARNING; int INTENTIONAL_COMPILER_WARNING;
return(0); return(0);

View File

@ -63,15 +63,3 @@ 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,6 +7,4 @@ 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*/

File diff suppressed because it is too large Load Diff

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, GO_ON }; enum response { RETRY, FAIL };
enum response scsi_error(struct burn_drive *, unsigned char *, int); enum response scsi_error(struct burn_drive *, unsigned char *, int);
/* ts A61122 */ /* ts A61122 */
@ -68,54 +68,17 @@ int scsi_init_command(struct command *c, unsigned char *opcode, int oplen);
/* ts A91106 */ /* ts A91106 */
int scsi_show_cmd_text(struct command *c, void *fp, int flag); int scsi_show_cmd_text(struct command *c, void *fp, int flag);
/* ts B11110 */ /* ts A91106 */
/** Logs command (before execution). */ int scsi_show_cmd_reply(struct command *c, void *fp, int flag);
int scsi_log_command(unsigned char *opcode, int oplen, int data_dir,
unsigned char *data, int bytes,
void *fp_in, int flag);
/* ts A91218 (former sg_log_cmd ts A70518) */ /* ts A91218 (former sg_log_cmd ts A70518) */
/** Legacy frontend to scsi_log_command() */ /** Logs command (before execution) */
int scsi_log_cmd(struct command *c, void *fp, int flag); int scsi_log_cmd(struct command *c, void *fp, int flag);
/* ts B11110 */
/** Logs outcome of a sg command.
@param flag bit0 causes an error message
bit1 do not print duration
*/
int scsi_log_reply(unsigned char *opcode, int data_dir, unsigned char *data,
int dxfer_len, void *fp_in, unsigned char sense[18],
int sense_len, int duration, int flag);
/* ts A91221 (former sg_log_err ts A91108) */ /* ts A91221 (former sg_log_err ts A91108) */
/** Legacy frontend to scsi_log_reply(). /** Logs outcome of a sg command. */
@param flag bit0 causes an error message
bit1 do not print duration
*/
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 sense_len, int duration, int flag); 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

@ -1,6 +1,6 @@
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -18,7 +18,6 @@
#include "structure.h" #include "structure.h"
#include "write.h" #include "write.h"
#include "debug.h" #include "debug.h"
#include "init.h"
#include "libdax_msgs.h" #include "libdax_msgs.h"
extern struct libdax_msgs *libdax_messenger; extern struct libdax_msgs *libdax_messenger;
@ -34,7 +33,7 @@ extern struct libdax_msgs *libdax_messenger;
return 0;\ return 0;\
if (pos == BURN_POS_END)\ if (pos == BURN_POS_END)\
pos = TO->NEW##s;\ pos = TO->NEW##s;\
if ((int) pos > TO->NEW##s)\ if (pos > TO->NEW##s)\
return 0;\ return 0;\
\ \
tmp = realloc(TO->NEW, sizeof(struct NEW *) * (TO->NEW##s + 1));\ tmp = realloc(TO->NEW, sizeof(struct NEW *) * (TO->NEW##s + 1));\
@ -171,8 +170,6 @@ struct burn_track *burn_track_create(void)
/* ts A61031 */ /* ts A61031 */
t->open_ended = 0; t->open_ended = 0;
t->track_data_done = 0; t->track_data_done = 0;
/* ts B10103 */
t->end_on_premature_eoi = 0;
t->postgap = 0; t->postgap = 0;
t->pregap1 = 0; t->pregap1 = 0;
@ -242,12 +239,8 @@ int burn_session_remove_track(struct burn_session *s, struct burn_track *t)
void burn_structure_print_disc(struct burn_disc *d) void burn_structure_print_disc(struct burn_disc *d)
{ {
int i; int i;
char msg[40];
sprintf(msg, "This disc has %d sessions", d->sessions); burn_print(12, "This disc has %d sessions\n", d->sessions);
libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
for (i = 0; i < d->sessions; i++) { for (i = 0; i < d->sessions; i++) {
burn_structure_print_session(d->session[i]); burn_structure_print_session(d->session[i]);
} }
@ -255,25 +248,16 @@ void burn_structure_print_disc(struct burn_disc *d)
void burn_structure_print_session(struct burn_session *s) void burn_structure_print_session(struct burn_session *s)
{ {
int i; int i;
char msg[40];
sprintf(msg, " Session has %d tracks", s->tracks); burn_print(12, " Session has %d tracks\n", s->tracks);
libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
for (i = 0; i < s->tracks; i++) { for (i = 0; i < s->tracks; i++) {
burn_structure_print_track(s->track[i]); burn_structure_print_track(s->track[i]);
} }
} }
void burn_structure_print_track(struct burn_track *t) void burn_structure_print_track(struct burn_track *t)
{ {
char msg[80]; burn_print(12, "(%p) track size %d sectors\n", t,
burn_track_get_sectors(t));
sprintf(msg, " track size %d sectors",
burn_track_get_sectors(t));
libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
} }
void burn_track_define_data(struct burn_track *t, int offset, int tail, void burn_track_define_data(struct burn_track *t, int offset, int tail,
@ -283,14 +267,13 @@ void burn_track_define_data(struct burn_track *t, int offset, int tail,
int burn_sector_length(int tracktype); int burn_sector_length(int tracktype);
unsigned char ctladr; unsigned char ctladr;
int form = -1; /* unchanged form will be considered an error too */ int form = -1; /* unchanged form will be considered an error too */
char msg[80];
type_to_form(mode, &ctladr, &form); type_to_form(mode, &ctladr, &form);
if (form == -1 || burn_sector_length(mode) <= 0) { if (form == -1 || burn_sector_length(mode) <= 0) {
char msg[160];
sprintf(msg, sprintf(msg, "Attempt to set track mode to unusable value %d",
"Attempt to set track mode to unusable value 0x%X", mode);
(unsigned int) mode);
libdax_msgs_submit(libdax_messenger, -1, 0x00020115, libdax_msgs_submit(libdax_messenger, -1, 0x00020115,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
@ -411,6 +394,7 @@ int burn_track_get_sectors(struct burn_track *t)
sectors = size / seclen; sectors = size / seclen;
if (size % seclen) if (size % seclen)
sectors++; sectors++;
burn_print(1, "%d sectors of %d length\n", sectors, seclen);
return sectors; return sectors;
} }
@ -460,16 +444,14 @@ int burn_track_set_fillup(struct burn_track *t, int fill_up_media)
int burn_track_apply_fillup(struct burn_track *t, off_t max_size, int flag) int burn_track_apply_fillup(struct burn_track *t, off_t max_size, int flag)
{ {
int max_sectors, ret = 2; int max_sectors, ret = 2;
char msg[80]; char msg[160];
if (t->fill_up_media <= 0) if (t->fill_up_media <= 0)
return 2; return 2;
max_sectors = max_size / 2048; max_sectors = max_size / 2048;
if (burn_track_get_sectors(t) < max_sectors || (flag & 1)) { if (burn_track_get_sectors(t) < max_sectors || (flag & 1)) {
sprintf(msg, "Setting total track size to %ds (payload %ds)\n", sprintf(msg, "Setting total track size to %ds (payload %ds)\n",
max_sectors & 0x7fffffff, max_sectors, (int) (t->source->get_size(t->source)/2048));
(int) ((t->source->get_size(t->source) / 2048)
& 0x7fffffff));
libdax_msgs_submit(libdax_messenger, -1, 0x00000002, libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
msg, 0, 0); msg, 0, 0);
@ -595,12 +577,11 @@ int burn_session_get_hidefirst(struct burn_session *session)
/* ts A80808 : Enhance CD toc to DVD toc */ /* ts A80808 : Enhance CD toc to DVD toc */
int burn_disc_cd_toc_extensions(struct burn_disc *d, int flag) int burn_disc_cd_toc_extensions(struct burn_disc *d, int flag)
{ {
int sidx= 0, tidx= 0, ret; int sidx= 0, tidx= 0;
struct burn_toc_entry *entry, *prev_entry= NULL; struct burn_toc_entry *entry, *prev_entry= NULL;
/* ts A81126 : ticket 146 : There was a SIGSEGV in here */ /* ts A81126 : ticket 146 : There was a SIGSEGV in here */
char *msg_data = NULL, *msg; char msg_data[321], *msg;
BURN_ALLOC_MEM(msg_data, char, 321);
strcpy(msg_data, strcpy(msg_data,
"Damaged CD table-of-content detected and truncated."); "Damaged CD table-of-content detected and truncated.");
strcat(msg_data, " In burn_disc_cd_toc_extensions: "); strcat(msg_data, " In burn_disc_cd_toc_extensions: ");
@ -663,15 +644,12 @@ int burn_disc_cd_toc_extensions(struct burn_disc *d, int flag)
prev_entry = entry; prev_entry = entry;
} }
} }
{ret = 1; goto ex;} return 1;
failure: failure:
libdax_msgs_submit(libdax_messenger, -1, 0x0002015f, libdax_msgs_submit(libdax_messenger, -1, 0x0002015f,
LIBDAX_MSGS_SEV_MISHAP, LIBDAX_MSGS_PRIO_HIGH, msg_data, 0, 0); LIBDAX_MSGS_SEV_MISHAP, LIBDAX_MSGS_PRIO_HIGH, msg_data, 0, 0);
d->sessions= sidx; d->sessions= sidx;
ret = 0; return 0;
ex:;
BURN_FREE_MEM(msg_data);
return ret;
} }

View File

@ -1,6 +1,6 @@
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -55,14 +55,6 @@ struct burn_track
int open_ended; int open_ended;
/** End of open ended track flag : offset+payload+tail are delivered */ /** End of open ended track flag : offset+payload+tail are delivered */
int track_data_done; int track_data_done;
/* ts B10103 */
/** End track writing on premature End-of-input if source is of
defined length.
0= normal operation in case of eoi
1= be ready to end track writing on eoi
2= eoi was encountered with previously set value of 1
*/
int end_on_premature_eoi;
/** The audio/data mode for the entry. Derived from control and /** The audio/data mode for the entry. Derived from control and
possibly from reading the track's first sector. */ possibly from reading the track's first sector. */

View File

@ -1,7 +1,6 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2011 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -21,7 +20,6 @@
#include "libburn.h" #include "libburn.h"
#include "sector.h" #include "sector.h"
#include "options.h" #include "options.h"
#include "init.h"
#if 0 #if 0
static void write_clonecd2(volatile struct toc *toc, int f); static void write_clonecd2(volatile struct toc *toc, int f);
@ -105,14 +103,17 @@ static void write_clonecd2(volatile struct toc *toc, int f)
void toc_find_modes(struct burn_drive *d) void toc_find_modes(struct burn_drive *d)
{ {
struct burn_read_opts o;
int lba;
int i, j; int i, j;
struct buffer *mem = NULL; struct buffer mem;
struct burn_toc_entry *e; struct burn_toc_entry *e;
/* ts A70519 : the code which needs this does not work with GNU/Linux 2.4 USB /* ts A61008 : to be prevented on the higher levels */
int lba; /* a ssert(d->busy); */
struct burn_read_opts o;
mem.bytes = 0;
mem.sectors = 1;
o.raw = 1; o.raw = 1;
o.c2errors = 0; o.c2errors = 0;
o.subcodes_audio = 1; o.subcodes_audio = 1;
@ -121,18 +122,17 @@ void toc_find_modes(struct burn_drive *d)
o.report_recovered_errors = 0; o.report_recovered_errors = 0;
o.transfer_damaged_blocks = 1; o.transfer_damaged_blocks = 1;
o.hardware_error_retries = 1; o.hardware_error_retries = 1;
*/
BURN_ALLOC_MEM_VOID(mem, struct buffer, 1);
mem->bytes = 0;
mem->sectors = 1;
for (i = 0; i < d->disc->sessions; i++) for (i = 0; i < d->disc->sessions; i++)
for (j = 0; j < d->disc->session[i]->tracks; j++) { for (j = 0; j < d->disc->session[i]->tracks; j++) {
struct burn_track *t = d->disc->session[i]->track[j]; struct burn_track *t = d->disc->session[i]->track[j];
e = t->entry; e = t->entry;
if (!e)
lba = 0;
else
lba = burn_msf_to_lba(e->pmin, e->psec,
e->pframe);
/* XXX | in the subcodes if appropriate! */ /* XXX | in the subcodes if appropriate! */
if (e && !(e->control & 4)) { if (e && !(e->control & 4)) {
t->mode = BURN_AUDIO; t->mode = BURN_AUDIO;
@ -141,18 +141,10 @@ void toc_find_modes(struct burn_drive *d)
t->mode = BURN_MODE1; t->mode = BURN_MODE1;
/* ts A70519 : this does not work with GNU/Linux 2.4 USB because one cannot /* ts A70519 : this does not work with GNU/Linux 2.4 USB because one cannot
predict the exact dxfer_size without knowing the sector type. predict the exact dxfer_size without knowing the sector type.
if (!e) mem.sectors = 1;
lba = 0; d->read_sectors(d, lba, mem.sectors, &o, &mem);
else t->mode = sector_identify(mem.data);
lba = burn_msf_to_lba(e->pmin, e->psec,
e->pframe);
mem->sectors = 1;
d->read_sectors(d, lba, mem.sectors, &o, mem);
t->mode = sector_identify(mem->data);
*/ */
} }
} }
ex:
BURN_FREE_MEM(mem);
} }

View File

@ -134,8 +134,6 @@ struct burn_drive
1=MMC drive , 1=MMC drive ,
2=stdio random read-write 2=stdio random read-write
3=stdio sequential write-only 3=stdio sequential write-only
4=stdio random read-only
5=stdio random write-only
*/ */
int drive_role; int drive_role;
@ -208,11 +206,6 @@ struct burn_drive
*/ */
int current_feat2fh_byte4; int current_feat2fh_byte4;
/* ts B10524 : whether the damage bit was set for the future track.
bit0= damage bit , bit1= nwa valid bit
*/
int next_track_damaged;
/* ts A70114 : whether a DVD-RW media holds an incomplete session /* ts A70114 : whether a DVD-RW media holds an incomplete session
(which could need closing after write) */ (which could need closing after write) */
int needs_close_session; int needs_close_session;
@ -279,10 +272,6 @@ struct burn_drive
/* ts A70129 : /* ts A70129 :
from 51h READ DISC INFORMATION Last Track Number in Last Session */ from 51h READ DISC INFORMATION Last Track Number in Last Session */
int last_track_no; int last_track_no;
/* ts B10730 : whether a default mode page 05 was already sent.
*/
int sent_default_page_05;
/* ts A70212 : from various sources : free space on media (in bytes) /* ts A70212 : from various sources : free space on media (in bytes)
With CD this might change after particular write With CD this might change after particular write
parameters have been set and nwa has been inquired. parameters have been set and nwa has been inquired.
@ -293,30 +282,15 @@ struct burn_drive
int media_lba_limit; int media_lba_limit;
/* ts A81210 : Upper limit of readable data size, /* ts A81210 : Upper limit of readable data size,
0x7fffffff = unknown 0x7fffffff = unknown */
0x7ffffff0 = 32 bit overflow, or unknown stdio size
*/
int media_read_capacity; int media_read_capacity;
/* ts B10314 : Next Writeable Adress for drive_role == 5 */
int role_5_nwa;
int toc_temp; int toc_temp;
struct burn_disc *disc; /* disc structure */ struct burn_disc *disc; /* disc structure */
int block_types[4]; int block_types[4];
struct buffer *buffer; struct buffer *buffer;
struct burn_progress progress; struct burn_progress progress;
/* To be used by mmc.c, sbc.c, spc.c for SCSI commands where the struct
content surely does not have to persist while another command gets
composed and executed.
(Inherently, sending SCSI commands to the same drive cannot be
thread-safe. But there are functions which send SCSI commands
and also call other such functions. These shall use own allocated
command structs and not this struct here.)
*/
struct command casual_command;
/* ts A70711 : keeping an eye on the drive buffer */ /* ts A70711 : keeping an eye on the drive buffer */
off_t pessimistic_buffer_free; off_t pessimistic_buffer_free;
int pbf_altered; int pbf_altered;

View File

@ -34,7 +34,7 @@ char *burn_strdup(char *s)
return NULL; return NULL;
l = strlen(s) + 1; l = strlen(s) + 1;
ret = calloc(1, l); ret = malloc(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 = calloc(1, l < n ? l : n); ret = malloc(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';
@ -74,6 +74,9 @@ struct cd_mid_record {
int m_li; int m_li;
int s_li; int s_li;
int f_li; int f_li;
int m_lo;
int s_lo;
int f_lo;
char *other_brands; char *other_brands;
}; };
typedef struct cd_mid_record cd_mid_record_t; typedef struct cd_mid_record cd_mid_record_t;
@ -88,51 +91,51 @@ char *burn_guess_cd_manufacturer(int m_li, int s_li, int f_li,
int m_lo, int s_lo, int f_lo, int flag) int m_lo, int s_lo, int f_lo, int flag)
{ {
static cd_mid_record_t mid_list[]= { static cd_mid_record_t mid_list[]= {
{"SKC", 96, 40, 0, ""}, {"SKC", 96, 40, 0, 0, 0, 0, ""},
{"Ritek Corp" , 96, 43, 30, ""}, {"Ritek Corp" , 96, 43, 30, 0, 0, 0, ""},
{"TDK / Ritek" , 97, 10, 0, "TRAXDATA"}, {"TDK / Ritek" , 97, 10, 0, 0, 0, 0, "TRAXDATA"},
{"TDK Corporation" , 97, 15, 0, ""}, {"TDK Corporation" , 97, 15, 0, 0, 0, 0, ""},
{"Ritek Corp" , 97, 15, 10, "7-plus, Aopen, PONY, Power Source, TDK, TRAXDATA, HiCO, PHILIPS, Primdisc, Victor.JVC, OPTI STORAGE, Samsung"}, {"Ritek Corp" , 97, 15, 10, 0, 0, 0, "7-plus, Aopen, PONY, Power Source, TDK, TRAXDATA, HiCO, PHILIPS, Primdisc, Victor.JVC, OPTI STORAGE, Samsung"},
{"Mitsubishi Chemical Corporation" , 97, 15, 20, ""}, {"Mitsubishi Chemical Corporation" , 97, 15, 20, 0, 0, 0, ""},
{"Nan-Ya Plastics Corporation" , 97, 15, 30, "Hatron, MMore, Acer, LITEON"}, {"Nan-Ya Plastics Corporation" , 97, 15, 30, 0, 0, 0, "Hatron, MMore, Acer, LITEON"},
{"Delphi" , 97, 15, 50, ""}, {"Delphi" , 97, 15, 50, 0, 0, 0, ""},
{"Shenzhen SG&SAST" , 97, 16, 20, ""}, {"Shenzhen SG&SAST" , 97, 16, 20, 0, 0, 0, ""},
{"Moser Baer India Limited" , 97, 17, 0, "EMTEC, Intenso, YAKUMO, PLATINUM, Silver Circle"}, {"Moser Baer India Limited" , 97, 17, 0, 0, 0, 0, "EMTEC, Intenso, YAKUMO, PLATINUM, Silver Circle"},
{"SKY media Manufacturing SA" , 97, 17, 10, ""}, {"SKY media Manufacturing SA" , 97, 17, 10, 0, 0, 0, ""},
{"Wing" , 97, 18, 10, ""}, {"Wing" , 97, 18, 10, 0, 0, 0, ""},
{"DDT" , 97, 18, 20, ""}, {"DDT" , 97, 18, 20, 0, 0, 0, ""},
{"Daxon Technology Inc. / Acer" , 97, 22, 60, "Maxmax, Diamond Data, BenQ, gold, SONY"}, {"Daxon Technology Inc. / Acer" , 97, 22, 60, 0, 0, 0, "Maxmax, Diamond Data, BenQ, gold, SONY"},
{"Taiyo Yuden Company Limited" , 97, 24, 0, "Maxell, FUJIFILM, SONY"}, {"Taiyo Yuden Company Limited" , 97, 24, 0, 0, 0, 0, "Maxell, FUJIFILM, SONY"},
{"Sony Corporation" , 97, 24, 10, "LeadData, Imation"}, {"Sony Corporation" , 97, 24, 10, 0, 0, 0, "LeadData, Imation"},
{"Computer Support Italcard s.r.l" , 97, 24, 20, ""}, {"Computer Support Italcard s.r.l" , 97, 24, 20, 0, 0, 0, ""},
{"Unitech Japan Inc." , 97, 24, 30, ""}, {"Unitech Japan Inc." , 97, 24, 30, 0, 0, 0, ""},
{"MPO, France" , 97, 25, 0, "TDK"}, {"MPO, France" , 97, 25, 0, 0, 0, 0, "TDK"},
{"Hitachi Maxell Ltd." , 97, 25, 20, ""}, {"Hitachi Maxell Ltd." , 97, 25, 20, 0, 0, 0, ""},
{"Infodisc Technology Co,Ltd." , 97, 25, 30, "MEMOREX, SPEEDA, Lead data"}, {"Infodisc Technology Co,Ltd." , 97, 25, 30, 0, 0, 0, "MEMOREX, SPEEDA, Lead data"},
{"Xcitec" , 97, 25, 60, ""}, {"Xcitec" , 97, 25, 60, 0, 0, 0, ""},
{"Fornet International Pte Ltd" , 97, 26, 0, "COMPUSA, Cdhouse"}, {"Fornet International Pte Ltd" , 97, 26, 0, 0, 0, 0, "COMPUSA, Cdhouse"},
{"Postech Corporation" , 97, 26, 10, "Mr.Platinum"}, {"Postech Corporation" , 97, 26, 10, 0, 0, 0, "Mr.Platinum"},
{"SKC Co Ltd." , 97, 26, 20, "Infinite"}, {"SKC Co Ltd." , 97, 26, 20, 0, 0, 0, "Infinite"},
{"Fuji Photo Film Co,Ltd." , 97, 26, 40, ""}, {"Fuji Photo Film Co,Ltd." , 97, 26, 40, 0, 0, 0, ""},
{"Lead Data Inc." , 97, 26, 50, "SONY, Gigastorage, MIRAGE"}, {"Lead Data Inc." , 97, 26, 50, 0, 0, 0, "SONY, Gigastorage, MIRAGE"},
{"CMC Magnetics Corporation" , 97, 26, 60, "Daxon, Verbatim, Memorex, Bi-Winner, PLEXTOR, YAMAHA, Melody, Office DEPOT, Philips, eMARK, imation, HyperMedia, Samsung, Shintaro, Techworks"}, {"CMC Magnetics Corporation" , 97, 26, 60, 0, 0, 0, "Daxon, Verbatim, Memorex, Bi-Winner, PLEXTOR, YAMAHA, Melody, Office DEPOT, Philips, eMARK, imation, HyperMedia, Samsung, Shintaro, Techworks"},
{"Ricoh Company Limited" , 97, 27, 0, "Sony, Digital Storage, Csita"}, {"Ricoh Company Limited" , 97, 27, 0, 0, 0, 0, "Sony, Digital Storage, Csita"},
{"Plasmon Data Systems Ltd" , 97, 27, 10, "Ritek, TDK, EMTEC, ALPHAPET, MANIA"}, {"Plasmon Data Systems Ltd" , 97, 27, 10, 0, 0, 0, "Ritek, TDK, EMTEC, ALPHAPET, MANIA"},
{"Princo Corporation" , 97, 27, 20, ""}, {"Princo Corporation" , 97, 27, 20, 0, 0, 0, ""},
{"Pioneer" , 97, 27, 30, ""}, {"Pioneer" , 97, 27, 30, 0, 0, 0, ""},
{"Eastman Kodak Company" , 97, 27, 40, ""}, {"Eastman Kodak Company" , 97, 27, 40, 0, 0, 0, ""},
{"Mitsui Chemicals Inc." , 97, 27, 50, "MAM-A, TDK"}, {"Mitsui Chemicals Inc." , 97, 27, 50, 0, 0, 0, "MAM-A, TDK"},
{"Ricoh Company Limited" , 97, 27, 60, "Ritek"}, {"Ricoh Company Limited" , 97, 27, 60, 0, 0, 0, "Ritek"},
{"Gigastorage Corporation" , 97, 28, 10, "MaxMax, Nan-Ya"}, {"Gigastorage Corporation" , 97, 28, 10, 0, 0, 0, "MaxMax, Nan-Ya"},
{"Multi Media Masters&Machinary SA" , 97, 28, 20, "King, Mmirex"}, {"Multi Media Masters&Machinary SA" , 97, 28, 20, 0, 0, 0, "King, Mmirex"},
{"Ritek Corp" , 97, 31, 0, "TDK"}, {"Ritek Corp" , 97, 31, 0, 0, 0, 0, "TDK"},
{"Grand Advance Technology Sdn. Bhd." , 97, 31, 30, ""}, {"Grand Advance Technology Sdn. Bhd." , 97, 31, 30, 0, 0, 0, ""},
{"TDK Corporation" , 97, 32, 00, ""}, {"TDK Corporation" , 97, 32, 00, 0, 0, 0, ""},
{"Prodisc Technology Inc." , 97, 32, 10, "Smartbuy, Mitsubishi, Digmaster, LG, Media Market"}, {"Prodisc Technology Inc." , 97, 32, 10, 0, 0, 0, "Smartbuy, Mitsubishi, Digmaster, LG, Media Market"},
{"Mitsubishi Chemical Corporation" , 97, 34, 20, "YAMAHA, Verbatim"}, {"Mitsubishi Chemical Corporation" , 97, 34, 20, 0, 0, 0, "YAMAHA, Verbatim"},
{"Mitsui Chemicals Inc." , 97, 48, 50, ""}, {"Mitsui Chemicals Inc." , 97, 48, 50, 0, 0, 0, ""},
{"TDK Corporation" , 97, 49, 0, ""}, {"TDK Corporation" , 97, 49, 0, 0, 0, 0, ""},
{"", 0, 0, 0, ""} {"", 0, 0, 0, 0, 0, 0, ""}
}; };
int i, f_li_0; int i, f_li_0;
@ -170,6 +173,7 @@ char *burn_guess_cd_manufacturer(int m_li, int s_li, int f_li,
/* ts A90904 */ /* ts A90904 */
struct dvd_mid_record { struct dvd_mid_record {
char *mc1; char *mc1;
char *mc2;
int mc1_sig_len; int mc1_sig_len;
char *manufacturer; char *manufacturer;
}; };
@ -188,49 +192,49 @@ char *burn_guess_manufacturer(int prf,
Especially: ' ' -> '_' , {"_%/" unprintables -> %XY) Especially: ' ' -> '_' , {"_%/" unprintables -> %XY)
*/ */
static dvd_mid_record_t mid_list[]= { static dvd_mid_record_t mid_list[]= {
{"AML", 8, "UML"}, {"AML", "", 8, "UML"},
{"BeAll", 5, "BeAll Developers, Inc."}, {"BeAll", "", 5, "BeAll Developers, Inc."},
{"CMC", 3, "CMC Magnetics Corporation"}, {"CMC", "", 3, "CMC Magnetics Corporation"},
{"DAXON", 5, "Daxon Technology Inc. / Acer"}, {"DAXON", "", 5, "Daxon Technology Inc. / Acer"},
{"Daxon", 5, "Daxon Technology Inc. / Acer"}, {"Daxon", "", 5, "Daxon Technology Inc. / Acer"},
{"FUJI", 4, "Fujifilm Holdings Corporation"}, {"FUJI", "", 4, "Fujifilm Holdings Corporation"},
{"INFODISC", 8, "New Star Digital Co., Ltd."}, {"INFODISC", "", 8, "New Star Digital Co., Ltd."},
{"INFOME", 6, "InfoMedia Inc."}, {"INFOME", "", 6, "InfoMedia Inc."},
{"ISMMBD", 6, "Info Source Multi Media Ltd."}, {"ISMMBD", "", 6, "Info Source Multi Media Ltd."},
{"JVC", 3, "JVC Limited"}, {"JVC", "", 3, "JVC Limited"},
{"KIC01RG", 7, "AMC"}, {"KIC01RG", "", 7, "AMC"},
{"LD", 8, "Lead Data Inc."}, {"LD", "", 8, "Lead Data Inc."},
{"LGE", 3, "LG Electronics"}, {"LGE", "", 3, "LG Electronics"},
{"MAM", 8, "Mitsui Advanced Media, Inc. Europe"}, {"MAM", "", 8, "Mitsui Advanced Media, Inc. Europe"},
{"MAXELL", 6, "Hitachi Maxell Ltd."}, {"MAXELL", "", 6, "Hitachi Maxell Ltd."},
{"MBI", 3, "Moser Baer India Limited"}, {"MBI", "", 3, "Moser Baer India Limited"},
{"MCC", 8, "Mitsubishi Chemical Corporation"}, {"MCC", "", 8, "Mitsubishi Chemical Corporation"},
{"MCI", 8, "Mitsui Chemicals Inc."}, {"MCI", "", 8, "Mitsui Chemicals Inc."},
{"MEI", 3, "Panasonic Corporation"}, {"MEI", "", 3, "Panasonic Corporation"},
{"MKM", 3, "Mitsubishi Kagaku Media Co."}, {"MKM", "", 3, "Mitsubishi Kagaku Media Co."},
{"MMC", 8, "Mitsubishi Kagaku Media Co."}, {"MMC", "", 8, "Mitsubishi Kagaku Media Co."},
{"MXL", 8, "Hitachi Maxell Ltd."}, {"MXL", "", 8, "Hitachi Maxell Ltd."},
{"NANYA", 5, "Nan-Ya Plastics Corporation"}, {"NANYA", "", 5, "Nan-Ya Plastics Corporation"},
{"NSD", 8, "NESA International Inc."}, {"NSD", "", 8, "NESA International Inc."},
{"OPTODISC", 8, "Optodisc Technology Corporation"}, {"OPTODISC", "", 8, "Optodisc Technology Corporation"},
{"OTCBDR", 8, "Optodisc Technology Corporation"}, {"OTCBDR", "", 8, "Optodisc Technology Corporation"},
{"PHILIP", 8, "Moser Baer India Limited"}, {"PHILIP", "", 8, "Moser Baer India Limited"},
{"PHILIPS", 8, "Philips"}, {"PHILIPS", "", 8, "Philips"},
{"PRINCO", 6, "Princo Corporation"}, {"PRINCO", "", 6, "Princo Corporation"},
{"PRODISC", 7, "Prodisc Technology Inc."}, {"PRODISC", "", 7, "Prodisc Technology Inc."},
{"Prodisc", 7, "Prodisc Technology Inc."}, {"Prodisc", "", 7, "Prodisc Technology Inc."},
{"PVC", 3, "Pioneer"}, {"PVC", "", 3, "Pioneer"},
{"RICOHJPN", 8, "Ricoh Company Limited"}, {"RICOHJPN", "", 8, "Ricoh Company Limited"},
{"RITEK", 5, "Ritek Corp"}, {"RITEK", "", 5, "Ritek Corp"},
{"SONY", 4, "Sony Corporation"}, {"SONY", "", 4, "Sony Corporation"},
{"TDK", 3, "TDK Corporation"}, {"TDK", "", 3, "TDK Corporation"},
{"TT", 8, "TDK Corporation"}, {"TT", "", 8, "TDK Corporation"},
{"TY", 8, "Taiyo Yuden Company Limited"}, {"TY", "", 8, "Taiyo Yuden Company Limited"},
{"TYG", 3, "Taiyo Yuden Company Limited"}, {"TYG", "", 3, "Taiyo Yuden Company Limited"},
{"UTJR001", 7, "Unifino Inc."}, {"UTJR001", "", 7, "Unifino Inc."},
{"VERBAT", 5, "Mitsubishi Kagaku Media Co."}, {"VERBAT", "", 5, "Mitsubishi Kagaku Media Co."},
{"YUDEN", 5, "Taiyo Yuden Company Limited"}, {"YUDEN", "", 5, "Taiyo Yuden Company Limited"},
{"", 0, ""} {"", "", 0, ""}
}; };
if (media_code2 != NULL && if (media_code2 != NULL &&

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
*/ */
@ -244,6 +244,7 @@ int burn_write_close_track(struct burn_write_opts *o, struct burn_session *s,
{ {
char msg[81]; char msg[81];
struct burn_drive *d; struct burn_drive *d;
struct burn_track *t;
/* ts A61106 */ /* ts A61106 */
#ifdef Libburn_experimental_no_close_tracK #ifdef Libburn_experimental_no_close_tracK
@ -251,6 +252,7 @@ int burn_write_close_track(struct burn_write_opts *o, struct burn_session *s,
#endif #endif
d = o->drive; d = o->drive;
t = s->track[tnum];
d->busy = BURN_DRIVE_CLOSING_TRACK; d->busy = BURN_DRIVE_CLOSING_TRACK;
@ -274,7 +276,7 @@ int burn_write_close_track(struct burn_write_opts *o, struct burn_session *s,
/* ts A61030 */ /* ts A61030 */
int burn_write_close_session(struct burn_write_opts *o) int burn_write_close_session(struct burn_write_opts *o, struct burn_session *s)
{ {
/* ts A61106 */ /* ts A61106 */
@ -383,9 +385,9 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
runtime = nwa-150; runtime = nwa-150;
#endif #endif
sheet = calloc(1, sizeof(struct cue_sheet)); sheet = malloc(sizeof(struct cue_sheet));
/* ts A61009 : react on failures of calloc(), add_cue_sheet() /* ts A61009 : react on failures of malloc(), 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,
@ -412,6 +414,7 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
goto failed; goto failed;
runtime += 150; runtime += 150;
burn_print(1, "toc for %d tracks:\n", ntr);
d->toc_entries = ntr + 3; d->toc_entries = ntr + 3;
/* ts A61009 */ /* ts A61009 */
@ -512,6 +515,8 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
e[3 + i].pframe = f; e[3 + i].pframe = f;
e[3 + i].adr = 1; e[3 + i].adr = 1;
e[3 + i].control = type_to_ctrl(tar[i]->mode); e[3 + i].control = type_to_ctrl(tar[i]->mode);
burn_print(1, "track %d control %d\n", tar[i]->mode,
e[3 + i].control);
ret = add_cue(sheet, ctladr | 1, i + 1, 1, form, 0, runtime); ret = add_cue(sheet, ctladr | 1, i + 1, 1, form, 0, runtime);
if (ret <= 0) if (ret <= 0)
@ -563,6 +568,11 @@ XXX this is untested :)
e[2].pmin = m; e[2].pmin = m;
e[2].psec = s; e[2].psec = s;
e[2].pframe = f; e[2].pframe = f;
burn_print(1, "run time is %d (%d:%d:%d)\n", runtime, m, s, f);
for (i = 0; i < d->toc_entries; i++)
burn_print(1, "point %d (%02d:%02d:%02d)\n",
d->toc_entry[i].point, d->toc_entry[i].pmin,
d->toc_entry[i].psec, d->toc_entry[i].pframe);
ret = add_cue(sheet, ctladr | 1, 0xAA, 1, 1, 0, runtime); ret = add_cue(sheet, ctladr | 1, 0xAA, 1, 1, 0, runtime);
if (ret <= 0) if (ret <= 0)
goto failed; goto failed;
@ -604,6 +614,8 @@ int burn_write_leadin(struct burn_write_opts *o,
d->busy = BURN_DRIVE_WRITING_LEADIN; d->busy = BURN_DRIVE_WRITING_LEADIN;
burn_print(5, first ? " first leadin\n" : " leadin\n");
if (first) if (first)
count = 0 - d->alba - 150; count = 0 - d->alba - 150;
else else
@ -632,6 +644,7 @@ int burn_write_leadout(struct burn_write_opts *o,
d->busy = BURN_DRIVE_WRITING_LEADOUT; d->busy = BURN_DRIVE_WRITING_LEADOUT;
d->rlba = -150; d->rlba = -150;
burn_print(5, first ? " first leadout\n" : " leadout\n");
if (first) if (first)
count = 6750; count = 6750;
else else
@ -653,10 +666,19 @@ int burn_write_leadout(struct burn_write_opts *o,
int burn_write_session(struct burn_write_opts *o, struct burn_session *s) int burn_write_session(struct burn_write_opts *o, struct burn_session *s)
{ {
struct burn_drive *d = o->drive; struct burn_drive *d = o->drive;
struct burn_track *prev = NULL, *next = NULL;
int i, ret; int i, ret;
d->rlba = 0; d->rlba = 0;
burn_print(1, " writing a session\n");
for (i = 0; i < s->tracks; i++) { for (i = 0; i < s->tracks; i++) {
if (i > 0)
prev = s->track[i - 1];
if (i + 1 < s->tracks)
next = s->track[i + 1];
else
next = NULL;
if (!burn_write_track(o, s, i)) if (!burn_write_track(o, s, i))
{ ret = 0; goto ex; } { ret = 0; goto ex; }
} }
@ -665,7 +687,7 @@ int burn_write_session(struct burn_write_opts *o, struct burn_session *s)
ret = 1; ret = 1;
ex:; ex:;
if (o->write_type == BURN_WRITE_TAO) if (o->write_type == BURN_WRITE_TAO)
burn_write_close_session(o); burn_write_close_session(o, s);
return ret; return ret;
} }
@ -786,6 +808,8 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
burn_disc_init_track_status(o, s, tnum, sectors); burn_disc_init_track_status(o, s, tnum, sectors);
burn_print(12, "track %d is %d sectors long\n", tnum, sectors);
/* ts A61030 : this cannot happen. tnum is always < s->tracks */ /* ts A61030 : this cannot happen. tnum is always < s->tracks */
if (tnum == s->tracks) if (tnum == s->tracks)
tmp = sectors > 150 ? 150 : sectors; tmp = sectors > 150 ? 150 : sectors;
@ -816,6 +840,8 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
fprintf(stderr,"LIBBURN_DEBUG: TNUM=%d TRACKS=%d TMP=%d\n", fprintf(stderr,"LIBBURN_DEBUG: TNUM=%d TRACKS=%d TMP=%d\n",
tnum, s->tracks, tmp); tnum, s->tracks, tmp);
burn_print(1, "last track, leadout prep\n");
/* ts A61023 */ /* ts A61023 */
if ((i%64)==0) if ((i%64)==0)
d->read_buffer_capacity(d); d->read_buffer_capacity(d);
@ -973,18 +999,15 @@ int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc,
{ {
enum burn_write_types wt; enum burn_write_types wt;
struct burn_drive *d = o->drive; struct burn_drive *d = o->drive;
char *msg = NULL, *reason_pt; char msg[160], *reason_pt;
int no_media = 0; int no_media = 0;
reason_pt= reasons; reason_pt= reasons;
reasons[0] = 0; reasons[0] = 0;
if (d->drive_role == 0 || d->drive_role == 4) { if (d->drive_role == 0) {
if (d->drive_role == 0) sprintf(reasons,
sprintf(reasons, "DRIVE: is a virtual placeholder (null-drive)");
"DRIVE: is a virtual placeholder (null-drive)");
else
sprintf(reasons, "DRIVE: read-only pseudo drive");
no_media = 1; no_media = 1;
goto ex; goto ex;
} }
@ -1001,7 +1024,7 @@ int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc,
reason_pt= reasons + strlen(reasons); reason_pt= reasons + strlen(reasons);
if (d->status == BURN_DISC_UNSUITABLE) if (d->status == BURN_DISC_UNSUITABLE)
goto unsuitable_profile; goto unsuitable_profile;
if (d->drive_role == 2 || d->drive_role == 5 || if (d->drive_role == 2 ||
d->current_profile == 0x1a || d->current_profile == 0x12 || d->current_profile == 0x1a || d->current_profile == 0x12 ||
d->current_profile == 0x43) { d->current_profile == 0x43) {
/* DVD+RW , DVD-RAM , BD-RE, emulated drive on stdio file */ /* DVD+RW , DVD-RAM , BD-RE, emulated drive on stdio file */
@ -1030,18 +1053,13 @@ int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc,
strcat(reasons, "write start address not supported, "); strcat(reasons, "write start address not supported, ");
} else { } else {
unsuitable_profile:; unsuitable_profile:;
msg = calloc(1, 160); sprintf(msg, "Unsuitable media detected. Profile %4.4Xh %s",
if (msg != NULL && !silent) { d->current_profile, d->current_profile_text);
sprintf(msg, if (!silent)
"Unsuitable media detected. Profile %4.4Xh %s",
d->current_profile, d->current_profile_text);
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002011e, 0x0002011e,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
}
if (msg != NULL)
free(msg);
strcat(reasons, "no suitable media profile detected, "); strcat(reasons, "no suitable media profile detected, ");
return 0; return 0;
} }
@ -1071,11 +1089,10 @@ int burn_disc_open_track_dvd_minus_r(struct burn_write_opts *o,
struct burn_session *s, int tnum) struct burn_session *s, int tnum)
{ {
struct burn_drive *d = o->drive; struct burn_drive *d = o->drive;
char *msg = NULL; char msg[160];
int ret, lba, nwa; int ret, lba, nwa;
off_t size; off_t size;
BURN_ALLOC_MEM(msg, char, 160);
d->send_write_parameters(d, o); d->send_write_parameters(d, o);
ret = d->get_nwa(d, -1, &lba, &nwa); ret = d->get_nwa(d, -1, &lba, &nwa);
sprintf(msg, sprintf(msg,
@ -1102,13 +1119,11 @@ int burn_disc_open_track_dvd_minus_r(struct burn_write_opts *o,
#endif #endif
if (o->write_type == BURN_WRITE_SAO) { /* DAO */ if (o->write_type == BURN_WRITE_SAO) { /* DAO */
/* Round track size up to write chunk size and reserve track */
size = ((off_t) burn_track_get_sectors(s->track[tnum])) size = ((off_t) burn_track_get_sectors(s->track[tnum]))
* (off_t) 2048; * (off_t) 2048;
if (size % o->obs)
/* Eventually round track size up to write chunk */
if (o->obs_pad && (size % o->obs))
size += (off_t) (o->obs - (size % o->obs)); size += (off_t) (o->obs - (size % o->obs));
ret = d->reserve_track(d, size); ret = d->reserve_track(d, size);
if (ret <= 0) { if (ret <= 0) {
sprintf(msg, "Cannot reserve track of %.f bytes", sprintf(msg, "Cannot reserve track of %.f bytes",
@ -1117,13 +1132,10 @@ int burn_disc_open_track_dvd_minus_r(struct burn_write_opts *o,
0x00020138, 0x00020138,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
{ret = 0; goto ex;} return 0;
} }
} }
ret = 1; return 1;
ex:;
BURN_FREE_MEM(msg);
return ret;
} }
@ -1132,11 +1144,10 @@ int burn_disc_open_track_dvd_plus_r(struct burn_write_opts *o,
struct burn_session *s, int tnum) struct burn_session *s, int tnum)
{ {
struct burn_drive *d = o->drive; struct burn_drive *d = o->drive;
char *msg = NULL; char msg[160];
int ret, lba, nwa; int ret, lba, nwa;
off_t size; off_t size;
BURN_ALLOC_MEM(msg, char, 160);
ret = d->get_nwa(d, -1, &lba, &nwa); ret = d->get_nwa(d, -1, &lba, &nwa);
sprintf(msg, sprintf(msg,
"DVD+R pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d", "DVD+R pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d",
@ -1153,10 +1164,6 @@ int burn_disc_open_track_dvd_plus_r(struct burn_write_opts *o,
/* Round track size up to write chunk size and reserve track */ /* Round track size up to write chunk size and reserve track */
size = ((off_t) burn_track_get_sectors(s->track[tnum])) size = ((off_t) burn_track_get_sectors(s->track[tnum]))
* (off_t) 2048; * (off_t) 2048;
/* o->obs should be 32k or 64k already. But 32k alignment
was once performed in d->reserve_track() */
if (o->obs % 32768)
o->obs += 32768 - (o->obs % 32768);
if (size % o->obs) if (size % o->obs)
size += (off_t) (o->obs - (size % o->obs)); size += (off_t) (o->obs - (size % o->obs));
ret = d->reserve_track(d, size); ret = d->reserve_track(d, size);
@ -1167,18 +1174,16 @@ int burn_disc_open_track_dvd_plus_r(struct burn_write_opts *o,
0x00020138, 0x00020138,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
{ret = 0; goto ex;} return 0;
} }
} }
ret = 1; return 1;
ex:;
BURN_FREE_MEM(msg);
return ret;
} }
/* ts A70129 */ /* ts A70129 */
int burn_disc_close_track_dvd_minus_r(struct burn_write_opts *o, int tnum) int burn_disc_close_track_dvd_minus_r(struct burn_write_opts *o,
struct burn_session *s, int tnum)
{ {
struct burn_drive *d = o->drive; struct burn_drive *d = o->drive;
char msg[80]; char msg[80];
@ -1235,7 +1240,7 @@ int burn_disc_finalize_dvd_plus_r(struct burn_write_opts *o)
/* ts A70226 */ /* ts A70226 */
int burn_disc_close_track_dvd_plus_r(struct burn_write_opts *o, int burn_disc_close_track_dvd_plus_r(struct burn_write_opts *o,
int tnum, int is_last_track) struct burn_session *s, int tnum, int is_last_track)
{ {
struct burn_drive *d = o->drive; struct burn_drive *d = o->drive;
char msg[80]; char msg[80];
@ -1427,6 +1432,20 @@ int burn_dvd_write_track(struct burn_write_opts *o,
sectors = burn_track_get_sectors(t); sectors = burn_track_get_sectors(t);
open_ended = burn_track_is_open_ended(t); open_ended = burn_track_is_open_ended(t);
/* <<< */
{
char msg[160];
sprintf(msg,
"DVD pre-track %2.2d : demand=%.f%s, cap=%.f\n",
tnum+1, (double) sectors * 2048.0,
(open_ended ? " (open ended)" : ""),
(double) d->media_capacity_remaining);
libdax_msgs_submit(libdax_messenger, d->global_index, 0x000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
msg, 0, 0);
}
/* (offset padding is done within sector_data()) */ /* (offset padding is done within sector_data()) */
@ -1486,18 +1505,18 @@ int burn_dvd_write_track(struct burn_write_opts *o,
if (d->current_profile == 0x11 || d->current_profile == 0x14 || if (d->current_profile == 0x11 || d->current_profile == 0x14 ||
d->current_profile == 0x15) { d->current_profile == 0x15) {
/* DVD-R, DVD-RW Sequential, DVD-R/DL Sequential */ /* DVD-R, DVD-RW Sequential, DVD-R/DL Sequential */
ret = burn_disc_close_track_dvd_minus_r(o, tnum); ret = burn_disc_close_track_dvd_minus_r(o, s, tnum);
if (ret <= 0) if (ret <= 0)
goto ex; goto ex;
} else if (d->current_profile == 0x1b || d->current_profile == 0x2b) { } else if (d->current_profile == 0x1b || d->current_profile == 0x2b) {
/* DVD+R , DVD+R/DL */ /* DVD+R , DVD+R/DL */
ret = burn_disc_close_track_dvd_plus_r(o, tnum, ret = burn_disc_close_track_dvd_plus_r(o, s, tnum,
is_last_track); is_last_track);
if (ret <= 0) if (ret <= 0)
goto ex; goto ex;
} else if (d->current_profile == 0x41) { } else if (d->current_profile == 0x41) {
/* BD-R SRM */ /* BD-R SRM */
ret = burn_disc_close_track_dvd_plus_r(o, tnum, ret = burn_disc_close_track_dvd_plus_r(o, s, tnum,
is_last_track); is_last_track);
if (ret <= 0) if (ret <= 0)
goto ex; goto ex;
@ -1552,7 +1571,8 @@ int burn_disc_close_session_dvd_minus_rw(struct burn_write_opts *o,
/* ts A70129 : for profile 0x11 DVD-R, 0x14 DVD-RW Seq, 0x15 DVD-R/DL Seq */ /* ts A70129 : for profile 0x11 DVD-R, 0x14 DVD-RW Seq, 0x15 DVD-R/DL Seq */
int burn_disc_close_session_dvd_minus_r(struct burn_write_opts *o) int burn_disc_close_session_dvd_minus_r(struct burn_write_opts *o,
struct burn_session *s)
{ {
struct burn_drive *d = o->drive; struct burn_drive *d = o->drive;
@ -1657,7 +1677,7 @@ int burn_dvd_write_session(struct burn_write_opts *o,
multi_mem = o->multi; multi_mem = o->multi;
if (!is_last_session) if (!is_last_session)
o->multi = 1; o->multi = 1;
ret = burn_disc_close_session_dvd_minus_r(o); ret = burn_disc_close_session_dvd_minus_r(o, s);
o->multi = multi_mem; o->multi = multi_mem;
if (ret <= 0) if (ret <= 0)
return 0; return 0;
@ -1717,7 +1737,7 @@ int burn_disc_setup_dvd_minus_rw(struct burn_write_opts *o,
struct burn_disc *disc) struct burn_disc *disc)
{ {
struct burn_drive *d = o->drive; struct burn_drive *d = o->drive;
char msg[60]; char msg[160];
int ret; int ret;
d->nwa = 0; d->nwa = 0;
@ -1800,9 +1820,8 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
off_t default_size = 0; off_t default_size = 0;
struct burn_drive *d = o->drive; struct burn_drive *d = o->drive;
struct burn_track *t; struct burn_track *t;
char *msg = NULL; char msg[160];
BURN_ALLOC_MEM(msg, char, 160);
d->needs_close_session = 0; d->needs_close_session = 0;
/* buffer flush trigger for sector.c:get_sector() */ /* buffer flush trigger for sector.c:get_sector() */
@ -1873,8 +1892,6 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
msg, 0, 0); msg, 0, 0);
burn_track_set_size(t, default_size); burn_track_set_size(t, default_size);
} }
/* Whether to fill-up last 32k buffer of track. */
o->obs_pad = (o->write_type != BURN_WRITE_SAO);
ret = burn_disc_setup_dvd_minus_r(o, disc); ret = burn_disc_setup_dvd_minus_r(o, disc);
if (ret <= 0) { if (ret <= 0) {
sprintf(msg, sprintf(msg,
@ -1885,6 +1902,8 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
msg, 0, 0); msg, 0, 0);
goto early_failure; goto early_failure;
} }
/* ??? padding needed ??? cowardly doing it for now */
o->obs_pad = 1; /* fill-up track's last 32k buffer */
} else if (d->current_profile == 0x1b || d->current_profile == 0x2b || } else if (d->current_profile == 0x1b || d->current_profile == 0x2b ||
d->current_profile == 0x41) { d->current_profile == 0x41) {
@ -1984,19 +2003,12 @@ ex:;
/* >>> eventual emergency finalization measures */ /* >>> eventual emergency finalization measures */
/* update media state records */ /* update media state records */
burn_drive_mark_unready(d, 0); burn_drive_mark_unready(d);
burn_drive_inquire_media(d); burn_drive_inquire_media(d);
if (d->current_profile == 0x41 && d->complete_sessions >= 300) { /* <<< d->busy = BURN_DRIVE_IDLE; */
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);
}
BURN_FREE_MEM(msg);
return ret; return ret;
early_failure:; early_failure:;
BURN_FREE_MEM(msg);
return 0; return 0;
} }
@ -2006,8 +2018,7 @@ int burn_stdio_open_write(struct burn_drive *d, off_t start_byte,
int sector_size, int flag) int sector_size, int flag)
{ {
/* We normally need _LARGEFILE64_SOURCE defined by the build system. /* <<< We need _LARGEFILE64_SOURCE defined by the build system.
Nevertheless the system might use large address integers by default.
*/ */
#ifndef O_LARGEFILE #ifndef O_LARGEFILE
#define O_LARGEFILE 0 #define O_LARGEFILE 0
@ -2015,27 +2026,15 @@ int burn_stdio_open_write(struct burn_drive *d, off_t start_byte,
int fd = -1; int fd = -1;
int mode = O_RDWR | O_CREAT | O_LARGEFILE; int mode = O_RDWR | O_CREAT | O_LARGEFILE;
char msg[60]; char msg[160];
off_t lseek_res;
if(d->drive_role == 4) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020181,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Pseudo-drive is a read-only file. Cannot write.",
0, 0);
return 0;
}
if (d->drive_role == 5 || d->drive_role == 3)
mode = O_WRONLY | O_CREAT | O_LARGEFILE;
if (d->devname[0] == 0) /* null drives should not come here */ if (d->devname[0] == 0) /* null drives should not come here */
return -1; return -1;
fd = burn_drive__fd_from_special_adr(d->devname); fd = burn_drive__fd_from_special_adr(d->devname);
if (fd >= 0) if (fd >= 0)
fd = dup(fd); /* check validity and make closeable */ fd = dup(fd); /* check validity and make closeable */
else else
fd = open(d->devname, mode, fd = open(d->devname, mode, S_IRUSR | S_IWUSR);
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (fd == -1) { if (fd == -1) {
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020005, 0x00020005,
@ -2046,11 +2045,10 @@ int burn_stdio_open_write(struct burn_drive *d, off_t start_byte,
} }
if (start_byte < 0) if (start_byte < 0)
start_byte = 0; start_byte = 0;
if (d->drive_role == 2 || d->drive_role == 5) { if (d->drive_role == 2)
lseek_res = lseek(fd, start_byte, SEEK_SET); if (lseek(fd, start_byte, SEEK_SET)==-1) {
if (lseek_res == -1) {
sprintf(msg, "Cannot address start byte %.f", sprintf(msg, "Cannot address start byte %.f",
(double) start_byte); (double) start_byte);
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020147, 0x00020147,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
@ -2059,7 +2057,6 @@ int burn_stdio_open_write(struct burn_drive *d, off_t start_byte,
d->cancel = 1; d->cancel = 1;
fd = -1; fd = -1;
} }
}
d->nwa = start_byte / sector_size; d->nwa = start_byte / sector_size;
return fd; return fd;
} }
@ -2089,9 +2086,6 @@ int burn_stdio_read_source(struct burn_source *source, char *buf, int bufsize,
int burn_stdio_write(int fd, char *buf, int count, struct burn_drive *d, int burn_stdio_write(int fd, char *buf, int count, struct burn_drive *d,
int flag) int flag)
{ {
int ret;
char *msg = NULL;
if (d->cancel) if (d->cancel)
return 0; return 0;
/* /*
@ -2099,23 +2093,15 @@ fprintf(stderr, "libburn_DEBUG: write(%d, %lX, %d)\n",
fd, (unsigned long) buf, count); fd, (unsigned long) buf, count);
*/ */
ret = write(fd, buf, count); if (write(fd, buf, count) != count) {
if (ret != count) {
BURN_ALLOC_MEM(msg, char, 160);
sprintf(msg,
"Cannot write desired amount of data. write(2) returned %d.",
ret);
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020148, 0x00020148,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, errno, 0); "Cannot write desired amount of data", errno, 0);
d->cancel = 1; d->cancel = 1;
return 0; return 0;
} }
ex:; return count;
BURN_FREE_MEM(msg);
return ret;
} }
@ -2128,11 +2114,9 @@ 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,
0x0002017d, /* >>> program error */;
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;
} }
@ -2179,15 +2163,10 @@ 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)
{ {
int ret;
char *msg = NULL;
if (fd < 0) { if (fd < 0) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002017d, /* >>> program error */;
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;
} }
@ -2196,24 +2175,17 @@ int burn_stdio_sync_cache(int fd, struct burn_drive *d, int flag)
libdax_msgs_submit(libdax_messenger, -1, 0x00000002, libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
"syncing cache (stdio fsync)", 0, 0); "syncing cache (stdio fsync)", 0, 0);
ret = fsync(fd); if (fsync(fd) != 0) {
if (ret != 0 && errno == EIO) { if (errno == EINVAL) /* E.g. /dev/null cannot fsync */
BURN_ALLOC_MEM(msg, char, 160); return 1;
sprintf(msg,
"Cannot write desired amount of data. fsync(2) returned %d.",
ret);
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020148, 0x00020148,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, errno, 0); "Cannot write desired amount of data", errno, 0);
d->cancel = 1; d->cancel = 1;
return 0; return 0;
} }
ret = 1; return 1;
ex:;
BURN_FREE_MEM(msg);
return ret;
} }
@ -2258,22 +2230,21 @@ int burn_stdio_slowdown(struct burn_drive *d, struct timeval *prev_time,
int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s, int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s,
int tnum, int flag) int tnum, int flag)
{ {
int open_ended, bufsize = 16 * 2048, ret, sectors; int open_ended, bufsize, ret, sectors, fd;
struct burn_track *t = s->track[tnum]; struct burn_track *t = s->track[tnum];
struct burn_drive *d = o->drive; struct burn_drive *d = o->drive;
char *buf = NULL; char buf[16*2048];
int i, prev_sync_sector = 0; int i, prev_sync_sector = 0;
struct buffer *out = d->buffer; struct buffer *out = d->buffer;
struct timeval prev_time; struct timeval prev_time;
BURN_ALLOC_MEM(buf, char, bufsize); bufsize = sizeof(buf);
fd = d->stdio_fd;
sectors = burn_track_get_sectors(t); sectors = burn_track_get_sectors(t);
burn_disc_init_track_status(o, s, tnum, sectors); burn_disc_init_track_status(o, s, tnum, sectors);
open_ended = burn_track_is_open_ended(t); open_ended = burn_track_is_open_ended(t);
t->end_on_premature_eoi = (o->write_type == BURN_WRITE_TAO);
/* attach stdio emulators for mmc_*() functions */ /* attach stdio emulators for mmc_*() functions */
if (o->simulate) if (o->simulate)
d->write = burn_stdio_mmc_dummy_write; d->write = burn_stdio_mmc_dummy_write;
@ -2286,9 +2257,8 @@ int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s,
/* transact a (CD sized) sector */ /* transact a (CD sized) sector */
if (!sector_data(o, t, 0)) if (!sector_data(o, t, 0))
{ret= 0; goto ex;} {ret= 0; goto ex;}
if (open_ended) if (open_ended) {
d->progress.sectors = sectors = d->progress.sector; d->progress.sectors = sectors = d->progress.sector;
if (open_ended || t->end_on_premature_eoi) {
if (burn_track_is_data_done(t)) if (burn_track_is_data_done(t))
break; break;
} }
@ -2315,9 +2285,6 @@ int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s,
ex:; ex:;
if (d->cancel) if (d->cancel)
burn_source_cancel(t->source); burn_source_cancel(t->source);
if (t->end_on_premature_eoi == 2)
d->cancel = 1;
BURN_FREE_MEM(buf);
return ret; return ret;
} }
@ -2343,15 +2310,9 @@ int burn_stdio_write_sync(struct burn_write_opts *o,
d->progress.tracks = 1; d->progress.tracks = 1;
/* >>> adjust sector size (2048) to eventual audio or even raw */ /* >>> adjust sector size (2048) to eventual audio or even raw */
/* >>> ??? ts B11004 : Why this eagerness to close and open ? */
/* open target file */ /* open target file */
if (d->stdio_fd >= 0) if (d->stdio_fd >= 0)
close(d->stdio_fd); close(d->stdio_fd);
if (d->drive_role == 5 && d->status == BURN_DISC_APPENDABLE &&
o->start_byte < 0)
o->start_byte = d->role_5_nwa * 2048;
d->stdio_fd = burn_stdio_open_write(d, o->start_byte, 2048, 0); d->stdio_fd = burn_stdio_open_write(d, o->start_byte, 2048, 0);
if (d->stdio_fd == -1) if (d->stdio_fd == -1)
{ret = 0; goto ex;} {ret = 0; goto ex;}
@ -2366,15 +2327,12 @@ int burn_stdio_write_sync(struct burn_write_opts *o,
d->progress.sectors = 0; d->progress.sectors = 0;
ret = 1; ret = 1;
ex:; ex:;
/* >>> ??? ts B11004 : Why this eagerness to close ? */
if (d->stdio_fd >= 0) if (d->stdio_fd >= 0)
close(d->stdio_fd); close(d->stdio_fd);
d->stdio_fd = -1; d->stdio_fd = -1;
/* update media state records */ /* update media state records */
burn_drive_mark_unready(d, 8); burn_drive_mark_unready(d);
/* <<< d->busy = BURN_DRIVE_IDLE; */ /* <<< d->busy = BURN_DRIVE_IDLE; */
return ret; return ret;
@ -2437,14 +2395,6 @@ calloc() seems not to have the desired effect. valgrind warns:
d->rlba = -150; d->rlba = -150;
d->toc_temp = 9; d->toc_temp = 9;
if(d->drive_role == 4) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020181,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Pseudo-drive is a read-only file. Cannot write.",
0, 0);
goto fail_wo_sync;
}
/* ts A70904 */ /* ts A70904 */
if (d->drive_role != 1) { if (d->drive_role != 1) {
ret = burn_stdio_write_sync(o, disc); ret = burn_stdio_write_sync(o, disc);
@ -2488,6 +2438,8 @@ calloc() seems not to have the desired effect. valgrind warns:
} }
} }
burn_print(1, "sync write of %d CD sessions\n", disc->sessions);
/* Apparently some drives require this command to be sent, and a few drives /* Apparently some drives require this command to be sent, and a few drives
return crap. so we send the command, then ignore the result. return crap. so we send the command, then ignore the result.
*/ */
@ -2529,8 +2481,6 @@ return crap. so we send the command, then ignore the result.
/* print_cue(sheet);*/ /* print_cue(sheet);*/
if (o->write_type == BURN_WRITE_SAO) if (o->write_type == BURN_WRITE_SAO)
d->send_cue_sheet(d, sheet); d->send_cue_sheet(d, sheet);
if (sheet->data != NULL)
free(sheet->data);
free(sheet); free(sheet);
if (o->write_type == BURN_WRITE_RAW) { if (o->write_type == BURN_WRITE_RAW) {
@ -2617,9 +2567,12 @@ return crap. so we send the command, then ignore the result.
sleep(1); sleep(1);
/* ts A61125 : update media state records */ /* ts A61125 : update media state records */
burn_drive_mark_unready(d, 0); burn_drive_mark_unready(d);
burn_drive_inquire_media(d); burn_drive_inquire_media(d);
burn_print(1, "done\n");
/* <<< d->busy = BURN_DRIVE_IDLE; */
/* ts A61012 : This return was traditionally missing. I suspect this /* ts A61012 : This return was traditionally missing. I suspect this
to have caused Cdrskin_eject() failures */ to have caused Cdrskin_eject() failures */
goto ex; goto ex;
@ -2628,6 +2581,7 @@ fail:
d->sync_cache(d); d->sync_cache(d);
fail_wo_sync:; fail_wo_sync:;
usleep(500001); /* ts A61222: to avoid a warning from remove_worker()*/ usleep(500001); /* ts A61222: to avoid a warning from remove_worker()*/
burn_print(1, "done - failed\n");
libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002010b, libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002010b,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Burn run failed", 0, 0); "Burn run failed", 0, 0);
@ -2648,33 +2602,24 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
{ {
int alignment = 0, start, upto, chunksize, err, fd = -1, ret; int alignment = 0, start, upto, chunksize, err, fd = -1, ret;
char msg[81], *rpt; char msg[81], *rpt;
struct buffer *buf = NULL, *buffer_mem = d->buffer; struct buffer buf, *buffer_mem = d->buffer;
BURN_ALLOC_MEM(buf, struct buffer, 1);
if (d->released) { if (d->released) {
libdax_msgs_submit(libdax_messenger, libdax_msgs_submit(libdax_messenger,
d->global_index, 0x00020142, d->global_index, 0x00020142,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Drive is not grabbed on random access write", 0, 0); "Drive is not grabbed on random access write", 0, 0);
{ret = 0; goto ex;} return 0;
} }
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,
0x00020146, 0x00020146,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Drive is a virtual placeholder (null-drive)", 0, 0); "Drive is a virtual placeholder (null-drive)", 0, 0);
{ret = 0; goto ex;} return 0;
}
if(d->drive_role == 4) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020181,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Pseudo-drive is a read-only file. Cannot write.",
0, 0);
{ret = 0; goto ex;}
} }
if(d->drive_role == 2 || d->drive_role == 5) if(d->drive_role == 2)
alignment = 2 * 1024; alignment = 2 * 1024;
if (d->current_profile == 0x12) /* DVD-RAM */ if (d->current_profile == 0x12) /* DVD-RAM */
alignment = 2 * 1024; alignment = 2 * 1024;
@ -2690,7 +2635,7 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
0x00020125, 0x00020125,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"Write start address not supported", 0, 0); "Write start address not supported", 0, 0);
{ret = 0; goto ex;} return 0;
} }
if ((byte_address % alignment) != 0) { if ((byte_address % alignment) != 0) {
sprintf(msg, sprintf(msg,
@ -2700,7 +2645,7 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
0x00020126, 0x00020126,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
{ret = 0; goto ex;} return 0;
} }
if ((data_count % alignment) != 0) { if ((data_count % alignment) != 0) {
sprintf(msg, sprintf(msg,
@ -2710,22 +2655,22 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
0x00020141, 0x00020141,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0); msg, 0, 0);
{ret = 0; goto ex;} return 0;
} }
if (d->busy != BURN_DRIVE_IDLE) { if (d->busy != BURN_DRIVE_IDLE) {
libdax_msgs_submit(libdax_messenger, libdax_msgs_submit(libdax_messenger,
d->global_index, 0x00020140, d->global_index, 0x00020140,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Drive is busy on attempt to write random access",0,0); "Drive is busy on attempt to write random access",0,0);
{ret = 0; goto ex;} return 0;
} }
if(d->drive_role != 1) { if(d->drive_role != 1) {
fd = burn_stdio_open_write(d, byte_address, 2048, 0); fd = burn_stdio_open_write(d, byte_address, 2048, 0);
if (fd == -1) if (fd == -1)
{ret = 0; goto ex;} return 0;
} }
d->busy = BURN_DRIVE_WRITING_SYNC; d->busy = BURN_DRIVE_WRITING_SYNC;
d->buffer = buf; d->buffer = &buf;
start = byte_address / 2048; start = byte_address / 2048;
upto = start + data_count / 2048; upto = start + data_count / 2048;
@ -2752,7 +2697,7 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
d->busy = BURN_DRIVE_IDLE; d->busy = BURN_DRIVE_IDLE;
if(fd >= 0) if(fd >= 0)
close(fd); close(fd);
{ret = -(start * 2048 - byte_address); goto ex;} return (-(start * 2048 - byte_address));
} }
} }
@ -2770,95 +2715,6 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address,
close(fd); close(fd);
d->buffer = buffer_mem; d->buffer = buffer_mem;
d->busy = BURN_DRIVE_IDLE; d->busy = BURN_DRIVE_IDLE;
ret = 1; return 1;
ex:
BURN_FREE_MEM(buf);
return ret;
} }
/* ts B10527 */
/* @param bit0= force close, even if no damage was seen
*/
int burn_disc_close_damaged(struct burn_write_opts *o, int flag)
{
struct burn_drive *d;
int ret;
enum burn_drive_status busy;
d = o->drive;
busy = d->busy;
if (busy != BURN_DRIVE_IDLE) {
libdax_msgs_submit(libdax_messenger,
d->global_index, 0x00020106,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"Drive is busy on attempt to close damaged session",
0, 0);
{ret = 0; goto ex;}
}
if (!((d->next_track_damaged & 1) || (flag & 1))) {
libdax_msgs_submit(libdax_messenger,
d->global_index, 0x00020187,
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
"Track not marked as damaged. No action taken.",
0, 0);
{ret = 0; goto ex;}
}
d->busy = BURN_DRIVE_WRITING;
if (d->current_profile == 0x09 || d->current_profile == 0x0a) {
/* Close CD track and session */
o->write_type = BURN_WRITE_TAO; /* no action without TAO */
/* Send mode page 5 */;
d->send_write_parameters(d, o);
ret = burn_write_close_session(o);
if (ret <= 0)
goto ex;
} else if(d->current_profile == 0x11 || d->current_profile == 0x14) {
/* Close DVD-R[W] track and session */
o->write_type = BURN_WRITE_TAO; /* no action without TAO */
/* Send mode page 5 */;
d->send_write_parameters(d, o);
ret = burn_disc_close_track_dvd_minus_r(o, 0);
if (ret <= 0)
goto ex;
ret = burn_disc_close_session_dvd_minus_r(o);
if (ret <= 0)
goto ex;
} else if(d->current_profile == 0x1b || d->current_profile == 0x2b) {
/* Close DVD+R track and session */
ret = burn_disc_close_track_dvd_plus_r(o, d->last_track_no, 1);
if (ret <= 0)
goto ex;
} else if(d->current_profile == 0x41) {
/* Close BD-R track and session */
ret = burn_disc_close_track_dvd_plus_r(o, d->last_track_no, 1);
if (ret <= 0)
goto ex;
} else {
libdax_msgs_submit(libdax_messenger,
d->global_index, 0x00020188,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"Cannot close damaged track on given media type",
0, 0);
{ret = 0; goto ex;}
}
ret = 1;
ex:;
d->busy = busy;
/* Record with drive that repair was attempted */
d->next_track_damaged &= ~1;
return ret;
}

View File

@ -37,7 +37,7 @@ int burn_write_flush(struct burn_write_opts *o, struct burn_track *track);
/* ts A61030 : necessary for TAO */ /* ts A61030 : necessary for TAO */
int burn_write_close_track(struct burn_write_opts *o, struct burn_session *s, int burn_write_close_track(struct burn_write_opts *o, struct burn_session *s,
int tnum); int tnum);
int burn_write_close_session(struct burn_write_opts *o); int burn_write_close_session(struct burn_write_opts *o,struct burn_session *s);

View File

@ -1,41 +0,0 @@
#!/bin/sh
set -e
cd ..
if [ ! -x configure ]; then
printf "\n*** please run ./bootstrap first.\n"
exit 1
fi
build()
{
for F in ${1}
do
make clean
clear
printf "\n *** building with: %s\n" CPPFLAGS=-D${F}
sleep 1
# libcdio is not autodetected by default; should be available everywhere
CPPFLAGS=-D${F} ./configure --enable-libcdio; make 2> releng/libburn.${F}.log
make clean
done
}
OS=`uname -o`
case ${OS} in
GNU/Linux)
printf "OS: %s\n" ${OS}
sleep 1
build "__linux Libburn_use_sg_dummY Libburn_use_libcdiO"
;;
*)
printf "Unknown OS: %s\n" ${OS}
exit 1
;;
esac
# just in case
unset CPPFLAGS

View File

@ -25,19 +25,18 @@
#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 and libdax_audioxtr via libburn */ /* This build environment uses libdax_msgs 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

@ -1,6 +1,6 @@
/* test/libburner.c , API illustration of burning data or audio tracks to CD */ /* test/libburner.c , API illustration of burning data or audio tracks to CD */
/* Copyright (C) 2005 - 2011 Thomas Schmitt <scdbackup@gmx.net> */ /* Copyright (C) 2005 - 2010 Thomas Schmitt <scdbackup@gmx.net> */
/* Provided under GPL, see also "License and copyright aspects" at file end */ /* Provided under GPL, see also "License and copyright aspects" at file end */
@ -20,37 +20,31 @@
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("libburner : ", NULL, 0x0) burn_set_signal_handling()
as it is done in main() at the end of this file. as it is done in main() at the end of this file. Then you aquire a
Then you aquire a drive in an appropriate way conforming to the API. The twoi drive in an appropriate way conforming to the API. The two main
main approaches are shown here in application functions: 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. See With the aquired drive you can burn to CD, DVD, BD
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
@ -66,7 +60,7 @@
/* This program insists in the own headerfile. */ /* This program insists in the own headerfile. */
#include "../libburn/libburn.h" #include "../libburn/libburn.h"
/* libburn works on Linux systems with kernel 2.4 or 2.6, FreeBSD, Solaris */ /* libburn is intended for Linux systems with kernel 2.4 or 2.6 for now */
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <sys/types.h> #include <sys/types.h>
@ -218,7 +212,7 @@ int libburner_aquire_by_driveno(int *driveno)
printf("\nOverview of accessible drives (%d found) :\n", printf("\nOverview of accessible drives (%d found) :\n",
drive_count); drive_count);
printf("-----------------------------------------------------------------------------\n"); printf("-----------------------------------------------------------------------------\n");
for (i = 0; i < (int) drive_count; i++) { for (i = 0; i < drive_count; i++) {
if (burn_drive_get_adr(&(drive_list[i]), adr) <=0) if (burn_drive_get_adr(&(drive_list[i]), adr) <=0)
strcpy(adr, "-get_adr_failed-"); strcpy(adr, "-get_adr_failed-");
printf("%d --drive '%s' : '%s' '%s'\n", printf("%d --drive '%s' : '%s' '%s'\n",
@ -255,7 +249,7 @@ int libburner_aquire_by_driveno(int *driveno)
printf("Pseudo-drive \"-\" given : bus scanning done.\n"); printf("Pseudo-drive \"-\" given : bus scanning done.\n");
return 2; /* the program will end after this */ return 2; /* the program will end after this */
} }
if ((int) drive_count <= *driveno) { if (drive_count <= *driveno) {
fprintf(stderr, fprintf(stderr,
"Found only %d drives. Number %d not available.\n", "Found only %d drives. Number %d not available.\n",
drive_count, *driveno); drive_count, *driveno);
@ -263,7 +257,7 @@ int libburner_aquire_by_driveno(int *driveno)
} }
/* Drop all drives which we do not want to use */ /* Drop all drives which we do not want to use */
for (i = 0; i < (int) drive_count; i++) { for (i = 0; i < drive_count; i++) {
if (i == *driveno) /* the one drive we want to keep */ if (i == *driveno) /* the one drive we want to keep */
continue; continue;
ret = burn_drive_info_forget(&(drive_list[i]),0); ret = burn_drive_info_forget(&(drive_list[i]),0);
@ -339,7 +333,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, 0x0); burn_set_signal_handling("libburner : ", NULL, 0);
printf("Done\n"); printf("Done\n");
return 1; return 1;
} }
@ -407,7 +401,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, 0x0); burn_set_signal_handling("libburner : ", NULL, 0);
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)
@ -763,7 +757,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, 0x0); burn_set_signal_handling("libburner : ", NULL, 0);
/** 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);

View File

@ -1,134 +0,0 @@
/*
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);
}

View File

@ -20,6 +20,8 @@ static void catch_int ()
static void poll_drive(int d) static void poll_drive(int d)
{ {
enum burn_disc_status s;
fprintf(stderr, "polling disc in %s - %s:\n", fprintf(stderr, "polling disc in %s - %s:\n",
drives[d].vendor, drives[d].product); drives[d].vendor, drives[d].product);
@ -31,7 +33,8 @@ static void poll_drive(int d)
while (burn_drive_get_status(drives[d].drive, NULL)) while (burn_drive_get_status(drives[d].drive, NULL))
usleep(1000); usleep(1000);
while (burn_disc_get_status(drives[d].drive) == BURN_DISC_UNREADY) while ((s = burn_disc_get_status(drives[d].drive))
== BURN_DISC_UNREADY)
usleep(1000); usleep(1000);
while (NEXT == 0) { while (NEXT == 0) {
@ -64,7 +67,7 @@ int main()
newact.sa_handler = catch_int; newact.sa_handler = catch_int;
sigaction(SIGINT, &newact, &oldact); sigaction(SIGINT, &newact, &oldact);
for (i = 0; i < (int) n_drives; i++) { for (i = 0; i < n_drives; i++) {
NEXT=0; NEXT=0;
poll_drive(i); poll_drive(i);
} }

View File

@ -12,9 +12,6 @@ int main(int argc, char **argv)
struct burn_session *session; struct burn_session *session;
struct burn_source *src; struct burn_source *src;
burn_initialize();
burn_msgs_set_severities("NEVER", "ALL", "structest: ");
disc = burn_disc_create(); disc = burn_disc_create();
session = burn_session_create(); session = burn_session_create();
burn_disc_add_session(disc, session, BURN_POS_END); burn_disc_add_session(disc, session, BURN_POS_END);

View File

@ -1,6 +1,6 @@
/* test/telltoc.c , API illustration of obtaining media status info */ /* test/telltoc.c , API illustration of obtaining media status info */
/* Copyright (C) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net> /* Copyright (C) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL */ Provided under GPL */
/** Overview /** Overview
@ -178,7 +178,7 @@ int telltoc_aquire_by_driveno(int *driveno, int silent_drive)
} }
fprintf(stderr, "Done\n"); fprintf(stderr, "Done\n");
for (i = 0; i < (int) drive_count; i++) { for (i = 0; i < drive_count; i++) {
if (*driveno >= 0 && (silent_drive || *driveno != i)) if (*driveno >= 0 && (silent_drive || *driveno != i))
continue; continue;
if (burn_drive_get_adr(&(drive_list[i]), adr) <=0) if (burn_drive_get_adr(&(drive_list[i]), adr) <=0)
@ -197,7 +197,7 @@ int telltoc_aquire_by_driveno(int *driveno, int silent_drive)
/* We already made our choice via command line. (default is 0) /* We already made our choice via command line. (default is 0)
So we just have to keep our desired drive and drop all others. So we just have to keep our desired drive and drop all others.
*/ */
if ((int) drive_count <= *driveno) { if (drive_count <= *driveno) {
fprintf(stderr, fprintf(stderr,
"Found only %d drives. Number %d not available.\n", "Found only %d drives. Number %d not available.\n",
drive_count, *driveno); drive_count, *driveno);
@ -205,7 +205,7 @@ int telltoc_aquire_by_driveno(int *driveno, int silent_drive)
} }
/* Drop all drives which we do not want to use */ /* Drop all drives which we do not want to use */
for (i = 0; i < (int) drive_count; i++) { for (i = 0; i < drive_count; i++) {
if (i == *driveno) /* the one drive we want to keep */ if (i == *driveno) /* the one drive we want to keep */
continue; continue;
ret = burn_drive_info_forget(&(drive_list[i]),0); ret = burn_drive_info_forget(&(drive_list[i]),0);