Compare commits
4 Commits
1.1.8
...
ZeroEightT
Author | SHA1 | Date | |
---|---|---|---|
7e01bae7e6 | |||
7c0a33420a | |||
101a8813d5 | |||
3a5acf9989 |
@ -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
328
ChangeLog
@ -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.
|
|
||||||
|
20
Makefile.am
20
Makefile.am
@ -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
159
README
@ -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.
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
17
acinclude.m4
17
acinclude.m4
@ -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
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh -x
|
#!/bin/sh -x
|
||||||
|
|
||||||
aclocal -I .
|
aclocal
|
||||||
libtoolize --copy --force
|
libtoolize --copy --force
|
||||||
autoconf
|
autoconf
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
@ -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"
|
||||||
|
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
1524
cdrskin/cdrskin.c
1524
cdrskin/cdrskin.c
File diff suppressed because it is too large
Load Diff
@ -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> cdrskin -v dev=/dev/hdc speed=12 fs=8m \</KBD></DD>
|
<DD>$<KBD> cdrskin -v dev=/dev/hdc speed=12 fs=8m \</KBD></DD>
|
||||||
<DD><KBD> blank=as_needed -eject padsize=300k my_image.iso</KBD></DD>
|
<DD><KBD> 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> find . | afio -oZ - | \</KBD></DD>
|
<DD>$<KBD> find . | afio -oZ - | \</KBD></DD>
|
||||||
<DD><KBD> cdrskin -v dev=0,1,0 fs=32m speed=8 \</KBD></DD>
|
<DD><KBD> cdrskin -v dev=0,1,0 fs=32m speed=8 \</KBD></DD>
|
||||||
<DD><KBD> blank=as_needed padsize=300k -</KBD></DD>
|
<DD><KBD> 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> </DD>
|
<DD> </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> </DD>
|
<DD> </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).
|
||||||
|
@ -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
@ -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);
|
||||||
|
@ -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."
|
||||||
|
@ -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/−/-/g' \
|
|
||||||
<"$2" >"$htmlpage"
|
<"$2" >"$htmlpage"
|
||||||
|
|
||||||
set +x
|
set +x
|
||||||
|
88
configure.ac
88
configure.ac
@ -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
|
||||||
|
13
doc/comments
13
doc/comments
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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]
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
826
libburn/drive.c
826
libburn/drive.c
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
|||||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
/* -*- 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 */
|
||||||
|
179
libburn/file.c
179
libburn/file.c
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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: *;
|
|
||||||
};
|
|
@ -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);
|
||||||
|
@ -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_________________ */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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_________________ */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1703
libburn/mmc.c
1703
libburn/mmc.c
File diff suppressed because it is too large
Load Diff
@ -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*/
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
12
libburn/sg.c
12
libburn/sg.c
@ -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);
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
|
@ -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*/
|
||||||
|
842
libburn/spc.c
842
libburn/spc.c
File diff suppressed because it is too large
Load Diff
@ -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*/
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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. */
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
184
libburn/util.c
184
libburn/util.c
@ -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 &&
|
||||||
|
386
libburn/write.c
386
libburn/write.c
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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, ¤t_profile,
|
burn_disc_get_profile(drive_list[0].drive, ¤t_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);
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user