Compare commits
5 Commits
1.2.8
...
ZeroSevenE
Author | SHA1 | Date | |
---|---|---|---|
9649668c99 | |||
4729b8f1be | |||
fd05a264e9 | |||
d83944719d | |||
071a39d014 |
@ -1,7 +1,7 @@
|
||||
Derek Foreman <derek@signalmarketing.com> and Ben Jansens <xor@orodu.net>
|
||||
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
Mario Danic <mario.danic@gmail.com>, Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-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
|
||||
|
382
ChangeLog
382
ChangeLog
@ -1,381 +1 @@
|
||||
libburn-1.2.8.tar.gz Mon Mar 08 2013
|
||||
===============================================================================
|
||||
* New cdrskin option --list_speeds
|
||||
* -toc and -minfo now report about tracks in the incomplete session
|
||||
* New API call burn_disc_get_incomplete_sessions()
|
||||
* New burn_toc_entry component .track_status_bits
|
||||
* Bug fix: All CD tracks were reported with the sizes of the tracks in the
|
||||
first session. Regression introduced with version 1.2.0 (rev 4552).
|
||||
* Bug fix: On some drives the request for minimum speed yielded maximum speed
|
||||
|
||||
libburn-1.2.6.tar.gz Tue Jan 08 2013
|
||||
===============================================================================
|
||||
* New cdrskin option --no_load
|
||||
* Bug fix: Speed setting had no effect on BD media
|
||||
* New API call burn_read_audio()
|
||||
* New API call burn_list_sev_texts()
|
||||
|
||||
libburn-1.2.4.tar.gz Fri Jul 20 2012
|
||||
===============================================================================
|
||||
* New API call burn_write_opts_set_obs_pad(), ./configure --enable-dvd-obs-pad
|
||||
* New cdrskin option --obs_pad
|
||||
* Bug fix: CD SAO sessions with data tracks started by an audio pause
|
||||
* Bug fix: CD tracks were perceived 2 sectors too short. Nice with TAO, bad with SAO.
|
||||
* Bug fix: cdrskin SIGSEGV if track source was added when no drive was available
|
||||
|
||||
libburn-1.2.2.tar.gz Mon Apr 02 2012
|
||||
===============================================================================
|
||||
* Small internal refinements
|
||||
|
||||
libburn-1.2.0.tar.gz Sat Jan 28 2012
|
||||
===============================================================================
|
||||
* Bug fix: cdrskin produced a memory fault if interupted before writing began
|
||||
* Bug fix: Solaris adapter mishandled write commands which failed on first try
|
||||
* Bug fix: Interrupting libburn while drive tray is loading led to endless loop
|
||||
* Bug fix: Progress report with blanking and formatting could be bogus
|
||||
* New API calls burn_disc_get_leadin_text(), burn_write_opts_set_leadin_text()
|
||||
* New API calls for composing CD-TEXT, see doc/cdtext.txt
|
||||
* New API call burn_session_by_cue_file() for reading CDRWIN .cue files
|
||||
* New API call burn_track_set_isrc_string()
|
||||
* New API calls burn_track_set_index(), burn_track_clear_indice()
|
||||
* New API calls burn_session_set_start_tno(), burn_session_get_start_tno()
|
||||
* New API calls burn_track_set_pregap_size(), burn_track_set_postgap_size()
|
||||
* Implemented cdrskin option textfile=
|
||||
* Implemented cdrskin option combination -vv -toc for cdtext.dat production
|
||||
* Implemented cdrskin options mcn= and isrc=
|
||||
* Implemented cdrskin options -scms -copy -nocopy -preemp -nopreemp
|
||||
* Implemented cdrskin option index=
|
||||
* Partly implemented cdrskin options cuefile= and -text
|
||||
* New cdrskin option input_sheet_v07t= for CD-TEXT definition
|
||||
* New cdrskin options --cdtext_dummy and --cdtext_verbose
|
||||
* New cdrskin options --four_channel --two_channel
|
||||
* New cdrskin option cd_start_tno=
|
||||
* New cdrskin options sao_pregap=, sao_postgap=
|
||||
|
||||
libburn-1.1.8.tar.gz Mon Nov 21 2011
|
||||
===============================================================================
|
||||
* 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.
|
||||
nothing here now
|
||||
|
33
Makefile.am
33
Makefile.am
@ -6,7 +6,6 @@ pkgconfigdir=$(LIBBURNIA_PKGCONFDIR)
|
||||
libincludedir=$(includedir)/libburn
|
||||
|
||||
lib_LTLIBRARIES = libburn/libburn.la
|
||||
ACLOCAL_AMFLAGS = -I ./
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
@ -21,7 +20,6 @@ libburn_libburn_la_SOURCES = \
|
||||
libburn/async.c \
|
||||
libburn/async.h \
|
||||
libburn/back_hacks.h \
|
||||
libburn/cdtext.c \
|
||||
libburn/cleanup.c \
|
||||
libburn/cleanup.h \
|
||||
libburn/crc.c \
|
||||
@ -69,22 +67,19 @@ libburn_libburn_la_SOURCES = \
|
||||
libburn/util.c \
|
||||
libburn/util.h \
|
||||
libburn/write.c \
|
||||
libburn/write.h
|
||||
libburn/write.h \
|
||||
version.h
|
||||
|
||||
## libburn/sg-@ARCH@.c \
|
||||
|
||||
libinclude_HEADERS = \
|
||||
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
|
||||
noinst_PROGRAMS = \
|
||||
test/libburner \
|
||||
test/offst_source \
|
||||
test/telltoc \
|
||||
test/dewav \
|
||||
test/fake_au \
|
||||
@ -99,9 +94,6 @@ LIBBURN_EXTRALIBS = $(LIBBURN_ARCH_LIBS) $(THREAD_LIBS)
|
||||
test_libburner_CPPFLAGS = -Ilibburn
|
||||
test_libburner_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
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_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
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_SOURCES = test/structest.c
|
||||
|
||||
## cdrskin construction site - ts A60816 - B30318
|
||||
## cdrskin construction site - ts A60816 - B00122
|
||||
cdrskin_cdrskin_CPPFLAGS = -Ilibburn
|
||||
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_2_8
|
||||
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_7_8
|
||||
|
||||
# cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
# ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking
|
||||
@ -131,11 +123,6 @@ cdrskin_cdrskin_SOURCES = cdrskin/cdrskin.c cdrskin/cdrfifo.c cdrskin/cdrfifo.h
|
||||
## Open questions: how to compute $timestamp and express -DX="$timestamp"
|
||||
##
|
||||
|
||||
# "make clean" shall remove a few stubborn .libs directories
|
||||
# which George Danchev reported Dec 03 2011.
|
||||
# Learned from: http://www.gnu.org/software/automake/manual/automake.html#Clean
|
||||
clean-local:
|
||||
-rm -rf cdrskin/.libs test/.libs
|
||||
|
||||
|
||||
## ========================================================================= ##
|
||||
@ -156,10 +143,7 @@ doc/html: doc/doxygen.conf
|
||||
doc-upload: doc/html
|
||||
scp -r $</* $(webhost):$(webpath)
|
||||
|
||||
## ts B00729
|
||||
## Not by default any more.
|
||||
## It is unclear who is supposed to create file ./doc/doc.lock
|
||||
# all: doc
|
||||
all: doc
|
||||
|
||||
install-data-local:
|
||||
if [ -f ./doc/doc.lock ]; then \
|
||||
@ -198,14 +182,10 @@ nodist_pkgconfig_DATA = \
|
||||
man_MANS = cdrskin/cdrskin.1
|
||||
|
||||
EXTRA_DIST = \
|
||||
bootstrap \
|
||||
libburn-1.pc.in \
|
||||
version.h.in \
|
||||
doc/comments \
|
||||
doc/doxygen.conf.in \
|
||||
doc/cookbook.txt \
|
||||
doc/mediainfo.txt \
|
||||
doc/cdtext.txt \
|
||||
README \
|
||||
AUTHORS \
|
||||
CONTRIBUTORS \
|
||||
@ -219,17 +199,14 @@ EXTRA_DIST = \
|
||||
cdrskin/wiki_plain.txt \
|
||||
cdrskin/cleanup.h \
|
||||
cdrskin/cleanup.c \
|
||||
libburn/libburn.ver \
|
||||
libburn/os-dummy.h \
|
||||
libburn/os-freebsd.h \
|
||||
libburn/os-linux.h \
|
||||
libburn/os-libcdio.h \
|
||||
libburn/os-solaris.h \
|
||||
libburn/sg-dummy.c \
|
||||
libburn/sg-freebsd.c \
|
||||
libburn/sg-linux.c \
|
||||
libburn/sg-libcdio.c \
|
||||
libburn/sg-solaris.c \
|
||||
COPYING \
|
||||
NEWS \
|
||||
ChangeLog \
|
||||
|
220
README
220
README
@ -4,14 +4,14 @@
|
||||
This all is under GPL.
|
||||
(See GPL reference, our clarification and commitment at the end of this text)
|
||||
------------------------------------------------------------------------------
|
||||
libburnia-project.org
|
||||
libburn-project.org
|
||||
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-2013 Mario Danic, Thomas Schmitt
|
||||
Copyright (C) 2006-2010 Mario Danic, Thomas Schmitt
|
||||
Still containing parts of Libburn. By Derek Foreman <derek@signalmarketing.com>
|
||||
and Ben Jansens <xor@orodu.net>
|
||||
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
|
||||
http://files.libburnia-project.org/releases/libburn-1.2.8.tar.gz
|
||||
http://files.libburnia-project.org/releases/libburn-0.7.8.pl00.tar.gz
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
@ -19,10 +19,10 @@ Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
|
||||
From tarball
|
||||
|
||||
Obtain libburn-1.2.8.tar.gz, take it to a directory of your choice and do:
|
||||
Obtain libburn-0.7.8.pl00.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf libburn-1.2.8.tar.gz
|
||||
cd libburn-1.2.8
|
||||
tar xzf libburn-0.7.8.pl00.tar.gz
|
||||
cd libburn-0.7.8
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
|
||||
@ -60,11 +60,6 @@ Warning: The trunk might contain experimental features which might not
|
||||
|
||||
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
|
||||
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
|
||||
@ -77,40 +72,15 @@ configure time by:
|
||||
--enable-dvd-obs-64k
|
||||
This may be combined with above --enable-track-src-odirect .
|
||||
|
||||
If it is desired that DVD DAO writing and stdio: writing get padded up to
|
||||
a full write chunk of 32k resp. 64k, then use ./configure option:
|
||||
--enable-dvd-obs-pad
|
||||
|
||||
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
|
||||
--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 clean ; make
|
||||
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
|
||||
@ -129,15 +99,14 @@ See README files there.
|
||||
|
||||
libburnia-project.org is an open-source software project for reading, mastering
|
||||
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
|
||||
together strive to be a usable foundation for application development.
|
||||
These are libraries, language bindings, and middleware binaries which emulate
|
||||
classical (and valuable) Linux tools.
|
||||
Currently it is supported on GNU/Linux with kernels >= 2.4,
|
||||
on FreeBSD with ATAPI/CAM enabled in the kernel (see man atapicam),
|
||||
and on OpenSolaris (tested with kernel 5.11).
|
||||
Currently it is supported on Linux with kernels >= 2.4 and on FreeBSD versions
|
||||
with ATAPI/CAM support enabled in the kernel, see atapicam(4).
|
||||
On other X/Open compliant systems there will only be pseudo drives, but no
|
||||
direct MMC operation on real CD/DVD/BD drives.
|
||||
|
||||
@ -169,15 +138,12 @@ The project components (list subject to growth, hopefully):
|
||||
|
||||
- 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.
|
||||
An own ISO 9660 extension stores ACLs, xattr, and MD5 of file
|
||||
content.
|
||||
libisofs is to be the foundation of our upcoming mkisofs emulation.
|
||||
|
||||
- libisoburn is an add-on to libburn and libisofs which coordinates both and
|
||||
also allows to grow ISO-9660 filesystem images on multi-session
|
||||
media as well as on overwriteable media via the same API.
|
||||
All media peculiarities are handled automatically.
|
||||
It also contains the methods of command oriented application
|
||||
xorriso and offers them via a C language API.
|
||||
|
||||
- cdrskin is a limited cdrecord compatibility wrapper for libburn.
|
||||
cdrecord is a powerful GPL'ed burn program included in Joerg
|
||||
@ -195,12 +161,9 @@ The project components (list subject to growth, hopefully):
|
||||
Rock Ridge extensions. Manipulation is not only adding or
|
||||
overwriting of files but also deleting, renaming, attribute
|
||||
changing, incremental backups, activating boot images, and
|
||||
extracting of files from ISO images to disk. There is also a
|
||||
sparse emulation of cdrecord and a more laborate one of mkisofs.
|
||||
All features of xorriso are also available via a C language API
|
||||
of libisoburn.
|
||||
A static compilation of xorriso and the libraries is dedicated
|
||||
to the GNU Operating System. See xorriso/README_gnu_xorriso .
|
||||
extracting of files from ISO images to disk. An own ISO 9660
|
||||
extension stores ACLs, xattr, and MD5 of file content.
|
||||
See xorriso/README for more.
|
||||
|
||||
- "test" is a collection of application gestures and examples given by the
|
||||
authors of the library features. The burn API example of libburn
|
||||
@ -542,161 +505,8 @@ Project history as far as known to me:
|
||||
The licenses of libburnia libraries and applications are not affected by
|
||||
this change.
|
||||
|
||||
- 10 Mar 2010 libburn-0.7.8 fixes bugs and improves the built-in abort handler
|
||||
on FreeBSD.
|
||||
|
||||
- 30 Mar 2010 Release 0.5.2 of libisoburn provides xorriso documentation in
|
||||
GNU Texinfo format with embedded extra data to derive a full man page.
|
||||
|
||||
- 09 Apr 2010 libburn-0.8.0 now works with ahci driver on FreeBSD 8-STABLE.
|
||||
|
||||
- 03 May 2010 Version 0.6.32 of libisofs is able to create ISO images with
|
||||
multiple boot images. All boot catalog parameters described in El-Torito
|
||||
specs can be set and inquired. This allows to use GRUB boot images for EFI.
|
||||
|
||||
- 04 May 2010 Release 0.5.6.pl00 of libisoburn makes use of the new libisofs
|
||||
capabilities about boot images.
|
||||
|
||||
- 11 Jun 2010 libburn-0.8.2 now works on Solaris.
|
||||
|
||||
- 14 Jun 2010 By release 0.5.8.pl00 of libisoburn, xorriso becomes a public C
|
||||
language API of libisoburn. The emulations of mkisofs and cdrecord have
|
||||
been enhanced.
|
||||
|
||||
- Tue Jun 29 2010 Version 0.6.34 of libisofs provides new features about
|
||||
hiding file names from directory trees.
|
||||
|
||||
- Wed Jun 30 2010 libburn-0.8.4 removes some restrictions on operating
|
||||
systems other than Linux and FreeBSD.
|
||||
|
||||
- Fri Jul 02 2010 Release 0.6.0.pl00 of libisoburn adds more options to the
|
||||
mkisofs emulation of xorriso. It also fixes minor bugs and shortcommings.
|
||||
|
||||
- Wed Sep 15 2010 Version 0.6.36 of libisofs can produce ISO images which
|
||||
bear a partiton 1 with non-zero start address. They can be mounted from
|
||||
USB stick via the main device file (e.g. /dev/sdb) as well as via the
|
||||
partition device file (e.g. /dev/sdb1).
|
||||
|
||||
- Fri Sep 17 2010 libburn-0.8.6 lifts the test reservation on DVD-R DL media.
|
||||
|
||||
- Sat Sep 18 2010 Release 0.6.2.pl00 of libisoburn introduces a partition
|
||||
with non-zero offset for ISO 9660 images on USB sticks, improves mkisofs
|
||||
emulation, and fixes a regression which existed since version 0.4.2.
|
||||
|
||||
- Wed Oct 20 2010 libburn-0.8.8 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.
|
||||
|
||||
- Sat Jan 28 2012 release 1.2.0:
|
||||
libburn has learned to read and write CD-TEXT with CD SAO audio sessions.
|
||||
It can now read CDRWIN .cue files which define pure audio or pure data
|
||||
sessions. libisofs and libisoburn improved timestamp handling. Several
|
||||
minor bugs were fixed.
|
||||
|
||||
- Mon Apr 02 2012 release 1.2.2:
|
||||
The handling of intentional deviations from ECMA-119 specifications has
|
||||
been improved in libisofs. libisoburn and xorriso now make use of these
|
||||
improvements. Some rarely occuring bugs have been fixed.
|
||||
|
||||
- Fri Jul 20 2012 release 1.2.4:
|
||||
libburn and libisofs got some rarely occuring bugs fixed. libisofs learned
|
||||
to produce HFS+ metadata and Apple Partition Map. The capabilities of
|
||||
isohybrid options --efi and --mac have been implemented (GPT and APM).
|
||||
|
||||
- Tue Jan 08 2013 release 1.2.6:
|
||||
Small improvements were made in libburn. Minor bugs were fixed in the
|
||||
libraries. xorriso improved its capabilities to serve the needs of frontend
|
||||
programs. A proof of concept for a GUI frontend has been implemented:
|
||||
xorriso-tcltk
|
||||
|
||||
- Mon Mar 18 2013 release 1.2.8:
|
||||
Some rarely occuring bugs were fixed in libisofs and libburn. libburn's
|
||||
handling of incomplete sessions has been improved. xorriso's mkisofs
|
||||
emulation learned to set El Torito section id strings.
|
||||
|
||||
- 10 Mar 2010 libburn-0.7.8.pl00 fixes bugs and improves the built-in abort
|
||||
handler on FreeBSD.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
17
acinclude.m4
17
acinclude.m4
@ -16,13 +16,11 @@ AC_DEFUN([TARGET_SHIZZLE],
|
||||
|
||||
AC_MSG_CHECKING([target operating system])
|
||||
|
||||
LIBBURNIA_LDCONFIG_CMD="echo 'No ldconfig run performed. If needed, configure manually for:'"
|
||||
|
||||
case $target_os in
|
||||
linux*)
|
||||
ARCH=linux
|
||||
LIBBURN_ARCH_LIBS=
|
||||
LIBBURNIA_LDCONFIG_CMD=ldconfig
|
||||
;;
|
||||
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 Important: Must be performed _after_ TARGET_SHIZZLE
|
||||
dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
#!/bin/sh -x
|
||||
|
||||
aclocal -I .
|
||||
aclocal
|
||||
libtoolize --copy --force
|
||||
autoconf
|
||||
|
||||
|
139
cdrskin/README
139
cdrskin/README
@ -4,17 +4,16 @@
|
||||
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
|
||||
Integrated sub project of libburnia-project.org but also published via:
|
||||
http://scdbackup.sourceforge.net/cdrskin_eng.html
|
||||
http://scdbackup.sourceforge.net/cdrskin-1.2.8.tar.gz
|
||||
http://scdbackup.sourceforge.net/cdrskin-0.7.8.pl00.tar.gz
|
||||
|
||||
Copyright (C) 2006-2013 Thomas Schmitt, provided under GPL version 2 or later.
|
||||
Copyright (C) 2006-2010 Thomas Schmitt, provided under GPL version 2 or later.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
cdrskin is a limited cdrecord compatibility wrapper which allows to use
|
||||
most of the libburn features from the command line.
|
||||
|
||||
Currently it is supported on GNU/Linux with kernels >= 2.4,
|
||||
on FreeBSD and on OpenSolaris.
|
||||
Currently it is supported on Linux with kernels >= 2.4 and on FreeBSD.
|
||||
IDE drives under Linux 2.4. need kernel module ide-scsi.
|
||||
ATA and SATA drives under FreeBSD need kernel module atapicam.
|
||||
On other X/Open compliant systems there will only be emulated drives, but no
|
||||
@ -26,10 +25,10 @@ By using this software you agree to the disclaimer at the end of this text
|
||||
|
||||
Compilation, First Glimpse, Installation
|
||||
|
||||
Obtain cdrskin-1.2.8.tar.gz, take it to a directory of your choice and do:
|
||||
Obtain cdrskin-0.7.8.pl00.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf cdrskin-1.2.8.tar.gz
|
||||
cd cdrskin-1.2.8
|
||||
tar xzf cdrskin-0.7.8.pl00.tar.gz
|
||||
cd cdrskin-0.7.8
|
||||
|
||||
Within that directory execute:
|
||||
|
||||
@ -104,25 +103,17 @@ The output of cdrskin --devices might look like
|
||||
0 dev='/dev/sr0' rwrwr- : '_NEC' 'DVD_RW ND-4570A'
|
||||
1 dev='/dev/sr1' rwrw-- : 'HL-DT-ST' 'DVDRAM GSA-4082B'
|
||||
|
||||
On Linux, full and insecure enabling of both for everybody would look like
|
||||
chmod a+rw /dev/sr0 /dev/hda
|
||||
This is equivalent to the traditional setup chmod a+x,u+s cdrecord.
|
||||
So full and insecure enabling of both for everybody would look like
|
||||
|
||||
On FreeBSD, device permissions are to be set in /etc/devfs.rules.
|
||||
On Solaris, pfexec privileges may be restricted to "basic,sys_devices".
|
||||
See below "System Dependend Drive Permission Examples".
|
||||
chmod a+rw /dev/sr0 /dev/sr1
|
||||
|
||||
This is equivalent to the traditional setup chmod a+x,u+s cdrecord.
|
||||
|
||||
I strongly discourage to run cdrskin with setuid root or via sudo !
|
||||
It is not checked for the necessary degree of hacker safety.
|
||||
Better consider to grant the necessary permissions to group "floppy"
|
||||
and to add users to it.
|
||||
|
||||
|
||||
A behavioral conflict is known between any burn software and demons like hald
|
||||
which probe CD drives. This can spoil burn runs for CD-R or CD-RW.
|
||||
You may have to keep your hald away from the drive. See for example
|
||||
http://www.freebsd.org/gnome/docs/halfaq.html
|
||||
|
||||
Consider to put all authorized users into group "floppy", to chgrp the
|
||||
device file to that group and to disallow w-access to others.
|
||||
|
||||
Helpful with Linux kernel 2.4 is a special SCSI feature:
|
||||
It is possible to address a scsi(-emulated) drive via associated device files
|
||||
@ -131,6 +122,11 @@ as listed device files. This addressing via e.g. /dev/sr0 or /dev/scd1 is
|
||||
compatible with generic read programs like dd and with write program growisofs.
|
||||
For finding /dev/sg1 from /dev/sr0, the program needs rw-access to both files.
|
||||
|
||||
A behavioral conflict is known between any burn software and demons like hald
|
||||
which probe CD drives. This can spoil burn runs for CD-R or CD-RW.
|
||||
You may have to keep your hald away from the drive. See for example
|
||||
http://www.freebsd.org/gnome/docs/halfaq.html
|
||||
|
||||
|
||||
Usage examples
|
||||
|
||||
@ -310,11 +306,10 @@ Add-on session (equivalent to growisofs -M):
|
||||
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
|
||||
"Sequential Recording". DVD-R are always in sequential state. DVD-R DL are
|
||||
always sequential and incapable of multi-session.
|
||||
"Sequential Recording". DVD-R are always in sequential state.
|
||||
|
||||
"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.
|
||||
@ -439,100 +434,6 @@ will not have a fifo buffer, and will not be able to put out help texts or
|
||||
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
|
||||
|
||||
Accessing the optical drives requires privileges which usually are granted
|
||||
only to the superuser. Linux, FreeBSD and Solaris offer quite different
|
||||
approaches for avoiding the need for unrestricted privileges.
|
||||
|
||||
First check whether some friendly system setting already allows you to
|
||||
access the drives as normal user:
|
||||
cdrskin --devices
|
||||
Those drives of which you see address and type strings are already usable.
|
||||
|
||||
If there remain drives invisible which the superuser can see by the same
|
||||
command, then the following examples might help:
|
||||
|
||||
---------------------
|
||||
On all three systems:
|
||||
---------------------
|
||||
Add the authorized users of CD drives to group "floppy" in /etc/group.
|
||||
If missing: create this group.
|
||||
Changes to /etc/group often only affect new login sessions. So log out and in
|
||||
before making the first tests.
|
||||
|
||||
---------
|
||||
On Linux:
|
||||
---------
|
||||
Allow rw-access to the drives
|
||||
chgrp floppy /dev/sr0 /dev/sr1
|
||||
chmod g+rw /dev/sr0 /dev/sr1
|
||||
It might be necessary to perform chgrp and chmod after each reboot or to
|
||||
edit distro dependent device configuration files for permanent settings.
|
||||
|
||||
-----------
|
||||
On FreeBSD:
|
||||
-----------
|
||||
Edit /etc/devfs.rules and make sure to have these lines
|
||||
[localrules=10]
|
||||
add path 'acd*' mode 0664 group floppy
|
||||
add path 'cd*' mode 0664 group floppy
|
||||
add path 'pass*' mode 0664 group floppy
|
||||
add path 'xpt*' mode 0664 group floppy
|
||||
[localrules=5]
|
||||
add path 'pass*' mode 0664 group floppy
|
||||
add path 'cd*' mode 0664 group floppy
|
||||
add path 'xpt*' mode 0664 group floppy
|
||||
add path 'acd*' mode 0664 group floppy
|
||||
|
||||
Edit /etc/rc.conf and add the following line if missing
|
||||
devfs_system_ruleset="localrules"
|
||||
|
||||
This gets into effect by reboot or by command
|
||||
/etc/rc.d/devfs start
|
||||
|
||||
-----------
|
||||
On Solaris:
|
||||
-----------
|
||||
Run cdrskin by
|
||||
pfexec cdrskin ...arguments...
|
||||
|
||||
The following settings will make pfexec keep original UID and EUID and prevent
|
||||
most superuser powers. Be aware that you still can manipulate all device files
|
||||
if you have the file permissions for that.
|
||||
Full root privileges for cdrskin can then be aquired only by command su.
|
||||
|
||||
Edit /etc/security/exec_attr and add this line to the other "Media Backup"
|
||||
lines:
|
||||
Media Backup:solaris:cmd:::/usr/local/bin/cdrskin:privs=basic,sys_devices
|
||||
Edit /etc/user_attr and add profile "Media Backup" to the user's line:
|
||||
thomas::::profiles=Media Backup,Primary Administrator;roles=root
|
||||
See also man privileges, man exec_attr, man user_attr.
|
||||
|
||||
Then allow the group r-access to the drives
|
||||
pfexec chgrp floppy /dev/rdsk/c3t0d0s2 /dev/rdsk/c4t0d0s2
|
||||
pfexec chmod g+r /dev/rdsk/c3t0d0s2 /dev/rdsk/c4t0d0s2
|
||||
The last two commands have to be executed after each boot. I do not know
|
||||
the relevant device configuration files yet.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Project aspects and legal stuff
|
||||
------------------------------------------------------------------------------
|
||||
@ -576,7 +477,7 @@ contributions in a due way.
|
||||
Based on and sub project of:
|
||||
libburnia-project.org
|
||||
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-2013 Mario Danic, Thomas Schmitt
|
||||
Copyright (C) 2006-2010 Mario Danic, Thomas Schmitt
|
||||
|
||||
libburnia-project.org is inspired by and in other components still containing
|
||||
parts of
|
||||
|
@ -38,9 +38,8 @@ original="./libburn_svn_release.tgz"
|
||||
# My changes are in $changes , mainly in $changes/cdrskin
|
||||
changes="./libburn-release"
|
||||
|
||||
skin_release="1.2.8"
|
||||
patch_level=""
|
||||
# patch_level=".pl00"
|
||||
skin_release="0.7.8"
|
||||
patch_level=".pl00"
|
||||
skin_rev="$skin_release""$patch_level"
|
||||
|
||||
# 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
|
||||
changes="./libburn-develop"
|
||||
|
||||
skin_release="1.2.9"
|
||||
skin_release="0.7.9"
|
||||
patch_level=""
|
||||
skin_rev="$skin_release""$patch_level"
|
||||
|
@ -34,7 +34,7 @@
|
||||
|
||||
|
||||
/* 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
|
||||
@ -634,7 +634,7 @@ return: <0 = error , 0 = idle , 1 = did some work
|
||||
*/
|
||||
{
|
||||
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);
|
||||
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)
|
||||
can_write= o->buffer_size - o->read_idx;
|
||||
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)
|
||||
goto after_write;
|
||||
}
|
||||
@ -1039,9 +1039,9 @@ int Test_mixed_bs(char **paths, int path_count,
|
||||
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;
|
||||
char target_path[80];
|
||||
char buf[10240], target_path[80];
|
||||
double in_counter, out_counter, prev_in= -1.0, prev_out= -1.0;
|
||||
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
|
||||
*/
|
||||
{
|
||||
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;
|
||||
char buf[10240];
|
||||
struct CdrfifO *ff1= NULL,*ff2= NULL;
|
||||
|
||||
/* open four pairs of fds */
|
||||
|
@ -2,7 +2,7 @@
|
||||
.\" First parameter, NAME, should be all caps
|
||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||
.\" other parameters are allowed: see man(7), man(1)
|
||||
.TH CDRSKIN 1 "Version 1.2.8, Mar 18, 2013"
|
||||
.TH CDRSKIN 1 "Feb 29, 2010"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
@ -47,7 +47,7 @@ Multi session on CD (follow-up sessions in TAO only)
|
||||
.br
|
||||
or on DVD-R[W] (in Incremental mode) or DVD+R[/DL] or BD-R.
|
||||
.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
|
||||
Single session or emulated ISO-9660 multi-session
|
||||
.br
|
||||
@ -80,19 +80,15 @@ Emulated drives
|
||||
The input-output entities which get processed are called tracks.
|
||||
A \fBtrack\fP stores a stream of bytes.
|
||||
.br
|
||||
Each track is initiated by one track source address argument, which may either
|
||||
be "-" for standard input or the address of a readable file. If no write mode
|
||||
is given explicitly then one will be chosen which matches the peculiarities
|
||||
of track sources and the state of the output media.
|
||||
.PP
|
||||
More than one track can be burned by a single run of cdrskin.
|
||||
In the terms of the MMC standard all tracks written by the same run constitute
|
||||
a \fBsession\fP.
|
||||
.br
|
||||
Normally, each track is initiated by one track source address argument,
|
||||
which may either be "-" for standard input or the address of a readable file.
|
||||
Alternatively, option cuefile= may be used to read a session description
|
||||
from a text file and to read the session content from a single data file.
|
||||
.br
|
||||
If no write mode
|
||||
is given explicitly then one will be chosen which matches the peculiarities
|
||||
of track sources and the state of the output media.
|
||||
.PP
|
||||
Some media types can be kept appendable so that further tracks can
|
||||
be written to them in subsequent runs of cdrskin (see option -multi).
|
||||
Info about the addresses of burned tracks is kept in a table of
|
||||
@ -134,8 +130,8 @@ eventual multi-session capabilities.
|
||||
A more restrictive mode
|
||||
.B -sao
|
||||
(alias -dao) which usually demands a predictable track size and is not
|
||||
necessarily capable of multi-session. It can be used to write CD-TEXT and
|
||||
it is the only one that works with option cuefile=.
|
||||
necessarily capable of multi-session. It may have advantages for some
|
||||
readers resp. players of the recorded tracks.
|
||||
.br
|
||||
If none of the options -dao, -tao or -sao is given then the program will
|
||||
try to choose a write mode which matches the defined recording job,
|
||||
@ -170,7 +166,7 @@ needed.
|
||||
.SS
|
||||
.B Sequentially Recordable DVD or BD Media:
|
||||
.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
|
||||
blanked and re-used from scratch.
|
||||
.br
|
||||
@ -190,8 +186,8 @@ of recognizable size or the size has to be announced explicitly by options
|
||||
or
|
||||
.B tao_to_sao_tsize= .
|
||||
.br
|
||||
DAO is the only mode for DVD-R media which do not offer feature 21h Incremental
|
||||
Streaming (e.g. DVD-R DL). DAO may also be selected explicitly by option
|
||||
DAO is the only mode for media which do not offer feature 21h Incremental
|
||||
Streaming. DAO may also be selected explicitly by option
|
||||
.B -sao .
|
||||
Program growisofs uses DAO on sequential DVD-R[W] media for maximum
|
||||
DVD-ROM/-Video compatibility.
|
||||
@ -202,7 +198,7 @@ Incremental Streaming may be selected explicitly by option
|
||||
.B -tao
|
||||
as it resembles much CD TAO by allowing track sources of
|
||||
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.
|
||||
Multiple tracks per session are permissible.
|
||||
.br
|
||||
@ -260,7 +256,7 @@ that it has to be formatted again. If in doubt, just give it a try.
|
||||
.br
|
||||
The drives, CD, DVD, or BD burners, are accessed via addresses which
|
||||
are specific to libburn and the operating system. Those addresses get listed
|
||||
by a run of \fBcdrskin --devices\fP or \fBcdrskin --device_links\fP.
|
||||
by a run of \fBcdrskin --devices\fP.
|
||||
.br
|
||||
On Linux, they are device files which traditionally do not offer
|
||||
w-permissions for normal users. Because libburn needs rw-permission,
|
||||
@ -275,22 +271,19 @@ the drive is somewhat higher but the overall system is much less at stake.
|
||||
Consider to restrict rw-access to a single group which bundles the users who
|
||||
are allowed to use the burner drive (like group "floppy").
|
||||
.br
|
||||
For drive permission examples on Linux, FreeBSD, and Solaris,
|
||||
see cdrskin/README.
|
||||
.br
|
||||
.PP
|
||||
If you only got one CD capable drive then you may leave out cdrskin option
|
||||
\fBdev=\fP. Else you should use this option to address the drive you want.
|
||||
.br
|
||||
cdrskin option dev= not only accepts the listed addresses but also
|
||||
traditional cdrecord SCSI addresses which consist of three numbers:
|
||||
Bus,Target,Lun. On Linux there is also a related address family "ATA" which
|
||||
traditional cdrecord SCSI addresses which on Linux consist of three
|
||||
numbers: Bus,Target,Lun. There is also a related address family "ATA" which
|
||||
accesses IDE drives not under control of Linux SCSI drivers:
|
||||
ATA:Bus,Target,Lun.
|
||||
.br
|
||||
See option -scanbus for getting a list of cdrecord style addresses.
|
||||
.br
|
||||
Further are accepted: links to libburn-suitable device files,
|
||||
Further are accepted on Linux: links to libburn-suitable device files,
|
||||
device files which have the same major and minor device number,
|
||||
and device files which have the same SCSI address parameters (e.g. /dev/sg0).
|
||||
.br
|
||||
@ -498,27 +491,6 @@ Print this list of blanking types.
|
||||
Retrieve some info about the addressed drive and then exit.
|
||||
Exits with non-zero value if the drive cannot be found and opened.
|
||||
.TP
|
||||
.BI \-copy
|
||||
Create the subsequent tracks with permission for an unlimited number of copies.
|
||||
.TP
|
||||
.BI cuefile= path
|
||||
Read a session description from a cue sheet file in CDRWIN format.
|
||||
Base the tracks on a single file which is given in the sheet by command FILE.
|
||||
To enable CD-TEXT from the cue sheet file, cdrskin option -text has to be
|
||||
present.
|
||||
.br
|
||||
cdrskin currently supports TRACK datatypes AUDIO and MODE1/2048 which may
|
||||
not be mixed.
|
||||
Data source may be of FILE type BINARY, MOTOROLA, or WAVE.
|
||||
.br
|
||||
Non-CDRWIN commands ARRANGER, COMPOSER, MESSAGE are supported.
|
||||
.br
|
||||
Cue sheet file commands CATALOG and ISRC may be overridden by option mcn=
|
||||
and by input_sheet_v07t= purpose specifiers "UPC / EAN" and "ISRC".
|
||||
This does not affect their appearance in CD-TEXT, but only on Q sub-channel.
|
||||
.br
|
||||
The track numbers may be overridden by option cd_start_tno=.
|
||||
.TP
|
||||
.BI \-dao
|
||||
Alias for option -sao. Write CD in Session at Once mode
|
||||
or DVD-R[W] in Disc-at-once mode.
|
||||
@ -537,7 +509,7 @@ cdrskin will not write CD-ROM XA but rather strip the header bytes and write as
|
||||
.TP
|
||||
.BI dev= target
|
||||
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,
|
||||
ATA:X,Y,Z addresses listed with options dev=ATA -scanbus,
|
||||
and volatile libburn drive numbers (numbering starts at "0").
|
||||
@ -579,9 +551,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
|
||||
that drive and media will not simulate the write mode but will write for real.
|
||||
.br
|
||||
It enables a burn run where cdrskin expects to exceed the available media
|
||||
capacity.
|
||||
.br
|
||||
.B Caution:
|
||||
Use this only when in urgent need.
|
||||
.TP
|
||||
@ -617,20 +586,6 @@ long running drive commands asynchronous and thus eases the load on some
|
||||
wiring hardware types. Regardless of option -immed, cdrskin uses asynchronous
|
||||
commands where possible and appropriate.
|
||||
.TP
|
||||
.BI index= list
|
||||
Set a comma separated list of index start address numbers for the next track.
|
||||
This applies to CD SAO sessions only.
|
||||
.br
|
||||
The addresses count sectors from the start of the next track. The first number
|
||||
is for index 1 and must be 0. The following numbers have to be larger than
|
||||
their respective predecessors. Up to 99 numbers are allowed.
|
||||
.br
|
||||
Sector numbers are computed from Min:Sec:Frame addresses by
|
||||
.br
|
||||
Sector = ((Min*60)+Sec)*75+Frame
|
||||
.br
|
||||
E.g.: "0,7512,20408" sets index 2 to 01:40:12 and index 3 to 04:32:08.
|
||||
.TP
|
||||
.BI -inq
|
||||
Print the identification of the drive and then exit.
|
||||
.TP
|
||||
@ -650,16 +605,6 @@ This option can be performed on track sources which are regular files or block
|
||||
devices. For the first track of the session it can be performed on any type
|
||||
of source if there is a fifo of at least 64 kiB. See option fs= .
|
||||
.TP
|
||||
.BI isrc= text
|
||||
Set the ISRC for the next track source to the given text, which must be exactly
|
||||
13 characters long. It must comply to the format CCOOOYYSSSSS.
|
||||
.br
|
||||
CC is the country code. OOO is the owner code. Both may consist of capital
|
||||
letters A to Z and of decimal digits 0 to 9. YY depicts the year (00 to 99).
|
||||
SSSSS is the serial number (00000 to 99999).
|
||||
.br
|
||||
This option does not affect CD-TEXT but only the Q sub-channel.
|
||||
.TP
|
||||
.BI -load
|
||||
Load the media and exit. Exit value is 0 if any kind of media was found, non
|
||||
zero else. Note: Option -eject will unload the media even if -load is given.
|
||||
@ -672,12 +617,6 @@ Use program "eject" or cdrskin -eject to get the tray out of the drive.
|
||||
Runs of programs like cdrecord, growisofs, wodim, cdrskin will not be hampered
|
||||
and normally enable the drive's eject button when they are done.
|
||||
.TP
|
||||
.BI mcn= text
|
||||
Set the CD Media Catalog Number to text, which must be exactly 13 characters
|
||||
long and should consist of decimal digits.
|
||||
.br
|
||||
This option does not affect CD-TEXT but only the Q sub-channel.
|
||||
.TP
|
||||
.BI minbuf= percentage
|
||||
Equivalent to:
|
||||
.br
|
||||
@ -717,8 +656,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.
|
||||
.br
|
||||
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.
|
||||
Option --prodvd_cli_compatible eventually makes
|
||||
with DVD-R[W] DAO write mode. Option --prodvd_cli_compatible eventually makes
|
||||
-multi tolerable but cannot make it work.
|
||||
.br
|
||||
In order to have all filesystem content accessible, the eventual ISO-9660
|
||||
@ -739,19 +677,11 @@ for lifting the ban on -multi.
|
||||
.br
|
||||
Note: -multi might make DVD media unreadable in some DVD-ROM drives.
|
||||
.TP
|
||||
.BI \-nocopy
|
||||
Create subsequent tracks with permission for a single level of copies.
|
||||
I.e. those copies would then be marked by -scms as offering no permission
|
||||
for further copies.
|
||||
.TP
|
||||
.BI \-nopad
|
||||
Do not add trailing zeros to the data stream. Nevertheless, since there seems
|
||||
to be no use for audio tracks with incomplete last sector, this option applies
|
||||
only to data tracks. There it is default.
|
||||
.TP
|
||||
.BI \-nopreemp
|
||||
Indicate for subsequent tracks that they were mastered without pre-emphasis.
|
||||
.TP
|
||||
.BI \-pad
|
||||
Add 30 kiB of trailing zeros to each data track. (This is not sufficient to
|
||||
avoid problems with various CD-ROM read drivers.)
|
||||
@ -761,9 +691,6 @@ Add the given amount of trailing zeros to the next data track. This option
|
||||
gets reset to padsize=0 after that next track is written. It may be set
|
||||
again before the next track argument. About size specifiers, see option fs=.
|
||||
.TP
|
||||
.BI \-preemp
|
||||
Indicate for subsequent tracks that they were mastered with pre-emphasis.
|
||||
.TP
|
||||
.BI \-sao
|
||||
Write CD in Session At Once mode or sequential DVD-R[W] in Disc-at-once
|
||||
(DAO) mode.
|
||||
@ -796,14 +723,6 @@ The useful fields in a result line are:
|
||||
.br
|
||||
Bus,Target,Lun Number) 'Vendor' 'Mode' 'Revision'
|
||||
.TP
|
||||
.BI \-scms
|
||||
Create subsequent tracks without permission for being copied. This is usually
|
||||
done for tracks which are copies of tracks that were marked with -nocopy
|
||||
(but not yet with -scms). So copies of copies are prohibited.
|
||||
.br
|
||||
This option gets reset by option -copy. Thus the combination -copy -nocopy
|
||||
means -nocopy surely without -scms.
|
||||
.TP
|
||||
.BI speed= number
|
||||
Set speed of drive. With data CD, 1x speed corresponds to a throughput of
|
||||
150,000 bytes/second. With DVD, 1x = 1,385,000 bytes/second.
|
||||
@ -831,42 +750,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
|
||||
to appendable media which already hold data. With unformatted DVD-R[W] it is
|
||||
the only mode which allows -multi.
|
||||
.br
|
||||
Mode -tao is not usable for minimally blanked DVD-RW and for DVD-R DL.
|
||||
.TP
|
||||
.BI \-text
|
||||
Enable writing of CD-TEXT attributes read by option cuefile=.
|
||||
Without option -text, cue sheet file command CDTEXTFILE will be ignored and
|
||||
no CD-TEXT attributes will be read from the file. Nevertheless, CATALOG and
|
||||
ISRC will have the same effect as options mcn= and isrc=.
|
||||
.TP
|
||||
.BI textfile= path
|
||||
Read CD-TEXT packs from the file depicted by path and put them into the
|
||||
Lead-in of the emerging session. This session has to be done by Session At Once
|
||||
(SAO) mode and may only contain audio tracks.
|
||||
.br
|
||||
path must lead to a regular file, which consists of an optional header of four
|
||||
bytes and one or more text packs of 18 bytes each. Suitable would be the
|
||||
file 'cdtext.dat' which gets extracted from CD media by options -vv -toc
|
||||
and shown in human readable form by -vvv -toc.
|
||||
.br
|
||||
The header, if present, must tell the file size minus 2, encoded as big-endian
|
||||
16 bit word. The other two bytes must be 0.
|
||||
.br
|
||||
If there is no 4-byte header, then a trailing 0-byte, as of Sony specification,
|
||||
is tolerated and ignored.
|
||||
.br
|
||||
A text pack consists of a pack type byte, a track number byte, a counter byte,
|
||||
a Block Number and Character Indicator byte, 12 text characters or data bytes,
|
||||
two optional CRC bytes. For details see libburn documentation file
|
||||
doc/cdtext.txt.
|
||||
.br
|
||||
By default, the input file is checked for correct CRC bytes. If all CRC bytes
|
||||
are 0, then the correct values get silently inserted. If there are non-zero
|
||||
CRC bytes, then a mismatch causes the abort of the burn run.
|
||||
This check can be disabled by option -force.
|
||||
.br
|
||||
Note that this option overrides option input_sheet_v07t= .
|
||||
.TP
|
||||
.BI \-toc
|
||||
Print the table of content (TOC) which describes the tracks recorded on disc.
|
||||
@ -874,17 +757,6 @@ The output contains all info from option -atip plus lines which begin with
|
||||
"track:", the track number, the word "lba:" and a number which gives the
|
||||
start address of the track. Addresses are counted in CD sectors which with
|
||||
SAO or TAO data tracks hold 2048 bytes each.
|
||||
.br
|
||||
If verbosity is set to level 2 (-v -v) then the CD-TEXT packs from the lead-in
|
||||
of an audio CD get extracted and written into file 'cdtext.dat', if that file
|
||||
does not yet exist. Prepended is a 4 byte header, followed by one or more
|
||||
packs of 18 bytes each.
|
||||
.br
|
||||
Verbosity level 3 causes the CD-TEXT packs to be printed as hex numbers to
|
||||
standard output. Bytes 4 to 15 of certain pack types are printed as ASCII
|
||||
characters if they have values in the range of 32 to 126.
|
||||
.br
|
||||
See option textfile= for more information about the text pack format.
|
||||
.RS
|
||||
.TP
|
||||
Example. Retrieve an afio archive from track number 2:
|
||||
@ -917,7 +789,7 @@ then the track on media gets truncated to the predicted size and cdrskin exits
|
||||
with non-zero value.
|
||||
.TP
|
||||
.BI \-v
|
||||
Increment verbosity level by one. Startlevel is 0 with only few messages.
|
||||
Increment verbose level by one. Startlevel is 0 with only few messages.
|
||||
Level 1 prints progress report with long running operations and also causes
|
||||
some extra lines to be put out with info retrieval options.
|
||||
Level 2 additionally reports about option settings derived from arguments or
|
||||
@ -984,16 +856,6 @@ taken as plain block number with block size 2048 byte.
|
||||
(E.g ...=1000 or ...=1000s means block 1000, ...=1m means block
|
||||
512, ...=4096b means block number 2)
|
||||
.TP
|
||||
.BI cd_start_tno= number
|
||||
Set the number which shall be written as CD track number with the first
|
||||
track of the session. The following tracks will then get written with
|
||||
consecutive CD track numbers. The resulting number of the last track
|
||||
must not exceed 99. The lowest possible start number is 1, which is also
|
||||
the default.
|
||||
.br
|
||||
This setting applies only to CD SAO writing. It overrides the track number
|
||||
settings caused by options cuefile= or input_sheet_v07t=.
|
||||
.TP
|
||||
.BI \--demand_a_drive
|
||||
Exit with a nonzero value if no drive can be found during a bus scan.
|
||||
.TP
|
||||
@ -1010,17 +872,6 @@ Number dev='Devicefile' rw-Permissions : 'Vendor' 'Model'
|
||||
Number and Devicefile can both be used with option dev=, but number is
|
||||
volatile (numbering changes if drives become busy).
|
||||
.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
|
||||
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
|
||||
@ -1051,10 +902,9 @@ overwriteable DVD-RW it is 32k.
|
||||
.BI dvd_obs= default|32k|64k
|
||||
Linux specific:
|
||||
Set the number of bytes to be transmitted with each write operation to DVD
|
||||
or BD media. With most write types, tracks get padded up to the next multiple
|
||||
of this write size (see option --obs_pad).
|
||||
A number of 64 KB may improve throughput with systems
|
||||
which show latency problems. The default depends on media type, option
|
||||
or BD media. Tracks get padded up to the next multiple of this write
|
||||
size. A number of 64 KB may improve throughput with bus systems which
|
||||
show latency problems. The default depends on media type, option
|
||||
stream_recording=, and on compile time options.
|
||||
.TP
|
||||
.BI fallback_program= command
|
||||
@ -1083,9 +933,6 @@ implies fallback_program=cdrecord
|
||||
.br
|
||||
.B codim
|
||||
implies fallback_program=wodim
|
||||
.TP
|
||||
.BI --four_channel
|
||||
Indicate for subsequent tracks that they were mastered with four channels.
|
||||
.TP
|
||||
.BI fifo_start_at= size
|
||||
Do not wait for full fifo but start burning as soon as the given number
|
||||
@ -1137,97 +984,6 @@ With multi-session DVD, blank=fast will act like dvd+rw-format -blank=full .
|
||||
.br
|
||||
growisofs -dvd-compat is roughly equivalent to cdrskin without option -multi.
|
||||
.TP
|
||||
.BI input_sheet_v07t= path
|
||||
Read CD-TEXT definitions from a Sony Input Sheet version 0.7T. Up to eight
|
||||
or seven such sheets can be read by multiple input_sheet_v07t= options.
|
||||
Each will define a CD-TEXT language block.
|
||||
.br
|
||||
The information in such a sheet is given by text lines of the following form:
|
||||
.br
|
||||
purpose specifier [whitespace] = [whitespace] content text
|
||||
.br
|
||||
[whitespace] is zero or more ASCII 32 (space) or ASCII 9 (tab) characters.
|
||||
The purpose specifier tells the meaning of the content text.
|
||||
Empty content text does not cause a CD-TEXT attribute to be attached.
|
||||
.br
|
||||
The following purpose specifiers apply to the session as a whole:
|
||||
.br
|
||||
Purpose specifier | Content example
|
||||
.br
|
||||
-------------------------------------------------------------
|
||||
.br
|
||||
Text Code = 8859
|
||||
.br
|
||||
Language Code = English
|
||||
.br
|
||||
Album Title = Joyful Nights
|
||||
.br
|
||||
Artist Name = United Cat Orchestra
|
||||
.br
|
||||
Songwriter = Various Songwriters
|
||||
.br
|
||||
Composer = Various Composers
|
||||
.br
|
||||
Arranger = Tom Cat
|
||||
.br
|
||||
Album Message = For all our fans
|
||||
.br
|
||||
Catalog Number = 1234567890
|
||||
.br
|
||||
Genre Code = Classical
|
||||
.br
|
||||
Genre Information = Feline classic music
|
||||
.br
|
||||
Closed Information = This is not to be shown by CD players
|
||||
.br
|
||||
UPC / EAN = 1234567890123
|
||||
.br
|
||||
Text Data Copy Protection = OFF
|
||||
.br
|
||||
First Track Number = 1
|
||||
.br
|
||||
Last Track Number = 3
|
||||
.br
|
||||
The following purpose specifiers apply to particular tracks:
|
||||
.br
|
||||
Purpose specifier | Content example
|
||||
.br
|
||||
-------------------------------------------------------------
|
||||
.br
|
||||
Track 01 Title = Song of Joy
|
||||
.br
|
||||
Track 01 Artist = Felix and The Purrs
|
||||
.br
|
||||
Track 01 Songwriter = Friedrich Schiller
|
||||
.br
|
||||
Track 01 Composer = Ludwig van Beethoven
|
||||
.br
|
||||
Track 01 Arranger = Tom Cat
|
||||
.br
|
||||
Track 01 Message = Fritz and Louie once were punks
|
||||
.br
|
||||
ISRC 01 = XYCRR1101234
|
||||
.br
|
||||
Track numbers are decimal despite the leading 0. There should be as many track
|
||||
definitions as there are track source files given.
|
||||
.br
|
||||
See libburn's doc/cdtext.txt for a detailed definition of 0.7T and the
|
||||
possible values for Text Code, Language Code, Genre Code, Text Data Copy
|
||||
Protection.
|
||||
.br
|
||||
The Q sub-channel settings by "UPC / EAN" and "ISRC" may be overridden by
|
||||
options mcn= and isrc=. This will not affect their appearance as CD-TEXT.
|
||||
They may override cuefile= commands CATALOG and ISRC in the same way.
|
||||
.br
|
||||
If options -text cuefile= are given and if the cue sheet file defines CD-TEXT,
|
||||
then only seven input_sheet_v07t= options may be given. They will then be
|
||||
used as CD-TEXT language blocks 1 to 7.
|
||||
.br
|
||||
This option will get into effect only if no option textfile= is given.
|
||||
The write mode must be SAO on CD. All tracks must be -audio tracks.
|
||||
.br
|
||||
The track numbers may be overridden by option cd_start_tno=.
|
||||
.TP
|
||||
.BI \--list_formats
|
||||
List the available format descriptors as reported by the drive for the
|
||||
loaded media. Each descriptor line begins with "Format idx" and the
|
||||
@ -1243,36 +999,10 @@ List all ignored cdrecord options. The "-" options cannot be used as addresses
|
||||
of track sources. No track source address may begin with a text equal to an
|
||||
option which ends by "=". The list is ended by an empty line.
|
||||
.TP
|
||||
.BI \--list_speeds
|
||||
Put out a list of speed values as reported by the output drive with
|
||||
the loaded medium. This does not necessarily mean that the medium is writable
|
||||
or that these speeds are actually achievable. Especially the
|
||||
lists reported with empty drive or with ROM media obviously advertise
|
||||
speeds for other media.
|
||||
.br
|
||||
It is not mandatory to use speed values out of the listed range.
|
||||
The drive is supposed to choose a safe speed that is as near to the desired
|
||||
speed as possible.
|
||||
.br
|
||||
At the end of the list, "Write speed L" and "Write speed H"
|
||||
are the best guesses for lower and upper speed limit.
|
||||
"Write speed l" and "Write speed h" may appear only with CD
|
||||
and eventually override the list of other speed offers.
|
||||
.br
|
||||
Only if the drive reports contradicting speed information there will appear
|
||||
"Write speed 0" or "Write speed-1", which tell the outcome of speed selection
|
||||
by options speed=0 resp. speed=-1, if it deviates from "Write speed L"
|
||||
resp. "Write speed H".
|
||||
.TP
|
||||
.BI \--long_toc
|
||||
Like option -toc but marking each session start by a line "first: X last: Y"
|
||||
and each session end by "track:lout ...".
|
||||
.TP
|
||||
.BI \--no_load
|
||||
When aquiring the optical drive, do not try to load its tray. This yields the
|
||||
same behavior for desktop drives with tray loader as is shown by laptop drives
|
||||
which usually lack a motorized tray loader.
|
||||
.TP
|
||||
.BI \--no_rc
|
||||
Only if used as first command line argument this option prevents reading and
|
||||
interpretation of eventual startup files. See section FILES below.
|
||||
@ -1339,9 +1069,6 @@ is possible with the given options.
|
||||
This option redirects to stderr all message output except its own result
|
||||
string and eventual output of -msinfo.
|
||||
.TP
|
||||
.BI --two_channel
|
||||
Indicate for subsequent tracks that they were mastered with two channels.
|
||||
.TP
|
||||
.BI write_start_address= byte_offset
|
||||
Set the address on media where to start writing the track. With DVD+RW, DVD-RAM
|
||||
or BD-RE byte_offset must be aligned to 2 kiB blocks, but better is 32 kiB.
|
||||
@ -1360,25 +1087,12 @@ This option is only needed for revoking eventual --ignore_signals or
|
||||
.TP
|
||||
.BI \--allow_untested_media
|
||||
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
|
||||
under test reservation.
|
||||
tested. Currently this applies to :
|
||||
.br
|
||||
(If you really test experimental media, then please report the outcome on
|
||||
libburn-hackers@pykix.org)
|
||||
.TP
|
||||
.BI \--cdtext_dummy
|
||||
Prepare a burn run, report the effective array of CD-TEXT packs to stdout,
|
||||
and then end the program run without starting to burn the session.
|
||||
A blank CD-R or CD-RW has to be present in the drive, nevertheless.
|
||||
Profile 0015h , DVD-R/DL Sequential (will not allow -multi).
|
||||
.br
|
||||
The output is formatted in lines which describe 18 bytes as 2-digit hex
|
||||
numbers or as single printable characters.
|
||||
See libburn document doc/cdtext.txt about the format of these records.
|
||||
.TP
|
||||
.BI \--cdtext_verbose
|
||||
Like --cdtext_dummy but without preventing the burn run. Combinable with
|
||||
option -dummy to exercise a CD burn run with no persistent impact on the
|
||||
medium.
|
||||
If you really test such media, then please report the outcome on
|
||||
libburn-hackers@pykix.org
|
||||
.TP
|
||||
.BI dev_translation= <sep><from><sep><to>
|
||||
Set drive address alias. This was necessary before cdrskin-0.2.4 to manually
|
||||
@ -1414,7 +1128,7 @@ Wether this leads to senseful behavior depends on operating system and kernel.
|
||||
.TP
|
||||
.BI drive_scsi_dev_family= sr | scd | sg
|
||||
Linux specific: Select a SCSI device file family to be 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
|
||||
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.
|
||||
@ -1504,42 +1218,11 @@ Such opening is needed for Bus,Target,Lun addresses unless option
|
||||
addresses which are not listed with cdrskin --devices but nevertheless point
|
||||
to a usable drive. (Like /dev/sg0 using the same SCSI address as /dev/sr0.)
|
||||
.TP
|
||||
.BI \--obs_pad
|
||||
Pad the data of last write operation of a DVD-R[W] DAO session or
|
||||
stdio: pseudo-drive up to the full size of an output chunk.
|
||||
This padding has to be applied automatically to the other DVD and BD media
|
||||
types, where it causes e.g. ISO images to have trailing unclaimed blocks.
|
||||
.br
|
||||
Use this option if there is the suspicion that DAO sessions abort with
|
||||
your kernel and/or DVD drive, if their size is not a multiple of 16 blocks.
|
||||
.br
|
||||
This option may also get enabled at compile time of libburn.
|
||||
.TP
|
||||
.BI \--old_pseudo_scsi_adr
|
||||
Linux specific:
|
||||
Use and report literal Bus,Target,Lun addresses rather than real SCSI and
|
||||
pseudo ATA addresses. This method is outdated and was never compatible with
|
||||
original cdrecord.
|
||||
.TP
|
||||
.BI sao_postgap= off|number
|
||||
Define whether a post-gap shall be written at the end of the track and
|
||||
how many sectors this gap shall have. A post-gap occupies the range of
|
||||
an additional index of the track. It contains zeros. No bytes from the
|
||||
track source will be read for writing the post-gap.
|
||||
.br
|
||||
This setting affects only CD SAO write runs.
|
||||
.TP
|
||||
.BI sao_pregap= off|number
|
||||
Define whether a pre-gap shall be written before the track and how many
|
||||
sectors this pre-gap shall have. A pre-gap is written in the range of track
|
||||
index 0 and contains zeros resp. silence. No bytes from the track source
|
||||
will be read for writing the pre-gap.
|
||||
.br
|
||||
This setting affects only CD SAO write runs.
|
||||
.br
|
||||
The first track automatically gets a pre-gap of at least 150 sectors. Its
|
||||
size can only be enlarged by this call.
|
||||
.TP
|
||||
.BI --xa1-ignore
|
||||
Silently interpret option -xa1 as -data. This may be necessary if a frontent
|
||||
does not prepare -xa1 block headers but insists in using option -xa1.
|
||||
@ -1551,7 +1234,7 @@ cdrskin -scanbus
|
||||
.br
|
||||
cdrskin dev=ATA -scanbus
|
||||
.br
|
||||
cdrskin --device_links
|
||||
cdrskin --devices
|
||||
.SS
|
||||
.B Get info about a particular drive or loaded media:
|
||||
.br
|
||||
@ -1579,7 +1262,7 @@ cdrskin -v dev=/dev/hdc speed=12 fs=8m \\
|
||||
.br
|
||||
blank=as_needed -eject padsize=300k my_image.iso
|
||||
.SS
|
||||
.B Write compressed afio archive on-the-fly (not possible with minimally blanked DVD-RW or DVD-R DL):
|
||||
.B Write compressed afio archive on-the-fly (not possible with minimally blanked DVD-RW):
|
||||
.br
|
||||
find . | afio -oZ - | \\
|
||||
.br
|
||||
|
3063
cdrskin/cdrskin.c
3063
cdrskin/cdrskin.c
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,7 @@
|
||||
|
||||
<HEAD>
|
||||
<META NAME="description" CONTENT="cdrskin, a limited cdrecord compatibility wrapper for libburn">
|
||||
<META NAME="keywords" CONTENT="cdrskin, libburn, libburnia, burn, CD, DVD, 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">
|
||||
<TITLE>cdrskin homepage english</TITLE>
|
||||
</HEAD>
|
||||
@ -24,8 +24,7 @@
|
||||
<P>
|
||||
<H2>Purpose:</H2>
|
||||
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,
|
||||
DVD-RW, DVD-RAM, DVD+RW, BD-RE
|
||||
CD-R, DVD-R, DVD+R, DVD+R/DL, BD-R, CD-RW, DVD-RW, DVD-RAM, DVD+RW, BD-RE
|
||||
</P>
|
||||
<P>
|
||||
|
||||
@ -39,8 +38,8 @@ About any CD, DVD, or BD recorder produced in the recent ten years.
|
||||
<BR>
|
||||
<A HREF="http://libburnia-project.org">libburn</A>
|
||||
supports recorders which are compliant to standards MMC-1 for CD and
|
||||
MMC-5 for DVD or BD. Linux, FreeBSD, and Solaris allow to access drives
|
||||
connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
|
||||
MMC-5 for DVD or BD. Linux and FreeBSD allow to access drives connected
|
||||
via SCSI, PATA (aka IDE, ATA), USB, or SATA.
|
||||
<BR>
|
||||
</P>
|
||||
|
||||
@ -53,8 +52,6 @@ connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
|
||||
<DT>or FreeBSD (with libc, of course) :</DT>
|
||||
<DD>ATA and SATA drives need atapicam running.</DD>
|
||||
<DD>libcam has to be installed.</DD>
|
||||
<DT>or Solaris (with libc, of course) :</DT>
|
||||
<DD>Tested on kernel 5.11, hopefully suitable for older ones too.</DD>
|
||||
<DT>libpthread</DT>
|
||||
<DD>is supposed to be a standard system component.</DD>
|
||||
</DL>
|
||||
@ -65,7 +62,7 @@ connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
|
||||
GPL software included:<BR>
|
||||
</H2>
|
||||
<DL>
|
||||
<DT>libburn-1.2.8</DT>
|
||||
<DT>libburn-0.7.8</DT>
|
||||
<DD>(founded by Derek Foreman and Ben Jansens,
|
||||
developed and maintained since August 2006 by
|
||||
Thomas Schmitt from team of libburnia-project.org)
|
||||
@ -75,8 +72,8 @@ Thomas Schmitt from team of libburnia-project.org)
|
||||
</P>
|
||||
|
||||
<P>
|
||||
This program system has been tested on Intel/AMD with Linux, FreeBSD,
|
||||
and OpenSolaris based operating systems.<BR>
|
||||
This program system has been tested on Intel/AMD Linux and FreeBSD systems
|
||||
only.<BR>
|
||||
Ports to other usable systems are appreciated. Reports are welcome.
|
||||
</P>
|
||||
|
||||
@ -96,11 +93,10 @@ Ports to other usable systems are appreciated. Reports are welcome.
|
||||
<DL>
|
||||
<DT>The most common options of cdrecord for data and audio on CD media
|
||||
are provided in a compatible way.<BR>
|
||||
On 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.
|
||||
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
|
||||
DVD-R DL, which both support no -multi.
|
||||
BD-R. Write mode -tao works with anything but quickly blanked DVD-RW.
|
||||
</DT>
|
||||
<BR><BR>
|
||||
<DT>Get an overview of drives and their addresses</DT>
|
||||
@ -109,9 +105,8 @@ DVD-R DL, which both support no -multi.
|
||||
<DD>#<KBD> cdrskin --devices</KBD></DD>
|
||||
<DT>Being superuser avoids permission problems with /dev/srN resp. /dev/hdX .
|
||||
</DT>
|
||||
<DT>Ordinary users should then get granted access to the /dev files
|
||||
as listed by option --devices. Linux and FreeBSD demand rw-permission.
|
||||
On Solaris it is r-permission and privileges "basic,sys_devices".</DT>
|
||||
<DT>Ordinary users should then get granted rw access to the /dev files
|
||||
as listed by option --devices.</DT>
|
||||
<DT> </DT>
|
||||
|
||||
<DT>Get info about a particular drive or loaded media:</DT>
|
||||
@ -133,8 +128,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> blank=as_needed -eject padsize=300k my_image.iso</KBD></DD>
|
||||
|
||||
<DT>Write compressed afio archive on-the-fly
|
||||
(not DVD-R DL or minimally blanked DVD-RW):</DT>
|
||||
<DT>Write compressed afio archive on-the-fly:</DT>
|
||||
<DD>$<KBD> find . | afio -oZ - | \</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>
|
||||
@ -200,15 +194,8 @@ Standalone ISO 9660 multi-session CD/DVD/BD tool
|
||||
<P>
|
||||
<DL>
|
||||
<DT>Download as source code (see README):</DT>
|
||||
<DD><A HREF="cdrskin-1.2.8.tar.gz">cdrskin-1.2.8.tar.gz</A>
|
||||
(945 KB).
|
||||
</DD>
|
||||
<DD><A HREF="cdrskin-1.2.8.tar.gz.sig">cdrskin-1.2.8.tar.gz.sig</A></DD>
|
||||
<DD>
|
||||
(detached GPG signature for verification by
|
||||
<KBD>gpg --verify cdrskin-1.2.8.tar.gz.sig cdrskin-1.2.8.tar.gz</KBD>
|
||||
<BR>
|
||||
after <KBD>gpg --keyserver keys.gnupg.net --recv-keys ABC0A854</KBD>).
|
||||
<DD><A HREF="cdrskin-0.7.8.pl00.tar.gz">cdrskin-0.7.8.pl00.tar.gz</A>
|
||||
(840 KB).
|
||||
</DD>
|
||||
<DD>
|
||||
The cdrskin tarballs are source code identical with libburn releases
|
||||
@ -257,27 +244,23 @@ cdrskin_0.4.2.pl00-x86-suse9_0-static.tar.gz</A>, (310 KB), -static compiled,
|
||||
<HR>
|
||||
|
||||
<P>
|
||||
Enhancements towards previous stable version cdrskin-1.2.6:
|
||||
Enhancements towards previous stable version cdrskin-0.7.6.pl00:
|
||||
<UL>
|
||||
<LI>
|
||||
-toc and -minfo now report about tracks in the incomplete session
|
||||
</LI>
|
||||
<LI>
|
||||
New cdrskin option --list_speeds
|
||||
Abort handling is more suitable for FreeBSD now.
|
||||
</LI>
|
||||
<!--
|
||||
<LI>none</LI>
|
||||
-->
|
||||
</UL>
|
||||
|
||||
Bug fixes towards cdrskin-1.2.6:
|
||||
Bug fixes towards cdrskin-0.7.6.pl00:
|
||||
<UL>
|
||||
<LI>
|
||||
All CD tracks were reported with the sizes of the tracks in the
|
||||
first session. Regression introduced with version 1.2.0
|
||||
On FreeBSD: Piped input was falsely attributed a small fixed size
|
||||
</LI>
|
||||
<LI>
|
||||
On some drives the request for minimum speed yielded maximum speed
|
||||
cdrskin fs=0 led to SIGSEGV. Regression introduced by version 0.7.4.
|
||||
</LI>
|
||||
<!--
|
||||
<LI>none</LI>
|
||||
@ -288,31 +271,29 @@ On some drives the request for minimum speed yielded maximum speed
|
||||
|
||||
<P>
|
||||
<DL>
|
||||
<DT><H3>Development snapshot, version 1.2.9 :</H3></DT>
|
||||
<DD>Enhancements towards current stable version 1.2.8:
|
||||
<DT><H3>Development snapshot, version 0.7.9 :</H3></DT>
|
||||
<DD>Enhancements towards current stable version 0.7.8.pl00:
|
||||
<UL>
|
||||
<LI>none yet</LI>
|
||||
<!--
|
||||
<LI>none yet</LI>
|
||||
-->
|
||||
|
||||
</UL>
|
||||
</DD>
|
||||
|
||||
<DD>Bug fixes towards cdrskin-1.2.8:
|
||||
<DD>Bug fixes towards cdrskin-0.7.6.pl00:
|
||||
<UL>
|
||||
<LI>none yet</LI>
|
||||
<!--
|
||||
<LI>none yet</LI>
|
||||
-->
|
||||
</UL>
|
||||
</DD>
|
||||
|
||||
<DD> </DD>
|
||||
<DD><A HREF="README_cdrskin_devel">README 1.2.9</A>
|
||||
<DD><A HREF="cdrskin__help_devel">cdrskin-1.2.9 --help</A></DD>
|
||||
<DD><A HREF="cdrskin_help_devel">cdrskin-1.2.9 -help</A></DD>
|
||||
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.2.9)</A></DD>
|
||||
<DD><A HREF="README_cdrskin_devel">README 0.7.9</A>
|
||||
<DD><A HREF="cdrskin__help_devel">cdrskin_0.7.9 --help</A></DD>
|
||||
<DD><A HREF="cdrskin_help_devel">cdrskin_0.7.9 -help</A></DD>
|
||||
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 0.7.9)</A></DD>
|
||||
<DD> </DD>
|
||||
<DT>Maintainers of cdrskin unstable packages please use SVN of
|
||||
<A HREF="http://libburnia-project.org"> libburnia-project.org</A></DT>
|
||||
@ -332,8 +313,8 @@ admins with full system souvereignty.</DT>
|
||||
<A HREF="README_cdrskin_devel">upcoming README</A> ):
|
||||
</DD>
|
||||
<DD>
|
||||
<A HREF="cdrskin-1.2.9.tar.gz">cdrskin-1.2.9.tar.gz</A>
|
||||
(945 KB).
|
||||
<A HREF="cdrskin-0.7.9.tar.gz">cdrskin-0.7.9.tar.gz</A>
|
||||
(840 KB).
|
||||
</DD>
|
||||
|
||||
<!-- This is not offered any more since spring 2008
|
||||
@ -482,11 +463,10 @@ First of all: this relationship is single sided, as cdrskin has to be aware of
|
||||
cdrecord but not vice versa.
|
||||
<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
|
||||
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
|
||||
burning CDs.
|
||||
maintained. So for me - there would be no problem with it.
|
||||
<BR>
|
||||
But the author of cdrecord and the Linux kernel people foster a very hostile
|
||||
relationship. Ok, that's their business, not mine (or ours if you are with me).
|
||||
|
@ -1 +1 @@
|
||||
#define Cdrskin_timestamP "2013.03.18.080001"
|
||||
#define Cdrskin_timestamP "2010.03.10.120001"
|
||||
|
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);
|
||||
|
||||
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");
|
||||
c= *cpt;
|
||||
printf("Strange: The system ignored a SIGSEGV: c= %u\n", (unsigned int) c);
|
||||
} else {
|
||||
printf("killme: %d\n",getpid());
|
||||
sleep(3600);
|
||||
|
@ -1,14 +1,14 @@
|
||||
#!/bin/sh
|
||||
|
||||
# compile_cdrskin.sh
|
||||
# Copyright 2005 - 2013 Thomas Schmitt, scdbackup@gmx.net, GPL v2 or later
|
||||
# Copyright 2005 - 2010 Thomas Schmitt, scdbackup@gmx.net, GPL
|
||||
# to be executed within ./libburn-* resp ./cdrskin-*
|
||||
|
||||
debug_opts="-O2"
|
||||
def_opts=
|
||||
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
|
||||
fifo_opts=""
|
||||
libvers="-DCdrskin_libburn_1_2_8"
|
||||
libvers="-DCdrskin_libburn_0_7_8"
|
||||
|
||||
# To be used if Makefile.am uses libburn_libburn_la_CFLAGS
|
||||
# burn="libburn/libburn_libburn_la-"
|
||||
@ -19,7 +19,7 @@ libdax_msgs_o="$burn"libdax_msgs.o
|
||||
libdax_audioxtr_o="$burn"libdax_audioxtr.o
|
||||
do_strip=0
|
||||
static_opts=
|
||||
warn_opts="-Wall -Wextra -Wno-unused-parameter"
|
||||
warn_opts="-Wall"
|
||||
libcdio=
|
||||
fifo_source="cdrskin/cdrfifo.c"
|
||||
compile_cdrskin=1
|
||||
@ -41,21 +41,31 @@ do
|
||||
elif test "$i" = "-compile_dewav"
|
||||
then
|
||||
compile_dewav=1
|
||||
elif test "$i" = "-libburn_1_2_8"
|
||||
elif test "$i" = "-cvs_A60220"
|
||||
then
|
||||
libvers="-DCdrskin_libburn_1_2_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_7_8"
|
||||
then
|
||||
libvers="-DCdrskin_libburn_0_7_8"
|
||||
libdax_audioxtr_o="$burn"libdax_audioxtr.o
|
||||
libdax_msgs_o="$burn"libdax_msgs.o
|
||||
cleanup_src_or_obj="$burn"cleanup.o
|
||||
elif test "$i" = "-libburn_svn"
|
||||
then
|
||||
libvers="-DCdrskin_libburn_1_2_9"
|
||||
libvers="-DCdrskin_libburn_0_7_9"
|
||||
libdax_audioxtr_o="$burn"libdax_audioxtr.o
|
||||
libdax_msgs_o="$burn"libdax_msgs.o
|
||||
cleanup_src_or_obj="$burn"cleanup.o
|
||||
elif test "$i" = "-newapi" -o "$i" = "-experimental"
|
||||
then
|
||||
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"
|
||||
then
|
||||
largefile_opts=
|
||||
@ -99,7 +109,7 @@ do
|
||||
echo "Options:"
|
||||
echo " -compile_cdrfifo compile program cdrskin/cdrfifo."
|
||||
echo " -compile_dewav compile program test/dewav without libburn."
|
||||
echo " -libburn_1_2_8 set macro to match libburn-1.2.8"
|
||||
echo " -libburn_0_7_8 set macro to match libburn-0.7.8"
|
||||
echo " -libburn_svn set macro to match current libburn-SVN."
|
||||
echo " -dvd_obs_64k 64 KB default size for DVD/BD writing."
|
||||
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_cdrfifo always use fifo of libburn and never cdrfifo"
|
||||
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_strip apply program strip to compiled programs."
|
||||
echo " -g produce debuggable programm."
|
||||
@ -145,7 +156,6 @@ then
|
||||
$cleanup_src_or_obj \
|
||||
\
|
||||
"$burn"async.o \
|
||||
"$burn"cdtext.o \
|
||||
"$burn"debug.o \
|
||||
"$burn"drive.o \
|
||||
"$burn"file.o \
|
||||
|
@ -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/See section FILES/See section <A HREF="#FILES">FILES<\/A>/' \
|
||||
-e 's/See section EXAMPLES/See section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \
|
||||
-e 's/−/-/g' \
|
||||
<"$2" >"$htmlpage"
|
||||
|
||||
set +x
|
||||
|
@ -19,7 +19,7 @@ Many bytes have been copied from the message output of cdrecord
|
||||
runs, though. The most comprehensive technical overview of cdrskin
|
||||
can be found in [http://libburnia-project.org/browser/libburn/trunk/cdrskin/README?format=txt cdrskin/README].
|
||||
|
||||
About libburn API for burning CD, DVD, and BD: http://api.libburnia-project.org
|
||||
About libburn API for burning CD and DVD: http://api.libburnia-project.org
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
@ -279,7 +279,23 @@ for an illustrated example with K3b 0.10 .
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
Advanced multi-session use cases as of dvd+rw-tools:
|
||||
DVD advise:
|
||||
|
||||
For burning of DVD/BD media other than DVD-RAM, DVD+RW, DVD+R, DVD+R DL,
|
||||
DVD-RW, DVD-R, BD-RE, the cdrskin project currently advises to use
|
||||
Andy Polyakov's dvd+rw-tools which despite their historic name are
|
||||
capable of all the media above and more, including BD discs.
|
||||
|
||||
http://fy.chalmers.se/~appro/linux/DVD+RW/tools
|
||||
|
||||
They are not compatible or related to cdrecord resp. cdrecord-ProDVD
|
||||
(now obsoleted by original source cdrtools cdrecord with identical
|
||||
capabilities besides the license key).
|
||||
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
Advanced multi-session use cases:
|
||||
|
||||
A special feature of dvd+rw-tools is growing of ISO-9660 filesystems on
|
||||
overwriteable media. This is not the same as multi-session writing of cdrskin
|
||||
|
137
configure.ac
137
configure.ac
@ -1,4 +1,4 @@
|
||||
AC_INIT([libburn], [1.2.8], [http://libburnia-project.org])
|
||||
AC_INIT([libburn], [0.7.8], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
dnl AC_CONFIG_HEADER([config.h])
|
||||
|
||||
@ -8,9 +8,8 @@ AC_CANONICAL_TARGET
|
||||
LIBBURNIA_SET_FLAGS
|
||||
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
AC_CONFIG_MACRO_DIR([./])
|
||||
|
||||
dnl Notes about version numbers and .so numbers:
|
||||
dnl Notes by ts A71207 - B00310 :
|
||||
dnl
|
||||
dnl Regrettably the meaning of the various version types was misunderstood
|
||||
dnl before version 0.4.1.
|
||||
@ -81,25 +80,6 @@ dnl 0.7.2 = libburn.so.4.37.0
|
||||
dnl 0.7.4 = libburn.so.4.39.0
|
||||
dnl 0.7.6 = libburn.so.4.41.0
|
||||
dnl 0.7.8 = libburn.so.4.43.0
|
||||
dnl 0.8.0 = libburn.so.4.45.0
|
||||
dnl 0.8.2 = libburn.so.4.47.0
|
||||
dnl 0.8.4 = libburn.so.4.49.0
|
||||
dnl 0.8.6 = libburn.so.4.51.0
|
||||
dnl 0.8.8 = libburn.so.4.53.0
|
||||
dnl 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 1.2.0 = libburn.so.4.73.0
|
||||
dnl 1.2.2 = libburn.so.4.75.0
|
||||
dnl 1.2.4 = libburn.so.4.77.0
|
||||
dnl 1.2.6 = libburn.so.4.79.0
|
||||
dnl 1.2.8 = libburn.so.4.81.0
|
||||
dnl
|
||||
dnl So LT_CURRENT, LT_REVISION and LT_AGE get set directly here.
|
||||
dnl SONAME of the emerging library is LT_CURRENT - LT_AGE.
|
||||
@ -123,8 +103,8 @@ dnl
|
||||
dnl If BURN_*_VERSION changes, be sure to change AC_INIT above to match.
|
||||
dnl
|
||||
dnl As said: Only copies. Original in libburn/libburn.h : burn_header_version_*
|
||||
BURN_MAJOR_VERSION=1
|
||||
BURN_MINOR_VERSION=2
|
||||
BURN_MAJOR_VERSION=0
|
||||
BURN_MINOR_VERSION=7
|
||||
BURN_MICRO_VERSION=8
|
||||
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
|
||||
|
||||
@ -136,14 +116,15 @@ AC_SUBST(BURN_VERSION)
|
||||
dnl Libtool versioning
|
||||
LT_RELEASE=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
|
||||
dnl
|
||||
dnl This is the release version libburn-1.2.8
|
||||
dnl ts B00310
|
||||
dnl This is the release version libburn-0.7.8 = libburn.so.4.43.0
|
||||
dnl ### This is the development version after above release version
|
||||
dnl LT_CURRENT++, LT_AGE++ has not yet happened.
|
||||
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile.
|
||||
dnl
|
||||
dnl SONAME = 85 - 81 = 4 . Linux library name = libburn.so.4.81.0
|
||||
LT_CURRENT=85
|
||||
LT_AGE=81
|
||||
dnl SONAME = 47 - 43 = 4 . Linux library name = libburn.so.4.43.0
|
||||
LT_CURRENT=47
|
||||
LT_AGE=43
|
||||
LT_REVISION=0
|
||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||
|
||||
@ -201,11 +182,11 @@ AC_CHECK_HEADER(sys/statvfs.h, X=, STATVFS_DEF=)
|
||||
AC_CHECK_FUNC([statvfs], X=, STATVFS_DEF=)
|
||||
dnl If this would be done more specifically in Makefile.am
|
||||
dnl via libburn_libburn_la_CFLAGS then undesired .o file names would emerge
|
||||
CFLAGS="$STATVFS_DEF $CFLAGS"
|
||||
CFLAGS="$CFLAGS $STATVFS_DEF"
|
||||
|
||||
dnl ts A91122
|
||||
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)
|
||||
if test x$enable_track_src_odirect = xyes; then
|
||||
LIBBURN_O_DIRECT_DEF="-DLibburn_read_o_direcT"
|
||||
@ -216,12 +197,12 @@ else
|
||||
fi
|
||||
dnl Avoid the need for libburn_libburn_la_CFLAGS in Makefile.am (ugly .o names)
|
||||
dnl ### AC_SUBST(LIBBURN_O_DIRECT_DEF)
|
||||
CFLAGS="$LIBBURN_O_DIRECT_DEF $CFLAGS"
|
||||
CFLAGS="$CFLAGS $LIBBURN_O_DIRECT_DEF"
|
||||
|
||||
dnl ts A91116
|
||||
AC_ARG_ENABLE(dvd-obs-64k,
|
||||
[ --enable-dvd-obs-64k 64 KB default size for DVD/BD writing, default=no],
|
||||
, enable_dvd_obs_64k=no)
|
||||
[ --enable-dvd-obs-64k 64 KB default size for DVD/BD writing, default=no],
|
||||
, enable_fifo_odirect=no)
|
||||
if test x$enable_dvd_obs_64k = xyes; then
|
||||
LIBBURN_DVD_OBS_64K="-DLibburn_dvd_obs_default_64K"
|
||||
echo "enabled write size default 64 KB on DVD and BD"
|
||||
@ -229,39 +210,12 @@ else
|
||||
LIBBURN_DVD_OBS_64K=
|
||||
echo "disabled write size default 64 KB on DVD and BD"
|
||||
fi
|
||||
CFLAGS="$LIBBURN_DVD_OBS_64K $CFLAGS"
|
||||
CFLAGS="$CFLAGS $LIBBURN_DVD_OBS_64K"
|
||||
|
||||
dnl ts B20413
|
||||
AC_ARG_ENABLE(dvd-obs-pad,
|
||||
[ --enable-dvd-obs-pad pad DVD DAO sessions to 32 resp. 64 KB, default=no],
|
||||
, enable_dvd_obs_pad=no)
|
||||
if test x$enable_dvd_obs_pad = xyes; then
|
||||
LIBBURN_DVD_OBS_PAD="-DLibburn_dvd_always_obs_paD"
|
||||
echo "enabled padding of DVD DAO sessions to 32 resp. 64 KB"
|
||||
else
|
||||
LIBBURN_DVD_OBS_64K=
|
||||
echo "disabled padding of DVD DAO sessions to 32 resp. 64 KB"
|
||||
fi
|
||||
CFLAGS="$LIBBURN_DVD_OBS_PAD $CFLAGS"
|
||||
|
||||
dnl ts A91218 - B21002
|
||||
case $host_os in
|
||||
cygwin*|mingw*)
|
||||
default_libcdio=yes
|
||||
;;
|
||||
*)
|
||||
default_libcdio=no
|
||||
;;
|
||||
esac
|
||||
# Check for proper library versions if this is desired.
|
||||
# (It fails too often on too many systems.)
|
||||
AC_ARG_ENABLE(pkg-check-modules,
|
||||
[ --enable-pkg-check-modules Enable pkg-config check for libcdio , default=no],
|
||||
, enable_pkg_check_modules=no)
|
||||
dnl ts A91218
|
||||
AC_ARG_ENABLE(libcdio,
|
||||
[ --enable-libcdio Enable use of libcdio as system adapter, default=no (except on MSWindows)],
|
||||
, enable_libcdio=$default_libcdio)
|
||||
PKG_PROG_PKG_CONFIG
|
||||
[ --enable-libcdio Enable EXPERIMENTAL use of libcdio as system adapter, default=no],
|
||||
, enable_libcdio=no)
|
||||
if test x$enable_libcdio = xyes; then
|
||||
dnl Check whether there is libcdio-devel and libcdio-runtime.
|
||||
dnl If not, erase this macro
|
||||
@ -278,49 +232,14 @@ then
|
||||
echo "WARNING: could not enable use of libcdio as system adapter"
|
||||
fi
|
||||
else
|
||||
echo "enabled use of libcdio as system adapter"
|
||||
CFLAGS="$LIBCDIO_DEF $CFLAGS"
|
||||
echo "enabled EXPERIMENTAL use of libcdio as system adapter"
|
||||
CFLAGS="$CFLAGS $LIBCDIO_DEF"
|
||||
|
||||
LIBCDIO_REQUIRED=0.83
|
||||
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
|
||||
|
||||
if test x$enable_pkg_check_modules = xyes; then
|
||||
LIBCDIO_REQUIRED=0.83
|
||||
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
|
||||
else
|
||||
echo "checking for LIBCDIO... skipped, no --enable-pkg-check-modules"
|
||||
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
|
||||
|
||||
@ -330,15 +249,15 @@ AC_ARG_ENABLE(debug,
|
||||
, enable_debug=yes)
|
||||
if test x$enable_debug != xyes; then
|
||||
if test x$GCC = xyes; then
|
||||
CFLAGS="-O3 $CFLAGS"
|
||||
CFLAGS="-fexpensive-optimizations $CFLAGS"
|
||||
CFLAGS="$CFLAGS -O3"
|
||||
CFLAGS="$CFLAGS -fexpensive-optimizations"
|
||||
fi
|
||||
CFLAGS="-DNDEBUG $CFLAGS"
|
||||
CFLAGS="$CFLAGS -DNDEBUG"
|
||||
else
|
||||
if test x$GCC = xyes; then
|
||||
CFLAGS="-g -pedantic -Wall -Wextra -Wno-unused-parameter $CFLAGS"
|
||||
CFLAGS="$CFLAGS -g -pedantic -Wall"
|
||||
fi
|
||||
CFLAGS="-DDEBUG $CFLAGS"
|
||||
CFLAGS="$CFLAGS -DDEBUG"
|
||||
fi
|
||||
|
||||
dnl Determine target directory for libburn-*.pc
|
||||
|
729
doc/cdtext.txt
729
doc/cdtext.txt
@ -1,729 +0,0 @@
|
||||
|
||||
Description of CD-TEXT
|
||||
|
||||
Guided by Leon Merten Lohse via libcdio-devel@gnu.org
|
||||
by reading mmc3r10g.pdf from http://www.t10.org/ftp/t10/drafts/mmc3/
|
||||
by docs and results of cdtext.zip from http://www.sonydadc.com/file/
|
||||
by reading http://digitalx.org/cue-sheet/syntax
|
||||
by reading source of libcdio from http://www.gnu.org/s/libcdio
|
||||
which quotes source of cdrecord from ftp://ftp.berlios.de/pub/cdrecord/alpha
|
||||
by reading cdrecord.1 from ftp://ftp.berlios.de/pub/cdrecord/alpha
|
||||
|
||||
Language codes were learned from http://tech.ebu.ch/docs/tech/tech3264.pdf
|
||||
Genre codes were learned from libcdio and confirmed by
|
||||
http://helpdesk.audiofile-engineering.com/index.php?pg=kb.page&id=123
|
||||
|
||||
For libburnia-project.org by Thomas Schmitt <scdbackup@gmx.net>
|
||||
|
||||
Content:
|
||||
- CD-TEXT from the view of the user
|
||||
- Content specifications of particular pack types
|
||||
- Format of a CD-TEXT packs array
|
||||
- Overview of libburn API calls for CD-TEXT
|
||||
- Sony Text File Format (Input Sheet Version 0.7T)
|
||||
- CDRWIN cue sheet files
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
CD-TEXT from the view of the user:
|
||||
|
||||
CD-TEXT records attributes of disc and tracks on audio CD.
|
||||
|
||||
The attributes are grouped into blocks which represent particular languages.
|
||||
Up to 8 blocks are possible.
|
||||
|
||||
There are 13 defined attribute categories, which are called Pack Types and are
|
||||
identified by a single-byte code:
|
||||
0x80 = Title
|
||||
0x81 = Names of Performers
|
||||
0x82 = Names of Songwriters
|
||||
0x83 = Names of Composers
|
||||
0x84 = Names of Arrangers
|
||||
0x85 = Messages
|
||||
0x86 = text-and-binary: Disc Identification
|
||||
0x87 = text-and-binary: Genre Identification
|
||||
0x88 = binary: Table of Content information
|
||||
0x89 = binary: Second Table of Content information
|
||||
(0x8a to 0x8c are reserved.)
|
||||
0x8d = Closed Information
|
||||
0x8e = UPC/EAN code of the album and ISRC code of each track
|
||||
0x8f = binary: Size Information of the Block
|
||||
|
||||
Some of these categories apply to the whole disc only:
|
||||
0x86, 0x87, 0x88, 0x89, 0x8d
|
||||
Some have to be additionally attributed to each track, if they are present for
|
||||
the whole disc:
|
||||
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x8e
|
||||
One describes the overall content of a block and in part of all other blocks:
|
||||
0x8f
|
||||
|
||||
The total size of a block's attribute set is restricted by the fact that it
|
||||
has to be stored in at most 253 records with 12 bytes of payload. These records
|
||||
are called Text Packs.
|
||||
A shortcut for repeated identical track texts is provided, so that a text
|
||||
that is identical to the one of the previous track occupies only 2 or 4 bytes.
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Content specification of particular pack types:
|
||||
|
||||
Pack types 0x80 to 0x85 and 0x8e contain 0-terminated cleartext. If double byte
|
||||
characters are used, then two 0-bytes terminate the cleartext.
|
||||
The meaning of 0x80 to 0x85 should be clear by above list. They are encoded
|
||||
according to the Character Code of their block. Either as ISO-8859-1 single
|
||||
byte characters, or as 7-bit ASCII single byte characters, or as MS-JIS double
|
||||
byte characters.
|
||||
More info to 0x8e is given below.
|
||||
|
||||
Pack type 0x86 (Disc Identification) is documented by Sony as "Catalog Number:
|
||||
(use ASCII Code) Catalog Number of the album". So it is not really binary
|
||||
but might be non-printable, and should contain only bytes with bit7 = 0.
|
||||
|
||||
Pack type 0x87 contains 2 binary bytes, followed by 0-terminated cleartext.
|
||||
The two binary bytes form a big-endian index to the following list.
|
||||
0x0000 = "Not Used" (Sony prescribes to use this if no genre applies)
|
||||
0x0001 = "Not Defined"
|
||||
0x0002 = "Adult Contemporary"
|
||||
0x0003 = "Alternative Rock"
|
||||
0x0004 = "Childrens Music"
|
||||
0x0005 = "Classical"
|
||||
0x0006 = "Contemporary Christian"
|
||||
0x0007 = "Country"
|
||||
0x0008 = "Dance"
|
||||
0x0009 = "Easy Listening"
|
||||
0x000a = "Erotic"
|
||||
0x000b = "Folk"
|
||||
0x000c = "Gospel"
|
||||
0x000d = "Hip Hop"
|
||||
0x000e = "Jazz"
|
||||
0x000f = "Latin"
|
||||
0x0010 = "Musical"
|
||||
0x0011 = "New Age"
|
||||
0x0012 = "Opera"
|
||||
0x0013 = "Operetta"
|
||||
0x0014 = "Pop Music"
|
||||
0x0015 = "Rap"
|
||||
0x0016 = "Reggae"
|
||||
0x0017 = "Rock Music"
|
||||
0x0018 = "Rhythm & Blues"
|
||||
0x0019 = "Sound Effects"
|
||||
0x001a = "Spoken Word"
|
||||
0x001b = "World Music"
|
||||
Sony documents the cleartext part as "Genre information that would supplement
|
||||
the Genre Code, such as 'USA Rock music in the 60s'". Always ASCII encoded.
|
||||
|
||||
Pack type 0x88 records information from the CD's Table of Content, as of
|
||||
READ PMA/TOC/ATIP Format 0010b (mmc3r10g.pdf, table 237 TOC Track Descriptor
|
||||
Format, Q Sub-channel).
|
||||
See below, Format of a CD-TEXT packs array, for more details about the content
|
||||
of pack type 0x88.
|
||||
|
||||
Pack type 0x89 is yet quite unclear. It might be a representation of Playback
|
||||
Skip Interval, Mode-5 Q sub-channel, POINT 01 to 40 (mmc3r10g.pdf 4.2.3.6.3).
|
||||
If so, then this seems not to apply to write type SAO, because the CUE SHEET
|
||||
format offers no way to express Mode-5 Q.
|
||||
See below, Format of a CD-TEXT packs array, for an example of this pack type.
|
||||
|
||||
Pack type 0x8d is documented by Sony as "Closed Information: (use 8859-1 Code)
|
||||
Any information can be recorded on disc as memorandum. Information in this
|
||||
field will not be read by CD TEXT players available to the public."
|
||||
Always ISO-8859-1 encoded.
|
||||
|
||||
Pack type 0x8e is documented by Sony as "UPC/EAN Code (POS Code) of the album.
|
||||
This field typically consists of 13 characters." Always ASCII encoded.
|
||||
It applies to tracks as "ISRC code [which] typically consists of 12 characters"
|
||||
and is always ISO-8859-1 encoded.
|
||||
MMC calls these information entities Media Catalog Number and ISRC.
|
||||
The catalog number consists of 13 decimal digits.
|
||||
ISRC consists of 12 characters: 2 country code [0-9A-Z], 3 owner code [0-9A-Z],
|
||||
2 year digits (00 to 99), 5 serial number digits (00000 to 99999).
|
||||
|
||||
Pack type 0x8f summarizes the whole list of text packs of a block.
|
||||
See below, Format of a CD-TEXT packs array, for details.
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Format of a CD-TEXT packs array:
|
||||
|
||||
The attributes are represented on CD as Text Packs in the sub-channel of
|
||||
the Lead-in of the disc. See doc/cookbook.txt for a description how to write
|
||||
the readily formatted CD-TEXT pack array to CD, and how to read CD-TEXT packs
|
||||
from CD.
|
||||
|
||||
The format is explained in part in MMC-3 (mmc3r10g.pdf, Annex J) and in part by
|
||||
the documentation in Sony's cdtext.zip :
|
||||
|
||||
Each pack consists of a 4-byte header, 12 bytes of payload, and 2 bytes of CRC.
|
||||
|
||||
The first byte of each pack tells the pack type. See above for a list of types.
|
||||
|
||||
The second byte tells the track number to which the first text piece in
|
||||
a pack is associated. Number 0 means the whole album. Higher numbers are
|
||||
valid for types 0x80 to 0x85, and 0x8e. With these types, there should be
|
||||
one text for the disc and one for each track.
|
||||
With types 0x88 and 0x89, the second byte bears a track number, too.
|
||||
With type 0x8f, the second byte counts the record parts from 0 to 2.
|
||||
|
||||
The third byte is a sequential counter.
|
||||
|
||||
The fourth byte is the Block Number and Character Position Indicator.
|
||||
It consists of three bit fields:
|
||||
bit7 = Double Bytes Character Code (0= single byte characters)
|
||||
bit4-6 = Block Number (groups text packs in language blocks)
|
||||
bit0-3 = Character position. Either the number of characters which
|
||||
the current text inherited from the previous pack, or
|
||||
15 if the current text started before the previous pack.
|
||||
|
||||
The 12 payload bytes contain pieces of 0-terminated texts or binary data.
|
||||
A text may span over several packs. Unused characters in a pack are used for
|
||||
the next text of the same pack type. If no text of the same type follows,
|
||||
then the remaining text bytes are set to 0.
|
||||
|
||||
The CRC algorithm uses divisor 0x11021. The resulting 16-bit residue of the
|
||||
polynomial division gets inverted and written as big-endian number to bytes
|
||||
16 and 17 of the pack.
|
||||
|
||||
|
||||
The text packs are grouped in up to 8 blocks of at most 256 packs. Each block
|
||||
is in charge for one language. Sequence numbers of each block are counted
|
||||
separately. All packs of block 0 come before the packs of block 1.
|
||||
|
||||
The limitation of block number and sequence numbers imply that there are at
|
||||
most 2048 text packs possible. (READ TOC/PMA/ATIP could retrieve 3640 packs,
|
||||
as it is limited to 64 kB - 2.)
|
||||
|
||||
|
||||
If a text of a track (pack types 0x80 to 0x85 and 0x8e) repeats identically
|
||||
for the next track, then it may be represented by a TAB character (ASCII 9)
|
||||
for single byte texts, resp. two TAB characters for double byte texts.
|
||||
(This should be used because 256 * 12 bytes is few space for 99 tracks.)
|
||||
|
||||
The two binary bytes of pack type 0x87 are written to the first 0x87 pack of
|
||||
a block. They may or may not be repeated at the start of the follow-up packs
|
||||
of type 0x87.
|
||||
|
||||
The first pack of type 0x88 in a block records in its payload bytes:
|
||||
0 : PMIN of POINT A1 = First Track Number
|
||||
1 : PMIN of POINT A2 = Last Track Number
|
||||
2 : unknown, 0 in Sony example
|
||||
3 : PMIN of POINT A2 = Start position of Lead-Out
|
||||
4 : PSEC of POINT A2 = Start position of Lead-Out
|
||||
5 : PFRAME of POINT A2 = Start position of Lead-Out
|
||||
6 to 11 : unknown, 0 in Sony example
|
||||
The following packs record PMIN, PSEC, PFRAME of the POINTs between the
|
||||
lowest track number (min 01h) and the highest track number (max 63h).
|
||||
The payload of the last pack is padded by 0s.
|
||||
The Sony .TOC example:
|
||||
A0 01
|
||||
A1 14
|
||||
A2 63:02:18
|
||||
01 00:02:00
|
||||
02 04:11:25
|
||||
03 08:02:50
|
||||
04 11:47:62
|
||||
...
|
||||
13 53:24:25
|
||||
14 57:03:25
|
||||
yields
|
||||
88 00 23 00 01 0e 00 3f 02 12 00 00 00 00 00 00 12 00
|
||||
88 01 24 00 00 02 00 04 0b 19 08 02 32 0b 2f 3e 67 2d
|
||||
...
|
||||
88 0d 27 00 35 18 19 39 03 19 00 00 00 00 00 00 ea af
|
||||
|
||||
Pack type 0x89 is yet quite unclear. Especially what the information shall
|
||||
mean to the user of the CD. The time points in the Sony example are in the
|
||||
time range of the tracks numbers that are given before the time points:
|
||||
01 02:41:48 01 02:52:58
|
||||
06 23:14:25 06 23:29:60
|
||||
07 28:30:39 07 28:42:30
|
||||
13 55:13:26 13 55:31:50
|
||||
yields
|
||||
89 01 28 00 01 04 00 00 00 00 02 29 30 02 34 3a f3 0c
|
||||
89 06 29 00 02 04 00 00 00 00 17 0e 19 17 1d 3c 73 92
|
||||
89 07 2a 00 03 04 00 00 00 00 1c 1e 27 1c 2a 1e 72 20
|
||||
89 0d 2b 00 04 04 00 00 00 00 37 0d 1a 37 1f 32 0b 62
|
||||
The track numbers are stored in the track number byte of the packs. The two
|
||||
time points are stored in byte 6 to 11 of the payload. Byte 0 of the payload
|
||||
seems to be a sequential counter. Byte 1 always 4 ? Byte 2 to 5 always 0 ?
|
||||
|
||||
Pack type 0x8f summarizes the whole list of text packs of a block.
|
||||
So there is one group of three 0x8f packs per block.
|
||||
Nevertheless each 0x8f group tells the highest sequence number and the
|
||||
language code of all blocks.
|
||||
The payload bytes of three 0x8f packs form a 36 byte record. The track number
|
||||
bytes of the three packs have the values 0, 1, 2.
|
||||
Byte :
|
||||
0 : Character code for pack types 0x80 to 0x85:
|
||||
0x00 = ISO-8859-1
|
||||
0x01 = 7 bit ASCII
|
||||
0x80 = MS-JIS (japanese Kanji, double byte characters)
|
||||
1 : Number of first track
|
||||
2 : Number of last track
|
||||
3 : libcdio source states: "cd-text information copyright byte"
|
||||
Probably 3 means "copyrighted", 0 means "not copyrighted".
|
||||
4 - 19 : Pack count of the various types 0x80 to 0x8f.
|
||||
Byte number N tells the count of packs of type 0x80 + (N - 4).
|
||||
I.e. the first byte in this field of 16 counts packs of type 0x80.
|
||||
20 - 27 : Highest sequence byte number of blocks 0 to 7.
|
||||
28 - 36 : Language code for blocks 0 to 7 (tech3264.pdf appendix 3)
|
||||
Not all of these Codes have ever been seen with CD-TEXT, though.
|
||||
0x00 = Unknown
|
||||
0x01 = Albanian
|
||||
0x02 = Breton
|
||||
0x03 = Catalan
|
||||
0x04 = Croatian
|
||||
0x05 = Welsh
|
||||
0x06 = Czech
|
||||
0x07 = Danish
|
||||
0x08 = German
|
||||
0x09 = English
|
||||
0x0a = Spanish
|
||||
0x0b = Esperanto
|
||||
0x0c = Estonian
|
||||
0x0d = Basque
|
||||
0x0e = Faroese
|
||||
0x0f = French
|
||||
0x10 = Frisian
|
||||
0x11 = Irish
|
||||
0x12 = Gaelic
|
||||
0x13 = Galician
|
||||
0x14 = Icelandic
|
||||
0x15 = Italian
|
||||
0x16 = Lappish
|
||||
0x17 = Latin
|
||||
0x18 = Latvian
|
||||
0x19 = Luxembourgian
|
||||
0x1a = Lithuanian
|
||||
0x1b = Hungarian
|
||||
0x1c = Maltese
|
||||
0x1d = Dutch
|
||||
0x1e = Norwegian
|
||||
0x1f = Occitan
|
||||
0x20 = Polish
|
||||
0x21 = Portuguese
|
||||
0x22 = Romanian
|
||||
0x23 = Romansh
|
||||
0x24 = Serbian
|
||||
0x25 = Slovak
|
||||
0x26 = Slovenian
|
||||
0x27 = Finnish
|
||||
0x28 = Swedish
|
||||
0x29 = Turkish
|
||||
0x2a = Flemish
|
||||
0x2b = Wallon
|
||||
0x45 = Zulu
|
||||
0x46 = Vietnamese
|
||||
0x47 = Uzbek
|
||||
0x48 = Urdu
|
||||
0x49 = Ukrainian
|
||||
0x4a = Thai
|
||||
0x4b = Telugu
|
||||
0x4c = Tatar
|
||||
0x4d = Tamil
|
||||
0x4e = Tadzhik
|
||||
0x4f = Swahili
|
||||
0x50 = Sranan Tongo
|
||||
0x51 = Somali
|
||||
0x52 = Sinhalese
|
||||
0x53 = Shona
|
||||
0x54 = Serbo-croat
|
||||
0x55 = Ruthenian
|
||||
0x56 = Russian
|
||||
0x57 = Quechua
|
||||
0x58 = Pushtu
|
||||
0x59 = Punjabi
|
||||
0x5a = Persian
|
||||
0x5b = Papamiento
|
||||
0x5c = Oriya
|
||||
0x5d = Nepali
|
||||
0x5e = Ndebele
|
||||
0x5f = Marathi
|
||||
0x60 = Moldavian
|
||||
0x61 = Malaysian
|
||||
0x62 = Malagasay
|
||||
0x63 = Macedonian
|
||||
0x64 = Laotian
|
||||
0x65 = Korean
|
||||
0x66 = Khmer
|
||||
0x67 = Kazakh
|
||||
0x68 = Kannada
|
||||
0x69 = Japanese
|
||||
0x6a = Indonesian
|
||||
0x6b = Hindi
|
||||
0x6c = Hebrew
|
||||
0x6d = Hausa
|
||||
0x6e = Gurani
|
||||
0x6f = Gujurati
|
||||
0x70 = Greek
|
||||
0x71 = Georgian
|
||||
0x72 = Fulani
|
||||
0x73 = Dari
|
||||
0x74 = Churash
|
||||
0x75 = Chinese
|
||||
0x76 = Burmese
|
||||
0x77 = Bulgarian
|
||||
0x78 = Bengali
|
||||
0x79 = Bielorussian
|
||||
0x7a = Bambora
|
||||
0x7b = Azerbaijani
|
||||
0x7c = Assamese
|
||||
0x7d = Armenian
|
||||
0x7e = Arabic
|
||||
0x7f = Amharic
|
||||
E.g. these three packs
|
||||
42 : 8f 00 2a 00 01 01 03 00 06 05 04 05 07 06 01 02 48 65
|
||||
43 : 8f 01 2b 00 00 00 00 00 00 00 06 03 2c 00 00 00 c0 20
|
||||
44 : 8f 02 2c 00 00 00 00 00 09 00 00 00 00 00 00 00 11 45
|
||||
decode to
|
||||
Byte :Value Meaning
|
||||
0 : 01 = ASCII 7-bit
|
||||
1 : 01 = first track is 1
|
||||
2 : 03 = last track is 3
|
||||
3 : 00 = copyright (0 = public domain, 3 = copyrighted ?)
|
||||
4 : 06 = 6 packs of type 0x80
|
||||
5 : 05 = 5 packs of type 0x81
|
||||
6 : 04 = 4 packs of type 0x82
|
||||
7 : 05 = 5 packs of type 0x83
|
||||
8 : 07 = 7 packs of type 0x84
|
||||
9 : 06 = 6 packs of type 0x85
|
||||
10 : 01 = 1 pack of type 0x86
|
||||
11 : 02 = 2 packs of type 0x87
|
||||
12 : 00 = 0 packs of type 0x88
|
||||
13 : 00 = 0 packs of type 0x89
|
||||
14 : 00 00 00 00 = 0 packs of types 0x8a to 0x8d
|
||||
18 : 06 = 6 packs of type 0x8e
|
||||
19 : 03 = 3 packs of type 0x8f
|
||||
20 : 2c = last sequence for block 0
|
||||
This matches the sequence number of the last text pack (0x2c = 44)
|
||||
21 : 00 00 00 00 00 00 00 = last sequence numbers for block 1..7 (none)
|
||||
28 : 09 = language code for block 0: English
|
||||
29 : 00 00 00 00 00 00 00 = language codes for block 1..7 (none)
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Overview of libburn API calls for CD-TEXT (see libburn/libburn.h for details):
|
||||
|
||||
libburn can retrieve the set of text packs from a CD:
|
||||
|
||||
int burn_disc_get_leadin_text(struct burn_drive *d,
|
||||
unsigned char **text_packs, int *num_packs,
|
||||
int flag);
|
||||
|
||||
|
||||
It can write a text pack set with a CD SAO session.
|
||||
|
||||
This set may be attached as array of readily formatted text packs by:
|
||||
|
||||
int burn_write_opts_set_leadin_text(struct burn_write_opts *opts,
|
||||
unsigned char *text_packs,
|
||||
int num_packs, int flag);
|
||||
|
||||
The array may be read from a file by
|
||||
|
||||
int burn_cdtext_from_packfile(char *path, unsigned char **text_packs,
|
||||
int *num_packs, int flag);
|
||||
|
||||
|
||||
Alternatively the pack set may be defined by attaching CD-TEXT attributes
|
||||
to burn_session and burn_track:
|
||||
|
||||
int burn_session_set_cdtext_par(struct burn_session *s,
|
||||
int char_codes[8], int copyrights[8],
|
||||
int languages[8], int flag);
|
||||
|
||||
int burn_session_set_cdtext(struct burn_session *s, int block,
|
||||
int pack_type, char *pack_type_name,
|
||||
unsigned char *payload, int length, int flag);
|
||||
|
||||
int burn_track_set_cdtext(struct burn_track *t, int block,
|
||||
int pack_type, char *pack_type_name,
|
||||
unsigned char *payload, int length, int flag);
|
||||
|
||||
Macros list the texts for genre and language codes:
|
||||
|
||||
BURN_CDTEXT_LANGUAGES_0X00
|
||||
BURN_CDTEXT_FILLER
|
||||
BURN_CDTEXT_LANGUAGES_0X45
|
||||
|
||||
BURN_CDTEXT_GENRE_LIST
|
||||
BURN_CDTEXT_NUM_GENRES
|
||||
|
||||
There is a reader for Sony Input Sheet Version 0.7T:
|
||||
|
||||
int burn_session_input_sheet_v07t(struct burn_session *session,
|
||||
char *path, int block, int flag);
|
||||
|
||||
CD-TEXT can be read from a CDRWIN cue sheet file which defines the tracks
|
||||
of a session
|
||||
|
||||
int burn_session_by_cue_file(struct burn_session *session,
|
||||
char *path, int fifo_size, struct burn_source **fifo,
|
||||
unsigned char **text_packs, int *num_packs, int flag);
|
||||
|
||||
|
||||
The session and track attributes can then be converted into an array of
|
||||
text packs by:
|
||||
|
||||
int burn_cdtext_from_session(struct burn_session *s,
|
||||
unsigned char **text_packs, int *num_packs,
|
||||
int flag);
|
||||
|
||||
or they can be written as array of text packs to CD when burning begins and
|
||||
no array of pre-formatted packs was attached to the write options by
|
||||
burn_write_opts_set_leadin_text().
|
||||
|
||||
There are calls for inspecting the attached attributes:
|
||||
|
||||
int burn_session_get_cdtext_par(struct burn_session *s,
|
||||
int char_codes[8], int copyrights[8],
|
||||
int block_languages[8], int flag);
|
||||
|
||||
int burn_session_get_cdtext(struct burn_session *s, int block,
|
||||
int pack_type, char *pack_type_name,
|
||||
unsigned char **payload, int *length, int flag);
|
||||
|
||||
int burn_track_get_cdtext(struct burn_track *t, int block,
|
||||
int pack_type, char *pack_type_name,
|
||||
unsigned char **payload, int *length, int flag);
|
||||
|
||||
and for removing attached attributes:
|
||||
|
||||
int burn_session_dispose_cdtext(struct burn_session *s, int block);
|
||||
|
||||
int burn_track_dispose_cdtext(struct burn_track *t, int block);
|
||||
|
||||
|
||||
UPC/EAN and ISRC not only affect CD-TEXT but also information that is written
|
||||
along with the tracks in Q sub-channel. These can be influenced by
|
||||
burn_session_input_sheet_v07t(), burn_session_by_cue_file() and by
|
||||
|
||||
void burn_write_opts_set_mediacatalog(struct burn_write_opts *opts,
|
||||
unsigned char mediacatalog[13]);
|
||||
|
||||
void burn_write_opts_set_has_mediacatalog(struct burn_write_opts *opts,
|
||||
int has_mediacatalog);
|
||||
|
||||
void burn_track_set_isrc(struct burn_track *t, char *country, char *owner,
|
||||
unsigned char year, unsigned int serial);
|
||||
|
||||
int burn_track_set_isrc_string(struct burn_track *t, char isrc[13],
|
||||
int flag);
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Sony Text File Format (Input Sheet Version 0.7T):
|
||||
|
||||
This text file format provides comprehensive means to define the text
|
||||
attributes of session and tracks for a single block. More than one
|
||||
such file has to be read to form an attribute set with multiple blocks.
|
||||
|
||||
The information is given by text lines of the following form:
|
||||
purpose specifier [whitespace] = [whitespace] content text
|
||||
[whitespace] is zero or more ASCII 32 (space) or ASCII 9 (tab) characters.
|
||||
The purpose specifier tells the meaning of the content text.
|
||||
Empty content text does not cause a CD-TEXT attribute to be attached.
|
||||
|
||||
The following purpose specifiers apply to the session as a whole:
|
||||
Specifier = Meaning
|
||||
-------------------------------------------------------------------------
|
||||
Text Code = Character code for pack type 0x8f
|
||||
"ASCII", "8859"
|
||||
Language Code = One of the language names for pack type 0x8f
|
||||
Album Title = Content of pack type 0x80
|
||||
Artist Name = Content of pack type 0x81
|
||||
Songwriter = Content of pack type 0x82
|
||||
Composer = Content of pack type 0x83
|
||||
Arranger = Content of pack type 0x84
|
||||
Album Message = Content of pack type 0x85
|
||||
Catalog Number = Content of pack type 0x86
|
||||
Genre Code = One of the genre names for pack type 0x87
|
||||
Genre Information = Cleartext part of pack type 0x87
|
||||
Closed Information = Content of pack type 0x8d
|
||||
UPC / EAN = Content of pack type 0x8e
|
||||
Text Data Copy Protection = Copyright value for pack type 0x8f
|
||||
"ON" = 0x03, "OFF" = 0x00
|
||||
First Track Number = The lowest track number used in the file
|
||||
Last Track Number = The highest track number used in the file
|
||||
|
||||
The following purpose specifiers apply to particular tracks:
|
||||
Track NN Title = Content of pack type 0x80
|
||||
Track NN Artist = Content of pack type 0x81
|
||||
Track NN Songwriter = Content of pack type 0x82
|
||||
Track NN Composer = Content of pack type 0x83
|
||||
Track NN Arranger = Content of pack type 0x84
|
||||
Track NN Message = Content of pack type 0x85
|
||||
ISRC NN = Content of pack type 0x8e
|
||||
|
||||
The following purpose specifiers have no effect on CD-TEXT:
|
||||
Remarks = Comments with no influence on CD-TEXT
|
||||
Disc Information NN = Supplementary information for use by record companies.
|
||||
ISO-8859-1 encoded. NN ranges from 01 to 04.
|
||||
Input Sheet Version = "0.7T"
|
||||
|
||||
|
||||
libburn peculiarties:
|
||||
|
||||
libburn may read files of the described format by
|
||||
burn_session_input_sheet_v07t()
|
||||
after the burn_session has been establiched and all burn_track objects have
|
||||
been added.
|
||||
|
||||
The following purpose specifiers accept byte values of the form 0xXY.
|
||||
Text Code , Language Code , Genre Code , Text Data Copy Protection
|
||||
E.g. to indicate MS-JIS character code (of which the exact name is unknown):
|
||||
Text Code = 0x80
|
||||
Genre Code is settable by 0xXY or 0xXYZT or 0xXY 0xZT.
|
||||
Genre Code = 0x001b
|
||||
|
||||
Purpose specifiers which have the meaning "Content of pack type 0xXY"
|
||||
may be replaced by the pack type codes. E.g.:
|
||||
0x80 = Session content of pack type 0x80
|
||||
Track 02 0x80 = Track content of pack type 0x80 for track 2.
|
||||
Applicable are pack types 0x80 to 0x86, 0x8d, 0x8e.
|
||||
|
||||
Text Code may be specified only once. It gets speficied to "ISO-8850-1"
|
||||
automatically as soon as content is defined which depends on the text
|
||||
encoding of the block. I.e with pack types 0x80 to 0x85.
|
||||
|
||||
If a track attribute is set, but the corresponding session attribute is not
|
||||
defined or defined with empty text, then the session attribute gets attached
|
||||
as empty test. (Normally empty content is ignored.)
|
||||
|
||||
|
||||
Example cdrskin run with three tracks:
|
||||
|
||||
$ cdrskin dev=/dev/sr0 -v input_sheet_v07t=NIGHTCATS.TXT \
|
||||
-audio track_source_1 track_source_2 track_source_3
|
||||
|
||||
----------------------------------------------------------
|
||||
Content of file NIGHTCATS.TXT :
|
||||
----------------------------------------------------------
|
||||
Input Sheet Version = 0.7T
|
||||
Text Code = 8859
|
||||
Language Code = English
|
||||
Album Title = Joyful Nights
|
||||
Artist Name = United Cat Orchestra
|
||||
Songwriter = Various Songwriters
|
||||
Composer = Various Composers
|
||||
Arranger = Tom Cat
|
||||
Album Message = For all our fans
|
||||
Catalog Number = 1234567890
|
||||
Genre Code = Classical
|
||||
Genre Information = Feline classic music
|
||||
Closed Information = This is not to be shown by CD players
|
||||
UPC / EAN = 1234567890123
|
||||
Text Data Copy Protection = OFF
|
||||
First Track Number = 1
|
||||
Last Track Number = 3
|
||||
Track 01 Title = Song of Joy
|
||||
Track 01 Artist = Felix and The Purrs
|
||||
Track 01 Songwriter = Friedrich Schiller
|
||||
Track 01 Composer = Ludwig van Beethoven
|
||||
Track 01 Arranger = Tom Cat
|
||||
Track 01 Message = Fritz and Louie once were punks
|
||||
ISRC 01 = XYBLG1101234
|
||||
Track 02 Title = Humpty Dumpty
|
||||
Track 02 Artist = Catwalk Beauties
|
||||
Track 02 Songwriter = Mother Goose
|
||||
Track 02 Composer = unknown
|
||||
Track 02 Arranger = Tom Cat
|
||||
Track 02 Message = Pluck the goose
|
||||
ISRC 02 = XYBLG1100005
|
||||
Track 03 Title = Mee Owwww
|
||||
Track 03 Artist = Mia Kitten
|
||||
Track 03 Songwriter = Mia Kitten
|
||||
Track 03 Composer = Mia Kitten
|
||||
Track 03 Arranger = Mia Kitten
|
||||
Track 03 Message =
|
||||
ISRC 03 = XYBLG1100006
|
||||
----------------------------------------------------------
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
CDRWIN cue sheet files:
|
||||
|
||||
A CDRWIN cue sheet file defines the track data source (FILE), various text
|
||||
attributes (CATALOG, TITLE, PERFORMER, SONGWRITER, ISRC), track block types
|
||||
(TRACK), track start addresses (INDEX).
|
||||
The rules for CDRWIN cue sheet files are described at
|
||||
http://digitalx.org/cue-sheet/syntax/
|
||||
There are three more text attributes mentioned in man cdrecord for defining
|
||||
the corresponding CD-TEXT attributes: ARRANGER, COMPOSER, MESSAGE.
|
||||
|
||||
|
||||
--------------------------------------------------------
|
||||
Example of a CDRWIN cue sheet file named NIGHTCATS.CUE :
|
||||
--------------------------------------------------------
|
||||
|
||||
CATALOG 1234567890123
|
||||
FILE "audiodata.bin" BINARY
|
||||
TITLE "Joyful Nights"
|
||||
TRACK 01 AUDIO
|
||||
FLAGS DCP
|
||||
TITLE "Song of Joy"
|
||||
PERFORMER "Felix and The Purrs"
|
||||
SONGWRITER "Friedrich Schiller"
|
||||
ISRC XYBLG1101234
|
||||
INDEX 01 00:00:00
|
||||
TRACK 02 AUDIO
|
||||
FLAGS DCP
|
||||
TITLE "Humpty Dumpty"
|
||||
PERFORMER "Catwalk Beauties"
|
||||
SONGWRITER "Mother Goose"
|
||||
ISRC XYBLG1100005
|
||||
INDEX 01 08:20:12
|
||||
TRACK 03 AUDIO
|
||||
FLAGS DCP
|
||||
TITLE "Mee Owwww"
|
||||
PERFORMER "Mia Kitten"
|
||||
SONGWRITER "Mia Kitten"
|
||||
ISRC XYBLG1100006
|
||||
INDEX 01 13:20:33
|
||||
|
||||
By
|
||||
|
||||
$ cdrskin -v dev=/dev/sr0 -text cuefile=NIGHTCATS.CUE
|
||||
|
||||
this yields as text packs:
|
||||
|
||||
0 : 80 00 00 00 J o y f u l N i g h t f0 f7
|
||||
1 : 80 00 01 0c s 00 S o n g o f J o 43 1c
|
||||
2 : 80 01 02 0a y 00 H u m p t y D u m 43 f9
|
||||
3 : 80 02 03 0a p t y 00 M e e O w w w 24 72
|
||||
4 : 80 03 04 08 w 00 00 00 00 00 00 00 00 00 00 00 6e af
|
||||
5 : 81 00 05 00 00 F e l i x a n d T 4d 51
|
||||
6 : 81 01 06 0b h e P u r r s 00 C a t a7 40
|
||||
7 : 81 02 07 03 w a l k B e a u t i e 59 80
|
||||
8 : 81 02 08 0f s 00 M i a K i t t e n 30 c9
|
||||
9 : 81 03 09 0a 00 00 00 00 00 00 00 00 00 00 00 00 ad 19
|
||||
10 : 82 00 0a 00 00 F r i e d r i c h S 70 8f
|
||||
11 : 82 01 0b 0b c h i l l e r 00 M o t h 33 43
|
||||
12 : 82 02 0c 04 e r G o o s e 00 M i a d6 f5
|
||||
13 : 82 03 0d 03 K i t t e n 00 00 00 00 00 f5 83
|
||||
14 : 8e 00 0e 00 1 2 3 4 5 6 7 8 9 0 1 2 92 3e
|
||||
15 : 8e 00 0f 0c 3 00 X Y B L G 1 1 0 1 2 c0 2b
|
||||
16 : 8e 01 10 0a 3 4 00 X Y B L G 1 1 0 0 bb b3
|
||||
17 : 8e 02 11 09 0 0 5 00 X Y B L G 1 1 0 f3 bf
|
||||
18 : 8e 03 12 08 0 0 0 6 00 00 00 00 00 00 00 00 5b 5c
|
||||
19 : 8f 00 13 00 00 01 03 00 05 05 04 00 00 00 00 00 9b fe
|
||||
20 : 8f 01 14 00 00 00 00 00 00 00 05 03 15 00 00 00 11 0b
|
||||
21 : 8f 02 15 00 00 00 00 00 09 00 00 00 00 00 00 00 da 77
|
||||
|
||||
--------------------------------------
|
||||
|
||||
Some restrictions apply in the libburn call burn_session_by_cue_file():
|
||||
|
||||
Only FILE types BINARY, MOTOROLA, WAVE are allowed.
|
||||
Only TRACK datatypes AUDIO, MODE1/2048 are allowed. They may not be mixed in
|
||||
the same session.
|
||||
|
||||
On the other hand, ARRANGER, COMPOSER, MESSAGE are supported unconditionally.
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
This text is copyright 2011 - 2012 Thomas Schmitt <scdbackup@gmx.net>.
|
||||
Permission is granted to copy, modify, and distribute it, as long as the
|
||||
references to the original information sources are maintained.
|
||||
There is NO WARRANTY, to the extent permitted by law.
|
||||
-------------------------------------------------------------------------------
|
||||
|
13
doc/comments
13
doc/comments
@ -8,13 +8,14 @@
|
||||
Libburnia is an open-source project for reading, mastering and writing
|
||||
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,
|
||||
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
|
||||
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
|
||||
about the equivalent of Linux sg or FreeBSD CAM, volunteers for testing of
|
||||
realistic use cases.
|
||||
Not supported yet are DVD-R/DL. Testers wanted.
|
||||
|
||||
Our scope is currently Linux 2.4 and 2.6, or FreeBSD . For ports to other
|
||||
systems we would need : login on a development machine resp. a live OS on CD
|
||||
or DVD, advise from a system person about the equivalent of Linux sg or FreeBSD
|
||||
CAM, volunteers for testing of realistic use cases.
|
||||
|
||||
libburn is the library by which preformatted data get onto optical media.
|
||||
Its code is independent of cdrecord. Its DVD capabilities are learned from
|
||||
|
176
doc/cookbook.txt
176
doc/cookbook.txt
@ -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
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
libburnia-project.org Optical Media Rotisserie Recipes as of December 2011
|
||||
libburnia-project.org Optical Media Rotisserie Recipes as of January 2010
|
||||
|
||||
Content:
|
||||
- TAO Multi-Session CD Cookbook (CD-R, CD-RW)
|
||||
@ -94,15 +88,10 @@ parameters:
|
||||
Write Type Packet/TAO/SAO/RAW 01h = TAO
|
||||
Multi-session Whether to keep appendable 00b = finalize
|
||||
11b = keep appendable
|
||||
Copy Whether to deny copying 1 = deny by SCMS , 0 = allow
|
||||
Track Mode Describes frame type 4 for data , 0 for audio
|
||||
Data Block Type Layout of payload blocks 8 for 2048 byte data blocks
|
||||
0 for 2352 byte audio blocks
|
||||
Audio Pause Length 150 = 2 seconds
|
||||
Media Catalog Number A property of the disc 0x80 if valid
|
||||
13 decimal digits as ASCII
|
||||
ISRC A property of the track 0x80 if valid
|
||||
12 letters and digits, ASCII
|
||||
Any other parameters may be set to 0.
|
||||
Mode page data as of MMC-5 table 644 are preceded by a Mode Parameter Header
|
||||
as of SPC-3 table 240. This 8-byte header may be filled with zeros.
|
||||
@ -198,9 +187,7 @@ If POINT is >= 1 and <= 99 (63h) then the descriptor is about the track of
|
||||
which POINT tells the number.
|
||||
The start address of this track can be read from PMIN, PSEC, PFRAME where
|
||||
it is encoded in MSF format:
|
||||
If M is smaller than 90: LBA = (M * 60 + S) * 75 + F - 150
|
||||
Else : LBA = (M * 60 + S) * 75 + F - 450150
|
||||
|
||||
blocks = frames - 150, 75 frames = 1 sec , 60 sec = 1 min.
|
||||
The length of the track is given by MIN,SEC,FRAME in the same format.
|
||||
|
||||
If POINT = A0h then the descriptor tells in PMIN the first track number of its
|
||||
@ -227,12 +214,10 @@ sync. libburn uses the info provided by 52h READ TRACK INFORMATION.
|
||||
-------------------------------------------------------------------------------
|
||||
SAO CD Cookbook
|
||||
-------------------------------------------------------------------------------
|
||||
Guided by reading libburn/* from http://icculus.org/burn
|
||||
backed by reading mmc5r03c.pdf from http://www.t10.org/ftp/t10/drafts/mmc5/
|
||||
backed by reading scms.html from
|
||||
http://www.barrel-of-monkeys.com/graphics/prod/dvdplayers/
|
||||
and by experiments with drives NEC ND-4570A, LG GSA-4082B, LITE-ON LTR48125S,
|
||||
Optiarc BD RW BD-5300S, LG BDDVDRW GGC-H20L
|
||||
Guided by reading libburn/* from http://icculus.org/burn
|
||||
backed by reading mmc5r03c.pdf from http://www.t10.org/ftp/t10/drafts/mmc5/
|
||||
and by experiments with drives NEC ND-4570A, LG GSA-4082B, LITE-ON LTR48125S
|
||||
which used in part code from http://icculus.org/burn.
|
||||
|
||||
For libburnia-project.org by Thomas Schmitt <scdbackup@gmx.net>
|
||||
|
||||
@ -269,96 +254,46 @@ Each entry of the sheet is of 8 bytes size. Its fields are named
|
||||
CTL|ADR, TNO, INDEX, DATA FORM, SCMS, MIN, SEC, FRAME .
|
||||
(mmc5r03c.pdf 6.33)
|
||||
|
||||
CTL is comprised of four bits:
|
||||
bit4 = Pre-emphasis (audio only)
|
||||
bit5 = Digital copy permission:
|
||||
0 = prohibited (one-time copy is permitted if SCMS is 00h)
|
||||
1 = permitted (unlimited)
|
||||
bit6 = Data track indicator (bit4 and bit7 shall be 0)
|
||||
bit7 = 4-channel audio
|
||||
Usually CTL is 40h for data and 00h for audio.
|
||||
CTL is 40h for data and 00h for audio.
|
||||
(mmc5r03c.pdf 6.33.3.4)
|
||||
ADR is 01h for entries which define time points. It is 02h for media catalog
|
||||
entries and it is 03h for track ISRC entries.
|
||||
The bits of CTL and ADR are combined in the CTL|ADR byte.
|
||||
|
||||
TNO is the track number. The TNO of the first track may be chosen in the range
|
||||
of 1 to 99. The TNO of following tracks must be the TNO of their predecessor
|
||||
plus 1. The last track must not have a TNO larger than 99.
|
||||
|
||||
INDEX is a subaddress within tracks. INDEX 1 is mandatory and marks the start
|
||||
of the payload area of a track. The range between INDEX 0 and 1 is called
|
||||
pre-gap. It should contain zeros if it exists. Further cue sheet entries with
|
||||
consecutive INDEX numbers mark ranges within the track. The range of the last
|
||||
index may contain a post-gap with zeros.
|
||||
ADR is always 01h.
|
||||
TNO is the track number (1 to 99).
|
||||
INDEX is a subaddress within tracks. This recipe uses only INDEX 01h within
|
||||
tracks.
|
||||
(mmc5r03c.pdf 4.2.3.5.2)
|
||||
A pre-gap of 2 seconds is mandatory only for the first track. Pre-gap and
|
||||
post-gap may be needed with further tracks if they have neighbors with
|
||||
different DATA FORM values. (Such mixing is not yet supported by libburn.)
|
||||
|
||||
DATA FORM is 00h for audio payload, 01h for audio pause (Lead-in and Lead-out),
|
||||
10h for data, 14h for data pause (Lead-in and Lead-out).
|
||||
This shall be ored with 40h for CD-TEXT in Lead-in.
|
||||
DATA FORM is 00h for audio payload , 10h for data. (01h for audio pause is not
|
||||
used in libburn).
|
||||
(mmc5r03c.pdf 6.33.3.11 CD-DA Data Form, 6.33.3.12 CD-ROM mode 1 Form)
|
||||
|
||||
SCMS value 80h in conjunction with bit5 of CTL is an indicator for exhausted
|
||||
one-time-copy permission. If this permission is still intact, then SCMS is 00h.
|
||||
|
||||
SCMS is always 00h.
|
||||
MIN, SEC, FRAME give the MSF address where the described data entity starts.
|
||||
LBA = frames - 150, 75 frames = 1 sec , 60 sec = 1 min.
|
||||
This address must increase from entry to entry (or at least stay equal).
|
||||
|
||||
|
||||
The first two entries in a Cue Sheet may describe the Media Catalog Number,
|
||||
a string of 13 characters, also known with CD-TEXT as "UPC/EAN".
|
||||
(02h, catalog characters 1 to 7)
|
||||
(02h, catalog characters 8 to 13, 00h)
|
||||
These two entries shall be omitted if no catalog number is given.
|
||||
|
||||
The next entry (eventually being the first one) describes the Lead-in.
|
||||
Its content is
|
||||
(CTL|ADR ,00h,00h, DATA FORM ,00h,00h,00h,00h)
|
||||
The first entry describes the Lead-in. Its content is
|
||||
(CTL|ADR ,00h,00h,01h,00h,00h,00h,00h)
|
||||
With the CTL|ADR for the first track: 41h for data, 01h for audio.
|
||||
DATA FORM is pause (audio=01h, data=14h). Ored with 40h if CD-TEXT shall
|
||||
be stored in Lean-in.
|
||||
|
||||
The LBA for the first write is negative: -150. This corresponds to MSF address
|
||||
00h:00h:00h. All addresses are to be given in MSF format.
|
||||
|
||||
Each track may be preceded by two entries describing an ISRC string of 12
|
||||
characters.
|
||||
(CTL | 03h, TNO, characters 1 to 6)
|
||||
(CTL | 03h, TNO, characters 7 to 12)
|
||||
These entries shall be omitted if no ISRC is given for the track.
|
||||
CTL shall be the same as with the track.
|
||||
|
||||
The first information track on disc is preceded by a pause encoding or pre-gap
|
||||
of at least 2 seconds:
|
||||
The first information track on disc is preceded by a pause encoding of 2 sec:
|
||||
(CTL|ADR,01h,00h, DATA FORM ,00h,00h,00h,00h)
|
||||
with DATA FORM = 00h for audio and 10h for data. By those 2 seconds the MSF
|
||||
address increases to 00h:02h:00h = LBA 0. Optional further sectors may occupy
|
||||
addresses larger than 0. This entry has to come after ISRC, if ISRC is given
|
||||
for the track. INDEX has to be 0.
|
||||
address increases to 00h:02h:00h = LBA 0.
|
||||
|
||||
Each track is represented by one or more entries, with increasing index number.
|
||||
At least the entry for INDEX 1 has to exist:
|
||||
Each track is represented by an entry
|
||||
(CTL|ADR, TNO ,01h,DATA FORM,00h, MIN , SEC , FRAME)
|
||||
TNO gives the track number. MIN, SEC, FRAME give the MSF address which becomes
|
||||
the start address of the track. The MSF address is then increased by the size
|
||||
of the track (to be used with next track or with lead-out).
|
||||
There may be more entries with INDEX 2 to 99. Their MSF address tells the
|
||||
sector where their range starts. This range ends at the MSF of the next entry
|
||||
in the cue sheet. INDEX information is stored in the sub-channel of the sectors
|
||||
but not in the Table-of-Content of the disc.
|
||||
|
||||
A track must at least contain 300 payload blocks: 4 seconds of audio or
|
||||
600 KiB of data.
|
||||
(mmc5r03c.pdf 6.33.3.6)
|
||||
|
||||
At the end of the session there is a lead-out entry
|
||||
(CTL|ADR,AAh,01h,DATA FORM,00h,MIN,SEC,FRAME)
|
||||
(CTL|ADR,AAh,01h,01h,00h,MIN,SEC,FRAME)
|
||||
marking the end of the last track. (With libburn CTL is as of the last track.)
|
||||
DATA FORM is 01h for audio, 14h for data.
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
@ -371,12 +306,6 @@ next lower possible value by the drive. So it is helpful to add a few
|
||||
kbytes/sec just in case the drive has rounding problems.
|
||||
(mmc5r03c.pdf 6.37)
|
||||
|
||||
If CD-TEXT shall be written into Lead-in, then it is necessary to obtain the
|
||||
Start Time of Lead-in by 43h READ TOC/PMA/ATIP Format 0100b. It is an MFS
|
||||
address which varies from media manufacturer to media manufacturer.
|
||||
Minute will be >= 90. Therefore this conversion applies:
|
||||
LBA = (M * 60 + S) * 75 + F - 450150
|
||||
|
||||
A Write Parameters mode page 05h has to be composed and transmitted via
|
||||
55h MODE SELECT. This page describes the following parameters:
|
||||
BUFE Buffer Underrun protection 0=off, 1=on
|
||||
@ -387,10 +316,6 @@ A Write Parameters mode page 05h has to be composed and transmitted via
|
||||
Track Mode Describes frame type 0 (is ignored)
|
||||
Data Block Type Layout of payload blocks 0 (is ignored)
|
||||
Audio Pause Length 150 = 2 seconds (ignored ?)
|
||||
Media Catalog Number 0x80 if valid
|
||||
See also Cue Sheet ADR 02h 13 decimal digits as ASCII
|
||||
(With SAO, ISRC is transmitted only by the Cue Sheet.)
|
||||
|
||||
Any other parameters may be set to 0.
|
||||
Mode page data as of MMC-5 table 644 are preceded by a Mode Parameter Header
|
||||
as of SPC-3 table 240. This 8-byte header may be filled with zeros.
|
||||
@ -407,32 +332,15 @@ blocks written. I.e the Transfer Length of the previous 2Ah WRITE has to be
|
||||
added to the Logical Block Address for the next 2Ah WRITE. Only full blocks
|
||||
can be written.
|
||||
(mmc5r03c.pdf, 6.44)
|
||||
Block addresses may be negative for areas before the normally readable
|
||||
data. Data representation of addresses is 4-byte, big-endian, two's-complement.
|
||||
E.g: -150 = FFh FFh FFh 6Ah.
|
||||
This is the natural form found with about any 32-bit processor, so only
|
||||
the endianness has to be taken into respect when converting a 32-bit
|
||||
integer into a LBA for command 2Ah WRITE.
|
||||
Writing begins at LBA -150 which is to be transmitted as 4-byte, Big-endian,
|
||||
two's-complement. E.g: -150 = FFh FFh FFh 6Ah. This is the natural form found
|
||||
with about any 32-bit processor, so only the endianness has to be taken into
|
||||
respect when converting a 32-bit integer into a LBA for command 2Ah WRITE.
|
||||
|
||||
If CD-TEXT shall be written into Lead-in, then writing begins at the start
|
||||
address of Lead-in, which was obtained above.
|
||||
The 18 bytes of each text pack have to be split up to 24 bytes with only the
|
||||
lowest six bits used in each byte. E.g. text pack
|
||||
8F 00 2A 00 01 01 03 00 06 05 04 05 07 06 01 02 48 65
|
||||
becomes
|
||||
23 30 00 2A 00 00 04 01 00 30 00 06 01 10 10 05 01 30 18 01 00 24 21 25
|
||||
4 of these 24 byte packs form a block of DATA FORM 41h. I.e. only 96 bytes
|
||||
payload per block. The whole range from Lead-in start to LBA -150 has to be
|
||||
filled with blocks of this form. Therefore it is necessary to write the
|
||||
list of given packs in repeated cycles.
|
||||
A typical Lead-in start address is -11635 = FFh FFh D2h 8Dh.
|
||||
A description of the CD-TEXT pack format is given in file doc/cdtext.txt .
|
||||
|
||||
Writing without CD-TEXT begins at LBA -150 = FFh FFh FFh 6Ah.
|
||||
|
||||
In both cases, the mandatory pause preceding the first track has to be
|
||||
written as 150 blocks of the matching sector size: 2048 for data,
|
||||
2352 for audio. By this, the LBA increases from -150 to 0.
|
||||
At first the mandatory pause preceding the first track has to be written as
|
||||
150 blocks of the matching sector size: 2048 for data, 2352 for audio.
|
||||
By this, the LBA increases from -150 to 0.
|
||||
|
||||
Next the tracks' payload is sent. For each track exactly the number of blocks
|
||||
has to be transmitted as is announced in the Cue Sheet by the difference
|
||||
@ -456,21 +364,6 @@ to media by 35h SYNCHRONIZE CACHE.
|
||||
No further finalization is necessary. (I.e. no 5Bh CLOSE TRACK SESSION.)
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Obtaining CD-TEXT from Lead-in :
|
||||
|
||||
Audio CDs may contain CD-TEXT information in their Lead-in. It is gained by
|
||||
43h READ TOC/PMA/ATIP, Format 0101b. The reply consists of 4 bytes header,
|
||||
of which the first two bytes give the number of following bytes as big-endian
|
||||
16 bit number. The other two bytes are 0.
|
||||
Following are text packs of 18 bytes each.
|
||||
(mmc5r03c.pdf 6.26.3.7.1 table 495)
|
||||
|
||||
|
||||
A description of CD-TEXT packs and of the applicable libburn API calls is
|
||||
given in file doc/cdtext.txt .
|
||||
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
What is known about mixed mode sessions :
|
||||
|
||||
@ -913,8 +806,7 @@ To support CD, DVD and BD media alike, it is advisable to round the NWA
|
||||
to the next multiple of 32 (= 64 KiB).
|
||||
|
||||
So one can use 0 as MSC1 and prepare a new ISO session for the computed NWA.
|
||||
After writing the session it is necessary to copy the PVD from session start
|
||||
plus 16 to LBA 16 and to adjust it to its new location.
|
||||
After writing the session it is necessary to patch the PVD at LBA 16.
|
||||
The minimal change would be to update the number of image sectors.
|
||||
It is stored in both notations LSB and MSB:
|
||||
for(i= 0; i < 4; i++)
|
||||
@ -975,7 +867,7 @@ Media type can be recognized by Current Profile from 46h GET CONFIGURATION.
|
||||
DVD-R 0011h
|
||||
DVD-RW Restricted Overwrite 0013h
|
||||
DVD-RW Sequential Recording 0014h
|
||||
DVD-R/DL Sequential Recording 0015h (can only do single-session)
|
||||
(DVD-R/DL Sequential Recording 0015h untested, might be single-session only)
|
||||
|
||||
There are two approaches for writing to sequential DVD-R[W]: DAO and
|
||||
Incremental. Not all media and drives offer Incremental which allows
|
||||
@ -1257,13 +1149,11 @@ track of the session.
|
||||
-------------------------------------------------------------------------------
|
||||
Hearsay about DVD-R/DL (Dual Layer) :
|
||||
|
||||
Meanwhile confirmed by one user:
|
||||
|
||||
DVD-R/DL can assume profile 0015h DVD-R Dual Layer Sequential which is supposed
|
||||
to behave like DVD-R or 0016h DVD-R Dual Layer Jump which has no counterpart
|
||||
with DVD-R.
|
||||
|
||||
A half-sentence in mmc5r03c.pdf 6.3.3.3.3 indicates that closing a session
|
||||
A half-sentence in mmc5r03c.pdf 6.3.3.3.3 might indicate that closing a session
|
||||
by 5Bh CLOSE TRACK SESSION Close Function 010b overrides the multi-session bits
|
||||
in mode page 05h.
|
||||
growisofs applies this function in case of not DAO, though. A comment in
|
||||
@ -1509,11 +1399,5 @@ written as rLBA nor as vLBA yet. So one should begin the vLBA of new sessions
|
||||
at the NWA of a sufficiently sized track.
|
||||
(mmc5r03c.pdf 4.5.3.5.4.2 , 4.5.3.6.9)
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
This text is copyright 2011 - 2012 Thomas Schmitt <scdbackup@gmx.net>.
|
||||
Permission is granted to copy, modify, and distribute it, as long as the
|
||||
references to the original information sources are maintained.
|
||||
There is NO WARRANTY, to the extent permitted by law.
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
|
@ -154,6 +154,13 @@ QT_AUTOBRIEF = NO
|
||||
|
||||
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
|
||||
# member inherits the documentation from any documented member that it
|
||||
# re-implements.
|
||||
@ -1145,8 +1152,7 @@ HIDE_UNDOC_RELATIONS = YES
|
||||
# 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)
|
||||
|
||||
# ts B10415: dot causes sigsegv on Debian buildd
|
||||
HAVE_DOT = NO
|
||||
HAVE_DOT = YES
|
||||
|
||||
# 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
|
||||
|
@ -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
|
||||
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 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".
|
||||
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 106 to 108 are Media Type ID
|
||||
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 AZ3 DAXON 16X [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 R4X Daxon Technology Inc. 1-4X HTL 25GB(12cm) [Blu]
|
||||
|
||||
@ -1182,13 +1172,9 @@ TTH02 TDK 12X [Hij]
|
||||
TYG01 TAIYO YUDEN 4X [Hij]
|
||||
TYG02 TAIYO YUDEN 12X [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 Y03 TAIYO YUDEN Co., Ltd. 1-4X LTH [Blu]
|
||||
|
||||
"UmeDisc Ltd. HK"
|
||||
UMEDISC DL1 Elite DVD+R DL [User report feb 2012]
|
||||
|
||||
"Unifino Inc."
|
||||
UTJR001001 UNIFINO 4X [Hij]
|
||||
|
||||
|
111
libburn/async.c
111
libburn/async.c
@ -1,7 +1,7 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
@ -23,9 +23,6 @@
|
||||
#define Libburn_detach_done_workeR 1
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libburn.h"
|
||||
#include "transport.h"
|
||||
@ -143,7 +140,7 @@ static void add_worker(int w_type, struct burn_drive *d,
|
||||
pthread_attr_t attr;
|
||||
#endif
|
||||
|
||||
a = calloc(1, sizeof(struct w_list));
|
||||
a = malloc(sizeof(struct w_list));
|
||||
a->w_type = w_type;
|
||||
a->drive = d;
|
||||
a->u = *(union w_list_data *)data;
|
||||
@ -183,6 +180,11 @@ static void remove_worker(pthread_t th)
|
||||
{
|
||||
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)
|
||||
if (a->thread == th) {
|
||||
if (l)
|
||||
@ -195,12 +197,8 @@ static void remove_worker(pthread_t th)
|
||||
/* Alternative : threads get detached and thus should
|
||||
dispose themselves.
|
||||
*/
|
||||
pthread_detach(th);
|
||||
/*
|
||||
int ret;
|
||||
char msg[80];
|
||||
|
||||
ret = pthread_detach(th);
|
||||
/*
|
||||
sprintf(msg,
|
||||
"remove_workers(): pid= %lu pthread_detach(%lu)= %d",
|
||||
(unsigned long) getpid(), (unsigned long) th, ret);
|
||||
@ -354,7 +352,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
|
||||
/* a ssert(!find_worker(drive)); */
|
||||
|
||||
if((drive == NULL)) {
|
||||
libdax_msgs_submit(libdax_messenger, -1,
|
||||
libdax_msgs_submit(libdax_messenger, drive->global_index,
|
||||
0x00020104,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"NULL pointer caught in burn_disc_erase", 0, 0);
|
||||
@ -382,9 +380,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
|
||||
/* ts A70909 : the willingness to burn any BURN_DISC_FULL media is
|
||||
inappropriate. One would rather need a -force option
|
||||
Note: keep this in sync with mmc_read_disc_info() */
|
||||
/* ts B10321 : Allowed role 5 to be blanked */
|
||||
if ((drive->drive_role == 1 &&
|
||||
drive->current_profile != 0x0a &&
|
||||
if ((drive->current_profile != 0x0a &&
|
||||
drive->current_profile != 0x13 &&
|
||||
drive->current_profile != 0x14 &&
|
||||
drive->status != BURN_DISC_FULL)
|
||||
@ -393,18 +389,13 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
|
||||
drive->status != BURN_DISC_APPENDABLE &&
|
||||
drive->status != BURN_DISC_BLANK)
|
||||
||
|
||||
(drive->drive_role != 1 && drive->drive_role != 5)
|
||||
(drive->drive_role != 1)
|
||||
) {
|
||||
char msg[160];
|
||||
|
||||
sprintf(msg, "Drive and media state unsuitable for blanking. (role= %d , profile= 0x%x , status= %d)",
|
||||
drive->drive_role,
|
||||
(unsigned int) drive->current_profile,
|
||||
drive->status);
|
||||
libdax_msgs_submit(libdax_messenger, drive->global_index,
|
||||
0x00020130,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
"Drive and media state unsuitable for blanking",
|
||||
0, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -449,7 +440,7 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag)
|
||||
{
|
||||
struct format_opts o;
|
||||
int ok = 0, ret;
|
||||
char msg[40];
|
||||
char msg[160];
|
||||
|
||||
reset_progress(drive, 1, 1, 1, 0x10000, 0);
|
||||
|
||||
@ -523,6 +514,42 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag)
|
||||
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) {
|
||||
@ -590,9 +617,8 @@ static void *write_disc_worker_func(struct w_list *w)
|
||||
void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||
{
|
||||
struct write_opts o;
|
||||
char *reasons= NULL;
|
||||
char reasons[BURN_REASONS_LEN+80];
|
||||
struct burn_drive *d;
|
||||
int mvalid;
|
||||
|
||||
d = opts->drive;
|
||||
|
||||
@ -615,13 +641,8 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||
d->cancel = 1;
|
||||
|
||||
/* ts A70203 : people have been warned in API specs */
|
||||
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);
|
||||
if (opts->write_type == BURN_WRITE_NONE)
|
||||
return;
|
||||
}
|
||||
|
||||
if (d->drive_role == 0) {
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
@ -630,35 +651,19 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||
"Drive is a virtual placeholder (null-drive)", 0, 0);
|
||||
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() */
|
||||
if (d->drive_role == 1) {
|
||||
mvalid = 0;
|
||||
if (d->mdata != NULL)
|
||||
if (d->mdata->valid > 0)
|
||||
mvalid = 1;
|
||||
if (!mvalid) {
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
if (d->drive_role == 1 && d->mdata->valid <= 0) {
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index, 0x00020113,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Drive capabilities not inquired yet", 0, 0);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* ts A70219 : intended to replace all further tests here and many
|
||||
tests in burn_*_write_sync()
|
||||
*/
|
||||
|
||||
BURN_ALLOC_MEM_VOID(reasons, char, BURN_REASONS_LEN + 80);
|
||||
strcpy(reasons, "Write job parameters are unsuitable:\n");
|
||||
if (burn_precheck_write(opts, disc, reasons + strlen(reasons), 1)
|
||||
<= 0) {
|
||||
@ -666,9 +671,8 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||
d->global_index, 0x00020139,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
reasons, 0, 0);
|
||||
goto ex;
|
||||
return;
|
||||
}
|
||||
BURN_FREE_MEM(reasons); reasons= NULL;
|
||||
|
||||
/* ts A90106 : early catching of unformatted BD-RE */
|
||||
if (d->current_profile == 0x43)
|
||||
@ -692,9 +696,6 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||
|
||||
add_worker(Burnworker_type_writE, d,
|
||||
(WorkerFunc) write_disc_worker_func, &o);
|
||||
|
||||
ex:;
|
||||
BURN_FREE_MEM(reasons);
|
||||
}
|
||||
|
||||
|
||||
|
1111
libburn/cdtext.c
1111
libburn/cdtext.c
File diff suppressed because it is too large
Load Diff
@ -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.
|
||||
|
||||
@ -10,10 +10,6 @@
|
||||
cc -g -o cleanup -DCleanup_standalonE cleanup.c
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
@ -205,10 +201,9 @@ main()
|
||||
Cleanup_set_handlers(&demoapp,(Cleanup_app_handler_T) Demo_app_handler,0);
|
||||
|
||||
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");
|
||||
c= *cpt;
|
||||
printf("Strange: The system ignored a SIGSEGV: c= %u\n", (unsigned int) c);
|
||||
} else {
|
||||
printf("killme: %d\n",getpid());
|
||||
sleep(3600);
|
||||
|
616
libburn/crc.c
616
libburn/crc.c
@ -1,568 +1,43 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
Containing disabled code pieces from other GPL programs.
|
||||
They are just quotes for reference.
|
||||
|
||||
The activated code uses plain polynomial division and other primitve
|
||||
algorithms to build tables of pre-computed CRC values. It then computes
|
||||
the CRCs by algorithms which are derived from mathematical considerations
|
||||
and from analysing the mathematical meaning of the disabled code pieces.
|
||||
|
||||
The comments here are quite detailed in order to prove my own understanding
|
||||
of the topic.
|
||||
*/
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "crc.h"
|
||||
|
||||
|
||||
/* Exploration ts B00214 :
|
||||
ECMA-130, 22.3.6 "CRC field"
|
||||
"This field contains the inverted parity bits. The CRC code word must be
|
||||
divisible by the check polynomial. [...]
|
||||
The generating polynomial shall be
|
||||
G(x) = x^16 + x^12 + x^5 + 1
|
||||
"
|
||||
Also known as CRC-16-CCITT, CRC-CCITT
|
||||
|
||||
Used in libburn for raw write modes in sector.c.
|
||||
There is also disabled code in read.c which would use it.
|
||||
|
||||
ts B11222:
|
||||
The same algorithm is prescribed for CD-TEXT in MMC-3 Annex J.
|
||||
"CRC Field consists of 2 bytes. Initiator system may use these bytes
|
||||
to check errors in the Pack. The polynomial is x^16 + x^12 + x^5 + 1.
|
||||
All bits shall be inverted."
|
||||
|
||||
libburn/cdtext.c uses a simple bit shifting function : crc_11021()
|
||||
|
||||
|
||||
ts B20211:
|
||||
Discussion why both are equivalent in respect to their result:
|
||||
|
||||
Both map the bits of the given bytes to a polynomial over the finite field
|
||||
of two elements "GF(2)". If bytes 0 .. M are given, then bit n of byte m
|
||||
is mapped to the coefficient of x exponent (n + ((M - m) * 8) + 16).
|
||||
I.e. they translate the bits into a polynomial with the highest bit
|
||||
becomming the coefficient of the highest power of x. Then this polynomial
|
||||
is multiplied by (x exp 16).
|
||||
|
||||
The set of all such polynomials forms a commutative ring. Its addition
|
||||
corresponds to bitwise exclusive or. Addition and subtraction are identical.
|
||||
Multiplication with polynomials of only one single non-zero coefficient
|
||||
corresponds to leftward bit shifting by the exponent of that coefficient.
|
||||
The same rules apply as with elementary school arithmetics on integer
|
||||
numbers, but with surprising results due to the finite nature of the
|
||||
coefficient number space.
|
||||
Note that multiplication is _not_ an iteration of addition here.
|
||||
|
||||
Function crc_11021() performs a division with residue by the euclidian
|
||||
algorithm. I.e. it splits polynomial d into quotient q(d) and residue r(d)
|
||||
in respect to the polynomial p = x exp 16 + x exp 12 + x exp 5 + x exp 0
|
||||
d = p * q(d) + r(d)
|
||||
where r(d) is of a polynomial degree lower than p, i.e. only x exp 15
|
||||
or lower have non-zero coefficients.
|
||||
The checksum crc(D) is derived by reverse mapping (r(d) * (x exp 16)).
|
||||
I.e. by mapping the coefficient of (x exp n) to bit n of the 16 bit word
|
||||
crc(D).
|
||||
The function result is the bit-wise complement of crc(D).
|
||||
|
||||
Function crc_ccitt uses a table ccitt_table of r(d) values for the
|
||||
polynomials d which represent the single byte values 0x00 to 0xff.
|
||||
It computes r(d) by computing the residues of an iteratively expanded
|
||||
polynomial. The expansion of the processed byte string A by the next byte B
|
||||
from the input byte string happens by shifting the string 8 bits to the
|
||||
left, and by oring B onto bits 0 to 7.
|
||||
In the space of polynomials, the already processed polynomial "a" (image of
|
||||
byte string A) gets expanded by polynomial b (the image of byte B) like this
|
||||
a * X + b
|
||||
where X is (x exp 8), i.e. the single coefficient polynomial of degree 8.
|
||||
|
||||
The following argumentation uses algebra with commutative, associative
|
||||
and distributive laws.
|
||||
Valid especially with polynomials is this rule:
|
||||
(1): r(a + b) = r(a) + r(b)
|
||||
because r(a) and r(b) are of degree lower than degree(p) and
|
||||
degree(a + b) <= max(degree(a), degree(b))
|
||||
Further valid are:
|
||||
(2): r(a) = r(r(a))
|
||||
(3): r(p * a) = 0
|
||||
|
||||
The residue of this expanded polynomial can be expressed by means of the
|
||||
residue r(a) which is known from the previous iteration step, and the
|
||||
residue r(b) which may be looked up in ccitt_table.
|
||||
r(a * X + b)
|
||||
= r(p * q(a) * X + r(a) * X + p * q(b) + r(b))
|
||||
|
||||
Applying rule (1):
|
||||
= r(p * q(a) * X) + r(r(a) * X) + r(p * q(b)) + r(r(b))
|
||||
|
||||
Rule (3) and rule (2):
|
||||
= r(r(a) * X) + r(b)
|
||||
|
||||
Be h(a) and l(a) chosen so that: r(a) = h(a) * X + l(a),
|
||||
and l(a) has zero coefficients above (x exp 7), and h(a) * X has zero
|
||||
coefficients below (x exp 8). (They correspond to the high and low byte
|
||||
of the 16 bit word crc(A).)
|
||||
So the previous statement can be written as:
|
||||
= r(h(a) * X * X) + r(l(a) * X) + r(b)
|
||||
|
||||
Since the degree of l(a) is lower than 8, the degree of l(a) * X is lower
|
||||
than 16. Thus it cannot be divisible by p which has degree 16.
|
||||
So: r(l(a) * X) = l(a) * X
|
||||
This yields
|
||||
= l(a) * X + r(h(a) * X * X + b)
|
||||
|
||||
h(a) * X * X is the polynomial representation of the high byte of 16 bit
|
||||
word crc(A).
|
||||
So in the world of bit patterns the iteration step is:
|
||||
|
||||
crc(byte string A expanded by byte B)
|
||||
= (low_byte(crc(A)) << 8) ^ crc(high_byte(crc(A)) ^ B)
|
||||
|
||||
And this is what function crc_ccitt() does, modulo swapping the exor
|
||||
operants and the final bit inversion which is prescribed by ECMA-130
|
||||
and MMC-3 Annex J.
|
||||
|
||||
The start value of the table driven byte shifting algorithm may be
|
||||
different from the start value of an equivalent bit shifting algorithm.
|
||||
This is because the final flushing by zero bits is already pre-computed
|
||||
in the table. So the start value of the table driven algorithm must be
|
||||
the CRC of the 0-polynomial under the start value of the bit shifting
|
||||
algorithm.
|
||||
This fact is not of much importance here, because the start value of
|
||||
the bit shifter is 0x0000 which leads to CRC 0x0000 and thus to start
|
||||
value 0x0000 with the table driven byte shifter.
|
||||
*/
|
||||
|
||||
|
||||
/* Plain implementation of polynomial division on a Galois field, where
|
||||
addition and subtraction both are binary exor. Euclidian algorithm.
|
||||
Divisor is x^16 + x^12 + x^5 + 1 = 0x11021.
|
||||
|
||||
This is about ten times slower than the table driven algorithm.
|
||||
*/
|
||||
static int crc_11021(unsigned char *data, int count, int flag)
|
||||
{
|
||||
int acc = 0, i;
|
||||
|
||||
for (i = 0; i < count * 8 + 16; i++) {
|
||||
acc = (acc << 1);
|
||||
if (i < count * 8)
|
||||
acc |= ((data[i / 8] >> (7 - (i % 8))) & 1);
|
||||
if (acc & 0x10000)
|
||||
acc ^= 0x11021;
|
||||
}
|
||||
return acc;
|
||||
}
|
||||
|
||||
|
||||
/* This is my own table driven implementation for which i claim copyright.
|
||||
|
||||
Copyright (c) 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
*/
|
||||
unsigned short crc_ccitt(unsigned char *data, int count)
|
||||
{
|
||||
static unsigned short crc_tab[256], tab_initialized = 0;
|
||||
unsigned short acc = 0;
|
||||
unsigned char b[1];
|
||||
int i;
|
||||
|
||||
if (!tab_initialized) {
|
||||
/* Create table of byte residues */
|
||||
for (i = 0; i < 256; i++) {
|
||||
b[0] = i;
|
||||
crc_tab[i] = crc_11021(b, 1, 0);
|
||||
}
|
||||
tab_initialized = 1;
|
||||
}
|
||||
/* There seems to be a speed advantage on amd64 if (acc << 8) is the
|
||||
second operant of exor, and *(data++) seems faster than data[i].
|
||||
*/
|
||||
for (i = 0; i < count; i++)
|
||||
acc = crc_tab[(acc >> 8) ^ *(data++)] ^ (acc << 8);
|
||||
|
||||
/* ECMA-130 22.3.6 and MMC-3 Annex J (CD-TEXT) want the result with
|
||||
inverted bits
|
||||
*/
|
||||
return ~acc;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
This was the function inherited with libburn-0.2.
|
||||
|
||||
static unsigned short ccitt_table[256] = {
|
||||
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
|
||||
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
|
||||
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
|
||||
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
|
||||
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
|
||||
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
|
||||
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
|
||||
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
|
||||
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
|
||||
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
|
||||
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
|
||||
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
|
||||
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
|
||||
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
|
||||
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
|
||||
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
|
||||
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
|
||||
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
|
||||
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
|
||||
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
|
||||
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
|
||||
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
|
||||
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
|
||||
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
|
||||
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
|
||||
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
|
||||
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
|
||||
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
|
||||
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
|
||||
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
|
||||
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
|
||||
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
|
||||
};
|
||||
|
||||
unsigned short crc_ccitt(unsigned char *q, int len)
|
||||
{
|
||||
unsigned short crc = 0;
|
||||
|
||||
while (len-- > 0)
|
||||
crc = ccitt_table[(crc >> 8 ^ *q++) & 0xff] ^ (crc << 8);
|
||||
return ~crc;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/* Exploration ts B00214 :
|
||||
ECMA-130, 14.3 "EDC field"
|
||||
"The EDC field shall consist of 4 bytes recorded in positions 2064 to 2067.
|
||||
The error detection code shall be a 32-bit CRC applied on bytes 0 to 2063.
|
||||
The least significant bit of a data byte is used first. The EDC codeword
|
||||
must be divisible by the check polynomial:
|
||||
P(x) = (x^16 + x^15 + x^2 + 1) . (x^16 + x^2 + x + 1)
|
||||
The least significant parity bit (x^0) is stored in the most significant
|
||||
bit position of byte 2067.
|
||||
"
|
||||
|
||||
Used for raw writing in sector.c
|
||||
|
||||
|
||||
ts B20211:
|
||||
Discussion why function crc_32() implements above prescription of ECMA-130.
|
||||
See end of this file for the ofunction inherited with libburn-0.2.
|
||||
|
||||
The mentioned polynomial product
|
||||
(x^16 + x^15 + x^2 + 1) . (x^16 + x^2 + x + 1)
|
||||
yields this sum of x exponents
|
||||
32 31 18 16
|
||||
18 17 4 2
|
||||
17 16 3 1
|
||||
16 15 2 0
|
||||
======================================
|
||||
32 31 16 15 4 3 1 0
|
||||
(The number of x^18 and x^17 is divisible by two and thus 0 in GF(2).)
|
||||
This yields as 33 bit number:
|
||||
0x18001801b
|
||||
|
||||
If above prescription gets implemented straight forward by function
|
||||
crc_18001801b(), then its results match the ones of crc_32() with all test
|
||||
strings which i could invent.
|
||||
|
||||
The function consists of a conventional polynomial division with reverse
|
||||
input order of bits per byte.
|
||||
|
||||
Further it swaps the bits in the resulting 32 bit word. That is because
|
||||
sector.c:sector_headers writes the 4 bytes of crc_32() as little endian.
|
||||
The ECMA-130 prescription rather demands big endianness and bit swapping
|
||||
towards the normal bit order in bytes:
|
||||
"The EDC field shall consist of 4 bytes recorded in positions 2064 to 2067.
|
||||
[...]
|
||||
The least significant parity bit (x^0) is stored in the most
|
||||
significant bit position of byte 2067."
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
/* Overall bit mirroring of a 32 bit word */
|
||||
unsigned int rfl32(unsigned int acc)
|
||||
{
|
||||
unsigned int inv_acc;
|
||||
int i;
|
||||
|
||||
inv_acc = 0;
|
||||
for (i = 0; i < 32; i++)
|
||||
if (acc & (1 << i))
|
||||
inv_acc |= 1 << (31 - i);
|
||||
return inv_acc;
|
||||
}
|
||||
|
||||
|
||||
/* Plain implementation of polynomial division on a Galois field, where
|
||||
addition and subtraction both are binary exor. Euclidian algorithm.
|
||||
Divisor is (x^16 + x^15 + x^2 + 1) * (x^16 + x^2 + x + 1).
|
||||
|
||||
This is about ten times slower than the table driven algorithm.
|
||||
|
||||
@param flag bit0= do not mirror bits in input bytes and result word
|
||||
(Useful for building the byte indexed CRC table)
|
||||
*/
|
||||
static unsigned int crc_18001801b(unsigned char *data, int count, int flag)
|
||||
{
|
||||
unsigned int acc = 0, top;
|
||||
long int i;
|
||||
unsigned int inv_acc;
|
||||
|
||||
for (i = 0; i < count * 8 + 32; i++) {
|
||||
top = acc & 0x80000000;
|
||||
acc = (acc << 1);
|
||||
if (i < count * 8) {
|
||||
if (flag & 1)
|
||||
/* Normal bit sequence of input bytes */
|
||||
acc |= ((data[i / 8] >> (7 - (i % 8))) & 1);
|
||||
else
|
||||
/* Bit sequence of input bytes mirrored */
|
||||
acc |= ((data[i / 8] >> (i % 8)) & 1);
|
||||
}
|
||||
if (top)
|
||||
acc ^= 0x8001801b;
|
||||
}
|
||||
|
||||
if (flag & 1)
|
||||
return (unsigned int) (acc & 0xffffffff);
|
||||
|
||||
/* The bits of the whole 32 bit result are mirrored for ECMA-130
|
||||
output compliance and for sector.c habit to store CRC little endian
|
||||
although ECMA-130 prescribes it big endian.
|
||||
*/
|
||||
inv_acc = rfl32((unsigned int) acc);
|
||||
return inv_acc;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Above discussion why crc_ccitt() and crc_11021() yield identical results
|
||||
can be changed from 16 bit to 32 bit by chosing h(a) and l(a) so that:
|
||||
r(a) = h(a) * X * X * X + l(a)
|
||||
h(a) corresponds to the highest byte of crc(A), whereas l(a) corresponds
|
||||
to the lower three bytes of crc(A).
|
||||
|
||||
This yields
|
||||
r(a * X + b)
|
||||
= l(a) * X + r(h(a) * X * X * X * X + b)
|
||||
|
||||
h(a) * X * X * X * X is the polynomial representation of the high byte of
|
||||
32 bit word crc(A).
|
||||
So in the world of bit patterns we have:
|
||||
|
||||
crc(byte string A expanded by byte B)
|
||||
= (lowest_three_bytes(crc(A)) << 8) ^ crc(high_byte(crc(A)) ^ B)
|
||||
|
||||
|
||||
Regrettably this does not yet account for the byte-internal mirroring of
|
||||
bits during the conversion from bit pattern to polynomial, and during
|
||||
conversion from polynomial residue to bit pattern.
|
||||
|
||||
Be rfl8(D) the result of byte-internal mirroring of bit pattern D,
|
||||
and mirr8(d) its corresponding polynom.
|
||||
|
||||
Be now h(a) and l(a) chosen so that: r(mirr8(a)) = h(a) * X * X * X + l(a)
|
||||
This corresponds to highest byte and lower three bytes of crc(A).
|
||||
|
||||
r(mirr8(a) * X + mirr8(b))
|
||||
= r(h(a) * X * X * X * X) + r(l(a) * X) + r(mirr8(b))
|
||||
= l(a)) * X + r(h(a) * X * X * X * X + mirr8(b))
|
||||
|
||||
The corresponding bit pattern operation is
|
||||
|
||||
crc(mirrored byte string A expanded by mirrored byte B)
|
||||
= (lowest_three_bytes(crc(A)) << 8) ^ crc(high_byte(crc(A)) ^ rfl8(B))
|
||||
|
||||
This demands a final result mirroring to meet the ECMA-130 prescription.
|
||||
|
||||
rfl8() can be implemented as lookup table.
|
||||
|
||||
The start value of the bit shifting iteration is 0x00000000, which leads
|
||||
to the same start value for the table driven byte shifting.
|
||||
|
||||
The following function crc32_by_tab() yields the same results as functions
|
||||
crc_18001801b() and crc_32():
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
/* Byte-internal bit mirroring function.
|
||||
*/
|
||||
unsigned int rfl8(unsigned int acc)
|
||||
{
|
||||
unsigned int inv_acc;
|
||||
int i, j;
|
||||
|
||||
inv_acc = 0;
|
||||
for (j = 0; j < 4; j++)
|
||||
for (i = 0; i < 8; i++)
|
||||
if (acc & (1 << (i + 8 * j)))
|
||||
inv_acc |= 1 << ((7 - i) + 8 * j);
|
||||
return inv_acc;
|
||||
}
|
||||
|
||||
|
||||
#ifdef Libburn_with_crc_illustratioN
|
||||
/* Not needed for libburn. The new implementation of function crc_32() is the
|
||||
one that is used.
|
||||
*/
|
||||
|
||||
unsigned int crc32_by_tab(unsigned char *data, int count, int flag)
|
||||
{
|
||||
static unsigned int crc_tab[256], tab_initialized = 0;
|
||||
static unsigned char mirr_tab[256];
|
||||
unsigned int acc, inv_acc;
|
||||
unsigned char b[1];
|
||||
int i;
|
||||
|
||||
if (!tab_initialized) {
|
||||
for (i = 0; i < 256; i++) {
|
||||
b[0] = i;
|
||||
/* Create table of non-mirrored 0x18001801b residues */
|
||||
crc_tab[i] = crc_18001801b(b, 1, 1);
|
||||
/* Create table of mirrored byte values */
|
||||
mirr_tab[i] = rfl8(i);
|
||||
}
|
||||
tab_initialized = 1;
|
||||
}
|
||||
|
||||
acc = 0;
|
||||
for (i = 0; i < count; i++)
|
||||
acc = (acc << 8) ^ crc_tab[(acc >> 24) ^ mirr_tab[data[i]]];
|
||||
|
||||
/* The bits of the whole 32 bit result are mirrored for ECMA-130
|
||||
output compliance and for sector.c habit to store CRC little endian
|
||||
although ECMA-130 prescribes it big endian.
|
||||
*/
|
||||
inv_acc = rfl32((unsigned int) acc);
|
||||
return inv_acc;
|
||||
}
|
||||
|
||||
#endif /* Libburn_with_crc_illustratioN */
|
||||
|
||||
|
||||
/*
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Above function yields sufficient performance, nevertheless the old function
|
||||
crc_32() (see below) is faster by avoiding the additional mirror table
|
||||
lookup.
|
||||
A test with 10 times 650 MB on 3000 MHz amd64:
|
||||
crc_18001801b : 187 s
|
||||
crc32_by_tab : 27 s
|
||||
crc_32 : 16 s
|
||||
|
||||
So how does crc_32() avoid the application of bit mirroring to B ?.
|
||||
|
||||
Inherited crc_32() performs
|
||||
crc = crc32_table[(crc ^ *data++) & 0xffL] ^ (crc >> 8);
|
||||
|
||||
Above function crc32_by_tab() would be
|
||||
crc = crc_tab[(crc >> 24) ^ mirr_tab[*data++]] ^ (crc << 8);
|
||||
|
||||
The shortcut does not change the polynomial representation of the algorithm
|
||||
or the mapping from and to bit patterns. It only mirrors the bit direction
|
||||
in the bytes and in the 32-bit words which are involved in the bit pattern
|
||||
computation. This affects input (which is desired), intermediate state
|
||||
(which is as good as unmirrored), and final output (which would be slightly
|
||||
undesirable if libburn could not use the mirrored result anyway).
|
||||
|
||||
Instead of the high byte (crc >> 24), the abbreviated algorithm uses
|
||||
the low byte of the mirrored intermediate checksum (crc & 0xffL).
|
||||
Instead of shifting the other three intermediate bytes to the left
|
||||
(crc << 8), the abbreviated algorithm shifts them to the right (crc >> 8).
|
||||
In both cases they overwrite the single byte that was used for computing
|
||||
the table index.
|
||||
|
||||
The byte indexed table of CRC values needs to hold mirrored 32 bit values.
|
||||
The byte index [(crc ^ *data++) & 0xffL] would need to be mirrored, which
|
||||
would eat up the gain of not mirroring the input bytes. But this mirroring
|
||||
can be pre-computed into the table by exchanging each value with the value
|
||||
of its mirrored index.
|
||||
|
||||
So this relation exists between the CRC table crc_tab[] of crc32_by_tab()
|
||||
and the table crc32_table[] of the abbreviated algorithm crc_32():
|
||||
|
||||
crc_tab[i] == rfl32(crc32_table[rfl8(i)])
|
||||
|
||||
for i={0..255}.
|
||||
|
||||
I compared the generated table in crc32_by_tab() by this test
|
||||
for (i = 0; i < 256; i++) {
|
||||
if (rfl32(crc_tab[rfl8(i)]) != crc32_table[i] ||
|
||||
crc_tab[i] != rfl32(crc32_table[rfl8(i)])) {
|
||||
printf("DEVIATION : i = %d\n", i);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
No screaming abort happened.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* This is my own mirrored table implementation for which i claim copyright.
|
||||
With gcc -O2 it shows the same efficiency as the inherited implementation
|
||||
below. With -O3, -O1, or -O0 it is only slightly slower.
|
||||
|
||||
Copyright (c) 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
*/
|
||||
unsigned int crc_32(unsigned char *data, int count)
|
||||
{
|
||||
static unsigned int crc_tab[256], tab_initialized = 0;
|
||||
unsigned int acc = 0;
|
||||
unsigned char b[1];
|
||||
int i;
|
||||
|
||||
if (!tab_initialized) {
|
||||
/* Create table of mirrored 0x18001801b residues in
|
||||
bit-mirrored index positions.
|
||||
*/
|
||||
for (i = 0; i < 256; i++) {
|
||||
b[0] = i;
|
||||
crc_tab[rfl8(i)] = rfl32(crc_18001801b(b, 1, 1));
|
||||
}
|
||||
tab_initialized = 1;
|
||||
}
|
||||
for (i = 0; i < count; i++)
|
||||
acc = (acc >> 8) ^ crc_tab[(acc & 0xff) ^ data[i]];
|
||||
|
||||
/* The bits of the whole 32 bit result stay mirrored for ECMA-130
|
||||
output 8-bit mirroring and for sector.c habit to store the CRC
|
||||
little endian although ECMA-130 prescribes it big endian.
|
||||
*/
|
||||
return acc;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
This was the function inherited with libburn-0.2 which implements the
|
||||
abbreviated algorithm. Its obscure existence led me to above insights.
|
||||
My compliments to the (unknown) people who invented this.
|
||||
|
||||
unsigned long crc32_table[256] = {
|
||||
static unsigned short ccitt_table[256] = {
|
||||
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
|
||||
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
|
||||
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
|
||||
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
|
||||
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
|
||||
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
|
||||
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
|
||||
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
|
||||
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
|
||||
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
|
||||
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
|
||||
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
|
||||
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
|
||||
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
|
||||
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
|
||||
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
|
||||
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
|
||||
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
|
||||
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
|
||||
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
|
||||
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
|
||||
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
|
||||
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
|
||||
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
|
||||
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
|
||||
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
|
||||
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
|
||||
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
|
||||
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
|
||||
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
|
||||
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
|
||||
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
|
||||
};
|
||||
|
||||
unsigned long crc32_table[256] = {
|
||||
0x00000000L, 0x90910101L, 0x91210201L, 0x01B00300L,
|
||||
0x92410401L, 0x02D00500L, 0x03600600L, 0x93F10701L,
|
||||
0x94810801L, 0x04100900L, 0x05A00A00L, 0x95310B01L,
|
||||
@ -627,16 +102,21 @@ unsigned int crc_32(unsigned char *data, int count)
|
||||
0xE541F401L, 0x75D0F500L, 0x7460F600L, 0xE4F1F701L,
|
||||
0xE381F801L, 0x7310F900L, 0x72A0FA00L, 0xE231FB01L,
|
||||
0x71C0FC00L, 0xE151FD01L, 0xE0E1FE01L, 0x7070FF00L
|
||||
};
|
||||
};
|
||||
|
||||
unsigned int crc_32(unsigned char *data, int len)
|
||||
{
|
||||
unsigned short crc_ccitt(unsigned char *q, int len)
|
||||
{
|
||||
unsigned short crc = 0;
|
||||
|
||||
while (len-- > 0)
|
||||
crc = ccitt_table[(crc >> 8 ^ *q++) & 0xff] ^ (crc << 8);
|
||||
return ~crc;
|
||||
}
|
||||
unsigned int crc_32(unsigned char *data, int len)
|
||||
{
|
||||
unsigned int crc = 0;
|
||||
|
||||
while (len-- > 0)
|
||||
crc = crc32_table[(crc ^ *data++) & 0xffL] ^ (crc >> 8);
|
||||
return crc;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,21 +1,11 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
#ifndef BURN__CRC_H
|
||||
#define BURN__CRC_H
|
||||
|
||||
|
||||
#ifdef Xorriso_standalonE
|
||||
/* Source module crc.c of yet unclear ancestry is excluded from GNU xorriso */
|
||||
/* ts B20219 : The functions have been re-implemented from scratch after
|
||||
studying texts about CRC computation and understanding the
|
||||
meaning of the underlying ECMA-130 specs.
|
||||
Nevertheless, there is no need to include them into xorriso
|
||||
because it does neither CD-TEXT nor raw CD writing.
|
||||
*/
|
||||
#ifndef Libburn_no_crc_C
|
||||
#define Libburn_no_crc_C 1
|
||||
#endif
|
||||
|
@ -22,10 +22,6 @@
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
@ -4,10 +4,6 @@
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
@ -25,4 +21,20 @@ void burn_set_verbosity(int 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
|
||||
}
|
||||
}
|
||||
|
932
libburn/drive.c
932
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; -*- */
|
||||
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
@ -12,7 +12,6 @@
|
||||
#include "libburn.h"
|
||||
#include "toc.h"
|
||||
#include "structure.h"
|
||||
#include <pthread.h>
|
||||
|
||||
struct burn_drive;
|
||||
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);
|
||||
|
||||
/* 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 */
|
||||
@ -151,8 +150,4 @@ int burn_abort_5(int patience,
|
||||
int (*pacifier_func)(void *handle, int patience, int elapsed),
|
||||
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 */
|
||||
|
@ -1,10 +1,6 @@
|
||||
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
/* ts A91016 : libburn/ecma130ab.c is the replacement for old libburn/lec.c
|
||||
|
||||
Copyright 2009, Thomas Schmitt <scdbackup@gmx.net>, libburnia-project.org
|
||||
|
200
libburn/file.c
200
libburn/file.c
@ -6,10 +6,6 @@
|
||||
*/
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
@ -26,7 +22,6 @@
|
||||
#include "libburn.h"
|
||||
#include "file.h"
|
||||
#include "async.h"
|
||||
#include "init.h"
|
||||
|
||||
#include "libdax_msgs.h"
|
||||
extern struct libdax_msgs *libdax_messenger;
|
||||
@ -130,7 +125,7 @@ struct burn_source *burn_file_source_new(const char *path, const char *subpath)
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
fs = calloc(1, sizeof(struct burn_source_file));
|
||||
fs = malloc(sizeof(struct burn_source_file));
|
||||
|
||||
/* ts A70825 */
|
||||
if (fs == NULL) {
|
||||
@ -176,7 +171,7 @@ struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size)
|
||||
|
||||
if (datafd == -1)
|
||||
return NULL;
|
||||
fs = burn_alloc_mem(sizeof(struct burn_source_file), 1, 0);
|
||||
fs = malloc(sizeof(struct burn_source_file));
|
||||
if (fs == NULL) /* ts A70825 */
|
||||
return NULL;
|
||||
fs->datafd = datafd;
|
||||
@ -212,10 +207,9 @@ struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size)
|
||||
|
||||
static int fifo_sleep(int flag)
|
||||
{
|
||||
static unsigned long sleeptime = 50000; /* 50 ms */
|
||||
static struct timespec sleeptime = { 0, 50000000}; /* 50 ms */
|
||||
|
||||
usleep(sleeptime);
|
||||
return 0;
|
||||
return nanosleep(&sleeptime, NULL);
|
||||
}
|
||||
|
||||
|
||||
@ -405,13 +399,9 @@ int burn_fifo_source_shoveller(struct burn_source *source, int flag)
|
||||
else
|
||||
ret = fs->inp->read_xt( fs->inp,
|
||||
(unsigned char *) bufpt, fs->inp_read_size);
|
||||
if (ret == 0) {
|
||||
|
||||
/* >>> ??? ts B00326 */
|
||||
/* >>> report EOF of fifo input and fs->in_counter */;
|
||||
|
||||
if (ret == 0)
|
||||
break; /* EOF */
|
||||
} else if (ret < 0) {
|
||||
else if (ret < 0) {
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00020153,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Read error on fifo input", errno, 0);
|
||||
@ -483,11 +473,10 @@ int burn_fifo_source_shoveller(struct burn_source *source, int flag)
|
||||
|
||||
int burn_fifo_cancel(struct burn_source *source)
|
||||
{
|
||||
int ret;
|
||||
struct burn_source_fifo *fs = source->data;
|
||||
|
||||
ret = burn_source_cancel(fs->inp);
|
||||
return ret;
|
||||
burn_source_cancel(fs->inp);
|
||||
return(1);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -511,7 +500,7 @@ struct burn_source *burn_fifo_source_new(struct burn_source *inp,
|
||||
"Desired fifo buffer too small", 0, 0);
|
||||
return NULL;
|
||||
}
|
||||
fs = burn_alloc_mem(sizeof(struct burn_source_fifo), 1, 0);
|
||||
fs = malloc(sizeof(struct burn_source_fifo));
|
||||
if (fs == NULL)
|
||||
return NULL;
|
||||
fs->is_started = 0;
|
||||
@ -626,9 +615,7 @@ void burn_fifo_next_interval(struct burn_source *source,
|
||||
|
||||
*interval_min_fill = fs->interval_min_fill;
|
||||
ret = burn_fifo_inquire_status(source,
|
||||
&size, &free_bytes, &status_text);
|
||||
if (ret < 0)
|
||||
return;
|
||||
&size, &free_bytes, &status_text);
|
||||
fs->interval_min_fill = size - free_bytes - 1;
|
||||
}
|
||||
|
||||
@ -752,170 +739,3 @@ int burn_fifo_fill(struct burn_source *source, int bufsize, int flag)
|
||||
1 | ((flag & 1) << 1));
|
||||
}
|
||||
|
||||
|
||||
/* ----------------------------- Offset source ----------------------------- */
|
||||
/* ts B00922 */
|
||||
|
||||
static void offst_free(struct burn_source *source);
|
||||
|
||||
/* @param flag bit0 = do not check for burn_source_offst, do not return NULL
|
||||
*/
|
||||
static struct burn_source_offst *offst_auth(struct burn_source *source,
|
||||
int flag)
|
||||
{
|
||||
if (source->free_data != offst_free && !(flag & 1)) {
|
||||
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, 0)) == NULL)
|
||||
return (off_t) 0;
|
||||
return fs->nominal_size;
|
||||
}
|
||||
|
||||
static int offst_set_size(struct burn_source *source, off_t size)
|
||||
{
|
||||
struct burn_source_offst *fs;
|
||||
|
||||
if ((fs = offst_auth(source, 0)) == NULL)
|
||||
return 0;
|
||||
|
||||
fs->nominal_size = size;
|
||||
if (fs->size <= 0 || fs->size_adjustable)
|
||||
fs->size = size;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void offst_free(struct burn_source *source)
|
||||
{
|
||||
struct burn_source_offst *fs;
|
||||
|
||||
if ((fs = offst_auth(source, 0)) == NULL)
|
||||
return;
|
||||
if (fs->prev != NULL)
|
||||
offst_auth(fs->prev, 1)->next = fs->next;
|
||||
if (fs->next != NULL)
|
||||
offst_auth(fs->next, 1)->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, 0)) == NULL)
|
||||
return -1;
|
||||
|
||||
/* Eventually skip bytes up to start position */;
|
||||
if (!fs->running) {
|
||||
if (fs->prev != NULL)
|
||||
fs->pos = offst_auth(fs->prev, 1)->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, 0)) == 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, 0)) == 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, 1)->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->size_adjustable = !(flag & 1);
|
||||
fs->nominal_size = size;
|
||||
fs->running = 0;
|
||||
fs->pos = 0;
|
||||
inp->refcount++; /* make sure inp lives longer than src */
|
||||
|
||||
return src;
|
||||
}
|
||||
|
||||
|
@ -74,26 +74,4 @@ struct burn_source_fifo {
|
||||
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;
|
||||
int size_adjustable;
|
||||
|
||||
/* for set_size/get_size */
|
||||
int nominal_size;
|
||||
|
||||
/* To help offst_free() */
|
||||
struct burn_source *next;
|
||||
|
||||
/* The current reading position */
|
||||
int running;
|
||||
off_t pos;
|
||||
|
||||
};
|
||||
|
||||
#endif /* LIBBURN__FILE_H */
|
||||
|
113
libburn/init.c
113
libburn/init.c
@ -1,14 +1,10 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
@ -105,14 +101,6 @@ int burn_support_untested_profiles = 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 */
|
||||
/** Create the messenger object for libburn. */
|
||||
int burn_msgs_initialize(void)
|
||||
@ -177,8 +165,6 @@ void burn_finish(void)
|
||||
|
||||
sg_shutdown(0);
|
||||
|
||||
burn_drive_clear_whitelist();
|
||||
|
||||
burn_running = 0;
|
||||
}
|
||||
|
||||
@ -347,25 +333,14 @@ int burn_sev_to_text(int severity_number, char **severity_name, int flag)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* ts B21214 API */
|
||||
char *burn_list_sev_texts(int flag)
|
||||
{
|
||||
char *sev_list;
|
||||
|
||||
libdax_msgs__sev_to_text(0, &sev_list, 1);
|
||||
return sev_list;
|
||||
}
|
||||
|
||||
|
||||
/* ts B00224 */
|
||||
char *burn_util_thread_id(pid_t pid, pthread_t tid, char text[80])
|
||||
{
|
||||
int i, l;
|
||||
|
||||
sprintf(text, "[%lu,", (unsigned long int) getpid());
|
||||
sprintf(text, "[%d,", getpid());
|
||||
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,
|
||||
"%2.2X", ((unsigned char *) &tid)[i]);
|
||||
|
||||
@ -373,23 +348,6 @@ char *burn_util_thread_id(pid_t pid, pthread_t tid, char text[80])
|
||||
return text;
|
||||
}
|
||||
|
||||
|
||||
/* ts B20122 */
|
||||
/* @param value 0=return rather than exit(value)
|
||||
*/
|
||||
int burn_abort_exit(int value)
|
||||
{
|
||||
burn_abort(4440, burn_abort_pacifier, abort_message_prefix);
|
||||
fprintf(stderr,
|
||||
"\n%sABORT : Program done. Even if you do not see a shell prompt.\n\n",
|
||||
abort_message_prefix);
|
||||
if (value)
|
||||
exit(value);
|
||||
burn_global_abort_level = -2;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int burn_builtin_abort_handler(void *handle, int signum, int flag)
|
||||
{
|
||||
|
||||
@ -504,9 +462,13 @@ int burn_builtin_abort_handler(void *handle, int signum, int flag)
|
||||
"%sABORT : Wait the normal burning time before any kill -9\n",
|
||||
abort_message_prefix);
|
||||
close(0); /* somehow stdin as input blocks abort until EOF */
|
||||
burn_abort(4440, burn_abort_pacifier, abort_message_prefix);
|
||||
|
||||
burn_abort_exit(0);
|
||||
return (1);
|
||||
fprintf(stderr,
|
||||
"\n%sABORT : Program done. Even if you do not see a shell prompt.\n\n",
|
||||
abort_message_prefix);
|
||||
burn_global_abort_level = -2;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
@ -574,41 +536,6 @@ int burn_init_catch_on_abort(int flag)
|
||||
}
|
||||
|
||||
|
||||
/* B20122 */
|
||||
/* Temporarily disable builtin actions 0,1,2 to avoid that burn_abort()
|
||||
waits for its own thread to end grabbing.
|
||||
*/
|
||||
int burn_grab_prepare_sig_action(int *signal_action_mem, int flag)
|
||||
{
|
||||
*signal_action_mem = -1;
|
||||
if (burn_global_signal_handler == burn_builtin_abort_handler &&
|
||||
burn_builtin_signal_action >= 0 &&
|
||||
burn_builtin_signal_action <= 2) {
|
||||
*signal_action_mem = burn_builtin_signal_action;
|
||||
burn_builtin_signal_action = 3;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* B20122 */
|
||||
/* Re-enable builtin actions 0,1,2 and perform delayed signal reactions
|
||||
*/
|
||||
int burn_grab_restore_sig_action(int signal_action_mem, int flag)
|
||||
{
|
||||
if (signal_action_mem >= 0)
|
||||
burn_builtin_signal_action = signal_action_mem;
|
||||
if (burn_is_aborting(0) && signal_action_mem >= 0) {
|
||||
if (signal_action_mem == 0 || signal_action_mem == 1) {
|
||||
burn_abort_exit(1); /* Never comes back */
|
||||
} else if (signal_action_mem == 2) {
|
||||
burn_builtin_triggered_action = signal_action_mem;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* ts A70223 : API */
|
||||
void burn_allow_untested_profiles(int yes)
|
||||
{
|
||||
@ -634,25 +561,3 @@ void burn_set_scsi_logging(int flag)
|
||||
{
|
||||
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(count, size);
|
||||
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,30 +27,5 @@ extern volatile int burn_builtin_triggered_action; /* burn_is_aborting() */
|
||||
*/
|
||||
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); \
|
||||
}
|
||||
|
||||
|
||||
/* B20122 */
|
||||
int burn_grab_prepare_sig_action(int *signal_action_mem, int flag);
|
||||
int burn_grab_restore_sig_action(int signal_action_mem, int flag);
|
||||
|
||||
|
||||
#endif /* BURN__INIT_H */
|
||||
|
1239
libburn/libburn.h
1239
libburn/libburn.h
File diff suppressed because it is too large
Load Diff
@ -1,198 +0,0 @@
|
||||
LIBBURN4 {
|
||||
global:
|
||||
burn_abort;
|
||||
burn_abort_pacifier;
|
||||
burn_allow_drive_role_4;
|
||||
burn_allow_untested_profiles;
|
||||
burn_cdtext_from_session;
|
||||
burn_cdtext_from_packfile;
|
||||
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_incomplete_sessions;
|
||||
burn_disc_get_leadin_text;
|
||||
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_list_sev_texts;
|
||||
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_audio;
|
||||
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_by_cue_file;
|
||||
burn_session_create;
|
||||
burn_session_dispose_cdtext;
|
||||
burn_session_free;
|
||||
burn_session_get_cdtext;
|
||||
burn_session_get_cdtext_par;
|
||||
burn_session_get_hidefirst;
|
||||
burn_session_get_leadout_entry;
|
||||
burn_session_get_sectors;
|
||||
burn_session_get_start_tno;
|
||||
burn_session_get_tracks;
|
||||
burn_session_hide_first_track;
|
||||
burn_session_input_sheet_v07t;
|
||||
burn_session_remove_track;
|
||||
burn_session_set_cdtext;
|
||||
burn_session_set_cdtext_par;
|
||||
burn_session_set_start_tno;
|
||||
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_indice;
|
||||
burn_track_clear_isrc;
|
||||
burn_track_create;
|
||||
burn_track_define_data;
|
||||
burn_track_dispose_cdtext;
|
||||
burn_track_free;
|
||||
burn_track_get_cdtext;
|
||||
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_cdtext;
|
||||
burn_track_set_default_size;
|
||||
burn_track_set_index;
|
||||
burn_track_set_isrc;
|
||||
burn_track_set_isrc_string;
|
||||
burn_track_set_postgap_size;
|
||||
burn_track_set_pregap_size;
|
||||
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_leadin_text;
|
||||
burn_write_opts_set_mediacatalog;
|
||||
burn_write_opts_set_multi;
|
||||
burn_write_opts_set_obs_pad;
|
||||
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: *;
|
||||
};
|
@ -4,10 +4,6 @@
|
||||
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
@ -25,8 +21,7 @@ extern struct libdax_msgs *libdax_messenger;
|
||||
/* Only this single source module is entitled to do this */
|
||||
#define LIBDAX_AUDIOXTR_H_INTERNAL 1
|
||||
|
||||
/* All clients of the extraction facility must do this or include libburn.h */
|
||||
#define LIBDAX_AUDIOXTR_H_PUBLIC 1
|
||||
/* All clients of the extraction facility must do this */
|
||||
#include "libdax_audioxtr.h"
|
||||
|
||||
|
||||
@ -35,7 +30,7 @@ int libdax_audioxtr_new(struct libdax_audioxtr **xtr, char *path, int flag)
|
||||
int ret= -1;
|
||||
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)
|
||||
return(-1);
|
||||
strncpy(o->path,path,LIBDAX_AUDIOXTR_STRLEN-1);
|
||||
|
@ -7,13 +7,6 @@
|
||||
#ifndef LIBDAX_AUDIOXTR_H_INCLUDED
|
||||
#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 */
|
||||
|
||||
/* 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);
|
||||
|
||||
#endif /* LIBDAX_AUDIOXTR_H_PUBLIC */
|
||||
|
||||
|
||||
#ifdef LIBDAX_AUDIOXTR________________
|
||||
#ifdef LIDBAX_AUDIOXTR________________
|
||||
|
||||
|
||||
-- place documentation text here ---
|
||||
|
||||
|
||||
#endif /* LIBDAX_AUDIOXTR_________________ */
|
||||
#endif /* LIDBAX_AUDIOXTR_________________ */
|
||||
|
||||
|
||||
|
||||
|
@ -5,10 +5,6 @@
|
||||
provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
@ -37,7 +33,7 @@ static int libdax_msgs_item_new(struct libdax_msgs_item **item,
|
||||
struct timezone tz;
|
||||
|
||||
(*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)
|
||||
return(-1);
|
||||
o->timestamp= 0.0;
|
||||
@ -140,7 +136,7 @@ int libdax_msgs_new(struct libdax_msgs **m, int flag)
|
||||
{
|
||||
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)
|
||||
return(-1);
|
||||
o->refcount= 1;
|
||||
@ -289,7 +285,7 @@ int libdax_msgs__sev_to_text(int severity, char **severity_name,
|
||||
int flag)
|
||||
{
|
||||
if(flag&1) {
|
||||
*severity_name= "ALL ERRFILE DEBUG UPDATE NOTE HINT WARNING SORRY MISHAP FAILURE FATAL ABORT NEVER";
|
||||
*severity_name= "NEVER\nABORT\nFATAL\nFAILURE\nMISHAP\nSORRY\nWARNING\nHINT\nNOTE\nUPDATE\nDEBUG\nERRFILE\nALL";
|
||||
return(1);
|
||||
}
|
||||
*severity_name= "";
|
||||
@ -370,7 +366,7 @@ int libdax_msgs_submit(struct libdax_msgs *m, int origin, int error_code,
|
||||
item->severity= severity;
|
||||
item->priority= priority;
|
||||
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)
|
||||
goto failed;
|
||||
strcpy(item->msg_text,msg_text);
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
/* libdax_msgs
|
||||
Message handling facility of libburn and libisofs.
|
||||
Copyright (C) 2006-2011 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
Message handling facility of libdax.
|
||||
Copyright (C) 2006-2010 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
@ -316,7 +316,7 @@ int libdax_msgs_submit(struct libdax_msgs *m, int origin, int error_code,
|
||||
|
||||
/** Convert a registered severity number into a severity name
|
||||
@param flag Bitfield for control purposes:
|
||||
bit0= list all severity names in a blank separated string
|
||||
bit0= list all severity names in a newline separated string
|
||||
@return >0 success, <=0 failure
|
||||
*/
|
||||
int libdax_msgs__sev_to_text(int severity, char **severity_name,
|
||||
@ -395,7 +395,7 @@ int libdax_msgs_item_get_rank(struct libdax_msgs_item *item,
|
||||
int *severity, int *priority, int flag);
|
||||
|
||||
|
||||
#ifdef LIBDAX_MSGS_________________
|
||||
#ifdef LIDBAX_MSGS_________________
|
||||
|
||||
|
||||
/* Registered Error Codes */
|
||||
@ -411,7 +411,6 @@ Range "libdax_msgs" : 0x00000000 to 0x0000ffff
|
||||
0x00000001 (DEBUG,ZERO) = Test error message
|
||||
0x00000002 (DEBUG,ZERO) = Debugging message
|
||||
0x00000003 (FATAL,HIGH) = Out of virtual memory
|
||||
0x00000004 (FATAL,HIGH) = Generic fatal error
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
@ -435,9 +434,6 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
||||
0x00020009 (SORRY,HIGH) = Neither stdio-path nor its directory exist
|
||||
0x0002000a (FAILURE,HIGH) = Cannot accept '...' as SG_IO CDROM drive
|
||||
0x0002000b (FAILURE,HIGH) = File object '...' not found
|
||||
0x0002000c (FAILURE,HIGH) = Cannot start device file enumeration
|
||||
0x0002000d (FAILURE,HIGH) = Cannot enumerate next device
|
||||
0x0002000e (NOTE,HIGH) = Failed to open device during
|
||||
|
||||
General library operations:
|
||||
|
||||
@ -475,7 +471,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
||||
0x0002011f (SORRY,HIGH) = Burning is restricted to a single track
|
||||
0x00020120 (NOTE,HIGH) = FORMAT UNIT ignored
|
||||
0x00020121 (FATAL,HIGH) = Write preparation setup failed
|
||||
0x00020122 (FAILURE,HIGH) = SCSI error on format_unit
|
||||
0x00020122 (FATAL,HIGH) = SCSI error on format_unit
|
||||
0x00020123 (SORRY,HIGH) = DVD Media are unsuitable for desired track type
|
||||
0x00020124 (SORRY,HIGH) = SCSI error on set_streaming
|
||||
0x00020125 (SORRY,HIGH) = Write start address not supported
|
||||
@ -519,9 +515,9 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
||||
0x0002014b (SORRY,HIGH) = Drive is already registered resp. scanned
|
||||
0x0002014c (FATAL,HIGH) = Emulated drive caught in SCSI function
|
||||
0x0002014d (SORRY,HIGH) = Asynchromous SCSI error
|
||||
0x0002014f (SORRY,HIGH) = Timeout with asynchronous SCSI command
|
||||
0x0002014f (SORRY,HIGH) = Timeout with asynchromous SCSI command
|
||||
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
|
||||
0x00020153 (SORRY,HIGH) = Read error on fifo input
|
||||
0x00020154 (NOTE,HIGH) = Forwarded input error ends output
|
||||
@ -560,44 +556,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
||||
0x00020176 (NOTE,HIGH) = Stream recording disabled because of small OS buffer
|
||||
0x00020177 (ABORT,HIGH) = Urged drive worker threads to do emergency halt
|
||||
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
|
||||
0x0002018a (SORRY,HIGH) = Timeout exceeded. Retry cancled.
|
||||
0x0002018b (FAILURE,HIGH) = Too many CD-TEXT packs
|
||||
0x0002018c (FAILURE,HIGH) = CD-TEXT pack type out of range
|
||||
0x0002018d (FAILURE,HIGH) = CD-TEXT block number out of range
|
||||
0x0002018e (FAILURE,HIGH) = Too many CD-TEXT packs in block
|
||||
0x0002018f (FAILURE,HIGH) = CD-TEXT pack CRC mismatch
|
||||
0x00020190 (WARNING,HIGH) = CD-TEXT pack CRC mismatch had to be corrected
|
||||
0x00020191 (FAILURE,HIGH) = Unknown parameter in text input file
|
||||
0x00020192 (FAILURE,HIGH) = Text input file sequence error
|
||||
0x00020193 (FAILURE,HIGH) = Text input file readability problem
|
||||
0x00020194 (FAILURE,HIGH) = Text input file syntax error or specs violation
|
||||
0x00020195 (WARNING,HIGH) = Text input file warning
|
||||
0x00020196 (FAILURE,HIGH) = Session has already defined tracks
|
||||
0x00020197 (FAILURE,HIGH) = Unsupported text input file feature
|
||||
0x00020198 (FAILURE,HIGH) = CD-TEXT pack file readability problem
|
||||
0x00020199 (SORRY,HIGH) = Text input file reading aborted
|
||||
0x0002019a (SORRY,HIGH) = Bad track index number
|
||||
0x0002019b (SORRY,HIGH) = CD track number exceeds range of 1 to 99
|
||||
0x0002019c (SORRY,HIGH) = Session has no defined tracks
|
||||
0x0002019d (SORRY,HIGH) = Audio read size not properly aligned
|
||||
|
||||
|
||||
|
||||
libdax_audioxtr:
|
||||
0x00020200 (SORRY,HIGH) = Cannot open audio source file
|
||||
@ -718,7 +677,7 @@ Range "libisoburn" : 0x00060000 to 0x00006ffff
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
#endif /* LIBDAX_MSGS_________________ */
|
||||
#endif /* LIDBAX_MSGS_________________ */
|
||||
|
||||
|
||||
|
||||
|
2328
libburn/mmc.c
2328
libburn/mmc.c
File diff suppressed because it is too large
Load Diff
@ -36,9 +36,9 @@ void mmc_erase(struct burn_drive *, int);
|
||||
void mmc_read_toc(struct burn_drive *);
|
||||
void mmc_read_disc_info(struct burn_drive *);
|
||||
void mmc_read_atip(struct burn_drive *);
|
||||
int mmc_read_cd(struct burn_drive *d, int start, int len,
|
||||
int sec_type, int main_ch,
|
||||
const struct burn_read_opts *o, struct buffer *buf, int flag);
|
||||
void mmc_read_sectors(struct burn_drive *,
|
||||
int,
|
||||
int, const struct burn_read_opts *, struct buffer *);
|
||||
void mmc_set_speed(struct burn_drive *, int, int);
|
||||
void mmc_read_lead_in(struct burn_drive *, struct buffer *);
|
||||
void mmc_perform_opc(struct burn_drive *);
|
||||
@ -48,8 +48,7 @@ void mmc_get_configuration(struct burn_drive *);
|
||||
@return 1=nwa is valid , 0=nwa is not valid , -1=error */
|
||||
int mmc_get_nwa(struct burn_drive *d, int trackno, int *lba, int *nwa);
|
||||
|
||||
/* ts B11228 : changed from void to int */
|
||||
int mmc_send_cue_sheet(struct burn_drive *, struct cue_sheet *);
|
||||
void mmc_send_cue_sheet(struct burn_drive *, struct cue_sheet *);
|
||||
|
||||
/* ts A61023 : get size and free space of drive buffer */
|
||||
int mmc_read_buffer_capacity(struct burn_drive *d);
|
||||
@ -72,19 +71,12 @@ int mmc_get_write_performance(struct burn_drive *d);
|
||||
is the eventual duty of the caller.
|
||||
*/
|
||||
int mmc_compose_mode_page_5(struct burn_drive *d,
|
||||
struct burn_session *s, int tno,
|
||||
const struct burn_write_opts *o,
|
||||
unsigned char *pd);
|
||||
|
||||
/* ts A70201 */
|
||||
int mmc_four_char_to_int(unsigned char *data);
|
||||
|
||||
/* ts A70201 :
|
||||
Common track info fetcher for mmc_get_nwa() and mmc_fake_toc()
|
||||
*/
|
||||
int mmc_read_track_info(struct burn_drive *d, int trackno, struct buffer *buf,
|
||||
int alloc_len);
|
||||
|
||||
/* ts A70812 : return 0 = ok , return BE_CANCELLED = error occured */
|
||||
int mmc_read_10(struct burn_drive *d, int start, int amount,
|
||||
struct buffer *buf);
|
||||
@ -114,25 +106,5 @@ int mmc_function_spy(struct burn_drive *d, char * text);
|
||||
/* ts A91118 */
|
||||
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);
|
||||
|
||||
/* ts B11201 */
|
||||
int mmc_get_leadin_text(struct burn_drive *d,
|
||||
unsigned char **text_packs, int *num_packs, int flag);
|
||||
|
||||
|
||||
#ifdef Libburn_develop_quality_scaN
|
||||
/* B21108 ts */
|
||||
int mmc_nec_optiarc_f3(struct burn_drive *d, int sub_op,
|
||||
int start_lba, int rate_period,
|
||||
int *eba, int *error_rate1, int *error_rate2);
|
||||
#endif
|
||||
|
||||
#endif /*__MMC*/
|
||||
|
@ -5,10 +5,6 @@
|
||||
*/
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "null.h"
|
||||
#include "libburn.h"
|
||||
#include <stdlib.h>
|
||||
@ -24,7 +20,7 @@ struct burn_source *burn_null_source_new(void)
|
||||
{
|
||||
struct burn_source *src;
|
||||
|
||||
src = calloc(1, sizeof(struct burn_source));
|
||||
src = malloc(sizeof(struct burn_source));
|
||||
src->refcount = 1;
|
||||
src->read = null_read;
|
||||
src->read_sub = NULL;
|
||||
|
@ -1,19 +1,13 @@
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libburn.h"
|
||||
#include "options.h"
|
||||
#include "drive.h"
|
||||
#include "transport.h"
|
||||
#include "init.h"
|
||||
#include "write.h"
|
||||
|
||||
/* ts A61007 */
|
||||
/* #include <a ssert.h> */
|
||||
@ -29,7 +23,7 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive)
|
||||
{
|
||||
struct burn_write_opts *opts;
|
||||
|
||||
opts = calloc(1, sizeof(struct burn_write_opts));
|
||||
opts = malloc(sizeof(struct burn_write_opts));
|
||||
if (opts == NULL) {
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00020111,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
@ -46,22 +40,13 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive)
|
||||
opts->underrun_proof = drive->mdata->underrun_proof;
|
||||
opts->perform_opc = 1;
|
||||
opts->obs = -1;
|
||||
|
||||
#ifdef Libburn_dvd_always_obs_paD
|
||||
opts->obs_pad = 1;
|
||||
#else
|
||||
opts->obs_pad = 0;
|
||||
#endif
|
||||
|
||||
opts->start_byte = -1;
|
||||
opts->fill_up_media = 0;
|
||||
opts->force_is_set = 0;
|
||||
opts->do_stream_recording = 0;
|
||||
opts->dvd_obs_override = 0;
|
||||
opts->stdio_fsync_size = Libburn_stdio_fsync_limiT;
|
||||
opts->text_packs = NULL;
|
||||
opts->num_text_packs = 0;
|
||||
opts->no_text_pack_crc_check = 0;
|
||||
opts->has_mediacatalog = 0;
|
||||
opts->format = BURN_CDROM;
|
||||
opts->multi = 0;
|
||||
@ -71,18 +56,15 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive)
|
||||
|
||||
void burn_write_opts_free(struct burn_write_opts *opts)
|
||||
{
|
||||
if (--opts->refcount > 0)
|
||||
return;
|
||||
if (opts->text_packs != NULL)
|
||||
free(opts->text_packs);
|
||||
free(opts);
|
||||
if (--opts->refcount <= 0)
|
||||
free(opts);
|
||||
}
|
||||
|
||||
struct burn_read_opts *burn_read_opts_new(struct burn_drive *drive)
|
||||
{
|
||||
struct burn_read_opts *opts;
|
||||
|
||||
opts = calloc(1, sizeof(struct burn_read_opts));
|
||||
opts = malloc(sizeof(struct burn_read_opts));
|
||||
opts->drive = drive;
|
||||
opts->refcount = 1;
|
||||
opts->raw = 0;
|
||||
@ -93,7 +75,6 @@ struct burn_read_opts *burn_read_opts_new(struct burn_drive *drive)
|
||||
opts->report_recovered_errors = 0;
|
||||
opts->transfer_damaged_blocks = 0;
|
||||
opts->hardware_error_retries = 3;
|
||||
opts->dap_bit = 0;
|
||||
|
||||
return opts;
|
||||
}
|
||||
@ -140,7 +121,7 @@ void burn_write_opts_set_toc_entries(struct burn_write_opts *opts, int count,
|
||||
struct burn_toc_entry *toc_entries)
|
||||
{
|
||||
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,
|
||||
sizeof(struct burn_toc_entry) * count);
|
||||
}
|
||||
@ -193,7 +174,7 @@ void burn_write_opts_set_has_mediacatalog(struct burn_write_opts *opts,
|
||||
void burn_write_opts_set_mediacatalog(struct burn_write_opts *opts,
|
||||
unsigned char mediacatalog[13])
|
||||
{
|
||||
memcpy(opts->mediacatalog, mediacatalog, 13);
|
||||
memcpy(opts->mediacatalog, &mediacatalog, 13);
|
||||
}
|
||||
|
||||
|
||||
@ -204,64 +185,6 @@ void burn_write_opts_set_multi(struct burn_write_opts *opts, int multi)
|
||||
}
|
||||
|
||||
|
||||
/* ts B11204 */
|
||||
/* @param flag bit0=do not verify checksums
|
||||
bit1= repair mismatching checksums
|
||||
bit2= repair checksums if they are 00 00 with each pack
|
||||
*/
|
||||
int burn_write_opts_set_leadin_text(struct burn_write_opts *opts,
|
||||
unsigned char *text_packs,
|
||||
int num_packs, int flag)
|
||||
{
|
||||
int ret;
|
||||
unsigned char *pack_buffer = NULL;
|
||||
|
||||
if (num_packs > Libburn_leadin_cdtext_packs_maX ) {
|
||||
libdax_msgs_submit(libdax_messenger, opts->drive->global_index,
|
||||
0x0002018b,
|
||||
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Too many CD-TEXT packs", 0, 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
|
||||
if (num_packs > 0)
|
||||
BURN_ALLOC_MEM(pack_buffer, unsigned char, num_packs * 18);
|
||||
|
||||
if (opts->text_packs != NULL) {
|
||||
free(opts->text_packs);
|
||||
opts->text_packs = NULL;
|
||||
}
|
||||
|
||||
if (flag & 1) {
|
||||
opts->no_text_pack_crc_check = 1;
|
||||
} else {
|
||||
opts->no_text_pack_crc_check = 0;
|
||||
ret = burn_cdtext_crc_mismatches(text_packs, num_packs,
|
||||
(flag >> 1) & 3);
|
||||
if (ret > 0) {
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x0002018f,
|
||||
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"CD-TEXT pack CRC mismatch", 0, 0);
|
||||
ret = 0; goto ex;
|
||||
} else if (ret < 0) {
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00020190,
|
||||
LIBDAX_MSGS_SEV_WARNING, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"CD-TEXT pack CRC mismatch had to be corrected",
|
||||
0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (num_packs > 0) {
|
||||
memcpy(pack_buffer, text_packs, num_packs * 18);
|
||||
opts->text_packs = pack_buffer;
|
||||
}
|
||||
opts->num_text_packs = num_packs;
|
||||
ret = 1;
|
||||
ex:;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* ts A61222 */
|
||||
void burn_write_opts_set_start_byte(struct burn_write_opts *opts, off_t value)
|
||||
{
|
||||
@ -369,10 +292,6 @@ do_sao:;
|
||||
{wt = BURN_WRITE_SAO; goto ex;}
|
||||
no_sao:;
|
||||
try_tao:;
|
||||
if (opts->num_text_packs > 0) {
|
||||
strcat(reasons, "CD-TEXT: write type SAO required, ");
|
||||
{wt = BURN_WRITE_NONE; goto ex;}
|
||||
}
|
||||
if ((flag & 1) && opts->write_type != BURN_WRITE_TAO)
|
||||
goto try_raw;
|
||||
reason_pt = reasons + strlen(reasons);
|
||||
@ -487,13 +406,6 @@ void burn_write_opts_set_dvd_obs(struct burn_write_opts *opts, int obs)
|
||||
}
|
||||
|
||||
|
||||
/* ts B20406: API */
|
||||
void burn_write_opts_set_obs_pad(struct burn_write_opts *opts, int pad)
|
||||
{
|
||||
opts->obs_pad = 2 * !!pad;
|
||||
}
|
||||
|
||||
|
||||
/* ts A91115: API */
|
||||
void burn_write_opts_set_stdio_fsync(struct burn_write_opts *opts, int rythm)
|
||||
{
|
||||
|
@ -1,6 +1,6 @@
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
@ -42,9 +42,7 @@ struct burn_write_opts
|
||||
/* ts A61219 : Output block size to trigger buffer flush if hit.
|
||||
-1 with CD, 32 kB with DVD */
|
||||
int obs;
|
||||
int obs_pad; /* >0 pad up last block to obs, 0 do not
|
||||
2 indicates burn_write_opts_set_obs_pad(,1)
|
||||
*/
|
||||
int obs_pad; /* 1=pad up last block to obs */
|
||||
|
||||
/* ts A61222 : Start address for media which allow a choice */
|
||||
off_t start_byte;
|
||||
@ -71,10 +69,6 @@ struct burn_write_opts
|
||||
Values 0 or >= 32 counted in 2 KB blocks. */
|
||||
int stdio_fsync_size;
|
||||
|
||||
/* ts B11203 : CD-TEXT */
|
||||
unsigned char *text_packs;
|
||||
int num_text_packs;
|
||||
int no_text_pack_crc_check;
|
||||
|
||||
/** A disc can have a media catalog number */
|
||||
int has_mediacatalog;
|
||||
@ -90,13 +84,6 @@ struct burn_write_opts
|
||||
*/
|
||||
#define Libburn_stdio_fsync_limiT 8192
|
||||
|
||||
/* Maximum number of Lead-in text packs.
|
||||
READ TOC/PMA/ATIP can at most return 3640.7 packs.
|
||||
The sequence counters of the packs have 8 bits. There are 8 blocks at most.
|
||||
Thus max 2048 packs.
|
||||
*/
|
||||
#define Libburn_leadin_cdtext_packs_maX 2048
|
||||
|
||||
|
||||
/** Options for disc reading operations. This should be created with
|
||||
burn_read_opts_new() and freed with burn_read_opts_free(). */
|
||||
@ -129,14 +116,6 @@ struct burn_read_opts
|
||||
/** The number of retries the hardware should make to correct
|
||||
errors. */
|
||||
unsigned char hardware_error_retries;
|
||||
|
||||
/* ts B21119 */
|
||||
/* >>> Needs API access */
|
||||
/** Whether to set DAP bit which allows drive to apply
|
||||
"flaw obscuring mechanisms like audio data mute and interpolate"
|
||||
*/
|
||||
unsigned int dap_bit;
|
||||
|
||||
};
|
||||
|
||||
#endif /* BURN__OPTIONS_H */
|
||||
|
@ -29,37 +29,12 @@
|
||||
/* The number of above list items */
|
||||
#define BURN_OS_SIGNAL_COUNT 16
|
||||
|
||||
/** 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.
|
||||
*/
|
||||
/** To list all signals which shall surely not be caught */
|
||||
#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 */
|
||||
#define BURN_OS_NON_SIGNAL_COUNT \
|
||||
( 3 + BURN_OS_SIG_WINCH_CNT + BURN_OS_SIG_URG_CNT )
|
||||
#define BURN_OS_NON_SIGNAL_COUNT 3
|
||||
|
||||
|
||||
/* The maximum size for a (SCSI) i/o transaction */
|
||||
|
@ -4,8 +4,7 @@
|
||||
by os.h in case of compilation for
|
||||
FreeBSD with CAM
|
||||
|
||||
Copyright (C) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
provided under GPLv2+
|
||||
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
|
||||
*/
|
||||
|
||||
/** 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 */
|
||||
/* Important : MUST be at least 32768 ! */
|
||||
/* Older BSD info says that 32 kB is maximum. But 64 kB seems to work well
|
||||
on 8-STABLE. It is by default only used with BD in streaming mode.
|
||||
So older systems should still be quite safe with this buffer max size.
|
||||
*/
|
||||
#define BURN_OS_TRANSPORT_BUFFER_SIZE 65536
|
||||
#define BURN_OS_TRANSPORT_BUFFER_SIZE 32768
|
||||
|
||||
|
||||
/** To hold all state information of BSD device enumeration
|
||||
@ -64,6 +59,5 @@ typedef struct burn_drive_enumeration_state *burn_drive_enumerator_t;
|
||||
#define BURN_OS_TRANSPORT_DRIVE_ELEMENTS \
|
||||
struct cam_device* cam; \
|
||||
int lock_fd; \
|
||||
int is_ahci; \
|
||||
|
||||
|
||||
|
@ -29,49 +29,26 @@
|
||||
/* The number of above list items */
|
||||
#define BURN_OS_SIGNAL_COUNT 16
|
||||
|
||||
|
||||
/** 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.
|
||||
*/
|
||||
/** To list all signals which shall surely not be caught */
|
||||
#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 */
|
||||
#define BURN_OS_NON_SIGNAL_COUNT \
|
||||
( 3 + BURN_OS_SIG_WINCH_CNT + BURN_OS_SIG_URG_CNT )
|
||||
#define BURN_OS_NON_SIGNAL_COUNT 3
|
||||
|
||||
|
||||
/* 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
|
||||
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
|
||||
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.
|
||||
This makes it worth to have a special case for GNU/Linux buffer size here.
|
||||
*/
|
||||
/* Important : MUST be at least 32768 ! */
|
||||
#ifdef __linux
|
||||
#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
|
||||
|
@ -1,66 +0,0 @@
|
||||
|
||||
/* os-solaris.h
|
||||
Operating system specific libburn definitions and declarations. Included
|
||||
by os.h in case of compilation for
|
||||
Solaris based systems, e.g. SunOS 5.11
|
||||
with Solaris uscsi MMC transport adapter sg-solaris.c
|
||||
|
||||
Copyright (C) 2010 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
|
||||
*/
|
||||
|
||||
|
||||
/** List of all signals which shall be caught by signal handlers and trigger
|
||||
a graceful abort of libburn. (See man signal.h)
|
||||
*/
|
||||
/* Once as system defined macros */
|
||||
#define BURN_OS_SIGNAL_MACRO_LIST \
|
||||
SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, \
|
||||
SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, \
|
||||
SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN, \
|
||||
SIGTTOU
|
||||
|
||||
/* Once as text 1:1 list of strings for messages and interpreters */
|
||||
#define BURN_OS_SIGNAL_NAME_LIST \
|
||||
"SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", \
|
||||
"SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", \
|
||||
"SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN", \
|
||||
"SIGTTOU"
|
||||
|
||||
/* The number of above list items */
|
||||
#define BURN_OS_SIGNAL_COUNT 16
|
||||
|
||||
/** To list all signals which shall surely not be caught */
|
||||
#define BURN_OS_NON_SIGNAL_MACRO_LIST \
|
||||
SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH
|
||||
|
||||
/* The number of above list items */
|
||||
#define BURN_OS_NON_SIGNAL_COUNT 5
|
||||
|
||||
|
||||
/* 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
|
||||
with buffer size 32 kB. So stream recording is allowed only with size 64k.
|
||||
*/
|
||||
#define BURN_OS_TRANSPORT_BUFFER_SIZE 65536
|
||||
|
||||
|
||||
/* >>> */
|
||||
|
||||
/* To hold the position of the most recently delivered address from
|
||||
device enumeration.
|
||||
*/
|
||||
struct burn_drive_enumerator_struct {
|
||||
void *dir;
|
||||
};
|
||||
|
||||
#define BURN_OS_DEFINE_DRIVE_ENUMERATOR_T \
|
||||
typedef struct burn_drive_enumerator_struct burn_drive_enumerator_t;
|
||||
|
||||
|
||||
/* The list of operating system dependent elements in struct burn_drive.
|
||||
Usually they are initialized in sg-*.c:enumerate_common().
|
||||
*/
|
||||
#define BURN_OS_TRANSPORT_DRIVE_ELEMENTS \
|
||||
int fd;
|
||||
|
18
libburn/os.h
18
libburn/os.h
@ -14,14 +14,6 @@
|
||||
*/
|
||||
|
||||
|
||||
#ifdef Libburn_use_sg_dummY
|
||||
|
||||
|
||||
/* --------- Any other system. With dummy MMC transport sg-dummy.c --------- */
|
||||
#include "os-dummy.h"
|
||||
|
||||
|
||||
#else
|
||||
#ifdef Libburn_use_libcdiO
|
||||
|
||||
|
||||
@ -53,14 +45,6 @@
|
||||
#include "os-linux.h"
|
||||
|
||||
|
||||
#else
|
||||
#ifdef __sun
|
||||
|
||||
|
||||
/* ------- Solaris (e.g. SunOS 5.11) with uscsi ------ */
|
||||
#include "os-solaris.h"
|
||||
|
||||
|
||||
#else
|
||||
|
||||
|
||||
@ -68,12 +52,10 @@
|
||||
#include "os-dummy.h"
|
||||
|
||||
|
||||
#endif /* ! __sun*/
|
||||
#endif /* ! __linux */
|
||||
#endif /* ! __FreeBSD__kernel__ */
|
||||
#endif /* ! __FreeBSD__ */
|
||||
#endif /* ! Libburn_use_libcdiO */
|
||||
#endif /* ! Libburn_use_sg_dummY */
|
||||
|
||||
|
||||
#endif /* ! BURN_OS_H_INCLUDED */
|
||||
|
255
libburn/read.c
255
libburn/read.c
@ -1,13 +1,12 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
/* #include <m alloc.h> ts A61013 : not in GNU/Linux man 3 malloc */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
@ -36,7 +35,6 @@
|
||||
#include "init.h"
|
||||
#include "toc.h"
|
||||
#include "util.h"
|
||||
#include "mmc.h"
|
||||
#include "sg.h"
|
||||
#include "read.h"
|
||||
#include "options.h"
|
||||
@ -55,7 +53,7 @@ void burn_disc_read(struct burn_drive *d, const struct burn_read_opts *o)
|
||||
int drive_lba;
|
||||
unsigned short crc;
|
||||
unsigned char fakesub[96];
|
||||
struct buffer page; <- needs to become dynamic memory
|
||||
struct buffer page;
|
||||
int speed;
|
||||
|
||||
/* ts A61007 : if this function gets revived, then these
|
||||
@ -116,6 +114,7 @@ drive, or only store a subset of the _opts structs in drives */
|
||||
while (1) {
|
||||
seclen = burn_sector_length_read(d, o);
|
||||
|
||||
burn_print(12, "received %d blocks\n", page.sectors);
|
||||
for (i = 0; i < page.sectors; i++) {
|
||||
burn_packet_process(d, page.data + seclen * i, o);
|
||||
d->track_end--;
|
||||
@ -123,6 +122,7 @@ drive, or only store a subset of the _opts structs in drives */
|
||||
}
|
||||
|
||||
if ((d->cancel) || (drive_lba == LAST_SESSION_END(d))) {
|
||||
burn_print(1, "finished or cancelled\n");
|
||||
d->busy = BURN_DRIVE_IDLE;
|
||||
if (!d->cancel)
|
||||
d->toc->complete = 1;
|
||||
@ -136,14 +136,16 @@ drive, or only store a subset of the _opts structs in drives */
|
||||
if (d->currtrack >
|
||||
d->toc->session[d->currsession].lasttrack) {
|
||||
d->currsession++;
|
||||
/* session switch to d->currsession */
|
||||
/* skipping a lead out */
|
||||
burn_print(12, "session switch to %d\n",
|
||||
d->currsession);
|
||||
burn_print(12, "skipping a lead out\n");
|
||||
drive_lba = CURRENT_SESSION_START(d);
|
||||
burn_print(12, "new lba %d\n", drive_lba);
|
||||
/* XXX more of the same
|
||||
end = burn_track_end(d, d->currsession,
|
||||
d->currtrack);
|
||||
*/
|
||||
}
|
||||
*/ }
|
||||
burn_print(12, "track switch to %d\n", d->currtrack);
|
||||
}
|
||||
|
||||
page.sectors = 0;
|
||||
@ -159,8 +161,6 @@ drive, or only store a subset of the _opts structs in drives */
|
||||
drive_lba);
|
||||
|
||||
/* >>> ts A61009 : ensure page.sectors >= 0 before calling */
|
||||
/* >>> ts B21123 : Would now be d->read_cd() with
|
||||
with sectype = 0 , mainch = 0xf8 */
|
||||
d->r ead_sectors(d, drive_lba, page.sectors, o, &page);
|
||||
|
||||
printf("Read %d\n", page.sectors);
|
||||
@ -200,21 +200,23 @@ static int bitcount(unsigned char *data, int n)
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
void burn_packet_process(struct burn_drive *d, unsigned char *data,
|
||||
const struct burn_read_opts *o)
|
||||
{
|
||||
unsigned char sub[96];
|
||||
unsigned short crc;
|
||||
int ptr = 2352, i, j, code, fb;
|
||||
int audio = 1;
|
||||
#ifndef Libburn_no_crc_C
|
||||
unsigned short crc;
|
||||
#endif
|
||||
|
||||
if (o->c2errors) {
|
||||
fb = bitcount(data + ptr, 294);
|
||||
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;
|
||||
}
|
||||
@ -250,17 +252,16 @@ void burn_packet_process(struct burn_drive *d, unsigned char *data,
|
||||
}
|
||||
}
|
||||
}
|
||||
crc = (*(sub + 22) << 8) + *(sub + 23);
|
||||
|
||||
#ifndef Libburn_no_crc_C
|
||||
crc = (*(sub + 22) << 8) + *(sub + 23);
|
||||
if (crc != crc_ccitt(sub + 12, 10)) {
|
||||
/*
|
||||
burn_print(1, "sending error on %s %s\n",
|
||||
d->idata->vendor, d->idata->product);
|
||||
e = burn_error();
|
||||
/* e = burn_error();
|
||||
e->drive = d;
|
||||
*/
|
||||
burn_print(1, "crc mismatch in Q\n");
|
||||
*/;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -284,12 +285,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
|
||||
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");
|
||||
write(fd, sec, 2352);
|
||||
}
|
||||
@ -341,7 +338,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 sose_mem = 0, fd = -1, ret;
|
||||
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
|
||||
@ -355,7 +352,7 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
|
||||
fprintf(log_fp, "%d\n", (int) (byte_address / 2048));
|
||||
#endif /* Libburn_read_data_logginG */
|
||||
|
||||
BURN_ALLOC_MEM(buf, struct buffer, 1);
|
||||
|
||||
*data_count = 0;
|
||||
sose_mem = d->silent_on_scsi_error;
|
||||
|
||||
@ -364,20 +361,20 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
|
||||
d->global_index, 0x00020142,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Drive is not grabbed on random access read", 0, 0);
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
if (d->drive_role == 0) {
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x00020146,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Drive is a virtual placeholder (null-drive)", 0, 0);
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
} else if (d->drive_role == 3) {
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
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);
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
if ((byte_address % alignment) != 0) {
|
||||
sprintf(msg,
|
||||
@ -387,7 +384,7 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
|
||||
0x00020143,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
if (d->media_read_capacity != 0x7fffffff && byte_address >=
|
||||
((off_t) d->media_read_capacity + (off_t) 1) * (off_t) 2048) {
|
||||
@ -401,7 +398,7 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
}
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (d->busy != BURN_DRIVE_IDLE) {
|
||||
@ -409,7 +406,7 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
|
||||
d->global_index, 0x00020145,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Drive is busy on attempt to read data", 0, 0);
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (d->drive_role != 1) {
|
||||
@ -425,41 +422,28 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
|
||||
d->stdio_fd = fd =
|
||||
open(d->devname, O_RDONLY | O_LARGEFILE);
|
||||
if (fd == -1) {
|
||||
if (errno == EACCES && (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))
|
||||
if (errno != ENOENT || !(flag & 2))
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index, 0x00020005,
|
||||
d->global_index,
|
||||
0x00020005,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Failed to open device (a pseudo-drive) for reading",
|
||||
errno, 0);
|
||||
ret = 0;
|
||||
if (errno == EACCES && (flag & 8))
|
||||
ret= -2;
|
||||
goto ex;
|
||||
ret = 0; goto ex;
|
||||
}
|
||||
if (lseek(fd, byte_address, SEEK_SET) == -1) {
|
||||
if (!(flag & 2)) {
|
||||
sprintf(msg, "Cannot address start byte %.f",
|
||||
(double) byte_address);
|
||||
if (!(flag & 2))
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index,
|
||||
0x00020147,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, errno, 0);
|
||||
}
|
||||
"Cannot address start byte", errno, 0);
|
||||
ret = 0; goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
d->busy = BURN_DRIVE_READING_SYNC;
|
||||
d->buffer = buf;
|
||||
d->buffer = &buf;
|
||||
|
||||
start = byte_address / 2048;
|
||||
upto = start + data_size / 2048;
|
||||
@ -468,18 +452,13 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
|
||||
wpt = data;
|
||||
for (; start < upto; start += chunksize) {
|
||||
chunksize = upto - start;
|
||||
if (chunksize > (BUFFER_SIZE / 2048)) {
|
||||
chunksize = (BUFFER_SIZE / 2048);
|
||||
cpy_size = BUFFER_SIZE;
|
||||
if (chunksize > 16) {
|
||||
chunksize = 16;
|
||||
cpy_size = 16 * 2048;
|
||||
} else
|
||||
cpy_size = data_size - *data_count;
|
||||
if (flag & 2)
|
||||
d->silent_on_scsi_error = 1;
|
||||
if (flag & 16) {
|
||||
d->had_particular_error &= ~1;
|
||||
if (!d->silent_on_scsi_error)
|
||||
d->silent_on_scsi_error = 2;
|
||||
}
|
||||
if (d->drive_role == 1) {
|
||||
err = d->read_10(d, start, chunksize, d->buffer);
|
||||
} else {
|
||||
@ -489,11 +468,9 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
|
||||
if (ret <= 0)
|
||||
err = BE_CANCELLED;
|
||||
}
|
||||
if (flag & (2 | 16))
|
||||
if (flag & 2)
|
||||
d->silent_on_scsi_error = sose_mem;
|
||||
if (err == BE_CANCELLED) {
|
||||
if ((flag & 16) && (d->had_particular_error & 1))
|
||||
{ret = -3; goto ex;}
|
||||
/* Try to read a smaller part of the chunk */
|
||||
if(!(flag & 4))
|
||||
for (i = 0; i < chunksize - 1; i++) {
|
||||
@ -533,149 +510,11 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
|
||||
|
||||
ret = 1;
|
||||
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->busy = BURN_DRIVE_IDLE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* ts B21119 : API function*/
|
||||
int burn_read_audio(struct burn_drive *d, int sector_no,
|
||||
char data[], off_t data_size, off_t *data_count, int flag)
|
||||
{
|
||||
int alignment = 2352, start, upto, chunksize = 1, err, cpy_size, i;
|
||||
int sose_mem = 0, ret;
|
||||
char msg[81], *wpt;
|
||||
struct buffer *buf = NULL, *buffer_mem = d->buffer;
|
||||
|
||||
BURN_ALLOC_MEM(buf, struct buffer, 1);
|
||||
*data_count = 0;
|
||||
sose_mem = d->silent_on_scsi_error;
|
||||
|
||||
if (d->released) {
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index, 0x00020142,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Drive is not grabbed on random access read", 0, 0);
|
||||
{ret = 0; goto ex;}
|
||||
}
|
||||
if (d->drive_role != 1) {
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x00020146,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Drive is a virtual placeholder (stdio-drive or null-drive)",
|
||||
0, 0);
|
||||
{ret = 0; goto ex;}
|
||||
}
|
||||
if ((data_size % alignment) != 0) {
|
||||
sprintf(msg,
|
||||
"Audio read size not properly aligned (%d bytes)",
|
||||
alignment);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x0002019d,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
{ret = 0; goto ex;}
|
||||
}
|
||||
if (d->busy != BURN_DRIVE_IDLE) {
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index, 0x00020145,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Drive is busy on attempt to read audio", 0, 0);
|
||||
{ret = 0; goto ex;}
|
||||
}
|
||||
|
||||
d->busy = BURN_DRIVE_READING_SYNC;
|
||||
d->buffer = buf;
|
||||
|
||||
start = sector_no;
|
||||
upto = start + data_size / alignment;
|
||||
wpt = data;
|
||||
for (; start < upto; start += chunksize) {
|
||||
chunksize = upto - start;
|
||||
if (chunksize > (BUFFER_SIZE / alignment))
|
||||
chunksize = (BUFFER_SIZE / alignment);
|
||||
cpy_size = chunksize * alignment;
|
||||
if (flag & 2)
|
||||
d->silent_on_scsi_error = 1;
|
||||
if (flag & 16) {
|
||||
d->had_particular_error &= ~1;
|
||||
if (!d->silent_on_scsi_error)
|
||||
d->silent_on_scsi_error = 2;
|
||||
}
|
||||
err = d->read_cd(d, start, chunksize, 1, 0x10, NULL, d->buffer,
|
||||
(flag & 8) >> 3);
|
||||
if (flag & (2 | 16))
|
||||
d->silent_on_scsi_error = sose_mem;
|
||||
if (err == BE_CANCELLED) {
|
||||
if ((flag & 16) && (d->had_particular_error & 1))
|
||||
{ret = -3; goto ex;}
|
||||
if(!(flag & 4))
|
||||
for (i = 0; i < chunksize - 1; i++) {
|
||||
if (flag & 2)
|
||||
d->silent_on_scsi_error = 1;
|
||||
err = d->read_cd(d, start + i, 1, 1, 0x10,
|
||||
NULL, d->buffer, (flag & 8) >> 3);
|
||||
if (flag & 2)
|
||||
d->silent_on_scsi_error = sose_mem;
|
||||
if (err == BE_CANCELLED)
|
||||
break;
|
||||
memcpy(wpt, d->buffer->data, alignment);
|
||||
wpt += alignment;
|
||||
*data_count += alignment;
|
||||
}
|
||||
|
||||
ret = 0; goto ex;
|
||||
}
|
||||
memcpy(wpt, d->buffer->data, cpy_size);
|
||||
wpt += cpy_size;
|
||||
*data_count += cpy_size;
|
||||
}
|
||||
|
||||
ret = 1;
|
||||
ex:
|
||||
BURN_FREE_MEM(buf);
|
||||
d->buffer = buffer_mem;
|
||||
d->busy = BURN_DRIVE_IDLE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
#ifdef Libburn_develop_quality_scaN
|
||||
|
||||
/* B21108 ts */
|
||||
int burn_nec_optiarc_rep_err_rate(struct burn_drive *d,
|
||||
int start_lba, int rate_period, int flag)
|
||||
{
|
||||
int ret, lba = 0, error_rate1 = 0, error_rate2 = 0, enabled = 0, dret;
|
||||
|
||||
/* Sub Operation Code 1 : Enable Error Rate reporting function */
|
||||
ret = mmc_nec_optiarc_f3(d, 1, start_lba, rate_period,
|
||||
&lba, &error_rate1, &error_rate2);
|
||||
if (ret <= 0)
|
||||
goto ex;
|
||||
enabled = 1;
|
||||
|
||||
/* >>> Sub Operation Code 2 : Seek to starting address
|
||||
start_lba , rate_period
|
||||
*/;
|
||||
|
||||
/* >>> Loop with Sub Operation Code 3 : Send Error Rate information
|
||||
reply: 4-byte LBA , 2-byte C1/PIE , 2-byte C2/PIF
|
||||
*/;
|
||||
|
||||
ret = 1;
|
||||
ex:;
|
||||
if (enabled) {
|
||||
/* Code F : Disable Error Rate reporting function */
|
||||
dret = mmc_nec_optiarc_f3(d, 0xf, 0, 0,
|
||||
&lba, &error_rate1, &error_rate2);
|
||||
if (dret < ret)
|
||||
ret = dret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* Libburn_develop_quality_scaN */
|
||||
|
||||
|
@ -7,9 +7,6 @@
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
@ -54,22 +51,20 @@ static unsigned char SBC_STOP_UNIT[] = { 0x1b, 0, 0, 0, 0, 0 };
|
||||
|
||||
void sbc_load(struct burn_drive *d)
|
||||
{
|
||||
struct command *c;
|
||||
struct command c;
|
||||
|
||||
c = &(d->casual_command);
|
||||
if (mmc_function_spy(d, "load") <= 0)
|
||||
return;
|
||||
|
||||
scsi_init_command(c, SBC_LOAD, sizeof(SBC_LOAD));
|
||||
c->retry = 1;
|
||||
scsi_init_command(&c, SBC_LOAD, sizeof(SBC_LOAD));
|
||||
c.retry = 1;
|
||||
|
||||
/* 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->timeout = Libburn_mmc_load_timeouT;
|
||||
d->issue_command(d, c);
|
||||
if (c->error)
|
||||
c.dir = NO_TRANSFER;
|
||||
d->issue_command(d, &c);
|
||||
if (c.error)
|
||||
return;
|
||||
/* ts A70923 : Needed regardless of Immed bit. Was once 1 minute, now
|
||||
5 minutes for loading. If this does not suffice then other commands
|
||||
@ -79,21 +74,20 @@ void sbc_load(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)
|
||||
return;
|
||||
|
||||
scsi_init_command(c, SBC_UNLOAD, sizeof(SBC_UNLOAD));
|
||||
/* c->opcode[1] |= 1; / * ts A70918 : Immed , ts B00109 : revoked */
|
||||
c->page = NULL;
|
||||
c->dir = NO_TRANSFER;
|
||||
d->issue_command(d, c);
|
||||
scsi_init_command(&c, SBC_UNLOAD, sizeof(SBC_UNLOAD));
|
||||
/* c.opcode[1] |= 1; / * ts A70918 : Immed , ts B00109 : revoked */
|
||||
c.page = NULL;
|
||||
c.dir = NO_TRANSFER;
|
||||
d->issue_command(d, &c);
|
||||
/* ts A70918 : Wait long. A late eject could surprise or hurt user.
|
||||
ts B00109 : Asynchronous eject revoked, as one cannot reliably
|
||||
distinguish out from unready.
|
||||
if (c->error)
|
||||
if (c.error)
|
||||
return;
|
||||
spc_wait_unit_attention(d, 1800, "STOP UNIT (+ EJECT)", 0);
|
||||
*/
|
||||
@ -105,19 +99,18 @@ void sbc_eject(struct burn_drive *d)
|
||||
*/
|
||||
int sbc_start_unit_flag(struct burn_drive *d, int flag)
|
||||
{
|
||||
struct command *c;
|
||||
struct command c;
|
||||
int ret;
|
||||
|
||||
c = &(d->casual_command);
|
||||
if (mmc_function_spy(d, "start_unit") <= 0)
|
||||
return 0;
|
||||
|
||||
scsi_init_command(c, SBC_START_UNIT, sizeof(SBC_START_UNIT));
|
||||
c->retry = 1;
|
||||
c->opcode[1] |= (flag & 1); /* ts A70918 : Immed */
|
||||
c->dir = NO_TRANSFER;
|
||||
d->issue_command(d, c);
|
||||
if (c->error)
|
||||
scsi_init_command(&c, SBC_START_UNIT, sizeof(SBC_START_UNIT));
|
||||
c.retry = 1;
|
||||
c.opcode[1] |= (flag & 1); /* ts A70918 : Immed */
|
||||
c.dir = NO_TRANSFER;
|
||||
d->issue_command(d, &c);
|
||||
if (c.error)
|
||||
return 0;
|
||||
if (!(flag & 1))
|
||||
return 1;
|
||||
@ -148,19 +141,18 @@ int sbc_start_unit(struct burn_drive *d)
|
||||
/* ts A90824 : Trying to reduce drive noise */
|
||||
int sbc_stop_unit(struct burn_drive *d)
|
||||
{
|
||||
struct command *c;
|
||||
struct command c;
|
||||
int ret;
|
||||
|
||||
c = &(d->casual_command);
|
||||
if (mmc_function_spy(d, "stop_unit") <= 0)
|
||||
return 0;
|
||||
|
||||
scsi_init_command(c, SBC_STOP_UNIT, sizeof(SBC_STOP_UNIT));
|
||||
c->retry = 0;
|
||||
c->opcode[1] |= 1; /* Immed */
|
||||
c->dir = NO_TRANSFER;
|
||||
d->issue_command(d, c);
|
||||
if (c->error)
|
||||
scsi_init_command(&c, SBC_STOP_UNIT, sizeof(SBC_STOP_UNIT));
|
||||
c.retry = 0;
|
||||
c.opcode[1] |= 1; /* Immed */
|
||||
c.dir = NO_TRANSFER;
|
||||
d->issue_command(d, &c);
|
||||
if (c.error)
|
||||
return 0;
|
||||
ret = spc_wait_unit_attention(d, 1800, "STOP UNIT", 0);
|
||||
d->is_stopped = 1;
|
||||
|
@ -1,13 +1,10 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
@ -179,27 +176,10 @@ static void get_bytes(struct burn_track *track, int count, unsigned char *data)
|
||||
if (!shortage)
|
||||
goto ex;
|
||||
|
||||
/* ts A61031 - B10103 */
|
||||
/* ts A61031 */
|
||||
if (shortage >= count)
|
||||
track->track_data_done = 1;
|
||||
if (track->end_on_premature_eoi && shortage >= count &&
|
||||
!track->open_ended) {
|
||||
char msg[80];
|
||||
off_t missing, inp_block_size, track_blocks;
|
||||
|
||||
inp_block_size = burn_sector_length(track->mode);
|
||||
track_blocks = burn_track_get_sectors_2(track, 1);
|
||||
missing = track_blocks * inp_block_size - track->sourcecount;
|
||||
sprintf(msg,
|
||||
"Premature end of input encountered. Missing: %.f bytes",
|
||||
(double) missing);
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00020180,
|
||||
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0,0);
|
||||
/* Memorize that premature end of input happened */
|
||||
track->end_on_premature_eoi = 2;
|
||||
}
|
||||
if (track->open_ended || track->end_on_premature_eoi)
|
||||
if (track->open_ended)
|
||||
goto ex;
|
||||
|
||||
/* If we're still short, and there's a "next" pointer, we pull from that.
|
||||
@ -228,43 +208,6 @@ ex:;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* ts B20113 : outsourced from get_sector() */
|
||||
int sector_write_buffer(struct burn_drive *d,
|
||||
struct burn_track *track, int flag)
|
||||
{
|
||||
int err, i;
|
||||
struct buffer *out;
|
||||
|
||||
out = d->buffer;
|
||||
if (out->sectors <= 0)
|
||||
return 2;
|
||||
err = d->write(d, d->nwa, out);
|
||||
if (err == BE_CANCELLED)
|
||||
return 0;
|
||||
|
||||
/* ts A61101 */
|
||||
if(track != NULL) {
|
||||
track->writecount += out->bytes;
|
||||
track->written_sectors += out->sectors;
|
||||
|
||||
/* Determine current index */
|
||||
for (i = d->progress.index; i + 1 < track->indices; i++) {
|
||||
if (track->index[i + 1] > d->nwa + out->sectors)
|
||||
break;
|
||||
d->progress.index = i + 1;
|
||||
}
|
||||
}
|
||||
/* ts A61119 */
|
||||
d->progress.buffered_bytes += out->bytes;
|
||||
|
||||
d->nwa += out->sectors;
|
||||
out->bytes = 0;
|
||||
out->sectors = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* ts A61009 : seems to hand out sector start pointer in opts->drive->buffer
|
||||
and to count hand outs as well as reserved bytes */
|
||||
/* ts A61101 : added parameter track for counting written bytes */
|
||||
@ -273,7 +216,7 @@ static unsigned char *get_sector(struct burn_write_opts *opts,
|
||||
{
|
||||
struct burn_drive *d = opts->drive;
|
||||
struct buffer *out = d->buffer;
|
||||
int outmode, seclen, write_ret;
|
||||
int outmode, seclen;
|
||||
unsigned char *ret;
|
||||
|
||||
outmode = get_outmode(opts);
|
||||
@ -292,9 +235,22 @@ static unsigned char *get_sector(struct burn_write_opts *opts,
|
||||
/* (there is enough buffer size reserve for track->cdxa_conversion) */
|
||||
if (out->bytes + seclen > BUFFER_SIZE ||
|
||||
(opts->obs > 0 && out->bytes + seclen > opts->obs)) {
|
||||
write_ret = sector_write_buffer(d, track, 0);
|
||||
if (write_ret <= 0)
|
||||
int err;
|
||||
err = d->write(d, d->nwa, out);
|
||||
if (err == BE_CANCELLED)
|
||||
return NULL;
|
||||
|
||||
/* ts A61101 */
|
||||
if(track != NULL) {
|
||||
track->writecount += out->bytes;
|
||||
track->written_sectors += out->sectors;
|
||||
}
|
||||
/* ts A61119 */
|
||||
d->progress.buffered_bytes += out->bytes;
|
||||
|
||||
d->nwa += out->sectors;
|
||||
out->bytes = 0;
|
||||
out->sectors = 0;
|
||||
}
|
||||
ret = out->data + out->bytes;
|
||||
out->bytes += seclen;
|
||||
@ -729,7 +685,7 @@ int sector_data(struct burn_write_opts *o, struct burn_track *t, int psub)
|
||||
return 0;
|
||||
|
||||
/* 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);
|
||||
return 2;
|
||||
}
|
||||
|
@ -24,10 +24,6 @@ int sector_postgap(struct burn_write_opts *, unsigned char tno,
|
||||
int sector_lout(struct burn_write_opts *, unsigned char control, int mode);
|
||||
int sector_data(struct burn_write_opts *, struct burn_track *t, int psub);
|
||||
|
||||
/* ts B20113 */
|
||||
int sector_write_buffer(struct burn_drive *d,
|
||||
struct burn_track *track, int flag);
|
||||
|
||||
/* ts A61009 */
|
||||
int sector_headers_is_ok(struct burn_write_opts *o, int mode);
|
||||
|
||||
|
@ -1,14 +1,10 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@ -44,7 +40,6 @@ Present implementation: default dummy which enables libburn only to work
|
||||
#include "debug.h"
|
||||
#include "toc.h"
|
||||
#include "util.h"
|
||||
#include "init.h"
|
||||
|
||||
#include "libdax_msgs.h"
|
||||
extern struct libdax_msgs *libdax_messenger;
|
||||
@ -252,13 +247,12 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
struct statvfs vfsbuf;
|
||||
#endif
|
||||
|
||||
char *testpath = NULL, *cpt;
|
||||
char testpath[4096], *cpt;
|
||||
long blocks;
|
||||
off_t add_size = 0;
|
||||
int ret;
|
||||
|
||||
BURN_ALLOC_MEM(testpath, char, 4096);
|
||||
|
||||
testpath[0] = 0;
|
||||
blocks = *bytes / 512;
|
||||
if (stat(path, &stbuf) == -1) {
|
||||
strcpy(testpath, path);
|
||||
cpt = strrchr(testpath, '/');
|
||||
@ -269,21 +263,18 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
else
|
||||
*cpt = 0;
|
||||
if (stat(testpath, &stbuf) == -1)
|
||||
{ret = -1; goto ex;}
|
||||
return -1;
|
||||
|
||||
#ifdef Libburn_if_this_was_linuX
|
||||
|
||||
} else if(S_ISBLK(stbuf.st_mode)) {
|
||||
long blocks;
|
||||
|
||||
blocks = *bytes / 512;
|
||||
fd = open(path, open_mode);
|
||||
if (fd == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
ret = ioctl(fd, BLKGETSIZE, &blocks);
|
||||
close(fd);
|
||||
if (ret == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
*bytes = ((off_t) blocks) * (off_t) 512;
|
||||
|
||||
#endif /* Libburn_if_this_was_linuX */
|
||||
@ -292,28 +283,25 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
add_size = stbuf.st_blocks * (off_t) 512;
|
||||
strcpy(testpath, path);
|
||||
} else
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
|
||||
if (testpath[0]) {
|
||||
|
||||
#ifdef Libburn_os_has_statvfS
|
||||
|
||||
if (statvfs(testpath, &vfsbuf) == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
*bytes = add_size + ((off_t) vfsbuf.f_frsize) *
|
||||
(off_t) vfsbuf.f_bavail;
|
||||
|
||||
#else /* Libburn_os_has_statvfS */
|
||||
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
|
||||
#endif /* ! Libburn_os_has_stavtfS */
|
||||
|
||||
}
|
||||
ret = 1;
|
||||
ex:;
|
||||
BURN_FREE_MEM(testpath);
|
||||
return ret;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,14 +1,11 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
|
||||
/* THIS CODE IS NOT FUNCTIONAL YET !!! */
|
||||
|
||||
|
||||
/*
|
||||
|
||||
This is the main operating system dependent SCSI part of libburn. It implements
|
||||
@ -98,10 +95,6 @@ Send feedback to libburn-hackers@pykix.org .
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
|
||||
/** PORTING : ------- OS dependent headers and definitions ------ */
|
||||
|
||||
@ -163,7 +156,7 @@ static int sg_init_enumerator(burn_drive_enumerator_t *idx)
|
||||
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.target_id = CAM_TARGET_WILDCARD;
|
||||
@ -172,10 +165,9 @@ static int sg_init_enumerator(burn_drive_enumerator_t *idx)
|
||||
idx->ccb.ccb_h.func_code = XPT_DEV_MATCH;
|
||||
idx->bufsize = sizeof(struct dev_match_result) * 100;
|
||||
idx->ccb.cdm.match_buf_len = idx->bufsize;
|
||||
idx->ccb.cdm.matches = (struct dev_match_result *)
|
||||
calloc(1, idx->bufsize);
|
||||
idx->ccb.cdm.matches = (struct dev_match_result *)malloc(idx->bufsize);
|
||||
if (idx->ccb.cdm.matches == NULL) {
|
||||
warnx("cannot allocate memory for matches");
|
||||
warnx("can't malloc memory for matches");
|
||||
close(idx->fd);
|
||||
return -1;
|
||||
}
|
||||
@ -493,8 +485,10 @@ int sg_grab(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;
|
||||
}
|
||||
sg_close_drive(d);
|
||||
return 0;
|
||||
}
|
||||
@ -548,6 +542,8 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
ccb->csio.cdb_len = c->oplen;
|
||||
memcpy(&ccb->csio.cdb_io.cdb_bytes, &c->opcode, c->oplen);
|
||||
|
||||
memset(&ccb->csio.sense_data, 0, sizeof (ccb->csio.sense_data));
|
||||
|
||||
if (c->page) {
|
||||
ccb->csio.data_ptr = c->page->data;
|
||||
if (c->dir == FROM_DRIVE) {
|
||||
@ -568,7 +564,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
}
|
||||
|
||||
do {
|
||||
memset(&ccb->csio.sense_data, 0, sizeof(ccb->csio.sense_data));
|
||||
err = cam_send_ccb(d->cam, ccb);
|
||||
if (err == -1) {
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
@ -720,12 +715,13 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
{
|
||||
struct stat stbuf;
|
||||
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;
|
||||
int fd, ret;
|
||||
|
||||
BURN_ALLOC_MEM(testpath, char, 4096);
|
||||
testpath[0] = 0;
|
||||
blocks = *bytes / 512;
|
||||
if (stat(path, &stbuf) == -1) {
|
||||
strcpy(testpath, path);
|
||||
cpt = strrchr(testpath, '/');
|
||||
@ -736,54 +732,38 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
else
|
||||
*cpt = 0;
|
||||
if (stat(testpath, &stbuf) == -1)
|
||||
{ret = -1; goto ex;}
|
||||
return -1;
|
||||
|
||||
#ifdef Libburn_if_this_was_linuX
|
||||
|
||||
} 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)
|
||||
open_mode |= O_EXCL;
|
||||
fd = open(path, open_mode);
|
||||
if (fd == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
ret = ioctl(fd, BLKGETSIZE, &blocks);
|
||||
close(fd);
|
||||
if (ret == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
*bytes = ((off_t) blocks) * (off_t) 512;
|
||||
|
||||
#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)) {
|
||||
add_size = stbuf.st_blocks * (off_t) 512;
|
||||
strcpy(testpath, path);
|
||||
} else
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
|
||||
if (testpath[0]) {
|
||||
if (statvfs(testpath, &vfsbuf) == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
*bytes = add_size + ((off_t) vfsbuf.f_frsize) *
|
||||
(off_t) vfsbuf.f_bavail;
|
||||
}
|
||||
ret = 1;
|
||||
ex:
|
||||
BURN_FREE_MEM(testpath);
|
||||
return ret;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,14 +1,10 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/*
|
||||
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later
|
||||
and under FreeBSD license revised, i.e. without advertising clause.
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
@ -34,18 +30,6 @@
|
||||
#include <sys/disk.h> /* DIOCGMEDIASIZE */
|
||||
|
||||
|
||||
/* ts B00326 : For use of CAM_PASS_ERR_RECOVER with ahci */
|
||||
#define Libburn_for_freebsd_ahcI yes
|
||||
|
||||
/* ts B00327 : for debugging of cam_send_cdb() failures
|
||||
# define Libburn_ahci_verbouS yes
|
||||
*/
|
||||
|
||||
/* ts B00327 : Apply CAM_PASS_ERR_RECOVER to drives even if not ahci
|
||||
# define libburn_ahci_style_for_alL yes
|
||||
*/
|
||||
|
||||
|
||||
#include "transport.h"
|
||||
#include "drive.h"
|
||||
#include "sg.h"
|
||||
@ -55,7 +39,6 @@
|
||||
#include "debug.h"
|
||||
#include "toc.h"
|
||||
#include "util.h"
|
||||
#include "init.h"
|
||||
|
||||
#include "libdax_msgs.h"
|
||||
extern struct libdax_msgs *libdax_messenger;
|
||||
@ -162,21 +145,21 @@ static int sg_init_enumerator(burn_drive_enumerator_t *idx_)
|
||||
struct burn_drive_enumeration_state *idx;
|
||||
int bufsize;
|
||||
|
||||
idx = calloc(1, sizeof(*idx));
|
||||
idx = malloc(sizeof(*idx));
|
||||
if (idx == NULL) {
|
||||
warnx("cannot allocate memory for enumerator");
|
||||
warnx("can't malloc memory for enumerator");
|
||||
return -1;
|
||||
}
|
||||
idx->skip_device = 0;
|
||||
|
||||
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);
|
||||
idx = NULL;
|
||||
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.target_id = CAM_TARGET_WILDCARD;
|
||||
@ -185,9 +168,9 @@ static int sg_init_enumerator(burn_drive_enumerator_t *idx_)
|
||||
idx->ccb.ccb_h.func_code = XPT_DEV_MATCH;
|
||||
bufsize = sizeof(struct dev_match_result) * 100;
|
||||
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) {
|
||||
warnx("cannot allocate memory for matches");
|
||||
warnx("can't malloc memory for matches");
|
||||
close(idx->fd);
|
||||
free(idx);
|
||||
return -1;
|
||||
@ -448,11 +431,10 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
||||
out.channel = channel_no;
|
||||
out.lun = lun_no;
|
||||
|
||||
out.devname = strdup(fname);
|
||||
out.devname = burn_strdup(fname);
|
||||
|
||||
out.cam = NULL;
|
||||
out.lock_fd = -1;
|
||||
out.is_ahci = 0;
|
||||
|
||||
out.start_lba= -2000000000;
|
||||
out.end_lba= -2000000000;
|
||||
@ -477,7 +459,7 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
||||
out.read_toc = mmc_read_toc;
|
||||
out.write = mmc_write;
|
||||
out.erase = mmc_erase;
|
||||
out.read_cd = mmc_read_cd;
|
||||
out.read_sectors = mmc_read_sectors;
|
||||
out.perform_opc = mmc_perform_opc;
|
||||
out.set_speed = mmc_set_speed;
|
||||
out.send_parameters = spc_select_error_params;
|
||||
@ -489,9 +471,9 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
||||
out.close_session = mmc_close_session;
|
||||
out.close_track_session = mmc_close;
|
||||
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.mdata = calloc(1, sizeof(struct scsi_mode_data));
|
||||
out.mdata = malloc(sizeof(struct scsi_mode_data));
|
||||
out.mdata->valid = 0;
|
||||
if (out.idata == NULL || out.mdata == NULL) {
|
||||
libdax_msgs_submit(libdax_messenger, -1, 0x00020108,
|
||||
@ -508,9 +490,12 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
||||
|
||||
/* try to get the drive info */
|
||||
if (t->grab(t)) {
|
||||
burn_print(2, "getting drive info\n");
|
||||
t->getcaps(t);
|
||||
t->unlock(t);
|
||||
t->released = 1;
|
||||
} else {
|
||||
burn_print(2, "unable to grab new located drive\n");
|
||||
}
|
||||
|
||||
/* ts A60821
|
||||
@ -542,7 +527,6 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
||||
/* Adapter specific handles and data */
|
||||
out.cam = NULL;
|
||||
out.lock_fd = -1;
|
||||
out.is_ahci = 0;
|
||||
|
||||
/* Adapter specific functions */
|
||||
out.grab = sg_grab;
|
||||
@ -672,9 +656,8 @@ static int freebsd_dev_lock(int dev_fd, char *devname,
|
||||
static int sg_lock(struct burn_drive *d, int flag)
|
||||
{
|
||||
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,
|
||||
&os_errno, &pass_dev_no, &flock_fd, msg, 0);
|
||||
if (ret <= 0) {
|
||||
@ -683,22 +666,18 @@ static int sg_lock(struct burn_drive *d, int flag)
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, os_errno, 0);
|
||||
sg_close_drive(d);
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
if (d->lock_fd > 0)
|
||||
close(d->lock_fd);
|
||||
d->lock_fd = flock_fd;
|
||||
ret = 1;
|
||||
ex:;
|
||||
BURN_FREE_MEM(msg);
|
||||
return ret;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int sg_grab(struct burn_drive *d)
|
||||
{
|
||||
struct cam_device *cam;
|
||||
char path_string[80];
|
||||
|
||||
if (mmc_function_spy(d, "sg_grab") <= 0)
|
||||
return 0;
|
||||
@ -721,18 +700,6 @@ int sg_grab(struct burn_drive *d)
|
||||
if (sg_lock(d, 0) <= 0)
|
||||
return 0;
|
||||
fcntl(cam->fd, F_SETOWN, getpid());
|
||||
|
||||
cam_path_string(d->cam, path_string, sizeof(path_string));
|
||||
|
||||
#ifdef Libburn_ahci_verbouS
|
||||
fprintf(stderr, "libburn_EXPERIMENTAL: CAM path = %s\n", path_string);
|
||||
#endif
|
||||
|
||||
if (strstr(path_string, ":ahcich") != NULL)
|
||||
d->is_ahci = 1;
|
||||
else
|
||||
d->is_ahci = -1;
|
||||
|
||||
d->released = 0;
|
||||
return 1;
|
||||
}
|
||||
@ -748,8 +715,10 @@ int sg_release(struct burn_drive *d)
|
||||
if (mmc_function_spy(d, "sg_release") <= 0)
|
||||
return 0;
|
||||
|
||||
if (d->cam == NULL)
|
||||
if (d->cam == NULL) {
|
||||
burn_print(1, "release an ungrabbed drive. die\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
mmc_function_spy(NULL, "sg_release ----------- closing.");
|
||||
|
||||
@ -760,19 +729,19 @@ int sg_release(struct burn_drive *d)
|
||||
|
||||
int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
{
|
||||
int done = 0, err, sense_len = 0, ret, ignore_error, i;
|
||||
int cam_pass_err_recover = 0, key, asc, ascq, timeout_ms;
|
||||
int done = 0, err, sense_len, ret;
|
||||
union ccb *ccb;
|
||||
char buf[161];
|
||||
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);
|
||||
|
||||
c->error = 0;
|
||||
memset(c->sense, 0, sizeof(c->sense));
|
||||
|
||||
if (d->cam == NULL)
|
||||
if (d->cam == NULL) {
|
||||
c->error = 0;
|
||||
return 0;
|
||||
}
|
||||
if (burn_sg_log_scsi & 1) {
|
||||
if (fp == NULL) {
|
||||
fp= fopen("/tmp/libburn_sg_command_log", "a");
|
||||
@ -784,10 +753,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
scsi_log_cmd(c,fp,0);
|
||||
|
||||
c->error = 0;
|
||||
if (c->timeout > 0)
|
||||
timeout_ms = c->timeout;
|
||||
else
|
||||
timeout_ms = 200000;
|
||||
|
||||
ccb = cam_getccb(d->cam);
|
||||
cam_fill_csio(&ccb->csio,
|
||||
@ -799,7 +764,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
0, /* dxfer_len */
|
||||
sizeof (ccb->csio.sense_data), /* sense_len */
|
||||
0, /* cdb_len */
|
||||
timeout_ms); /* timeout */
|
||||
30*1000); /* timeout */
|
||||
switch (c->dir) {
|
||||
case TO_DRIVE:
|
||||
ccb->csio.ccb_h.flags |= CAM_DIR_OUT;
|
||||
@ -812,26 +777,11 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef Libburn_for_freebsd_ahcI
|
||||
/* ts B00325 : Advise by Alexander Motin */
|
||||
/* Runs well on 8-STABLE (23 Mar 2003)
|
||||
But on 8-RELEASE cam_send_ccb() returns non-zero with errno 6
|
||||
on eject. Long lasting TEST UNIT READY cycles break with
|
||||
errno 16.
|
||||
*/
|
||||
#ifdef Libburn_ahci_style_for_alL
|
||||
{
|
||||
#else
|
||||
if (d->is_ahci > 0) {
|
||||
#endif
|
||||
ccb->ccb_h.flags |= CAM_PASS_ERR_RECOVER;
|
||||
cam_pass_err_recover = 1;
|
||||
}
|
||||
#endif /* Libburn_for_freebsd_ahcI */
|
||||
|
||||
ccb->csio.cdb_len = c->oplen;
|
||||
memcpy(&ccb->csio.cdb_io.cdb_bytes, &c->opcode, c->oplen);
|
||||
|
||||
memset(&ccb->csio.sense_data, 0, sizeof (ccb->csio.sense_data));
|
||||
|
||||
if (c->page) {
|
||||
ccb->csio.data_ptr = c->page->data;
|
||||
if (c->dir == FROM_DRIVE) {
|
||||
@ -856,82 +806,9 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
ccb->csio.dxfer_len = 0;
|
||||
}
|
||||
|
||||
start_time = time(NULL);
|
||||
for (i = 0; !done; i++) {
|
||||
|
||||
memset(&ccb->csio.sense_data, 0, sizeof(ccb->csio.sense_data));
|
||||
memset(c->sense, 0, sizeof(c->sense));
|
||||
do {
|
||||
err = cam_send_ccb(d->cam, ccb);
|
||||
|
||||
ignore_error = sense_len = 0;
|
||||
/* ts B00325 : CAM_AUTOSNS_VALID advised by Alexander Motin */
|
||||
if (ccb->ccb_h.status & CAM_AUTOSNS_VALID) {
|
||||
/* ts B00110 */
|
||||
/* Better curb sense_len */
|
||||
sense_len = ccb->csio.sense_len;
|
||||
if (sense_len > (int) sizeof(c->sense))
|
||||
sense_len = sizeof(c->sense);
|
||||
memcpy(c->sense, &ccb->csio.sense_data, sense_len);
|
||||
spc_decode_sense(c->sense, sense_len,
|
||||
&key, &asc, &ascq);
|
||||
if (sense_len >= 14 && cam_pass_err_recover && key)
|
||||
ignore_error = 1;
|
||||
}
|
||||
|
||||
if (err == -1 && cam_pass_err_recover && ! ignore_error) {
|
||||
|
||||
#ifdef Libburn_ahci_verbouS
|
||||
fprintf(stderr, "libburn_EXPERIMENTAL: errno = %d . cam_errbuf = '%s'\n", errno, cam_errbuf);
|
||||
#endif
|
||||
|
||||
if (errno == ENXIO && c->opcode[0] != 0) {
|
||||
/* Operations on empty or ejected tray */
|
||||
/* MEDIUM NOT PRESENT */
|
||||
|
||||
#ifdef Libburn_ahci_verbouS
|
||||
fprintf(stderr, "libburn_EXPERIMENTAL: Emulating [2,3A,00] MEDIUM NOT PRESENT\n");
|
||||
#endif
|
||||
|
||||
c->sense[0] = 0x70; /*Fixed format sense data*/
|
||||
c->sense[2] = 0x02;
|
||||
c->sense[12] = 0x3A;
|
||||
c->sense[13] = 0x00;
|
||||
sense_len = 14;
|
||||
ignore_error = 1;
|
||||
} else if (c->opcode[0] == 0 &&
|
||||
(errno == EBUSY || errno == ENXIO)) {
|
||||
/* Timeout of TEST UNIT READY loop */
|
||||
/* Inquiries while tray is being loaded */
|
||||
/*LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE*/
|
||||
|
||||
#ifdef Libburn_ahci_verbouS
|
||||
fprintf(stderr, "libburn_EXPERIMENTAL: Emulating [2,04,00] LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE\n");
|
||||
#endif
|
||||
|
||||
c->sense[0] = 0x70; /*Fixed format sense data*/
|
||||
c->sense[2] = 0x02;
|
||||
c->sense[12] = 0x04;
|
||||
c->sense[13] = 0x00;
|
||||
sense_len = 14;
|
||||
ignore_error = 1;
|
||||
} else if (errno == EINVAL) {
|
||||
/* Inappropriate MODE SENSE */
|
||||
/* INVALID FIELD IN CDB */
|
||||
|
||||
#ifdef Libburn_ahci_verbouS
|
||||
fprintf(stderr, "libburn_EXPERIMENTAL: Emulating [5,24,00] INVALID FIELD IN CDB\n");
|
||||
#endif
|
||||
|
||||
c->sense[0] = 0x70; /*Fixed format sense data*/
|
||||
c->sense[2] = 0x05;
|
||||
c->sense[12] = 0x24;
|
||||
c->sense[13] = 0x00;
|
||||
sense_len = 14;
|
||||
ignore_error = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (err == -1 && !ignore_error) {
|
||||
if (err == -1) {
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index, 0x0002010c,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
@ -945,36 +822,39 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
}
|
||||
/* XXX */
|
||||
|
||||
/* ts B00110 */
|
||||
/* Better curb sense_len */
|
||||
sense_len = ccb->csio.sense_len;
|
||||
if (sense_len > sizeof(c->sense))
|
||||
sense_len = sizeof(c->sense);
|
||||
memcpy(c->sense, &ccb->csio.sense_data, ccb->csio.sense_len);
|
||||
if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
|
||||
if (sense_len < 14) {
|
||||
/*LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE*/
|
||||
|
||||
#ifdef Libburn_ahci_verbouS
|
||||
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
|
||||
|
||||
c->sense[0] = 0x70; /*Fixed format sense data*/
|
||||
c->sense[2] = 0x02;
|
||||
c->sense[12] = 0x04;
|
||||
c->sense[13] = 0x00;
|
||||
done = 1;
|
||||
if (!c->retry) {
|
||||
c->error = 1;
|
||||
{ret = 1; goto ex;}
|
||||
}
|
||||
|
||||
/* >>> 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);
|
||||
if (d->cancel)
|
||||
switch (scsi_error(d, c->sense, 0)) {
|
||||
case RETRY:
|
||||
done = 0;
|
||||
break;
|
||||
case FAIL:
|
||||
done = 1;
|
||||
c->error = 1;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
done = 1;
|
||||
}
|
||||
} while (!done);
|
||||
ret = 1;
|
||||
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);
|
||||
return ret;
|
||||
}
|
||||
@ -987,13 +867,8 @@ ex:;
|
||||
int burn_os_is_2k_seekrw(char *path, int flag)
|
||||
{
|
||||
struct stat stbuf;
|
||||
#ifdef Libburn_DIOCGMEDIASIZE_ISBLK
|
||||
int fd, ret;
|
||||
off_t add_size;
|
||||
#else
|
||||
char *spt;
|
||||
int i, e;
|
||||
#endif /* ! Libburn_DIOCGMEDIASIZE_ISBLK */
|
||||
|
||||
if (stat(path, &stbuf) == -1)
|
||||
return 0;
|
||||
@ -1001,22 +876,6 @@ int burn_os_is_2k_seekrw(char *path, int flag)
|
||||
return 1;
|
||||
if (!S_ISCHR(stbuf.st_mode))
|
||||
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, '/');
|
||||
if (spt == NULL)
|
||||
spt = path;
|
||||
@ -1039,9 +898,6 @@ int burn_os_is_2k_seekrw(char *path, int flag)
|
||||
if (strncmp(spt, "fla", e) == 0) /* Flash drive */
|
||||
return 1;
|
||||
return 0;
|
||||
|
||||
#endif /* ! Libburn_DIOCGMEDIASIZE_ISBLK */
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -1059,12 +915,13 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
{
|
||||
struct stat stbuf;
|
||||
struct statvfs vfsbuf;
|
||||
char *testpath = NULL, *cpt;
|
||||
char testpath[4096], *cpt;
|
||||
long blocks;
|
||||
off_t add_size = 0;
|
||||
int fd, ret;
|
||||
|
||||
BURN_ALLOC_MEM(testpath, char, 4096);
|
||||
testpath[0] = 0;
|
||||
blocks = *bytes / 512;
|
||||
if (stat(path, &stbuf) == -1) {
|
||||
strcpy(testpath, path);
|
||||
cpt = strrchr(testpath, '/');
|
||||
@ -1075,24 +932,22 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
else
|
||||
*cpt = 0;
|
||||
if (stat(testpath, &stbuf) == -1)
|
||||
{ret = -1; goto ex;}
|
||||
return -1;
|
||||
|
||||
#ifdef Libburn_if_this_was_linuX
|
||||
|
||||
} 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)
|
||||
open_mode |= O_EXCL;
|
||||
fd = open(path, open_mode);
|
||||
if (fd == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
ret = ioctl(fd, BLKGETSIZE, &blocks);
|
||||
close(fd);
|
||||
if (ret == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
*bytes = ((off_t) blocks) * (off_t) 512;
|
||||
|
||||
#endif /* Libburn_if_this_was_linuX */
|
||||
@ -1101,28 +956,25 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
} else if(S_ISCHR(stbuf.st_mode)) {
|
||||
fd = open(path, O_RDONLY);
|
||||
if (fd == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
ret = ioctl(fd, DIOCGMEDIASIZE, &add_size);
|
||||
close(fd);
|
||||
if (ret == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
*bytes = add_size;
|
||||
} else if(S_ISREG(stbuf.st_mode)) {
|
||||
add_size = stbuf.st_blocks * (off_t) 512;
|
||||
strcpy(testpath, path);
|
||||
} else
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
|
||||
if (testpath[0]) {
|
||||
if (statvfs(testpath, &vfsbuf) == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
*bytes = add_size + ((off_t) vfsbuf.f_frsize) *
|
||||
(off_t) vfsbuf.f_bavail;
|
||||
}
|
||||
ret = 1;
|
||||
ex:
|
||||
BURN_FREE_MEM(testpath);
|
||||
return ret;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
@ -94,10 +94,6 @@ Send feedback to libburn-hackers@pykix.org .
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
|
||||
/** PORTING : ------- OS dependent headers and definitions ------ */
|
||||
|
||||
@ -135,16 +131,6 @@ Send feedback to libburn-hackers@pykix.org .
|
||||
|
||||
#define Libburn_guess_freebsd_atapi_devicE 1
|
||||
|
||||
#ifdef sun
|
||||
#define Libburn_is_on_solariS 1
|
||||
#endif
|
||||
#ifdef __sun
|
||||
#define Libburn_is_on_solariS 1
|
||||
#endif
|
||||
|
||||
/* Proposal by Rocky Bernstein to avoid macro clashes with cdio_config.h */
|
||||
#define __CDIO_CONFIG_H__ 1
|
||||
|
||||
#include <cdio/cdio.h>
|
||||
#include <cdio/logging.h>
|
||||
#include <cdio/mmc.h>
|
||||
@ -171,7 +157,6 @@ Send feedback to libburn-hackers@pykix.org .
|
||||
#include "debug.h"
|
||||
#include "toc.h"
|
||||
#include "util.h"
|
||||
#include "init.h"
|
||||
|
||||
#include "libdax_msgs.h"
|
||||
extern struct libdax_msgs *libdax_messenger;
|
||||
@ -240,9 +225,8 @@ static int sg_give_next_adr_raw(burn_drive_enumerator_t *idx,
|
||||
}
|
||||
|
||||
} else if (initialize == -1) {
|
||||
if (idx->ppsz_cd_drives != NULL)
|
||||
if (*(idx->ppsz_cd_drives) != NULL)
|
||||
cdio_free_device_list(idx->ppsz_cd_drives);
|
||||
if (*(idx->ppsz_cd_drives) != NULL)
|
||||
cdio_free_device_list(idx->ppsz_cd_drives);
|
||||
idx->ppsz_cd_drives = NULL;
|
||||
}
|
||||
|
||||
@ -262,7 +246,7 @@ try_next:;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((ssize_t) strlen(*(idx->pos)) >= adr_size)
|
||||
if (strlen(*(idx->pos)) >= adr_size)
|
||||
return -1;
|
||||
strcpy(adr, *(idx->pos));
|
||||
(idx->pos)++;
|
||||
@ -433,35 +417,17 @@ int sg_dispose_drive(struct burn_drive *d, int flag)
|
||||
int sg_give_next_adr(burn_drive_enumerator_t *idx,
|
||||
char adr[], int adr_size, int initialize)
|
||||
{
|
||||
int ret, recursion_count = 0, path_size = 4096;
|
||||
char *path = NULL;
|
||||
#ifdef Libburn_is_on_solariS
|
||||
int l;
|
||||
#endif
|
||||
BURN_ALLOC_MEM(path, char, path_size);
|
||||
int ret, recursion_count = 0;
|
||||
char path[4096];
|
||||
|
||||
ret = sg_give_next_adr_raw(idx, adr, adr_size, initialize);
|
||||
if (ret <= 0)
|
||||
goto ex;
|
||||
if ((ssize_t) strlen(adr) >= path_size)
|
||||
goto ex;
|
||||
|
||||
#ifdef Libburn_is_on_solariS
|
||||
/* >>> provisory : preserve Solaris /dev/rdsk/cXtYdZs2 addresses */
|
||||
l = strlen(adr);
|
||||
if (l >= 18)
|
||||
if (strncmp(adr, "/dev/rdsk/c", 11) == 0 && adr[11] >= '0' &&
|
||||
adr[11] <= '9' && strcmp(adr + (l - 2), "s2") == 0)
|
||||
{ret = 1; goto ex;}
|
||||
#endif /* Libburn_is_on_solariS */
|
||||
|
||||
ret = burn_drive_resolve_link(adr, path, &recursion_count, 2);
|
||||
if(ret > 0 && (ssize_t) strlen(path) < adr_size)
|
||||
strcpy(adr, path);
|
||||
ret = (ret >= 0);
|
||||
ex:
|
||||
BURN_FREE_MEM(path);
|
||||
return ret;
|
||||
return ret;
|
||||
if (strlen(adr) >= sizeof(path))
|
||||
return ret;
|
||||
strcpy(path, adr);
|
||||
ret = burn_drive_resolve_link(path, adr, &recursion_count, 2);
|
||||
return (ret >= 0);
|
||||
}
|
||||
|
||||
|
||||
@ -473,36 +439,14 @@ int scsi_enumerate_drives(void)
|
||||
burn_drive_enumerator_t idx;
|
||||
int initialize = 1, ret, i_bus_no = -1, recursion_count = 0;
|
||||
int i_host_no = -1, i_channel_no = -1, i_target_no = -1, i_lun_no = -1;
|
||||
int buf_size = 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);
|
||||
char buf[4096], target[4096];
|
||||
|
||||
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;
|
||||
if (ret <= 0)
|
||||
break;
|
||||
ret = 1;
|
||||
|
||||
#ifdef Libburn_is_on_solariS
|
||||
/* >>> provisory : preserve Solaris /dev/rdsk/cXtYdZs2 */
|
||||
l = strlen(buf);
|
||||
if (l >= 18)
|
||||
if (strncmp(buf, "/dev/rdsk/c", 11) == 0 &&
|
||||
buf[11] >= '0' && buf[11] <= '9' &&
|
||||
strcmp(buf + (l - 2), "s2") == 0)
|
||||
ret = 0;
|
||||
#endif /* Libburn_is_on_solariS */
|
||||
|
||||
if (ret == 1) {
|
||||
ret = burn_drive_resolve_link(buf, target,
|
||||
&recursion_count,2);
|
||||
}
|
||||
ret = burn_drive_resolve_link(buf, target, &recursion_count,2);
|
||||
if (ret <= 0)
|
||||
strcpy(target, buf);
|
||||
if (burn_drive_is_banned(target))
|
||||
@ -513,12 +457,8 @@ int scsi_enumerate_drives(void)
|
||||
i_bus_no, i_host_no, i_channel_no,
|
||||
i_target_no, i_lun_no);
|
||||
}
|
||||
sg_give_next_adr(&idx, buf, buf_size, -1);
|
||||
ret = 1;
|
||||
ex:;
|
||||
BURN_FREE_MEM(buf);
|
||||
BURN_FREE_MEM(target);
|
||||
return ret;
|
||||
sg_give_next_adr(&idx, buf, sizeof(buf), -1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@ -542,12 +482,12 @@ int sg_drive_is_open(struct burn_drive * d)
|
||||
int sg_grab(struct burn_drive *d)
|
||||
{
|
||||
CdIo_t *p_cdio;
|
||||
char *am_eff, *msg = NULL, *am_wanted;
|
||||
int os_errno, second_try = 0, ret;
|
||||
char *am_eff, msg[4096], *am_wanted;
|
||||
int os_errno, second_try = 0;
|
||||
|
||||
if (d->p_cdio != NULL) {
|
||||
d->released = 0;
|
||||
{ret = 1; goto ex;}
|
||||
return 1;
|
||||
}
|
||||
if (d->libcdio_name[0] == 0) /* just to be sure it is initialized */
|
||||
strcpy(d->libcdio_name, d->devname);
|
||||
@ -555,14 +495,13 @@ int sg_grab(struct burn_drive *d)
|
||||
try_to_open:;
|
||||
p_cdio = cdio_open_am(d->libcdio_name, DRIVER_DEVICE, am_wanted);
|
||||
if (p_cdio == NULL) {
|
||||
BURN_ALLOC_MEM(msg, char, 4096);
|
||||
os_errno = errno;
|
||||
sprintf(msg, "Could not grab drive '%s'", d->devname);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x00020003,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, os_errno, 0);
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
am_eff = (char *) cdio_get_arg(p_cdio, "access-mode");
|
||||
if (strncmp(am_eff, "MMC_RDWR", 8) != 0) {
|
||||
@ -577,15 +516,12 @@ try_to_open:;
|
||||
0x00020003,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"libcdio provides no MMC_RDWR access mode", 0, 0);
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
}
|
||||
|
||||
d->p_cdio = p_cdio;
|
||||
d->released = 0;
|
||||
ret = 1;
|
||||
ex:;
|
||||
BURN_FREE_MEM(msg);
|
||||
return ret;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@ -597,8 +533,10 @@ ex:;
|
||||
*/
|
||||
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;
|
||||
}
|
||||
sg_close_drive(d);
|
||||
return 0;
|
||||
}
|
||||
@ -615,8 +553,7 @@ int sg_release(struct burn_drive *d)
|
||||
*/
|
||||
int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
{
|
||||
int sense_valid = 0, i, timeout_ms, sense_len;
|
||||
int key = 0, asc = 0, ascq = 0, done = 0;
|
||||
int sense_valid = 0, i, usleep_time, timeout_ms;
|
||||
time_t start_time;
|
||||
driver_return_code_t i_status;
|
||||
unsigned int dxfer_len;
|
||||
@ -624,24 +561,22 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
mmc_cdb_t cdb = {{0, }};
|
||||
cdio_mmc_direction_t e_direction;
|
||||
CdIo_t *p_cdio;
|
||||
cdio_mmc_request_sense_t *sense_pt = NULL;
|
||||
unsigned char *sense_pt = NULL;
|
||||
|
||||
c->error = 0;
|
||||
memset(c->sense, 0, sizeof(c->sense));
|
||||
|
||||
if (d->p_cdio == NULL) {
|
||||
return 0;
|
||||
}
|
||||
p_cdio = (CdIo_t *) d->p_cdio;
|
||||
if (burn_sg_log_scsi & 1) {
|
||||
if (fp == NULL) {
|
||||
fp= fopen("/tmp/libburn_sg_command_log", "a");
|
||||
fprintf(fp,
|
||||
"\n-----------------------------------------\n");
|
||||
}
|
||||
}
|
||||
if (burn_sg_log_scsi & 3)
|
||||
scsi_log_cmd(c,fp,0);
|
||||
if (burn_sg_log_scsi & 1) {
|
||||
if (fp == NULL) {
|
||||
fp= fopen("/tmp/libburn_sg_command_log", "a");
|
||||
fprintf(fp,
|
||||
"\n-----------------------------------------\n");
|
||||
}
|
||||
}
|
||||
if (burn_sg_log_scsi & 3)
|
||||
scsi_log_cmd(c,fp,0);
|
||||
|
||||
memcpy(cdb.field, c->opcode, c->oplen);
|
||||
if (c->dir == TO_DRIVE) {
|
||||
@ -662,24 +597,16 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
|
||||
/* retry-loop */
|
||||
start_time = time(NULL);
|
||||
if (c->timeout > 0)
|
||||
timeout_ms = c->timeout;
|
||||
else
|
||||
timeout_ms = 200000;
|
||||
for(i = 0; !done; i++) {
|
||||
timeout_ms = 200000;
|
||||
for(i = 0; ; i++) {
|
||||
|
||||
memset(c->sense, 0, sizeof(c->sense));
|
||||
i_status = mmc_run_cmd(p_cdio, timeout_ms, &cdb, e_direction,
|
||||
dxfer_len, c->page->data);
|
||||
|
||||
sense_valid = mmc_last_cmd_sense(p_cdio, &sense_pt);
|
||||
if (sense_valid >= 18) {
|
||||
memcpy(c->sense, (unsigned char *) sense_pt,
|
||||
(size_t) sense_valid >= sizeof(c->sense) ?
|
||||
sizeof(c->sense) : (size_t) sense_valid );
|
||||
spc_decode_sense(c->sense, 0, &key, &asc, &ascq);
|
||||
} else
|
||||
key = asc = ascq = 0;
|
||||
if (sense_valid >= 18)
|
||||
memcpy(c->sense, sense_pt,
|
||||
sense_valid >= sizeof(c->sense) ?
|
||||
sizeof(c->sense) : sense_valid );
|
||||
if (sense_pt != NULL)
|
||||
free(sense_pt);
|
||||
|
||||
@ -701,28 +628,51 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
}
|
||||
*/
|
||||
|
||||
if ((!sense_valid) || (key == 0 && asc == 0 && ascq == 0)) {
|
||||
if (!sense_valid) {
|
||||
memset(c->sense, 0, sizeof(c->sense));
|
||||
if (i_status != 0) { /* set dummy sense */
|
||||
/*LOGICAL UNIT NOT READY,
|
||||
CAUSE NOT REPORTABLE*/
|
||||
c->sense[0] = 0x70; /*Fixed format sense data*/
|
||||
/*LOGICAL UNIT NOT READY,CAUSE NOT REPORTABLE*/
|
||||
c->sense[2] = 0x02;
|
||||
c->sense[12] = 0x04;
|
||||
done = 1;
|
||||
}
|
||||
}
|
||||
if (key || asc || ascq)
|
||||
sense_len = 18;
|
||||
else
|
||||
sense_len = 0;
|
||||
done = scsi_eval_cmd_outcome(d, c, fp, c->sense, sense_len,
|
||||
0, start_time, timeout_ms, i, 2);
|
||||
if (d->cancel)
|
||||
done = 1;
|
||||
|
||||
} else
|
||||
c->sense[2] &= 15;
|
||||
|
||||
if (i_status != 0 ||
|
||||
(c->sense[2] || c->sense[12] || c->sense[13])) {
|
||||
if (!c->retry) {
|
||||
c->error = 1;
|
||||
goto ex;
|
||||
}
|
||||
switch (scsi_error(d, c->sense, 18)) {
|
||||
case RETRY:
|
||||
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 */
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -870,12 +820,12 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
struct statvfs vfsbuf;
|
||||
#endif
|
||||
|
||||
char *testpath = NULL, *cpt;
|
||||
char testpath[4096], *cpt;
|
||||
long blocks;
|
||||
off_t add_size = 0;
|
||||
int ret;
|
||||
|
||||
BURN_ALLOC_MEM(testpath, char, 4096);
|
||||
testpath[0] = 0;
|
||||
blocks = *bytes / 512;
|
||||
if (stat(path, &stbuf) == -1) {
|
||||
strcpy(testpath, path);
|
||||
cpt = strrchr(testpath, '/');
|
||||
@ -886,23 +836,21 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
else
|
||||
*cpt = 0;
|
||||
if (stat(testpath, &stbuf) == -1)
|
||||
{ret = -1; goto ex;}
|
||||
return -1;
|
||||
|
||||
#ifdef __linux
|
||||
|
||||
/* GNU/Linux specific determination of block device size */
|
||||
} else if(S_ISBLK(stbuf.st_mode)) {
|
||||
int open_mode = O_RDONLY, fd;
|
||||
long blocks;
|
||||
int open_mode = O_RDONLY, fd, ret;
|
||||
|
||||
blocks = *bytes / 512;
|
||||
fd = open(path, open_mode);
|
||||
if (fd == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
ret = ioctl(fd, BLKGETSIZE, &blocks);
|
||||
close(fd);
|
||||
if (ret == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
*bytes = ((off_t) blocks) * (off_t) 512;
|
||||
|
||||
#endif /* __linux */
|
||||
@ -910,62 +858,42 @@ int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
#ifdef Libburn_is_on_freebsD
|
||||
|
||||
} else if(S_ISCHR(stbuf.st_mode)) {
|
||||
int fd;
|
||||
int fd, ret;
|
||||
|
||||
fd = open(path, O_RDONLY);
|
||||
if (fd == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
ret = ioctl(fd, DIOCGMEDIASIZE, &add_size);
|
||||
close(fd);
|
||||
if (ret == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
*bytes = add_size;
|
||||
|
||||
#endif /* Libburn_is_on_freebsD */
|
||||
|
||||
#ifdef Libburn_is_on_solariS
|
||||
|
||||
} else if(S_ISBLK(stbuf.st_mode)) {
|
||||
int open_mode = O_RDONLY, fd;
|
||||
|
||||
fd = open(path, open_mode);
|
||||
if (fd == -1)
|
||||
{ret = -2; goto ex;}
|
||||
*bytes = lseek(fd, 0, SEEK_END);
|
||||
close(fd);
|
||||
if (*bytes == -1) {
|
||||
*bytes = 0;
|
||||
{ret = 0; goto ex;}
|
||||
}
|
||||
|
||||
#endif /* Libburn_is_on_solariS */
|
||||
#endif/* Libburn_is_on_freebsD */
|
||||
|
||||
} else if(S_ISREG(stbuf.st_mode)) {
|
||||
add_size = stbuf.st_blocks * (off_t) 512;
|
||||
strcpy(testpath, path);
|
||||
} else
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
|
||||
if (testpath[0]) {
|
||||
|
||||
#ifdef Libburn_os_has_statvfS
|
||||
|
||||
if (statvfs(testpath, &vfsbuf) == -1)
|
||||
{ret = -2; goto ex;}
|
||||
return -2;
|
||||
*bytes = add_size + ((off_t) vfsbuf.f_frsize) *
|
||||
(off_t) vfsbuf.f_bavail;
|
||||
|
||||
#else /* Libburn_os_has_statvfS */
|
||||
|
||||
{ret = 0; goto ex;}
|
||||
return 0;
|
||||
|
||||
#endif /* ! Libburn_os_has_stavtfS */
|
||||
|
||||
}
|
||||
ret = 1;
|
||||
ex:;
|
||||
BURN_FREE_MEM(testpath);
|
||||
return ret;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,887 +0,0 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/*
|
||||
Copyright (c) 2010 - 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
|
||||
This is the main operating system dependent SCSI part of libburn. It implements
|
||||
the transport level aspects of SCSI control and command i/o.
|
||||
|
||||
Present implementation: Solaris uscsi, e.g. for SunOS 5.11
|
||||
|
||||
|
||||
PORTING:
|
||||
|
||||
Porting libburn typically will consist of adding a new operating system case
|
||||
to the following switcher files:
|
||||
os.h Operating system specific libburn definitions and declarations.
|
||||
sg.c Operating system dependent transport level modules.
|
||||
and of deriving the following system specific files from existing examples:
|
||||
os-*.h Included by os.h. You will need some general system knowledge
|
||||
about signals and knowledge about the storage object needs of your
|
||||
transport level module sg-*.c.
|
||||
|
||||
sg-*.c This source module. You will need special system knowledge about
|
||||
how to detect all potentially available drives, how to open them,
|
||||
eventually how to exclusively reserve them, how to perform
|
||||
SCSI transactions, how to inquire the (pseudo-)SCSI driver.
|
||||
You will not need to care about CD burning, MMC or other high-level
|
||||
SCSI aspects.
|
||||
|
||||
Said sg-*.c operations are defined by a public function interface, which has
|
||||
to be implemented in a way that provides libburn with the desired services:
|
||||
|
||||
sg_id_string() returns an id string of the SCSI transport adapter.
|
||||
It may be called before initialization but then may
|
||||
return only a preliminary id.
|
||||
|
||||
sg_initialize() performs global initialization of the SCSI transport
|
||||
adapter and eventually needed operating system
|
||||
facilities. Checks for compatibility of supporting
|
||||
software components.
|
||||
|
||||
sg_shutdown() performs global finalizations and releases golbally
|
||||
aquired resources.
|
||||
|
||||
sg_give_next_adr() iterates over the set of potentially useful drive
|
||||
address strings.
|
||||
|
||||
scsi_enumerate_drives() brings all available, not-whitelist-banned, and
|
||||
accessible drives into libburn's list of drives.
|
||||
|
||||
sg_dispose_drive() finalizes adapter specifics of struct burn_drive
|
||||
on destruction. Releases resources which were aquired
|
||||
underneath scsi_enumerate_drives().
|
||||
|
||||
sg_drive_is_open() tells wether libburn has the given drive in use.
|
||||
|
||||
sg_grab() opens the drive for SCSI commands and ensures
|
||||
undisturbed access.
|
||||
|
||||
sg_release() closes a drive opened by sg_grab()
|
||||
|
||||
sg_issue_command() sends a SCSI command to the drive, receives reply,
|
||||
and evaluates wether the command succeeded or shall
|
||||
be retried or finally failed.
|
||||
|
||||
sg_obtain_scsi_adr() tries to obtain SCSI address parameters.
|
||||
|
||||
|
||||
burn_os_is_2k_seekrw() tells whether the given path leads to a file object
|
||||
that can be used in 2 kB granularity by lseek(2),
|
||||
read(2), and possibly write(2) if not read-only..
|
||||
E.g. a USB stick or a hard disk.
|
||||
|
||||
burn_os_stdio_capacity() estimates the emulated media space of stdio-drives.
|
||||
|
||||
burn_os_open_track_src() opens a disk file in a way that allows best
|
||||
throughput with file reading and/or SCSI write command
|
||||
transmission.
|
||||
|
||||
burn_os_alloc_buffer() allocates a memory area that is suitable for file
|
||||
descriptors issued by burn_os_open_track_src().
|
||||
The buffer size may be rounded up for alignment
|
||||
reasons.
|
||||
|
||||
burn_os_free_buffer() delete a buffer obtained by burn_os_alloc_buffer().
|
||||
|
||||
Porting hints are marked by the text "PORTING:".
|
||||
Send feedback to libburn-hackers@pykix.org .
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
|
||||
/** PORTING : ------- OS dependent headers and definitions ------ */
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stropts.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#ifdef Libburn_os_has_statvfS
|
||||
#include <sys/statvfs.h>
|
||||
#endif /* Libburn_os_has_stavtfS */
|
||||
|
||||
#include <sys/dkio.h>
|
||||
#include <sys/vtoc.h>
|
||||
|
||||
#include <sys/scsi/impl/uscsi.h>
|
||||
|
||||
|
||||
/* The waiting time before eventually retrying a failed SCSI command.
|
||||
Before each retry wait Libburn_sg_linux_retry_incR longer than with
|
||||
the previous one.
|
||||
*/
|
||||
#define Libburn_sg_solaris_retry_usleeP 100000
|
||||
#define Libburn_sg_solaris_retry_incR 100000
|
||||
|
||||
|
||||
/** PORTING : ------ libburn portable headers and definitions ----- */
|
||||
|
||||
#include "transport.h"
|
||||
#include "drive.h"
|
||||
#include "sg.h"
|
||||
#include "spc.h"
|
||||
#include "sbc.h"
|
||||
#include "debug.h"
|
||||
#include "toc.h"
|
||||
#include "util.h"
|
||||
#include "init.h"
|
||||
|
||||
#include "libdax_msgs.h"
|
||||
extern struct libdax_msgs *libdax_messenger;
|
||||
|
||||
|
||||
/* is in portable part of libburn */
|
||||
int burn_drive_is_banned(char *device_address);
|
||||
int burn_drive_resolve_link(char *path, char adr[],
|
||||
int *recursion_count, int flag); /* drive.c */
|
||||
|
||||
/* Whether to log SCSI commands:
|
||||
bit0= log in /tmp/libburn_sg_command_log
|
||||
bit1= log to stderr
|
||||
bit2= flush every line
|
||||
*/
|
||||
extern int burn_sg_log_scsi;
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
/* PORTING: Private definitions. Port only if needed by public functions. */
|
||||
/* (Public functions are listed below) */
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
|
||||
/* Storage object is in libburn/init.c
|
||||
whether to strive for exclusive access to the drive
|
||||
*/
|
||||
extern int burn_sg_open_o_excl;
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
/* PORTING: Private functions. Port only if needed by public functions */
|
||||
/* (Public functions are listed below) */
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
|
||||
static int sg_close_drive(struct burn_drive * d)
|
||||
{
|
||||
if (d->fd != -1) {
|
||||
close(d->fd);
|
||||
d->fd = -1;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int decode_btl_number(char **cpt, int stopper, int *no)
|
||||
{
|
||||
*no = 0;
|
||||
for ((*cpt)++; **cpt != stopper; (*cpt)++) {
|
||||
if (**cpt < '0' || **cpt > '9')
|
||||
return 0;
|
||||
*no = *no * 10 + **cpt - '0';
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* Read bus, target, lun from name "cXtYdZs2".
|
||||
Return 0 if name is not of the desired form.
|
||||
*/
|
||||
static int decode_btl_solaris(char *name, int *busno, int *tgtno, int *lunno,
|
||||
int flag)
|
||||
{
|
||||
char *cpt;
|
||||
int ret;
|
||||
|
||||
*busno = *tgtno = *lunno = -1;
|
||||
cpt = name;
|
||||
if (*cpt != 'c')
|
||||
return 0;
|
||||
ret = decode_btl_number(&cpt, 't', busno);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
ret = decode_btl_number(&cpt, 'd', tgtno);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
ret = decode_btl_number(&cpt, 's', lunno);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
cpt++;
|
||||
if (*cpt != '2' || *(cpt + 1) != 0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int start_enum_cXtYdZs2(burn_drive_enumerator_t *idx, int flag)
|
||||
{
|
||||
DIR *dir;
|
||||
|
||||
idx->dir = NULL;
|
||||
dir = opendir("/dev/rdsk");
|
||||
if (dir == NULL) {
|
||||
libdax_msgs_submit(libdax_messenger, -1,
|
||||
0x0002000c, LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Cannot start device file enumeration. opendir(\"/dev/rdsk\") failed.",
|
||||
errno, 0);
|
||||
return 0;
|
||||
}
|
||||
idx->dir = dir;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int next_enum_cXtYdZs2(burn_drive_enumerator_t *idx,
|
||||
char adr[], int adr_size, int flag)
|
||||
{
|
||||
int busno, tgtno, lunno, ret, fd = -1, volpath_size = 160;
|
||||
char *volpath = NULL;
|
||||
struct dirent *entry;
|
||||
struct dk_cinfo cinfo;
|
||||
DIR *dir;
|
||||
|
||||
BURN_ALLOC_MEM(volpath, char, volpath_size);
|
||||
|
||||
dir = idx->dir;
|
||||
while (1) {
|
||||
errno = 0;
|
||||
entry = readdir(dir);
|
||||
if (entry == NULL) {
|
||||
if (errno) {
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
-1, 0x0002000d,
|
||||
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
|
||||
"Cannot enumerate next device. readdir() from \"/dev/rdsk\" failed.",
|
||||
errno, 0);
|
||||
{ret = -1; goto ex;}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (strlen(entry->d_name) > (size_t) (volpath_size - 11))
|
||||
continue;
|
||||
ret = decode_btl_solaris(entry->d_name,
|
||||
&busno, &tgtno, &lunno, 0);
|
||||
if (ret <= 0)
|
||||
continue; /* not cXtYdZs2 */
|
||||
|
||||
sprintf(volpath, "/dev/rdsk/%s", entry->d_name);
|
||||
if (burn_drive_is_banned(volpath))
|
||||
continue;
|
||||
|
||||
fd = open(volpath, O_RDONLY | O_NDELAY);
|
||||
if (fd < 0)
|
||||
continue;
|
||||
/* See man dkio */
|
||||
ret = ioctl(fd, DKIOCINFO, &cinfo);
|
||||
close(fd);
|
||||
if (ret < 0)
|
||||
continue;
|
||||
if (cinfo.dki_ctype != DKC_CDROM)
|
||||
continue;
|
||||
if (adr_size <= (int) strlen(volpath))
|
||||
{ret = -1; goto ex;}
|
||||
strcpy(adr, volpath);
|
||||
{ret = 1; goto ex;}
|
||||
}
|
||||
ret = 0;
|
||||
ex:;
|
||||
BURN_FREE_MEM(volpath);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int end_enum_cXtYdZs2(burn_drive_enumerator_t *idx, int flag)
|
||||
{
|
||||
DIR *dir;
|
||||
|
||||
dir = idx->dir;
|
||||
if(dir != NULL)
|
||||
closedir(dir);
|
||||
idx->dir = NULL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/* PORTING: Private functions which contain publicly needed functionality. */
|
||||
/* Their portable part must be performed. So it is probably best */
|
||||
/* to replace the non-portable part and to call these functions */
|
||||
/* in your port, too. */
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
|
||||
/** Wraps a detected drive into libburn structures and hands it over to
|
||||
libburn drive list.
|
||||
*/
|
||||
static void enumerate_common(char *fname,
|
||||
int bus_no, int host_no,
|
||||
int channel_no, int target_no, int lun_no)
|
||||
{
|
||||
int ret;
|
||||
struct burn_drive out;
|
||||
|
||||
/* General libburn drive setup */
|
||||
burn_setup_drive(&out, fname);
|
||||
|
||||
/* This transport adapter uses SCSI-family commands and models
|
||||
(seems the adapter would know better than its boss, if ever) */
|
||||
ret = burn_scsi_setup_drive(&out, bus_no, host_no, channel_no,
|
||||
target_no, lun_no, 0);
|
||||
if (ret <= 0)
|
||||
return;
|
||||
|
||||
/* PORTING: ------------------- non portable part --------------- */
|
||||
|
||||
/* Transport adapter is Solaris uscsi */
|
||||
/* Adapter specific handles and data */
|
||||
out.fd = -1;
|
||||
|
||||
/* PORTING: ---------------- end of non portable part ------------ */
|
||||
|
||||
/* Adapter specific functions with standardized names */
|
||||
out.grab = sg_grab;
|
||||
out.release = sg_release;
|
||||
out.drive_is_open = sg_drive_is_open;
|
||||
out.issue_command = sg_issue_command;
|
||||
/* Finally register drive and inquire drive information */
|
||||
burn_drive_finish_enum(&out);
|
||||
}
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
/* PORTING: Public functions. These MUST be ported. */
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
|
||||
/** Returns the id string of the SCSI transport adapter and eventually
|
||||
needed operating system facilities.
|
||||
This call is usable even if sg_initialize() was not called yet. In that
|
||||
case a preliminary constant message might be issued if detailed info is
|
||||
not available yet.
|
||||
@param msg returns id string
|
||||
@param flag unused yet, submit 0
|
||||
@return 1 = success, <=0 = failure
|
||||
*/
|
||||
int sg_id_string(char msg[1024], int flag)
|
||||
{
|
||||
sprintf(msg, "internal Solaris uscsi adapter sg-solaris");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/** Performs global initialization of the SCSI transport adapter and eventually
|
||||
needed operating system facilities. Checks for compatibility of supporting
|
||||
software components.
|
||||
@param msg returns ids and/or error messages of eventual helpers
|
||||
@param flag unused yet, submit 0
|
||||
@return 1 = success, <=0 = failure
|
||||
*/
|
||||
int sg_initialize(char msg[1024], int flag)
|
||||
{
|
||||
return sg_id_string(msg, 0);
|
||||
}
|
||||
|
||||
|
||||
/** Performs global finalization of the SCSI transport adapter and eventually
|
||||
needed operating system facilities. Releases globally aquired resources.
|
||||
@param flag unused yet, submit 0
|
||||
@return 1 = success, <=0 = failure
|
||||
*/
|
||||
int sg_shutdown(int flag)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/** Finalizes BURN_OS_TRANSPORT_DRIVE_ELEMENTS, the components of
|
||||
struct burn_drive which are defined in os-*.h.
|
||||
The eventual initialization of those components was made underneath
|
||||
scsi_enumerate_drives().
|
||||
This will be called when a burn_drive gets disposed.
|
||||
@param d the drive to be finalized
|
||||
@param flag unused yet, submit 0
|
||||
@return 1 = success, <=0 = failure
|
||||
*/
|
||||
int sg_dispose_drive(struct burn_drive *d, int flag)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/** Returns the next index number and the next enumerated drive address.
|
||||
The enumeration has to cover all available and accessible drives. It is
|
||||
allowed to return addresses of drives which are not available but under
|
||||
some (even exotic) circumstances could be available. It is on the other
|
||||
hand allowed, only to hand out addresses which can really be used right
|
||||
in the moment of this call. (This implementation chooses the latter.)
|
||||
@param idx An opaque handle. Make no own theories about it.
|
||||
@param adr Takes the reply
|
||||
@param adr_size Gives maximum size of reply including final 0
|
||||
@param initialize 1 = start new,
|
||||
0 = continue, use no other values for now
|
||||
-1 = finish
|
||||
@return 1 = reply is a valid address , 0 = no further address available
|
||||
-1 = severe error (e.g. adr_size too small)
|
||||
*/
|
||||
int sg_give_next_adr(burn_drive_enumerator_t *idx,
|
||||
char adr[], int adr_size, int initialize)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (initialize == 1) {
|
||||
ret = start_enum_cXtYdZs2(idx, 0);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
} else if (initialize == -1) {
|
||||
ret = end_enum_cXtYdZs2(idx, 0);
|
||||
return 0;
|
||||
}
|
||||
ret = next_enum_cXtYdZs2(idx, adr, adr_size, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/** Brings all available, not-whitelist-banned, and accessible drives into
|
||||
libburn's list of drives.
|
||||
*/
|
||||
int scsi_enumerate_drives(void)
|
||||
{
|
||||
burn_drive_enumerator_t idx;
|
||||
int initialize = 1, ret, i_bus_no = -1, buf_size = 4096;
|
||||
int i_host_no = -1, i_channel_no = -1, i_target_no = -1, i_lun_no = -1;
|
||||
char *buf = NULL;
|
||||
|
||||
BURN_ALLOC_MEM(buf, char, buf_size);
|
||||
|
||||
while(1) {
|
||||
ret = sg_give_next_adr(&idx, buf, buf_size, initialize);
|
||||
initialize = 0;
|
||||
if (ret <= 0)
|
||||
break;
|
||||
if (burn_drive_is_banned(buf))
|
||||
continue;
|
||||
sg_obtain_scsi_adr(buf, &i_bus_no, &i_host_no,
|
||||
&i_channel_no, &i_target_no, &i_lun_no);
|
||||
enumerate_common(buf,
|
||||
i_bus_no, i_host_no, i_channel_no,
|
||||
i_target_no, i_lun_no);
|
||||
}
|
||||
sg_give_next_adr(&idx, buf, buf_size, -1);
|
||||
ret = 1;
|
||||
ex:;
|
||||
BURN_FREE_MEM(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/** Tells whether libburn has the given drive in use or exclusively reserved.
|
||||
If it is "open" then libburn will eventually call sg_release() on it when
|
||||
it is time to give up usage resp. reservation.
|
||||
*/
|
||||
/** Published as burn_drive.drive_is_open() */
|
||||
int sg_drive_is_open(struct burn_drive * d)
|
||||
{
|
||||
return (d->fd != -1);
|
||||
}
|
||||
|
||||
|
||||
/** Opens the drive for SCSI commands and - if burn activities are prone
|
||||
to external interference on your system - obtains an exclusive access lock
|
||||
on the drive. (Note: this is not physical tray locking.)
|
||||
A drive that has been opened with sg_grab() will eventually be handed
|
||||
over to sg_release() for closing and unreserving.
|
||||
*/
|
||||
int sg_grab(struct burn_drive *d)
|
||||
{
|
||||
char *msg = NULL;
|
||||
int os_errno, ret;
|
||||
struct dk_cinfo cinfo;
|
||||
|
||||
BURN_ALLOC_MEM(msg, char, 4096);
|
||||
|
||||
if (d->fd != -1) {
|
||||
d->released = 0;
|
||||
{ret = 1; goto ex;}
|
||||
}
|
||||
d->fd = open(d->devname, O_RDONLY | O_NDELAY);
|
||||
if (d->fd == -1) {
|
||||
os_errno = errno;
|
||||
sprintf(msg, "Could not grab drive '%s'", d->devname);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x00020003,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, os_errno, 0);
|
||||
{ret = 0; goto ex;}
|
||||
}
|
||||
ret = ioctl(d->fd, DKIOCINFO, &cinfo);
|
||||
if (ret < 0)
|
||||
goto revoke;
|
||||
if (cinfo.dki_ctype != DKC_CDROM)
|
||||
goto revoke;
|
||||
|
||||
/* >>> obtain eventual locks */;
|
||||
|
||||
d->released = 0;
|
||||
{ret = 1; goto ex;}
|
||||
revoke:;
|
||||
sprintf(msg, "Could not grab drive '%s'. Not a CDROM device.",
|
||||
d->devname);
|
||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||
0x00020003,
|
||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, 0, 0);
|
||||
ret = 0;
|
||||
ex:;
|
||||
BURN_FREE_MEM(msg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/** PORTING: Is mainly about the call to sg_close_drive() and whether it
|
||||
implements the demanded functionality.
|
||||
*/
|
||||
/** Gives up the drive for SCSI commands and releases eventual access locks.
|
||||
(Note: this is not physical tray locking.)
|
||||
*/
|
||||
int sg_release(struct burn_drive *d)
|
||||
{
|
||||
if (d->fd < 0)
|
||||
return 0;
|
||||
sg_close_drive(d);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/** Sends a SCSI command to the drive, receives reply and evaluates wether
|
||||
the command succeeded or shall be retried or finally failed.
|
||||
Returned SCSI errors shall not lead to a return value indicating failure.
|
||||
The callers get notified by c->error. An SCSI failure which leads not to
|
||||
a retry shall be notified via scsi_notify_error().
|
||||
The Libburn_log_sg_commandS facility might be of help when problems with
|
||||
a drive have to be examined. It shall stay disabled for normal use.
|
||||
@return: 1 success , <=0 failure
|
||||
*/
|
||||
int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||
{
|
||||
int i, timeout_ms, ret, key, asc, ascq, done = 0, sense_len;
|
||||
time_t start_time;
|
||||
struct uscsi_cmd cgc;
|
||||
char msg[80];
|
||||
static FILE *fp = NULL;
|
||||
|
||||
c->error = 0;
|
||||
memset(c->sense, 0, sizeof(c->sense));
|
||||
|
||||
if (d->fd == -1)
|
||||
return 0;
|
||||
|
||||
if (burn_sg_log_scsi & 1) {
|
||||
if (fp == NULL) {
|
||||
fp= fopen("/tmp/libburn_sg_command_log", "a");
|
||||
fprintf(fp,
|
||||
"\n-----------------------------------------\n");
|
||||
}
|
||||
}
|
||||
if (burn_sg_log_scsi & 3)
|
||||
scsi_log_cmd(c,fp,0);
|
||||
|
||||
if (c->timeout > 0)
|
||||
timeout_ms = c->timeout;
|
||||
else
|
||||
timeout_ms = 200000;
|
||||
memset (&cgc, 0, sizeof (struct uscsi_cmd));
|
||||
/* No error messages, no retries,
|
||||
do not execute with other commands, request sense data
|
||||
*/
|
||||
cgc.uscsi_flags = USCSI_SILENT | USCSI_DIAGNOSE | USCSI_ISOLATE
|
||||
| USCSI_RQENABLE;
|
||||
cgc.uscsi_timeout = timeout_ms / 1000;
|
||||
cgc.uscsi_cdb = (caddr_t) c->opcode;
|
||||
cgc.uscsi_bufaddr = (caddr_t) c->page->data;
|
||||
if (c->dir == TO_DRIVE) {
|
||||
cgc.uscsi_flags |= USCSI_WRITE;
|
||||
cgc.uscsi_buflen = c->page->bytes;
|
||||
} else if (c->dir == FROM_DRIVE) {
|
||||
cgc.uscsi_flags |= USCSI_READ;
|
||||
if (c->dxfer_len >= 0)
|
||||
cgc.uscsi_buflen = c->dxfer_len;
|
||||
else
|
||||
cgc.uscsi_buflen = BUFFER_SIZE;
|
||||
/* touch page so we can use valgrind */
|
||||
memset(c->page->data, 0, BUFFER_SIZE);
|
||||
} else {
|
||||
cgc.uscsi_buflen = 0;
|
||||
}
|
||||
cgc.uscsi_cdblen = c->oplen;
|
||||
cgc.uscsi_rqlen = sizeof(c->sense);
|
||||
cgc.uscsi_rqbuf = (caddr_t) c->sense;
|
||||
|
||||
/* retry-loop */
|
||||
start_time = time(NULL);
|
||||
for(i = 0; !done; i++) {
|
||||
|
||||
memset(c->sense, 0, sizeof(c->sense));
|
||||
ret = ioctl(d->fd, USCSICMD, &cgc);
|
||||
|
||||
/* For cgc.uscsi_status see SAM-3 5.3.1, Table 22
|
||||
0 = GOOD , 2 = CHECK CONDITION : Sense Data are delivered
|
||||
8 = BUSY
|
||||
*/
|
||||
if (ret != 0 && cgc.uscsi_status != 2) {
|
||||
sprintf(msg,
|
||||
"Failed to transfer command to drive. (uscsi_status = 0x%X)",
|
||||
(unsigned int) cgc.uscsi_status),
|
||||
libdax_msgs_submit(libdax_messenger,
|
||||
d->global_index, 0x0002010c,
|
||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||
msg, errno, 0);
|
||||
sg_close_drive(d);
|
||||
d->released = 1;
|
||||
d->busy = BURN_DRIVE_IDLE;
|
||||
c->error = 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* >>> Should replace "18" by realistic sense length.
|
||||
What's about following older remark ?
|
||||
*/
|
||||
/* >>> valid sense: cgc.uscsi_rqlen - cgc.uscsi_rqresid */;
|
||||
|
||||
spc_decode_sense(c->sense, 0, &key, &asc, &ascq);
|
||||
if (key || asc || ascq)
|
||||
sense_len = 18;
|
||||
else
|
||||
sense_len = 0;
|
||||
done = scsi_eval_cmd_outcome(d, c, fp, c->sense, sense_len, 0,
|
||||
start_time, timeout_ms, i, 2);
|
||||
if (d->cancel)
|
||||
done = 1;
|
||||
|
||||
} /* end of retry-loop */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/** Tries to obtain SCSI address parameters.
|
||||
@return 1 is success , 0 is failure
|
||||
*/
|
||||
int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no,
|
||||
int *target_no, int *lun_no)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Try to guess from path */
|
||||
if (strncmp("/dev/rdsk/", path, 10) == 0) {
|
||||
ret = decode_btl_solaris(path + 10,
|
||||
bus_no, target_no, lun_no, 0);
|
||||
if (ret > 0) {
|
||||
*host_no = *bus_no;
|
||||
*channel_no = 0;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
*bus_no = *host_no = *channel_no = *target_no = *lun_no = -1;
|
||||
|
||||
/* >>> Could need a ioctl which gives SCSI numbers */;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/** Tells wether a text is a persistent address as listed by the enumeration
|
||||
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)
|
||||
{
|
||||
burn_drive_enumerator_t idx;
|
||||
int initialize = 1, ret;
|
||||
char buf[64];
|
||||
|
||||
while(1) {
|
||||
ret = sg_give_next_adr(&idx, buf, sizeof(buf), initialize);
|
||||
initialize = 0;
|
||||
if (ret <= 0)
|
||||
break;
|
||||
if (strcmp(adr, buf) == 0) {
|
||||
sg_give_next_adr(&idx, buf, sizeof(buf), -1);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
sg_give_next_adr(&idx, buf, sizeof(buf), -1);
|
||||
return (0);
|
||||
}
|
||||
#endif /* NIX */
|
||||
|
||||
|
||||
|
||||
|
||||
/* Return 1 if the given path leads to a regular file or a device that can be
|
||||
seeked, read, and possibly written with 2 kB granularity.
|
||||
*/
|
||||
int burn_os_is_2k_seekrw(char *path, int flag)
|
||||
{
|
||||
struct stat stbuf;
|
||||
|
||||
if (stat(path, &stbuf) == -1)
|
||||
return 0;
|
||||
if (S_ISREG(stbuf.st_mode))
|
||||
return 1;
|
||||
if (S_ISBLK(stbuf.st_mode))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/** Estimate the potential payload capacity of a file address.
|
||||
@param path The address of the file to be examined. If it does not
|
||||
exist yet, then the directory will be inquired.
|
||||
@param bytes The pointed value gets modified, but only if an estimation is
|
||||
possible.
|
||||
@return -2 = cannot perform necessary operations on file object
|
||||
-1 = neither path nor dirname of path exist
|
||||
0 = could not estimate size capacity of file object
|
||||
1 = estimation has been made, bytes was set
|
||||
*/
|
||||
int burn_os_stdio_capacity(char *path, off_t *bytes)
|
||||
{
|
||||
struct stat stbuf;
|
||||
int ret;
|
||||
|
||||
#ifdef Libburn_os_has_statvfS
|
||||
struct statvfs vfsbuf;
|
||||
#endif
|
||||
|
||||
char *testpath = NULL, *cpt;
|
||||
off_t add_size = 0;
|
||||
|
||||
BURN_ALLOC_MEM(testpath, char, 4096);
|
||||
|
||||
testpath[0] = 0;
|
||||
if (stat(path, &stbuf) == -1) {
|
||||
strcpy(testpath, path);
|
||||
cpt = strrchr(testpath, '/');
|
||||
if(cpt == NULL)
|
||||
strcpy(testpath, ".");
|
||||
else if(cpt == testpath)
|
||||
testpath[1] = 0;
|
||||
else
|
||||
*cpt = 0;
|
||||
if (stat(testpath, &stbuf) == -1)
|
||||
{ret = -1; goto ex;}
|
||||
|
||||
} else if(S_ISBLK(stbuf.st_mode)) {
|
||||
int open_mode = O_RDONLY, fd;
|
||||
|
||||
fd = open(path, open_mode);
|
||||
if (fd == -1)
|
||||
{ret = -2; goto ex;}
|
||||
*bytes = lseek(fd, 0, SEEK_END);
|
||||
close(fd);
|
||||
if (*bytes == -1) {
|
||||
*bytes = 0;
|
||||
{ret = 0; goto ex;}
|
||||
}
|
||||
|
||||
} else if(S_ISREG(stbuf.st_mode)) {
|
||||
add_size = stbuf.st_blocks * (off_t) 512;
|
||||
strcpy(testpath, path);
|
||||
} else
|
||||
{ret = 0; goto ex;}
|
||||
|
||||
if (testpath[0]) {
|
||||
|
||||
#ifdef Libburn_os_has_statvfS
|
||||
|
||||
if (statvfs(testpath, &vfsbuf) == -1)
|
||||
{ret = -2; goto ex;}
|
||||
*bytes = add_size + ((off_t) vfsbuf.f_frsize) *
|
||||
(off_t) vfsbuf.f_bavail;
|
||||
|
||||
#else /* Libburn_os_has_statvfS */
|
||||
|
||||
{ret = 0; goto ex;}
|
||||
|
||||
#endif /* ! Libburn_os_has_stavtfS */
|
||||
|
||||
}
|
||||
ret = 1;
|
||||
ex:;
|
||||
BURN_FREE_MEM(testpath);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* ts A91122 : an interface to open(O_DIRECT) or similar OS tricks. */
|
||||
|
||||
#ifdef Libburn_read_o_direcT
|
||||
|
||||
/* No special O_DIRECT-like precautions are implemented here */
|
||||
|
||||
#endif /* Libburn_read_o_direcT */
|
||||
|
||||
|
||||
int burn_os_open_track_src(char *path, int open_flags, int flag)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = open(path, open_flags);
|
||||
return fd;
|
||||
}
|
||||
|
||||
|
||||
void *burn_os_alloc_buffer(size_t amount, int flag)
|
||||
{
|
||||
void *buf = NULL;
|
||||
|
||||
buf = calloc(1, amount);
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
int burn_os_free_buffer(void *buffer, size_t amount, int flag)
|
||||
{
|
||||
if (buffer == NULL)
|
||||
return 0;
|
||||
free(buffer);
|
||||
return 1;
|
||||
}
|
||||
|
32
libburn/sg.c
32
libburn/sg.c
@ -1,21 +1,10 @@
|
||||
|
||||
/* sg.c
|
||||
Switcher for operating system dependent transport level modules of libburn.
|
||||
Copyright (C) 2009 - 2010 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
provided under GPLv2+
|
||||
Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#undef HAVE_CONFIG_H
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef Libburn_use_sg_dummY
|
||||
|
||||
#include "sg-dummy.c"
|
||||
|
||||
#else
|
||||
#ifdef Libburn_use_libcdiO
|
||||
|
||||
#include "sg-libcdio.c"
|
||||
@ -23,31 +12,18 @@
|
||||
#else
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
#ifdef Libburn_use_sg_freebsd_porT
|
||||
#include "sg-freebsd-port.c"
|
||||
#else
|
||||
#include "sg-freebsd.c"
|
||||
#endif
|
||||
|
||||
#else
|
||||
#ifdef __FreeBSD_kernel__
|
||||
|
||||
#ifdef Libburn_use_sg_freebsd_porT
|
||||
#include "sg-freebsd-port.c"
|
||||
#else
|
||||
#include "sg-freebsd.c"
|
||||
#endif
|
||||
|
||||
#else
|
||||
#ifdef __linux
|
||||
|
||||
#include "sg-linux.c"
|
||||
|
||||
#else
|
||||
#ifdef __sun
|
||||
|
||||
#include "sg-solaris.c"
|
||||
|
||||
#else
|
||||
|
||||
/* The dummy adapter formally fulfills the expectations of libburn towards
|
||||
@ -58,11 +34,11 @@
|
||||
static int intentional_compiler_warning(void)
|
||||
{
|
||||
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 This_libburn_will_not_be_able_to_operate_on_real_CD_drives;
|
||||
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;
|
||||
|
||||
return(0);
|
||||
@ -70,10 +46,8 @@ static int intentional_compiler_warning(void)
|
||||
|
||||
#include "sg-dummy.c"
|
||||
|
||||
#endif /* ! __sun */
|
||||
#endif /* ! __linux */
|
||||
#endif /* ! __FreeBSD_kernel__ */
|
||||
#endif /* ! __FreeBSD__ */
|
||||
#endif /* ! Libburn_use_libcdiO */
|
||||
#endif /* ! Libburn_use_sg_dummY */
|
||||
|
||||
|
@ -5,17 +5,12 @@
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "libburn.h"
|
||||
#include "source.h"
|
||||
#include "structure.h"
|
||||
#include "init.h"
|
||||
|
||||
void burn_source_free(struct burn_source *src)
|
||||
{
|
||||
@ -42,10 +37,12 @@ struct burn_source *burn_source_new(void)
|
||||
{
|
||||
struct burn_source *out;
|
||||
|
||||
/* ts A70825 , B11219 */
|
||||
out = burn_alloc_mem(sizeof(struct burn_source), 1, 0);
|
||||
out = calloc(1, sizeof(struct burn_source));
|
||||
|
||||
/* ts A70825 */
|
||||
if (out == NULL)
|
||||
return NULL;
|
||||
memset((char *) out, 0, sizeof(struct burn_source));
|
||||
|
||||
out->refcount = 1;
|
||||
return out;
|
||||
@ -62,15 +59,3 @@ int burn_source_cancel(struct burn_source *src)
|
||||
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_read(struct burn_source *src, unsigned char *buffer, int size);
|
||||
|
||||
#endif /*__SOURCE*/
|
||||
|
1174
libburn/spc.c
1174
libburn/spc.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; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
@ -21,7 +21,6 @@ void spc_select_error_params(struct burn_drive *,
|
||||
void spc_getcaps(struct burn_drive *d);
|
||||
void spc_sense_write_params(struct burn_drive *);
|
||||
void spc_select_write_params(struct burn_drive *,
|
||||
struct burn_session *, int,
|
||||
const struct burn_write_opts *);
|
||||
void spc_probe_write_modes(struct burn_drive *);
|
||||
void spc_request_sense(struct burn_drive *d, struct buffer *buf);
|
||||
@ -29,8 +28,7 @@ int spc_block_type(enum burn_block_types b);
|
||||
int spc_get_erase_progress(struct burn_drive *d);
|
||||
|
||||
/* ts A70315 : test_unit_ready with result parameters */
|
||||
int spc_test_unit_ready_r(struct burn_drive *d, int *key, int *asc, int *ascq,
|
||||
int *progress);
|
||||
int spc_test_unit_ready_r(struct burn_drive *d, int *key, int *asc, int *ascq);
|
||||
|
||||
int spc_test_unit_ready(struct burn_drive *d);
|
||||
|
||||
@ -51,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);
|
||||
|
||||
/* 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);
|
||||
|
||||
/* ts A61122 */
|
||||
@ -70,87 +68,17 @@ int scsi_init_command(struct command *c, unsigned char *opcode, int oplen);
|
||||
/* ts A91106 */
|
||||
int scsi_show_cmd_text(struct command *c, void *fp, int flag);
|
||||
|
||||
/* ts B11110 */
|
||||
/** Logs command (before execution). */
|
||||
int scsi_log_command(unsigned char *opcode, int oplen, int data_dir,
|
||||
unsigned char *data, int bytes,
|
||||
void *fp_in, int flag);
|
||||
/* ts A91106 */
|
||||
int scsi_show_cmd_reply(struct command *c, void *fp, int flag);
|
||||
|
||||
/* 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);
|
||||
|
||||
/* 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) */
|
||||
/** Legacy frontend to scsi_log_reply().
|
||||
@param flag bit0 causes an error message
|
||||
bit1 do not print duration
|
||||
*/
|
||||
/** Logs outcome of a sg command. */
|
||||
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. At most wait for Libburn_scsi_retry_umaX microseconds.
|
||||
*/
|
||||
#define Libburn_scsi_retry_usleeP 100000
|
||||
#define Libburn_scsi_retry_incR 100000
|
||||
#define Libburn_scsi_retry_umaX 500000
|
||||
|
||||
/* The retry waiting time for commands WRITE(10) and WRITE(12).
|
||||
*/
|
||||
#define Libburn_scsi_write_retry_usleeP 0
|
||||
#define Libburn_scsi_write_retry_incR 2000
|
||||
#define Libburn_scsi_write_retry_umaX 25000
|
||||
|
||||
|
||||
/* ts B11124 */
|
||||
/* Millisecond timeout for quickly responding SPC, SBC, and MMC commands */
|
||||
#define Libburn_scsi_default_timeouT 30000
|
||||
|
||||
/* WRITE(10) and WRITE(12) */
|
||||
#define Libburn_scsi_write_timeouT 200000
|
||||
|
||||
/* RESERVE TRACK */
|
||||
#define Libburn_mmc_reserve_timeouT 200000
|
||||
|
||||
/* CLOSE TRACK/SESSION (with Immed bit) */
|
||||
#define Libburn_mmc_close_timeouT 200000
|
||||
|
||||
/* BLANK , FORMAT UNIT (with Immed bit) */
|
||||
#define Libburn_mmc_blank_timeouT 200000
|
||||
|
||||
/* SEND OPC INFORMATION */
|
||||
#define Libburn_mmc_opc_timeouT 200000
|
||||
|
||||
/* MMC_SYNC_CACHE */
|
||||
#define Libburn_mmc_sync_timeouT 200000
|
||||
|
||||
/* START STOP UNIT with Start bit and Load bit set */
|
||||
#define Libburn_mmc_load_timeouT 300000
|
||||
|
||||
#endif /*__SPC*/
|
||||
|
1552
libburn/structure.c
1552
libburn/structure.c
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
||||
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
@ -16,32 +16,13 @@ struct isrc
|
||||
unsigned int serial; /* must be 0-99999 */
|
||||
};
|
||||
|
||||
/* ts B11206 */
|
||||
#define Libburn_pack_type_basE 0x80
|
||||
#define Libburn_pack_num_typeS 0x10
|
||||
#define Libburn_pack_type_nameS \
|
||||
"TITLE", "PERFORMER", "SONGWRITER", "COMPOSER", \
|
||||
"ARRANGER", "MESSAGE", "DISCID", "GENRE", \
|
||||
"TOC", "TOC2", "", "", \
|
||||
"", "CLOSED", "UPC_ISRC", "BLOCKSIZE"
|
||||
|
||||
struct burn_cdtext
|
||||
{
|
||||
unsigned char *(payload[Libburn_pack_num_typeS]);
|
||||
int length[Libburn_pack_num_typeS];
|
||||
int flags; /* bit0 - bit15= double byte characters */
|
||||
};
|
||||
|
||||
struct burn_track
|
||||
{
|
||||
int refcnt;
|
||||
struct burn_toc_entry *entry;
|
||||
unsigned char indices;
|
||||
/* lba address of the index. CD only. 0x7fffffff means undefined index.
|
||||
To be programmed relative to track source start before burning,
|
||||
but to hold absolute addresses after burning or reading.
|
||||
*/
|
||||
int index[100];
|
||||
/* lba address of the index */
|
||||
unsigned int index[99];
|
||||
/** number of 0 bytes to write before data */
|
||||
int offset;
|
||||
/** how much offset has been used */
|
||||
@ -74,14 +55,6 @@ struct burn_track
|
||||
int open_ended;
|
||||
/** End of open ended track flag : offset+payload+tail are delivered */
|
||||
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
|
||||
possibly from reading the track's first sector. */
|
||||
@ -90,18 +63,8 @@ struct burn_track
|
||||
int pregap1;
|
||||
/** The track contains interval two of a pregap */
|
||||
int pregap2;
|
||||
|
||||
/* ts B20110 */
|
||||
/** The number of sectors in pre-gap 2, if .pregap2 is set */
|
||||
int pregap2_size;
|
||||
|
||||
/** The track contains a postgap */
|
||||
int postgap;
|
||||
|
||||
/* ts B20111 */
|
||||
/** The number of sectors in post-gap, if .postgap is set */
|
||||
int postgap_size;
|
||||
|
||||
struct isrc isrc;
|
||||
|
||||
/* ts A61024 */
|
||||
@ -111,9 +74,6 @@ struct burn_track
|
||||
/* ts A90910 : conversions from CD XA prepared input */
|
||||
int cdxa_conversion; /* 0=none, 1=remove -xa1 headers (first 8 bytes)*/
|
||||
|
||||
/* ts B11206 */
|
||||
struct burn_cdtext *cdtext[8];
|
||||
|
||||
};
|
||||
|
||||
struct burn_session
|
||||
@ -129,26 +89,12 @@ struct burn_session
|
||||
int tracks;
|
||||
struct burn_track **track;
|
||||
int refcnt;
|
||||
|
||||
/* ts B11206 */
|
||||
struct burn_cdtext *cdtext[8];
|
||||
unsigned char cdtext_char_code[8];
|
||||
unsigned char cdtext_copyright[8];
|
||||
unsigned char cdtext_language[8];
|
||||
|
||||
/* ts B11226 */
|
||||
unsigned char mediacatalog[14]; /* overrideable by burn_write_opts */
|
||||
};
|
||||
|
||||
struct burn_disc
|
||||
{
|
||||
int sessions;
|
||||
struct burn_session **session;
|
||||
|
||||
#ifdef Libburn_disc_with_incomplete_sessioN
|
||||
int incomplete_sessions;
|
||||
#endif
|
||||
|
||||
int refcnt;
|
||||
};
|
||||
|
||||
@ -174,17 +120,7 @@ off_t burn_track_get_default_size(struct burn_track *t);
|
||||
|
||||
|
||||
/* ts A80808 : Enhance CD toc to DVD toc */
|
||||
int burn_disc_cd_toc_extensions(struct burn_drive *drive, int flag);
|
||||
|
||||
|
||||
/* ts B11206 */
|
||||
struct burn_cdtext *burn_cdtext_create(void);
|
||||
void burn_cdtext_free(struct burn_cdtext **cdtext);
|
||||
|
||||
/* ts B20119 */
|
||||
/* @param flag bit0= do not add post-gap
|
||||
*/
|
||||
int burn_track_get_sectors_2(struct burn_track *t, int flag);
|
||||
int burn_disc_cd_toc_extensions(struct burn_disc *d, int flag);
|
||||
|
||||
|
||||
#endif /* BURN__STRUCTURE_H */
|
||||
|
@ -1,15 +1,10 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2011 - 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
/* ts A61008 */
|
||||
/* #include <a ssert.h> */
|
||||
|
||||
@ -21,7 +16,6 @@
|
||||
#include "libburn.h"
|
||||
#include "sector.h"
|
||||
#include "options.h"
|
||||
#include "init.h"
|
||||
|
||||
#if 0
|
||||
static void write_clonecd2(volatile struct toc *toc, int f);
|
||||
@ -105,14 +99,17 @@ static void write_clonecd2(volatile struct toc *toc, int f)
|
||||
|
||||
void toc_find_modes(struct burn_drive *d)
|
||||
{
|
||||
struct burn_read_opts o;
|
||||
int lba;
|
||||
int i, j;
|
||||
struct buffer *mem = NULL;
|
||||
struct buffer mem;
|
||||
struct burn_toc_entry *e;
|
||||
|
||||
/* ts A70519 : the code which needs this does not work with GNU/Linux 2.4 USB
|
||||
int lba;
|
||||
struct burn_read_opts o;
|
||||
/* ts A61008 : to be prevented on the higher levels */
|
||||
/* a ssert(d->busy); */
|
||||
|
||||
mem.bytes = 0;
|
||||
mem.sectors = 1;
|
||||
o.raw = 1;
|
||||
o.c2errors = 0;
|
||||
o.subcodes_audio = 1;
|
||||
@ -121,18 +118,17 @@ void toc_find_modes(struct burn_drive *d)
|
||||
o.report_recovered_errors = 0;
|
||||
o.transfer_damaged_blocks = 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 (j = 0; j < d->disc->session[i]->tracks; j++) {
|
||||
struct burn_track *t = d->disc->session[i]->track[j];
|
||||
|
||||
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! */
|
||||
if (e && !(e->control & 4)) {
|
||||
t->mode = BURN_AUDIO;
|
||||
@ -141,22 +137,10 @@ void toc_find_modes(struct burn_drive *d)
|
||||
t->mode = BURN_MODE1;
|
||||
/* 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.
|
||||
if (!e)
|
||||
lba = 0;
|
||||
else
|
||||
lba = burn_msf_to_lba(e->pmin, e->psec,
|
||||
e->pframe);
|
||||
mem->sectors = 1;
|
||||
|
||||
ts B21119 : Would now be d->read_cd() with
|
||||
with sectype = 0 , mainch = 0xf8
|
||||
d->read_sectors(d, lba, mem.sectors, &o, mem);
|
||||
|
||||
t->mode = sector_identify(mem->data);
|
||||
mem.sectors = 1;
|
||||
d->read_sectors(d, lba, mem.sectors, &o, &mem);
|
||||
t->mode = sector_identify(mem.data);
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
ex:
|
||||
BURN_FREE_MEM(mem);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||
|
||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
@ -64,7 +64,6 @@ struct command
|
||||
int error;
|
||||
int retry;
|
||||
struct buffer *page;
|
||||
int timeout; /* milliseconds */
|
||||
};
|
||||
|
||||
struct burn_scsi_inquiry_data
|
||||
@ -135,8 +134,6 @@ struct burn_drive
|
||||
1=MMC drive ,
|
||||
2=stdio random read-write
|
||||
3=stdio sequential write-only
|
||||
4=stdio random read-only
|
||||
5=stdio random write-only
|
||||
*/
|
||||
int drive_role;
|
||||
|
||||
@ -209,11 +206,6 @@ struct burn_drive
|
||||
*/
|
||||
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
|
||||
(which could need closing after write) */
|
||||
int needs_close_session;
|
||||
@ -261,18 +253,8 @@ struct burn_drive
|
||||
volatile int released;
|
||||
|
||||
/* ts A61106 */
|
||||
/* 0= report errors
|
||||
1= do not report errors
|
||||
2= do not report errors which the libburn function indicates in
|
||||
member .had_particular_error
|
||||
*/
|
||||
int silent_on_scsi_error;
|
||||
|
||||
/* ts B21023 */
|
||||
/* bit0= 5 64 00 occured with READ10 in mmc_read_10()
|
||||
*/
|
||||
int had_particular_error;
|
||||
|
||||
int stdio_fd;
|
||||
|
||||
int nwa; /* next writeable address */
|
||||
@ -287,19 +269,9 @@ struct burn_drive
|
||||
/* ts A90107 */
|
||||
int state_of_last_session;
|
||||
|
||||
#ifdef Libburn_disc_with_incomplete_sessioN
|
||||
/* ts B30112 */
|
||||
int incomplete_sessions;
|
||||
#endif
|
||||
|
||||
|
||||
/* ts A70129 :
|
||||
from 51h READ DISC INFORMATION Last Track Number in Last Session */
|
||||
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)
|
||||
With CD this might change after particular write
|
||||
parameters have been set and nwa has been inquired.
|
||||
@ -310,30 +282,15 @@ struct burn_drive
|
||||
int media_lba_limit;
|
||||
|
||||
/* ts A81210 : Upper limit of readable data size,
|
||||
0x7fffffff = unknown
|
||||
0x7ffffff0 = 32 bit overflow, or unknown stdio size
|
||||
*/
|
||||
0x7fffffff = unknown */
|
||||
int media_read_capacity;
|
||||
|
||||
/* ts B10314 : Next Writeable Adress for drive_role == 5 */
|
||||
int role_5_nwa;
|
||||
|
||||
int toc_temp;
|
||||
struct burn_disc *disc; /* disc structure */
|
||||
int block_types[4];
|
||||
struct buffer *buffer;
|
||||
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 */
|
||||
off_t pessimistic_buffer_free;
|
||||
int pbf_altered;
|
||||
@ -388,18 +345,17 @@ struct burn_drive
|
||||
int is_stopped;
|
||||
|
||||
void (*read_disc_info) (struct burn_drive *);
|
||||
int (*read_cd) (struct burn_drive *, int start, int len,
|
||||
int sec_type, int main_ch,
|
||||
const struct burn_read_opts *, struct buffer *,
|
||||
int flag);
|
||||
void (*read_sectors) (struct burn_drive *,
|
||||
int start,
|
||||
int len,
|
||||
const struct burn_read_opts *, struct buffer *);
|
||||
void (*perform_opc) (struct burn_drive *);
|
||||
void (*set_speed) (struct burn_drive *, int, int);
|
||||
void (*send_parameters) (struct burn_drive *,
|
||||
const struct burn_read_opts *);
|
||||
void (*send_write_parameters) (struct burn_drive *,
|
||||
struct burn_session *, int tno,
|
||||
const struct burn_write_opts *);
|
||||
int (*send_cue_sheet) (struct burn_drive *, struct cue_sheet *);
|
||||
void (*send_cue_sheet) (struct burn_drive *, struct cue_sheet *);
|
||||
|
||||
/* ts A70205 : Announce size of a DVD-R[W] DAO session. */
|
||||
int (*reserve_track) (struct burn_drive *d, off_t size);
|
||||
|
260
libburn/util.c
260
libburn/util.c
@ -4,10 +4,6 @@
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/* ts A61008 */
|
||||
@ -23,6 +19,42 @@
|
||||
#include "util.h"
|
||||
#include "libburn.h"
|
||||
|
||||
char *burn_strdup(char *s)
|
||||
{
|
||||
char *ret;
|
||||
int l;
|
||||
|
||||
/* ts A61008 */
|
||||
/* a ssert(s); */
|
||||
if (s == NULL)
|
||||
return NULL;
|
||||
|
||||
l = strlen(s) + 1;
|
||||
ret = malloc(l);
|
||||
memcpy(ret, s, l);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *burn_strndup(char *s, int n)
|
||||
{
|
||||
char *ret;
|
||||
int l;
|
||||
|
||||
/* ts A61008 */
|
||||
/* a ssert(s); */
|
||||
/* a ssert(n > 0); */
|
||||
if (s == NULL || n <= 0)
|
||||
return NULL;
|
||||
|
||||
l = strlen(s);
|
||||
ret = malloc(l < n ? l : n);
|
||||
|
||||
memcpy(ret, s, l < n - 1 ? l : n - 1);
|
||||
ret[n - 1] = '\0';
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void burn_version(int *major, int *minor, int *micro)
|
||||
{
|
||||
@ -38,6 +70,9 @@ struct cd_mid_record {
|
||||
int m_li;
|
||||
int s_li;
|
||||
int f_li;
|
||||
int m_lo;
|
||||
int s_lo;
|
||||
int f_lo;
|
||||
char *other_brands;
|
||||
};
|
||||
typedef struct cd_mid_record cd_mid_record_t;
|
||||
@ -52,61 +87,57 @@ 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)
|
||||
{
|
||||
static cd_mid_record_t mid_list[]= {
|
||||
{"SKC", 96, 40, 0, ""},
|
||||
{"Ritek Corp" , 96, 43, 30, ""},
|
||||
{"TDK / Ritek" , 97, 10, 0, "TRAXDATA"},
|
||||
{"TDK Corporation" , 97, 15, 0, ""},
|
||||
{"Ritek Corp" , 97, 15, 10, "7-plus, Aopen, PONY, Power Source, TDK, TRAXDATA, HiCO, PHILIPS, Primdisc, Victor.JVC, OPTI STORAGE, Samsung"},
|
||||
{"Mitsubishi Chemical Corporation" , 97, 15, 20, ""},
|
||||
{"Nan-Ya Plastics Corporation" , 97, 15, 30, "Hatron, MMore, Acer, LITEON"},
|
||||
{"Delphi" , 97, 15, 50, ""},
|
||||
{"Shenzhen SG&SAST" , 97, 16, 20, ""},
|
||||
{"Moser Baer India Limited" , 97, 17, 0, "EMTEC, Intenso, YAKUMO, PLATINUM, Silver Circle"},
|
||||
{"SKY media Manufacturing SA" , 97, 17, 10, ""},
|
||||
{"Wing" , 97, 18, 10, ""},
|
||||
{"DDT" , 97, 18, 20, ""},
|
||||
{"Daxon Technology Inc. / Acer" , 97, 22, 60, "Maxmax, Diamond Data, BenQ, gold, SONY"},
|
||||
{"Taiyo Yuden Company Limited" , 97, 24, 0, "Maxell, FUJIFILM, SONY"},
|
||||
{"Sony Corporation" , 97, 24, 10, "LeadData, Imation"},
|
||||
{"Computer Support Italcard s.r.l" , 97, 24, 20, ""},
|
||||
{"Unitech Japan Inc." , 97, 24, 30, ""},
|
||||
{"MPO, France" , 97, 25, 0, "TDK"},
|
||||
{"Hitachi Maxell Ltd." , 97, 25, 20, ""},
|
||||
{"Infodisc Technology Co,Ltd." , 97, 25, 30, "MEMOREX, SPEEDA, Lead data"},
|
||||
{"Xcitec" , 97, 25, 60, ""},
|
||||
{"Fornet International Pte Ltd" , 97, 26, 0, "COMPUSA, Cdhouse"},
|
||||
{"Postech Corporation" , 97, 26, 10, "Mr.Platinum"},
|
||||
{"SKC Co Ltd." , 97, 26, 20, "Infinite"},
|
||||
{"Fuji Photo Film Co,Ltd." , 97, 26, 40, ""},
|
||||
{"Lead Data Inc." , 97, 26, 50, "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"},
|
||||
{"Ricoh Company Limited" , 97, 27, 0, "Sony, Digital Storage, Csita"},
|
||||
{"Plasmon Data Systems Ltd" , 97, 27, 10, "Ritek, TDK, EMTEC, ALPHAPET, MANIA"},
|
||||
{"Princo Corporation" , 97, 27, 20, ""},
|
||||
{"Pioneer" , 97, 27, 30, ""},
|
||||
{"Eastman Kodak Company" , 97, 27, 40, ""},
|
||||
{"Mitsui Chemicals Inc." , 97, 27, 50, "MAM-A, TDK"},
|
||||
{"Ricoh Company Limited" , 97, 27, 60, "Ritek"},
|
||||
{"Gigastorage Corporation" , 97, 28, 10, "MaxMax, Nan-Ya"},
|
||||
{"Multi Media Masters&Machinary SA" , 97, 28, 20, "King, Mmirex"},
|
||||
{"Ritek Corp" , 97, 31, 0, "TDK"},
|
||||
{"Grand Advance Technology Sdn. Bhd." , 97, 31, 30, ""},
|
||||
{"TDK Corporation" , 97, 32, 00, ""},
|
||||
{"Prodisc Technology Inc." , 97, 32, 10, "Smartbuy, Mitsubishi, Digmaster, LG, Media Market"},
|
||||
{"Mitsubishi Chemical Corporation" , 97, 34, 20, "YAMAHA, Verbatim"},
|
||||
{"Mitsui Chemicals Inc." , 97, 48, 50, ""},
|
||||
{"TDK Corporation" , 97, 49, 0, ""},
|
||||
{"", 0, 0, 0, ""}
|
||||
{"SKC", 96, 40, 0, 0, 0, 0, ""},
|
||||
{"Ritek Corp" , 96, 43, 30, 0, 0, 0, ""},
|
||||
{"TDK / Ritek" , 97, 10, 0, 0, 0, 0, "TRAXDATA"},
|
||||
{"TDK Corporation" , 97, 15, 0, 0, 0, 0, ""},
|
||||
{"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, 0, 0, 0, ""},
|
||||
{"Nan-Ya Plastics Corporation" , 97, 15, 30, 0, 0, 0, "Hatron, MMore, Acer, LITEON"},
|
||||
{"Delphi" , 97, 15, 50, 0, 0, 0, ""},
|
||||
{"Shenzhen SG&SAST" , 97, 16, 20, 0, 0, 0, ""},
|
||||
{"Moser Baer India Limited" , 97, 17, 0, 0, 0, 0, "EMTEC, Intenso, YAKUMO, PLATINUM, Silver Circle"},
|
||||
{"SKY media Manufacturing SA" , 97, 17, 10, 0, 0, 0, ""},
|
||||
{"Wing" , 97, 18, 10, 0, 0, 0, ""},
|
||||
{"DDT" , 97, 18, 20, 0, 0, 0, ""},
|
||||
{"Daxon Technology Inc. / Acer" , 97, 22, 60, 0, 0, 0, "Maxmax, Diamond Data, BenQ, gold, SONY"},
|
||||
{"Taiyo Yuden Company Limited" , 97, 24, 0, 0, 0, 0, "Maxell, FUJIFILM, SONY"},
|
||||
{"Sony Corporation" , 97, 24, 10, 0, 0, 0, "LeadData, Imation"},
|
||||
{"Computer Support Italcard s.r.l" , 97, 24, 20, 0, 0, 0, ""},
|
||||
{"Unitech Japan Inc." , 97, 24, 30, 0, 0, 0, ""},
|
||||
{"MPO, France" , 97, 25, 0, 0, 0, 0, "TDK"},
|
||||
{"Hitachi Maxell Ltd." , 97, 25, 20, 0, 0, 0, ""},
|
||||
{"Infodisc Technology Co,Ltd." , 97, 25, 30, 0, 0, 0, "MEMOREX, SPEEDA, Lead data"},
|
||||
{"Xcitec" , 97, 25, 60, 0, 0, 0, ""},
|
||||
{"Fornet International Pte Ltd" , 97, 26, 0, 0, 0, 0, "COMPUSA, Cdhouse"},
|
||||
{"Postech Corporation" , 97, 26, 10, 0, 0, 0, "Mr.Platinum"},
|
||||
{"SKC Co Ltd." , 97, 26, 20, 0, 0, 0, "Infinite"},
|
||||
{"Fuji Photo Film Co,Ltd." , 97, 26, 40, 0, 0, 0, ""},
|
||||
{"Lead Data Inc." , 97, 26, 50, 0, 0, 0, "SONY, Gigastorage, MIRAGE"},
|
||||
{"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, 0, 0, 0, "Sony, Digital Storage, Csita"},
|
||||
{"Plasmon Data Systems Ltd" , 97, 27, 10, 0, 0, 0, "Ritek, TDK, EMTEC, ALPHAPET, MANIA"},
|
||||
{"Princo Corporation" , 97, 27, 20, 0, 0, 0, ""},
|
||||
{"Pioneer" , 97, 27, 30, 0, 0, 0, ""},
|
||||
{"Eastman Kodak Company" , 97, 27, 40, 0, 0, 0, ""},
|
||||
{"Mitsui Chemicals Inc." , 97, 27, 50, 0, 0, 0, "MAM-A, TDK"},
|
||||
{"Ricoh Company Limited" , 97, 27, 60, 0, 0, 0, "Ritek"},
|
||||
{"Gigastorage Corporation" , 97, 28, 10, 0, 0, 0, "MaxMax, Nan-Ya"},
|
||||
{"Multi Media Masters&Machinary SA" , 97, 28, 20, 0, 0, 0, "King, Mmirex"},
|
||||
{"Ritek Corp" , 97, 31, 0, 0, 0, 0, "TDK"},
|
||||
{"Grand Advance Technology Sdn. Bhd." , 97, 31, 30, 0, 0, 0, ""},
|
||||
{"TDK Corporation" , 97, 32, 00, 0, 0, 0, ""},
|
||||
{"Prodisc Technology Inc." , 97, 32, 10, 0, 0, 0, "Smartbuy, Mitsubishi, Digmaster, LG, Media Market"},
|
||||
{"Mitsubishi Chemical Corporation" , 97, 34, 20, 0, 0, 0, "YAMAHA, Verbatim"},
|
||||
{"Mitsui Chemicals Inc." , 97, 48, 50, 0, 0, 0, ""},
|
||||
{"TDK Corporation" , 97, 49, 0, 0, 0, 0, ""},
|
||||
{"", 0, 0, 0, 0, 0, 0, ""}
|
||||
};
|
||||
|
||||
int i, f_li_0;
|
||||
char buf[1024];
|
||||
char *result = NULL;
|
||||
|
||||
if (m_li == 0 && s_li == 2 && f_li == 0) {
|
||||
result = strdup("(no manufacturer code)");
|
||||
return result;
|
||||
}
|
||||
f_li_0 = f_li - (f_li % 10);
|
||||
for (i = 0; mid_list[i].manufacturer[0]; i++) {
|
||||
if (m_li == mid_list[i].m_li &&
|
||||
@ -134,6 +165,7 @@ char *burn_guess_cd_manufacturer(int m_li, int s_li, int f_li,
|
||||
/* ts A90904 */
|
||||
struct dvd_mid_record {
|
||||
char *mc1;
|
||||
char *mc2;
|
||||
int mc1_sig_len;
|
||||
char *manufacturer;
|
||||
};
|
||||
@ -152,50 +184,49 @@ char *burn_guess_manufacturer(int prf,
|
||||
Especially: ' ' -> '_' , {"_%/" unprintables -> %XY)
|
||||
*/
|
||||
static dvd_mid_record_t mid_list[]= {
|
||||
{"AML", 8, "UML"},
|
||||
{"BeAll", 5, "BeAll Developers, Inc."},
|
||||
{"CMC", 3, "CMC Magnetics Corporation"},
|
||||
{"DAXON", 5, "Daxon Technology Inc. / Acer"},
|
||||
{"Daxon", 5, "Daxon Technology Inc. / Acer"},
|
||||
{"FUJI", 4, "Fujifilm Holdings Corporation"},
|
||||
{"INFODISC", 8, "New Star Digital Co., Ltd."},
|
||||
{"INFOME", 6, "InfoMedia Inc."},
|
||||
{"ISMMBD", 6, "Info Source Multi Media Ltd."},
|
||||
{"JVC", 3, "JVC Limited"},
|
||||
{"KIC01RG", 7, "AMC"},
|
||||
{"LD", 8, "Lead Data Inc."},
|
||||
{"LGE", 3, "LG Electronics"},
|
||||
{"MAM", 8, "Mitsui Advanced Media, Inc. Europe"},
|
||||
{"MAXELL", 6, "Hitachi Maxell Ltd."},
|
||||
{"MBI", 3, "Moser Baer India Limited"},
|
||||
{"MCC", 8, "Mitsubishi Chemical Corporation"},
|
||||
{"MCI", 8, "Mitsui Chemicals Inc."},
|
||||
{"MEI", 3, "Panasonic Corporation"},
|
||||
{"MKM", 3, "Mitsubishi Kagaku Media Co."},
|
||||
{"MMC", 8, "Mitsubishi Kagaku Media Co."},
|
||||
{"MXL", 8, "Hitachi Maxell Ltd."},
|
||||
{"NANYA", 5, "Nan-Ya Plastics Corporation"},
|
||||
{"NSD", 8, "NESA International Inc."},
|
||||
{"OPTODISC", 8, "Optodisc Technology Corporation"},
|
||||
{"OTCBDR", 8, "Optodisc Technology Corporation"},
|
||||
{"PHILIP", 8, "Moser Baer India Limited"},
|
||||
{"PHILIPS", 8, "Philips"},
|
||||
{"PRINCO", 6, "Princo Corporation"},
|
||||
{"PRODISC", 7, "Prodisc Technology Inc."},
|
||||
{"Prodisc", 7, "Prodisc Technology Inc."},
|
||||
{"PVC", 3, "Pioneer"},
|
||||
{"RICOHJPN", 8, "Ricoh Company Limited"},
|
||||
{"RITEK", 5, "Ritek Corp"},
|
||||
{"SONY", 4, "Sony Corporation"},
|
||||
{"TDK", 3, "TDK Corporation"},
|
||||
{"TT", 8, "TDK Corporation"},
|
||||
{"TY", 8, "Taiyo Yuden Company Limited"},
|
||||
{"TYG", 3, "Taiyo Yuden Company Limited"},
|
||||
{"UME", 3, "UmeDisc Limited"},
|
||||
{"UTJR001", 7, "Unifino Inc."},
|
||||
{"VERBAT", 5, "Mitsubishi Kagaku Media Co."},
|
||||
{"YUDEN", 5, "Taiyo Yuden Company Limited"},
|
||||
{"", 0, ""}
|
||||
{"AML", "", 8, "UML"},
|
||||
{"BeAll", "", 5, "BeAll Developers, Inc."},
|
||||
{"CMC", "", 3, "CMC Magnetics Corporation"},
|
||||
{"DAXON", "", 5, "Daxon Technology Inc. / Acer"},
|
||||
{"Daxon", "", 5, "Daxon Technology Inc. / Acer"},
|
||||
{"FUJI", "", 4, "Fujifilm Holdings Corporation"},
|
||||
{"INFODISC", "", 8, "New Star Digital Co., Ltd."},
|
||||
{"INFOME", "", 6, "InfoMedia Inc."},
|
||||
{"ISMMBD", "", 6, "Info Source Multi Media Ltd."},
|
||||
{"JVC", "", 3, "JVC Limited"},
|
||||
{"KIC01RG", "", 7, "AMC"},
|
||||
{"LD", "", 8, "Lead Data Inc."},
|
||||
{"LGE", "", 3, "LG Electronics"},
|
||||
{"MAM", "", 8, "Mitsui Advanced Media, Inc. Europe"},
|
||||
{"MAXELL", "", 6, "Hitachi Maxell Ltd."},
|
||||
{"MBI", "", 3, "Moser Baer India Limited"},
|
||||
{"MCC", "", 8, "Mitsubishi Chemical Corporation"},
|
||||
{"MCI", "", 8, "Mitsui Chemicals Inc."},
|
||||
{"MEI", "", 3, "Panasonic Corporation"},
|
||||
{"MKM", "", 3, "Mitsubishi Kagaku Media Co."},
|
||||
{"MMC", "", 8, "Mitsubishi Kagaku Media Co."},
|
||||
{"MXL", "", 8, "Hitachi Maxell Ltd."},
|
||||
{"NANYA", "", 5, "Nan-Ya Plastics Corporation"},
|
||||
{"NSD", "", 8, "NESA International Inc."},
|
||||
{"OPTODISC", "", 8, "Optodisc Technology Corporation"},
|
||||
{"OTCBDR", "", 8, "Optodisc Technology Corporation"},
|
||||
{"PHILIP", "", 8, "Moser Baer India Limited"},
|
||||
{"PHILIPS", "", 8, "Philips"},
|
||||
{"PRINCO", "", 6, "Princo Corporation"},
|
||||
{"PRODISC", "", 7, "Prodisc Technology Inc."},
|
||||
{"Prodisc", "", 7, "Prodisc Technology Inc."},
|
||||
{"PVC", "", 3, "Pioneer"},
|
||||
{"RICOHJPN", "", 8, "Ricoh Company Limited"},
|
||||
{"RITEK", "", 5, "Ritek Corp"},
|
||||
{"SONY", "", 4, "Sony Corporation"},
|
||||
{"TDK", "", 3, "TDK Corporation"},
|
||||
{"TT", "", 8, "TDK Corporation"},
|
||||
{"TY", "", 8, "Taiyo Yuden Company Limited"},
|
||||
{"TYG", "", 3, "Taiyo Yuden Company Limited"},
|
||||
{"UTJR001", "", 7, "Unifino Inc."},
|
||||
{"VERBAT", "", 5, "Mitsubishi Kagaku Media Co."},
|
||||
{"YUDEN", "", 5, "Taiyo Yuden Company Limited"},
|
||||
{"", "", 0, ""}
|
||||
};
|
||||
|
||||
if (media_code2 != NULL &&
|
||||
@ -293,38 +324,3 @@ ex:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* ts B11216 */
|
||||
/** Read a line from fp and strip LF or CRLF */
|
||||
char *burn_sfile_fgets(char *line, int maxl, FILE *fp)
|
||||
{
|
||||
int l;
|
||||
char *ret;
|
||||
|
||||
ret = fgets(line, maxl, fp);
|
||||
if (ret == NULL)
|
||||
return NULL;
|
||||
l = strlen(line);
|
||||
if (l > 0)
|
||||
if (line[l - 1] == '\r')
|
||||
line[--l] = 0;
|
||||
if (l > 0)
|
||||
if (line[l - 1] == '\n')
|
||||
line[--l] = 0;
|
||||
if(l > 0)
|
||||
if(line[l - 1] == '\r')
|
||||
line[--l] = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
char *burn_printify(char *msg)
|
||||
{
|
||||
char *cpt;
|
||||
|
||||
for (cpt = msg; *cpt != 0; cpt++)
|
||||
if (*cpt < 32 || *cpt > 126)
|
||||
*cpt = '#';
|
||||
return msg;
|
||||
}
|
||||
|
||||
|
@ -1,11 +1,11 @@
|
||||
#ifndef __UTIL
|
||||
#define __UTIL
|
||||
|
||||
char *burn_strdup(char *s);
|
||||
|
||||
char *burn_strndup(char *s, int n);
|
||||
|
||||
/* ts A90905 */
|
||||
int burn_util_make_printable_word(char **text, int flag);
|
||||
|
||||
/* ts B11216 */
|
||||
char *burn_sfile_fgets(char *line, int maxl, FILE *fp);
|
||||
char *burn_printify(char *msg);
|
||||
|
||||
#endif
|
||||
|
1100
libburn/write.c
1100
libburn/write.c
File diff suppressed because it is too large
Load Diff
@ -37,14 +37,7 @@ int burn_write_flush(struct burn_write_opts *o, struct burn_track *track);
|
||||
/* ts A61030 : necessary for TAO */
|
||||
int burn_write_close_track(struct burn_write_opts *o, struct burn_session *s,
|
||||
int tnum);
|
||||
int burn_write_close_session(struct burn_write_opts *o);
|
||||
|
||||
/* @param flag bit0= repair checksum
|
||||
bit1= repair checksum if all pack CRCs are 0
|
||||
@return 0= no mismatch , >0 number of unrepaired mismatches
|
||||
<0 number of repaired mismatches
|
||||
*/
|
||||
int burn_cdtext_crc_mismatches(unsigned char *packs, int num_packs, int flag);
|
||||
int burn_write_close_session(struct burn_write_opts *o,struct burn_session *s);
|
||||
|
||||
|
||||
|
||||
|
@ -25,19 +25,18 @@
|
||||
#include "../libburn/libdax_msgs.h"
|
||||
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 */
|
||||
|
||||
/* 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 */
|
||||
#include "../libburn/libburn.h"
|
||||
|
||||
#endif /* ! Dewav_without_libburN */
|
||||
|
||||
|
||||
/* The API for .wav extraction */
|
||||
#include "../libburn/libdax_audioxtr.h"
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
|
@ -1,6 +1,6 @@
|
||||
|
||||
/* 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 */
|
||||
|
||||
|
||||
@ -20,37 +20,31 @@
|
||||
Before you can do anything, you have to initialize libburn by
|
||||
burn_initialize()
|
||||
and provide some signal and abort handling, e.g. by the builtin handler, by
|
||||
burn_set_signal_handling("libburner : ", NULL, 0x0)
|
||||
as it is done in main() at the end of this file.
|
||||
Then you aquire a drive in an appropriate way conforming to the API. The twoi
|
||||
main approaches are shown here in application functions:
|
||||
burn_set_signal_handling()
|
||||
as it is done in main() at the end of this file. Then you aquire a
|
||||
drive in an appropriate way conforming to the API. The two main
|
||||
approaches are shown here in application functions:
|
||||
libburner_aquire_by_adr() demonstrates usage as of cdrecord traditions
|
||||
libburner_aquire_by_driveno() demonstrates a scan-and-choose approach
|
||||
|
||||
With that aquired drive you can blank a CD-RW or DVD-RW as shown in
|
||||
With that aquired drive you can blank a CD-RW or DVD-RW
|
||||
libburner_blank_disc()
|
||||
or you can format a DVD-RW to profile "Restricted Overwrite" (needed once)
|
||||
or an unused BD to default size with spare blocks
|
||||
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()
|
||||
|
||||
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:
|
||||
burn_drive_release();
|
||||
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
|
||||
#define _LARGEFILE_SOURCE
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
@ -66,7 +60,7 @@
|
||||
/* This program insists in the own headerfile. */
|
||||
#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 <ctype.h>
|
||||
#include <sys/types.h>
|
||||
@ -218,7 +212,7 @@ int libburner_aquire_by_driveno(int *driveno)
|
||||
printf("\nOverview of accessible drives (%d found) :\n",
|
||||
drive_count);
|
||||
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)
|
||||
strcpy(adr, "-get_adr_failed-");
|
||||
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");
|
||||
return 2; /* the program will end after this */
|
||||
}
|
||||
if ((int) drive_count <= *driveno) {
|
||||
if (drive_count <= *driveno) {
|
||||
fprintf(stderr,
|
||||
"Found only %d drives. Number %d not available.\n",
|
||||
drive_count, *driveno);
|
||||
@ -263,7 +257,7 @@ int libburner_aquire_by_driveno(int *driveno)
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
continue;
|
||||
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)
|
||||
return -1;
|
||||
/* Back to synchronous handling */
|
||||
burn_set_signal_handling("libburner : ", NULL, 0x0);
|
||||
burn_set_signal_handling("libburner : ", NULL, 0);
|
||||
printf("Done\n");
|
||||
return 1;
|
||||
}
|
||||
@ -407,7 +401,7 @@ int libburner_format(struct burn_drive *drive)
|
||||
}
|
||||
if (burn_is_aborting(0) > 0)
|
||||
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,
|
||||
current_profile_name);
|
||||
if (current_profile == 0x14 || current_profile == 0x13)
|
||||
@ -738,13 +732,6 @@ int main(int argc, char **argv)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* A warning to programmers who start their own projekt from here. */
|
||||
if (sizeof(off_t) != 8) {
|
||||
fprintf(stderr,
|
||||
"\nFATAL: Compile time misconfiguration. off_t is not 64 bit.\n\n");
|
||||
exit(39);
|
||||
}
|
||||
|
||||
ret = libburner_setup(argc, argv);
|
||||
if (ret)
|
||||
exit(ret);
|
||||
@ -763,7 +750,7 @@ int main(int argc, char **argv)
|
||||
|
||||
/* Activate the synchronous signal handler which eventually will try to
|
||||
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 */
|
||||
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)
|
||||
{
|
||||
enum burn_disc_status s;
|
||||
|
||||
fprintf(stderr, "polling disc in %s - %s:\n",
|
||||
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))
|
||||
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);
|
||||
|
||||
while (NEXT == 0) {
|
||||
@ -64,7 +67,7 @@ int main()
|
||||
|
||||
newact.sa_handler = catch_int;
|
||||
sigaction(SIGINT, &newact, &oldact);
|
||||
for (i = 0; i < (int) n_drives; i++) {
|
||||
for (i = 0; i < n_drives; i++) {
|
||||
NEXT=0;
|
||||
poll_drive(i);
|
||||
}
|
||||
|
@ -12,9 +12,6 @@ int main(int argc, char **argv)
|
||||
struct burn_session *session;
|
||||
struct burn_source *src;
|
||||
|
||||
burn_initialize();
|
||||
burn_msgs_set_severities("NEVER", "ALL", "structest: ");
|
||||
|
||||
disc = burn_disc_create();
|
||||
session = burn_session_create();
|
||||
burn_disc_add_session(disc, session, BURN_POS_END);
|
||||
|
144
test/telltoc.c
144
test/telltoc.c
@ -1,15 +1,14 @@
|
||||
|
||||
/* 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 */
|
||||
|
||||
/** Overview
|
||||
|
||||
telltoc is a minimal demo application for the library libburn as provided
|
||||
on http://libburnia-project.org . It can list the available devices, can
|
||||
display some drive properties, the type of media, eventual table of content,
|
||||
multisession info for mkisofs option -C, and can read audio or data tracks.
|
||||
|
||||
display some drive properties, the type of media, eventual table of content
|
||||
and multisession info for mkisofs option -C .
|
||||
It's main purpose, nevertheless, is to show you how to use libburn and also
|
||||
to serve the libburn team as reference application. telltoc.c does indeed
|
||||
define the standard way how above gestures can be implemented and stay upward
|
||||
@ -26,9 +25,8 @@
|
||||
telltoc_media() prints some information about the media in a drive
|
||||
telltoc_toc() prints a table of content (if there is content)
|
||||
telltoc_msinfo() prints parameters for mkisofs option -C
|
||||
telltoc_read_and_print() reads from audio or data CD or from DVD or BD
|
||||
and prints 7-bit to stdout (encodings 0,2) or 8-bit to
|
||||
file (encoding 1)
|
||||
telltoc_read_and_print() reads from data CD or from DVD and prints 7-bit
|
||||
to stdout (encodings 0,2) or 8-bit to file (encoding 1)
|
||||
When everything is done, main() releases the drive and shuts down libburn:
|
||||
burn_drive_release();
|
||||
burn_finish()
|
||||
@ -77,10 +75,9 @@ int telltoc_aquire_by_adr(char *drive_adr);
|
||||
int telltoc_aquire_by_driveno(int *drive_no, int silent);
|
||||
|
||||
|
||||
/* Messages from --toc to --read_and_print (CD tracksize is a bit tricky) */
|
||||
/* A message from --toc to --read_and_print (CD tracksize is a bit tricky) */
|
||||
static int last_track_start = 0, last_track_size = -1;
|
||||
static int medium_is_cd_profile = 0; /* 0 = undecided , -1 = no , 1 = yes */
|
||||
static int cd_is_audio = 0; /* 0 = undecided , -1 = no , 1 = yes */
|
||||
static int media_is_cd_profile = 0;
|
||||
|
||||
|
||||
/* ------------------------------- API gestures ---------------------------- */
|
||||
@ -181,7 +178,7 @@ int telltoc_aquire_by_driveno(int *driveno, int silent_drive)
|
||||
}
|
||||
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))
|
||||
continue;
|
||||
if (burn_drive_get_adr(&(drive_list[i]), adr) <=0)
|
||||
@ -200,7 +197,7 @@ int telltoc_aquire_by_driveno(int *driveno, int silent_drive)
|
||||
/* We already made our choice via command line. (default is 0)
|
||||
So we just have to keep our desired drive and drop all others.
|
||||
*/
|
||||
if ((int) drive_count <= *driveno) {
|
||||
if (drive_count <= *driveno) {
|
||||
fprintf(stderr,
|
||||
"Found only %d drives. Number %d not available.\n",
|
||||
drive_count, *driveno);
|
||||
@ -208,7 +205,7 @@ int telltoc_aquire_by_driveno(int *driveno, int silent_drive)
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
continue;
|
||||
ret = burn_drive_info_forget(&(drive_list[i]),0);
|
||||
@ -467,25 +464,12 @@ int telltoc_formatlist(struct burn_drive *drive)
|
||||
}
|
||||
|
||||
|
||||
void telltoc_detect_cd(struct burn_drive *drive)
|
||||
{
|
||||
int pno;
|
||||
char profile_name[80];
|
||||
|
||||
if (burn_disc_get_profile(drive, &pno, profile_name) > 0) {
|
||||
if (pno >= 0x08 && pno <= 0x0a)
|
||||
medium_is_cd_profile = 1;
|
||||
else
|
||||
medium_is_cd_profile = -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int telltoc_toc(struct burn_drive *drive)
|
||||
{
|
||||
int num_sessions = 0 , num_tracks = 0 , lba = 0, pmin, psec, pframe;
|
||||
int track_count = 0, track_is_audio;
|
||||
int track_count = 0, pno;
|
||||
int session_no, track_no;
|
||||
char profile_name[80];
|
||||
struct burn_disc *disc= NULL;
|
||||
struct burn_session **sessions;
|
||||
struct burn_track **tracks;
|
||||
@ -515,20 +499,10 @@ int telltoc_toc(struct burn_drive *drive)
|
||||
pframe = toc_entry.pframe;
|
||||
lba= burn_msf_to_lba(pmin, psec, pframe);
|
||||
}
|
||||
|
||||
if ((toc_entry.control & 7) < 4) {
|
||||
if (cd_is_audio == 0)
|
||||
cd_is_audio = 1;
|
||||
track_is_audio = 1;
|
||||
} else {
|
||||
track_is_audio = 0;
|
||||
cd_is_audio = -1;
|
||||
}
|
||||
|
||||
printf("Media content: session %2d ", session_no+1);
|
||||
printf("track %2d %s lba: %9d %4.2d:%2.2d:%2.2d\n",
|
||||
track_count,
|
||||
(track_is_audio ? "audio" : "data "),
|
||||
((toc_entry.control&7)<4?"audio":"data "),
|
||||
lba, pmin, psec, pframe);
|
||||
last_track_start = lba;
|
||||
}
|
||||
@ -547,7 +521,10 @@ int telltoc_toc(struct burn_drive *drive)
|
||||
printf("leadout lba: %9d %4.2d:%2.2d:%2.2d\n",
|
||||
lba, pmin, psec, pframe);
|
||||
last_track_size = lba - last_track_start;
|
||||
telltoc_detect_cd(drive);
|
||||
if (burn_disc_get_profile(drive, &pno, profile_name) > 0)
|
||||
if (pno == 0x09 || pno == 0x0a)
|
||||
media_is_cd_profile = 1;
|
||||
|
||||
}
|
||||
if (disc!=NULL)
|
||||
burn_disc_free(disc);
|
||||
@ -620,26 +597,27 @@ int telltoc_read_and_print(struct burn_drive *drive,
|
||||
int start_sector, int sector_count, char *raw_file, int encoding)
|
||||
{
|
||||
int j, i, request = 16, done, lbas = 0, final_cd_try = -1, todo;
|
||||
int ret = 0, sector_size, chunk_size, read_audio = 0;
|
||||
int ret = 0;
|
||||
char buf[16 * 2048], line[81];
|
||||
off_t data_count, total_count= 0, last_reported_count= 0;
|
||||
struct stat stbuf;
|
||||
FILE *raw_fp = NULL;
|
||||
|
||||
if (medium_is_cd_profile == 0)
|
||||
telltoc_detect_cd(drive);
|
||||
if (start_sector == -1)
|
||||
start_sector = last_track_start;
|
||||
if (sector_count == -1) {
|
||||
sector_count = last_track_start + last_track_size
|
||||
- start_sector;
|
||||
if (medium_is_cd_profile > 0) /* In case it is a TAO track */
|
||||
if (media_is_cd_profile) /* In case it is a TAO track */
|
||||
final_cd_try = 0; /* allow it (-1 is denial) */
|
||||
}
|
||||
|
||||
if (start_sector < 0)
|
||||
start_sector = 0;
|
||||
if (sector_count <= 0)
|
||||
sector_count = 2147483632;
|
||||
|
||||
if (sector_count <= 0)
|
||||
return -1;
|
||||
if (encoding == 1) {
|
||||
if (stat(raw_file,&stbuf) != -1) {
|
||||
if (!(S_ISCHR(stbuf.st_mode) || S_ISFIFO(stbuf.st_mode)
|
||||
@ -662,45 +640,16 @@ int telltoc_read_and_print(struct burn_drive *drive,
|
||||
printf(
|
||||
"Data : start=%ds , count=%ds , read=0 , encoding=%d\n",
|
||||
start_sector, sector_count, encoding);
|
||||
|
||||
/* Whether to read audio or data */
|
||||
if (cd_is_audio > 0) {
|
||||
read_audio = 1;
|
||||
} else if (medium_is_cd_profile > 0 && cd_is_audio == 0) {
|
||||
/* Try whether the start sector is audio */
|
||||
ret = burn_read_audio(drive, start_sector,
|
||||
buf, (off_t) 2352, &data_count, 2 | 4);
|
||||
if (ret > 0)
|
||||
read_audio = 1;
|
||||
}
|
||||
if (read_audio) {
|
||||
sector_size = 2352;
|
||||
chunk_size = 12;
|
||||
} else {
|
||||
sector_size = 2048;
|
||||
chunk_size = 16;
|
||||
if (start_sector < 0)
|
||||
start_sector = 0;
|
||||
}
|
||||
|
||||
todo = sector_count - 2*(final_cd_try > -1);
|
||||
for (done = 0; done < todo && final_cd_try != 1; done += request) {
|
||||
if (todo - done > chunk_size)
|
||||
request = chunk_size;
|
||||
if (todo - done > 16)
|
||||
request = 16;
|
||||
else
|
||||
request = todo - done;
|
||||
|
||||
if (read_audio) {
|
||||
ret = burn_read_audio(drive, start_sector + done,
|
||||
buf, (off_t) (request * sector_size),
|
||||
&data_count, 0);
|
||||
} else {
|
||||
ret = burn_read_data(drive,
|
||||
((off_t) start_sector + done) *
|
||||
(off_t) sector_size,
|
||||
buf, (off_t) (request * sector_size),
|
||||
&data_count, 1);
|
||||
}
|
||||
ret = burn_read_data(drive,
|
||||
((off_t) start_sector + done) * (off_t) 2048,
|
||||
buf, (off_t) (request * 2048), &data_count, 1);
|
||||
|
||||
print_result:;
|
||||
total_count += data_count;
|
||||
if (encoding == 1) {
|
||||
@ -709,8 +658,8 @@ print_result:;
|
||||
} else for (i = 0; i < data_count; i += 16) {
|
||||
if (encoding == 0) {
|
||||
sprintf(line, "%8ds + %4d : ",
|
||||
start_sector + done + i / sector_size,
|
||||
i % sector_size);
|
||||
start_sector + done + i / 2048,
|
||||
i % 2048);
|
||||
lbas = strlen(line);
|
||||
}
|
||||
for (j = 0; j < 16 && i + j < data_count; j++) {
|
||||
@ -726,11 +675,11 @@ print_result:;
|
||||
printf("%s\n",line);
|
||||
}
|
||||
if (encoding == 1 &&
|
||||
total_count - last_reported_count >= 1000 * sector_size) {
|
||||
total_count - last_reported_count >= 1000 * 2048) {
|
||||
fprintf(stderr,
|
||||
"\rReading data : start=%ds , count=%ds , read=%ds ",
|
||||
start_sector, sector_count,
|
||||
(int) (total_count / (off_t) sector_size));
|
||||
(int) (total_count / (off_t) 2048));
|
||||
last_reported_count = total_count;
|
||||
}
|
||||
if (ret <= 0) {
|
||||
@ -738,21 +687,13 @@ print_result:;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ret > 0 && medium_is_cd_profile > 0 && final_cd_try == 0) {
|
||||
if (ret > 0 && media_is_cd_profile && final_cd_try == 0) {
|
||||
/* In a SAO track the last 2 frames should be data too */
|
||||
final_cd_try = 1;
|
||||
if (read_audio) {
|
||||
ret = burn_read_audio(drive, start_sector + todo,
|
||||
buf, (off_t) (2 * sector_size),
|
||||
&data_count, 2);
|
||||
} else {
|
||||
burn_read_data(drive,
|
||||
((off_t) start_sector + todo) *
|
||||
(off_t) sector_size,
|
||||
buf, (off_t) (2 * sector_size),
|
||||
&data_count, 2);
|
||||
}
|
||||
if (data_count < 2 * sector_size)
|
||||
burn_read_data(drive,
|
||||
((off_t) start_sector + todo) * (off_t) 2048,
|
||||
buf, (off_t) (2 * 2048), &data_count, 2);
|
||||
if (data_count < 2 * 2048)
|
||||
fprintf(stderr, "\rNOTE : Last two frames of CD track unreadable. This is normal if TAO track.\n");
|
||||
if (data_count > 0)
|
||||
goto print_result;
|
||||
@ -761,8 +702,7 @@ print_result:;
|
||||
fprintf(stderr,
|
||||
"\r \r");
|
||||
printf("End Of Data : start=%ds , count=%ds , read=%ds\n",
|
||||
start_sector, sector_count,
|
||||
(int) (total_count / (off_t) sector_size));
|
||||
start_sector, sector_count,(int) (total_count / (off_t) 2048));
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -868,10 +808,10 @@ int telltoc_setup(int argc, char **argv)
|
||||
printf(" mkisofs ... -C \"$msinfo\" ...\n");
|
||||
printf("Obtain what is available about drive 0 and its media\n");
|
||||
printf(" %s --drive 0\n",argv[0]);
|
||||
printf("View blocks 16 to 19 of audio or data CD or DVD or BD in human readable form\n");
|
||||
printf("View blocks 16 to 19 of data CD or DVD in human readable form\n");
|
||||
printf(" %s --drive /dev/sr1 --read_and_print 16 4 0 | less\n",
|
||||
argv[0]);
|
||||
printf("Copy last track from CD to file /tmp/data\n");
|
||||
printf("Copy last data track from CD to file /tmp/data\n");
|
||||
printf(" %s --drive /dev/sr1 --toc --read_and_print -1 -1 raw:/tmp/data\n",
|
||||
argv[0]);
|
||||
}
|
||||
@ -951,7 +891,7 @@ int main(int argc, char **argv)
|
||||
if (ret<=0)
|
||||
{ret = 38; goto release_drive; }
|
||||
}
|
||||
if (read_start != -2 && (read_count > 0 || read_count == -1)) {
|
||||
if (read_start >= -1 && (read_count > 0 || read_count == -1)) {
|
||||
ret = telltoc_read_and_print(drive_list[driveno].drive,
|
||||
read_start, read_count, print_raw_file,
|
||||
print_encoding);
|
||||
|
Reference in New Issue
Block a user