Compare commits

..

4 Commits

147 changed files with 40809 additions and 132729 deletions

View File

@ -1,4 +1,3 @@
Thomas Schmitt
Vreixo Formoso Lopes
Nio Wiklund alias sudodus

View File

@ -1,8 +1,12 @@
Mario Danic <mario.danic@gmail.com>,
Vreixo Formoso <metalpain2002@yahoo.es>
Thomas Schmitt <scdbackup@gmx.net>
libisoburn is Copyright (C) 2007-2017 Vreixo Formoso, Thomas Schmitt
xorriso is Copyright (C) 2007-2017 Thomas Schmitt
libisoburn is Copyright (C) 2007-2010 Vreixo Formoso, Thomas Schmitt
xorriso is Copyright (C) 2007-2010 Thomas Schmitt
libisofs (if included) is Copyright (C) 2007-2010 Vreixo Formoso, Mario Danic
libburn (if included) is Copyright (C) 2002-2006 Derek Foreman, Ben Jansens
and Copyright (C) 2006-2010 Mario Danic, Thomas Schmitt
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2

950
ChangeLog
View File

@ -1,950 +0,0 @@
git clone git@dev.lovelyhq.com:libburnia/libisoburn.git
(to become libisoburn-1.5.8 or higher)
===============================================================================
* Bug fix: -boot_image and -append_partition were not perceived as image
manipulation which makes production of an ISO image worthwhile.
Thanks Cameron Seader.
* Bug fix: -outdev holding an ISO filesystem could get attached wrong start LBA
* Bug fix: Command -load "volid" did not work with constant search text
* Bug fix: Command -truncate_overwritable on ISO image without MD5 caused
double free of memory
* Bug fix: -boot_image "any" "replay" failed after the legacy BIOS boot image
file was replaced by -map. Thanks Brian C. Lane.
* Bug fix: -boot_image system_area=/dev/zero preserved system area of
loaded ISO
* Bug fix: Size assessment of ISO images smaller than 32 KiB yielded
random values
* Bug fix: -extract_boot_images reports "No such file or directory" when
complaining over an existing target file
* Bug fix: Reproducibility of ISO images depended on "undefined" qsort(3)
behavior with comparer function result 0.
Report and fix proposal by Henrik Lindström.
* Bug fix: ATA and SATA drives on modern Linux refused to perform -rollback
with -scsi_dev_family "sg" because libburn registered them as ATA
without SCSI adress tuple
* Bug fix: Symbolic links with xattr could cause unusable ISO filesystems.
Thanks Paul von Behren.
* Bug fix: When reading multiple slashes in symbolic link targets from an ISO
they were condensed to a single one if not marked by the
SL ROOT-flag. Thanks Jonas 'Sortie' Termansen.
* Bug fix: Empty symbolic link target components which represent add-on
slashes were written with ROOT flag set.
Thanks Jonas 'Sortie' Termansen.
* Bug fix: The last trailing slash in a symbolic link target was not written.
Thanks Jonas 'Sortie' Termansen.
* New bit1 with API call Xorriso_change_is_pending() issues a note if
return is 0 and indev and outdev point to different drives
* New API calls isoburn_toc_disc_get_sectors_v2,
isoburn_toc_session_get_sectors_v2, isoburn_toc_track_get_emul_v2
* New API calls isoburn_read_iso_head_v2(), isoburn_get_mount_params_v2()
* New API calls isoburn_igopt_get_effective_lba_v2(),
isoburn_igopt_get_data_start_v2()
* New API call isoburn_get_attached_start_lba_v2()
* New API calls isoburn_attach_start_lba_v2(), isoburn_disc_get_msc1_v2(),
isoburn_disc_track_lba_nwa_v2()
* New API call isoburn_prepare_blind_grow_v2()
* New info return modes 3 "Creation Time" and 4 "Modification Time"
with isoburn_read_iso_head() and isoburn_read_iso_head_v2()
* New address modes 5 to 9 for isoburn_set_msc1(), isoburn_get_mount_params(),
isoburn_get_mount_params_v2()
* New API call isoburn_drive_release_v2()
* New flag bit 12 "do not ignore XFS-style project ids" with
isoburn_drive_aquire()
* New -append_partition pseudo partition_number "all" and
pseudo type_code "revoke"
* New -as mkisofs options -cut_out and -hide_iso_path
* Improved handling of hidden boot images in -boot_image cmd/as_mkisofs/replay
* The maximum number of appended GPT partitions was increased from 4 to 8
* New command -toc_info_type
* New entities "at_time", "before", "after", "not_after", "not_before" for
commands -load, -mount, -mount_cmd, -session_string, -truncate_overwritable
* New commands -lfa_flags, -lsattr, -lsattrd, -chattr, -chattr_r,
* New -find test -has_lfa_flags, -has_some_lfa_flags_of,
new -find actions lsattrd, chattr
* New -as mkisofs option --lfa_flags
* New command and -as mkisofs option -genisoimage_completion
* New parameter "leave" to command -calm_drive
* New isoburn_read_opts extension isoburn_ropt_projid
* New commands -projid, -get_projid, -get_projid_r, -set_projid, -set_projid_r
* New -find test -has_projid, actions get_projid, set_projid, get_projid_minmax
* New -as mkisofs option --projid
* New -boot_image bootspec appended_gpt_with_gaps=
* New -as mkisofs option -appended_gpt_with_gaps
GNU xorriso-1.5.6.pl02.tar.gz Wed Jun 14 2023
===============================================================================
* Bug fix: On non-GNU/Linux systems ssize_t was not defined in libisofs file
rockridge.h . Report and fix proposal by Rui Chen.
GNU xorriso-1.5.6.pl01.tar.gz Mon Jun 12 2023
===============================================================================
(A failed attempt to create a tarball with a fixed libisofs/rockridge.h)
libisoburn-1.5.6.tar.gz Wed Jun 07 2023
===============================================================================
* Bug fix: False -status failure with -boot_image --interval:appended_partition
* Bug fix: -no_rc prevented pre-scanning of arguments for stdio output and
others. Introduced by mistake in a62f6af5, 2011.10.18.162119.
* Bug fix: -not_leaf and -not_paths were not applied to -extract and alike
* Bug fix: -report_system_area cmd misperceived -part_like_isohybrid with
-isohybrid-gpt-basdat
* Bug fix: -report_system_area cmd misperceived combination of isohybrid and
appended partition in GPT
* Bug fix: -as mkisofs option -part_like_isohybrid did not cause a MBR
partition table if the partitions are data files in the ISO
rather than appended
* Bug fix: Split file directories (-split_size) were created with wrong
permissions
* Bug fix: libisofs did not mark clones of imported files as imported.
This could cause that original and clone occupy data storage
in the newly written session. Thanks to Ivan Shmakov.
* Bug fix: Partition offset was preserved from -indev rather than from -outdev
* Bug fix: libisofs could misrepresent Rock Ridge information if many
symbolic links or AAIP data were recorded in a directory
* Bug fix: Data files named /boot.catalog or ./boot.cat could be left out of
the emerging ISO if the boot catalog was set to be hidden
* Bug fix: -toc reported wrong track LBA with overwritable media with
unrecognized content (pseudo-closed)
* Bug fix: -find test -has_xattr matched "isofs." attributes
in -xattr mode "any"
* New API call isoburn_assess_written_features()
* New API calls isoburn_igopt_set_max_ce_entries(),
isoburn_igopt_get_max_ce_entries()
* New flag bit12 with isoburn_read_iso_head():
Read even if start of multi-session emulation is damaged
* New -boot_image settings gpt_iso_bootable= and gpt_iso_not_ro=
* New -as mkisofs options --gpt-iso-bootable and --gpt-iso-not-ro
* New -as cdrecord option --obs_pad. Automatic no_emul_toc with -as cdrecord.
* New parameters "obs_pad" and "bdr_obs_exempt" for -dvd_obs
* New -as cdrecord option --bdr_obs_exempt
* New command -assess_indev_features
* New -find test -size
* New -compliance rules max_ce_entries=, max_ce_drop=
* Allowed lseekable device files with -cut_out.
Proof-of-concept by Ivan Shmakov on bugs.debian.org. (Closes: #1010098)
libisoburn-1.5.4.tar.gz Sat Jan 30 2021
===============================================================================
* Bug fix: -report_system_area as_mkisofs misrepresented GPT with appended
partition and forced boot flag as -part_like_isohybrid
* Bug fix: Boot catalog could get a wrong name if cat_path= is explicitely
given but not containing a slash character
* New helper script xorriso-dd-target
* New command -truncate_overwritable
* Switched to usage of libjte-2.0.0
* New -jigdo parameters "checksum_algorithm", "demand_checksum",
"-checksum-list"
* New -as mkisofs options "-jigdo-checksum-algorithm", "-checksum-list",
"-jigdo-force-checksum"
* New -read_speed prefixes "soft_force:" and "soft_corr:"
* New -check_media option data_to="-" for standard output
* New -zisofs parameters version_2=, block_size_v2=, max_bpt=, max_bpt_f=,
bpt_target=, bpt_free_ratio=, by_magic=v2, susp_z2=
* New -as mkisofs options --zisofs-version-2, --zisofs2-susp-z2,
--zisofs2-susp-zf
* Enabled recognition of zisofs by magic without zlib support
* New -osirrox option sparse= controls extraction into sparse files
* New libisoburn extension options isoburn_ropt_map_joliet_stripped and
isoburn_ropt_map_joliet_unmapped
* New command -joliet_map
* New command -extract_boot_images
* New API call isoburn_ropt_get_tree_loaded()
libisoburn-1.5.2.tar.gz Sat Oct 26 2019
===============================================================================
* Bug fix: -disk_pattern on -add ./ -- mistook "./" for the root directory
Thanks JBThiel.
* Bug fix: -disk_pattern on -add "" -- yielded SIGSEGV
* Bug fix: -osirrox "concat_split_on" worked only together with -split_size
larger than 0. Thanks William Willems.
* New command -drive_access, new -as cdrecord option --drive_not_exclusive
* New API calls isoburn_igopt_set_part_type_guid(),
isoburn_igopt_get_part_type_guid(), isoburn_igopt_set_iso_type_guid(),
isoburn_igopt_get_iso_type_guid()
* Enabled GPT type GUIDs with -append_partition,
-boot_image any iso_mbr_part_type=, and -as mkisofs -iso_mbr_part_type
* Made libisoburn and GNU xorriso ready for building out-of-source.
Thanks Ross Burton.
libisoburn-1.5.0.tar.gz Sat Sep 15 2018
===============================================================================
* Bug fix: Multi-session emulation was not recognized with non-zero partition
offset
* New bit10 of isoburn_drive_aquire() to accept all xattr namespaces
* New -xattr mode "any" to process all xattr namespaces of local filesystem
* New -as mkisofs option --xattr-any
* New -as mkisofs options -uid and -gid
libisoburn-1.4.8.tar.gz Tue Sep 12 2017
===============================================================================
* Bug fix: -as mkisofs -no-emul-boot without -boot-load-size defaulted to
size 4, instead of full boot image size
* Bug fix: -read_fs "norock" did not prevent reading of root Rock Ridge info
* Bug fix: Mix of absolute and relative disk paths could cause SIGSEGV with
pattern expansion
* Bug fix: --mbr-force-bootable did not get into effect with -append_partition
* Bug fix: Exit value of failed -mount command was reported as 0
* Bug fix: -boot_image actions "keep" and "patch" did not work any more.
Regression by libisofs 1.4.4.
* New -find tests -maxdepth and -mindepth
* New commands -update_lxi and -update_li
* New API calls isoburn_igopt_set_iso_mbr_part_type(),
isoburn_igopt_get_iso_mbr_part_type()
* New -boot_image bootspec iso_mbr_part_type=
* New -as mkisofs option -iso_mbr_part_type
* New -as mkisofs option -eltorito-platform
* Properly refusing on Pseudo Overwritable formatted BD-R
libisoburn-1.4.6.tar.gz Fri Sep 16 2016
===============================================================================
* Bug fix: The default setting of -compliance did not apply rec_mtime to
Joliet and ISO:1999. mkisofs emulation was not affected by this bug.
* Bug fix: -file_size_limit did not increase ISO level if necessary.
Thanks to Mattias Schlenker.
* New API calls isoburn_igopt_set_gpt_guid(), isoburn_igopt_get_gpt_guid()
* New command -use_immed_bit, new -as cdrecord option use_immed_bit=
* New -volume_date mode "all_file_dates"
* New -as mkisofs option --set_all_file_dates
* New bootspec "gpt_disk_guid=", new -as mkisofs option --gpt_disk_guid
* New -report_system_area modes "gpt_disk_guid", "make_guid"
* New environment variable SOURCE_DATE_EPOCH
* New -find action "set_to_mtime"
libisoburn-1.4.4.tar.gz Fri Jul 01 2016
===============================================================================
* Bug fix: -as mkisofs did not unescape "\=" in the source part of pathspecs
* Bug fix: -boot_image "any" "system_area=/dev/zero" did not zeroize loaded
data
* Bug fix: -pathspecs "on" did not properly handle "\\="
* Bug fix: HFS+ production could cause MBR partition of type 0xEE without GPT
* Bug fix: HFS+ directories could announce more children than they actually have
* Bug fix: The HFS+ filesystem was not marked by in GPT of GRUB2 hybrid layout
* Bug fix: When reading an ISO filesystem, the presence of
--protective-msdos-label was not recognized if a partition is
appended
* Bug fix: xorrisofs option --protective-msdos-label did not work if no
system area data were given by option -G or alike
* Bug fix: -modesty_on_drive properties timeout_sec, min_usec, max_usec
read wrong numbers from the parameter text
* Letting -as mkisofs --norock revoke the special effect of -r
* Letting -blank on overwritable media invalidate UDF extended descriptors
* New -pathspecs mode "as_mkisofs"
* New -boot_image setting mbr_force_bootable=, -as mkisofs --mbr-force-bootable
* New -boot_image bootspecs appended_part_as=apm, part_like_isohybrid=on
* New -as mkisofs options -appended_part_as_apm, -part_like_isohybrid
* New command -scsi_dev_family, new -as cdrecord option drive_scsi_dev_family=
libisoburn-1.4.2.tar.gz Sat Nov 28 2015
===============================================================================
* Bug fix: -backslash_codes "on" did not work outside quotes
and with showing "\r"
* New API calls isoburn_ropt_set_truncate_mode() isoburn_ropt_get_truncate_mode()
* New options with isoburn_ropt_set_extensions(): isoburn_ropt_map_*
* New command -modesty_on_drive,
new -as cdrecord -immed, minbuf=, modesty_on_drive=
* New command -ecma119_map
* New command -read_fs
* New -boot_image action "replay"
* New command -file_name_limit, -as mkisofs -file_name_limit
* New -find test -name_limit_blocker.
* Result of a Coverity audit: 50+ code changes, but no easy-to-trigger bugs
libisoburn-1.4.0.tar.gz Sun May 17 2015
===============================================================================
* Bug fix: -dev or -indev of medium with non-ISO data caused SIGSEGV by NULL
* New API calls isoburn_igopt_set_appended_as_gpt(),
isoburn_igopt_get_appended_as_gpt()
* New API call isoburn_igopt_set_part_flag() and libisofs interval reader flags
* New -find action "show_stream_id"
* Optional libisofs interval reader with -append_partition and System Area
* New -boot_image bootspec "appended_part_as=",
new -as mkisofs option -appended_part_as_gpt
* New -report_system_area formats "cmd" and "as_mkisofs"
libisoburn-1.3.8.tar.gz Sat Jun 28 2014
===============================================================================
* Bug fix: -boot_image grub grub2_mbr= did not work
(but -as mkisofs --grub2-mbr did work)
* Bug fix: -boot_image grub2_mbr= prevented -boot_image partition_table=on
* Bug fix: libburn: A final fsync(2) was performed with stdio drives,
even if -stdio_sync was set to "off".
* Bug fix: libburn: Wrong stack usage caused SIGBUS on sparc when compiled
by gcc -O2
* Bug fix: -blank force:all on DVD+RW had no effect
* Enabled use of libedit as alternative to libreadline
* Enabled recording and restoring of extattr on NetBSD
* New API calls isoburn_igopt_set_stdio_endsync() and
isoburn_igopt_get_stdio_endsync
* New bootspecs hppa_*, new -as mkisofs options -hppa-* for HP-PA via PALO
* New -find pseudo tests -use_pattern , -or_use_pattern
* New -find action report_sections
* New command -concat
* New commands -report_system_area and -report_el_torito
libisoburn-1.3.6.pl01.tar.gz Tue Mar 18 2014
===============================================================================
* Bug fix: Command -status produced FAILURE event if no drive was acquired
Regression introduced by release 1.3.6
* Bug fix: libburn : Compilation warning for unsupported systems mutated
into an error. Regression introduced by release 1.3.6.
* Bug fix: libburn : CD TAO with add-on sessions could cause a buffer overrun.
Introduced 7 years ago by release 0.3.2.
libisoburn-1.3.6.tar.gz Tue Mar 04 2014
===============================================================================
* Bug fix: libisofs: Division by zero if HFS+ was combined with TOC emulation
for overwritable media.
* Bug fix: -list_speeds did not work any more with old CD drives.
Regression introduced by release 1.3.4
* Bug fix: -check_media marked untested sectors in sector map as valid
* Bug fix: Paths with symbolic links preceding ".." were not interpreted
properly
* New isoburn_igopt_set_relaxed() relaxation isoburn_igopt_joliet_utf16
* New -compliance rule joliet_utf16, new -as mkisofs option -joliet-utf16
* New -find test -bad_outname, new -find action print_outname
* New API call isoburn_conv_name_chars()
* libburn: New system adapter for NetBSD
libisoburn-1.3.4.tar.gz Thu Dec 12 2013
===============================================================================
* Bug fix: Command -blank "as_needed" formatted blank BD-R.
* Bug fix: -as mkisofs option -log-file put the log file into the image
* Bug fix: -cut_out did not add x-permission to r-permission of directory
* Bug fix: Command -zisofs did not accept all options emitted by
-status -zisofs
* Bug fix: -blank force:... failed on appendable or closed media
* Bug fix: libburn: Drive LG BH16NS40 stalled on inspection of unformatted
DVD+RW
* libisofs: Default sort weight of El Torito boot images is now 2
* libisofs: Encoding HFS+ names in UTF-16 rather than UCS-2
* New command -read_speed
* New -close mode "as_needed", new -as cdrecord option --multi_if_possible
* New -alter_date types: a-c , m-c , b-c , c
libisoburn-1.3.2.tar.gz Wed Aug 07 2013
===============================================================================
* Bug fix: -find -exec "sort_weight" did not mark the image as having
pending changes
* Bug fix: -backslash_codes "with_program_arguments" was interpreted too late
* Bug fix: Missing or empty parameter with -dus was interpreted as "*" rather
than "."
* Bug fix: readline history was spammed by -msg_op parsing and pipe loops
* Bug fix: xorriso aborted on SIGCONT, SIGTSTP, SIGTTIN, SIGTTOU
* Improved granularity of SCSI log time measurement, now with timestamp
* New -pacifier behavior code "interval="
* New -as mkisofs options --sort-weight-list and --sort-weight-patterns
* New -format mode "without_spare" (for BD-RE)
* New command -named_pipe_loop
* New command -sh_style_result
* New -msg_op opcodes "parse_silently" and "parse_bulk_silently"
* New command -application_use and new -as mkisofs option --application_use
libisoburn-1.3.0.tar.gz Fri May 17 2013
===============================================================================
* Bug fix: Disk paths with components '.' or '..' could be mistaken for
directories.
* Bug fix: -as mkisofs -print-size failed with -isohybrid-mbr and a single
boot image. Regression introduced by libisoburn-1.2.8.
* Bug fix: -as mkisofs -path-list did not switch to --no-emul-toc by default.
* Bug fix: Unspecified Expiration Time and Effective Time of ISO volume was
represented by 0-bytes rather than ASCII '0' digits.
* Bug fix: Reserved and unused fields of APM entries were not zeroed.
* Bug fix: GPT header CRC was computed from all 512 bytes rather than from 92.
* Bug fix: The protective MBR partition for GPT started at block 0 instead of 1.
* New -boot_image bootspecs grub2_mbr= and grub2_boot_info=
* New -boot_image bootspec grub2_sparc_core=
* New -as mkisofs options --grub2-mbr , --grub2-boot-info , --grub2-sparc-core
* New -hardlinks mode "lsl_count" / "no_lsl_count"
libisoburn-1.2.8.tar.gz Mon Mar 18 2013
===============================================================================
* Bug fix: -tell_media_space altered the pointers to MD5 of data files
which stem from a previous session. This produced false
mismatches with -check_md5_r.
* Bug fix: CD tracks were reported with the sizes of the tracks in the
first session.
* Bug fix: -check_media use=outdev sector_map= stored TOC of input drive
* Bug fix: -hide hfsplus and -as mkisofs -hide-hfsplus had no effect.
Thanks to Davy Ho.
* Bug fix: ./configure did not abort if libburn.h or libisofs.h were missing
* New command -move
* New -as mkisofs options -eltorito-id , -eltorito-selcrit
libisoburn-1.2.6.tar.gz Tue Jan 08 2013
===============================================================================
* Bug fix: SIGSEGV by uninitialized local variable with
-check_media patch_lba0="on". Regression by version 1.0.6
* Bug fix: -partition_offset 16 kept -isohybrid-gpt-basdat from writing
MBR partition table entries of type 0xef
* Bug fix: -rollback did not work if indev and outdev were empty
* New API calls Xorriso_parse_line() and Xorriso__dispose_words()
* New API calls Xorriso_fetch_outlists() and Xorriso_peek_outlists()
* New API call Xorriso_start_msg_watcher()
* New API calls Xorriso__severity_cmp() and Xorriso__severity_list()
* New API calls Xorriso_sieve_add_filter, Xorriso_sieve_get_result,
Xorriso_sieve_clear_results, Xorriso_sieve_dispose, Xorriso_sieve_big
* New -boot_image partition_cyl_align mode "all"
* New -blank mode prefix "force:"
* New -osirrox settings "blocked" and "unblock"
* New command -lns for creating symbolic links
* New command -toc_of
* New command -msg_op
* New command -launch_frontend
* Proof-of-concept of a GUI frontend program: xorriso-tcltk written in Tcl/Tk.
libisoburn-1.2.4.tar.gz Fri Jul 20 2012
===============================================================================
* New API call isoburn_igopt_set_hfsp_serial_number()
* New API calls isoburn_igopt_set_prep_partition, isoburn_igopt_set_efi_bootp
* New API calls isoburn_igopt_set_hfsp_block_size() and isoburn_igopt_get_hfsp_block_size()
* New -check_media option async_chunks=
* New xorriso command -write_type
* New xorriso command -rockridge
* New xorriso command -hfsplus
* New -find tests -has_hfs_crtp, has_hfs_bless
* New -find actions set/get_hfs_crtp, set/get_hfs_bless
* New -find test -disk_path
* New -boot_image bootspec hfsplus_serial=
* New -boot_image bootspecs hfsplus_block_size= and apm_block_size=
* New -boot_image bootspecs efi_boot_part, prep_boot_part, chrp_boot_part
* Command -hide allows hiding in HFS+ filesystem
* New -as cdrecord options -tao -sao -dao
* New -as mkisofs option -log-file
* New -as mkisofs option --norock
* New -as mkisofs option -hfsplus
* New -as mkisofs option -hfsplus-file-creator-type
* New -as mkisofs options -hfs-bless and -hfs-bless-by
* New -as mkisofs option -hfsplus-serial-no
* New -as mkisofs options -hfsplus-block-size and -apm-block-size
* New -as mkisofs option -hide-hfsplus, -hide-hfsplus-list
* New -as mkisofs options -prep-boot-part, -efi-boot-part, -chrp-boot-part
* New -as mkisofs options -isohybrid-gpt-basdat, -isohybrid-gpt-hfsplus, -isohybrid-apm-hfsplus
* Bug fix: Memory corruption when reading bootable image that was truncated
* Bug fix: -update deleted MD5 of files of which only attributes had changed
libisoburn-1.2.2.tar.gz Mon Apr 02 2012
===============================================================================
* New API calls isoburn_get_attached_start_lba(), isoburn_attach_start_lba()
* New API calls isoburn_igopt_set_rr_reloc(), isoburn_igopt_get_rr_reloc()
* New API calls isoburn_ropt_set_data_cache(), isoburn_ropt_get_data_cache()
* New commands -x, -list_arg_sorting
* New command -rr_reloc_dir
* New command -data_cache_size
* New -as mkisofs option -rr_reloc, implemented option -hide-rr-moved
* Now ignoring -as mkisofs -no-split-symlink-components -no-split-symlink-fields
* Bug fix: -osirrox on:sort_lba_on -extract from / restored nearly nothing
* Bug fix: -as mkisofs without -graft-points could not handle names with "="
* Bug fix: Relaxation options joliet_rec_mtime and iso1999_rec_mtime had wrong values
libisoburn-1.2.0.tar.gz Sat Jan 28 2012
===============================================================================
* Bug fix: mkisofs emulation did not record mtime in ECMA-119 directories
* Bug fix: Program abort while drive tray is loading led to endless loop
* Bug fix: Solaris adapter mishandled write commands which failed on first try
* Bug fix: libisoburn.ver had a duplicate function entry
* New relaxations isoburn_igopt_joliet_rec_mtime,
isoburn_igopt_iso1999_rec_mtime
* Made -compliance "rec_mtime" default for xorriso
libisoburn-1.1.8.tar.gz Mon Nov 21 2011
===============================================================================
* Info document and man page for xorrecord
* New option -sleep
* Enabled recognition of QEMU DVD-ROM 0.12
* Enabled out-of the box use of xorriso on Linux guest on qemu virtio-blk-pci
libisoburn-1.1.6.tar.gz Tue Sep 27 2011
===============================================================================
* Bug fix: -extract_single extracted directory content
* Bug fix: -extract was not immediately aborted if -abort_on was triggered
* Bug fix: xorriso did not write to files in filesystems with >= 4 TB free space
* Bug fix: libisofs: ACL entries of groups and of user id 0 were not properly
recorded and cannot be restored
* Bug fix: libisofs: No ACLs were recorded on FreeBSD
* Enabled recording and restoring of extattr on FreeBSD.
* New option -list_extras
* New -osirrox option strict_acl
* New -find and -findx action list_extattr
* Workaround for collision with Linux udev which lets device links vanish
libisoburn-1.1.4.tar.gz Mon Aug 8 2011
===============================================================================
* Bug fix: xorriso native mode on some drives wrote unreadble ISO images to CD
* Bug fix: -assert_volid did not work. Regression since version 1.1.0.
* Bug fix: -acl or -xattr worked with -extract only on Linux and FreeBSD
* New option -device_links
libisoburn-1.1.2.tar.gz Fri Jul 8 2011
===============================================================================
* Bug fix: Since 1.0.6: Unreadable image produced by: xorrisofs ... >image.iso
* Bug fix: -update_r scheduled non-existing files for hardlink update
* Enabled extraction of the boot catalog file to disk filesystem
* New option -list_speeds
GNU xorriso-1.1.0.pl01.tar.gz Mon Jun 20 2011
===============================================================================
* Bug fix: Due to a bug in libburn-1.1.0, GNU xorriso-1.1.0 compiled only
on GNU/Linux, FreeBSD, and Solaris, but not on other systems.
libisoburn-1.1.0.tar.gz Sat Jun 18 2011
===============================================================================
* Bug fix: -mount_opts shared worked only with -osirrox o_excl_off
* Bug fix: xorriso command -add_plainly "any" did not add all files to the image
* Bug fix: The attempt to blank already blank DVD-RW was not gracefully blocked
* Bug fix: -as mkisofs -isohybrid-mbr without -no-pad was not cylinder aligned
* New option -signal_handling
* New option -close_damaged
* Dropped suffix .plXY from tarball name
libisoburn-1.0.8.pl00.tar.gz Thu Apr 14 2011
===============================================================================
* Bug fix: mkisofs emulation could ignore options (regression in 0.1.6)
libisoburn-1.0.6.pl00.tar.gz Sat Apr 9 2011
===============================================================================
* Bug fix: -as mkisofs padding did not work (regression in 1.0.4)
* Bug fix: Options -gid and -uid had no effect
* New API call isoburn_set_truncate()
* New relax option isoburn_igopt_joliet_long_names
* New option -early_stdio_test
* New options -print_info and -print_mark
* New -compliance option joliet_long_names
* -as mkisofs option -joliet-long is now fully functional
* Burning DVD-R DAO with 2 kB size granularity rather than 32 kB
libisoburn-1.0.4.pl00.tar.gz Thu Mar 10 2011
===============================================================================
libisoburn novelties:
* New isoburn_ropt_set_extensions() option isoburn_ropt_nomd5tag
xorriso novelties:
* Bug fix: xorrisofs did not work under growisofs -M (version 1.0.0 was ok)
* Bug fix: -as mkisofs -C attempted to read volume header of blank media
* Bug fix: -as mkisofs -old-root did not work with -graft-points
* Bug fix: -as mkisofs -partition_hd_cyl had no effect
* Bug fix: -as mkisofs did not properly unescape target part of pathspecs
* Bug fix: isohybrid image size was not aligned to cylinder boundary
* Bug fix: Compilation without zlib failed
* New -padding modes "included" and "appended"
* New bootspec partition_cyl_align=, new -as mkisofs option -partition_cyl_align
* New -as mkisofs and -as cdrecord option --no_rc
* Own man page and info document for xorrisofs
libisoburn-1.0.2.pl00.tar.gz Mon Feb 23 2011
===============================================================================
libisoburn novelties:
* Removed compiler obstacles of GNU xorriso on Solaris 9
* New isoburn_igopt_set_extensions() option isoburn_igopt_old_empty
xorriso novelties:
* Bug fix: Images produced with -for_backup might be unreadable and
also fail -check_md5 verification.
* Bug fix: mkisofs emulation options -l , -full-iso9660-filenames did not work.
* Bug fix: Option -mkdir yielded SIGSEGV due to a NULL pointer
* Bug fix: ECMA-119 standards violation with Volume Descriptor Set Terminator
* New options -clone and -cp_clone
* New -find actions update_merge, rm_merge, clear_merge
* New -as mkisofs option -max-iso9660-filenames
* New -as mkisofs option --old-empty
* New -as mkisofs options -root , -old-root
* New -as mkisofs options --old-root-no-md5, --old-root-no-ino, --old-root-dev
libisoburn-1.0.0.pl00.tar.gz Mon Jan 17 2011
===============================================================================
libisoburn novelties:
* New API call isoburn_igopt_set_untranslated_name_len()
xorriso novelties:
* Bug fix: -as mkisofs -print-size did not account for -partition_offset
* Default -abort_on value is now "FAILURE" with batch and "NEVER" with dialog
* New -compliance options untranslated_names , untranslated_name_len=
* New -as mkisofs option -untranslated_name_len
* New -compliance option iso_9660_1999, -as mkisofs option -iso-level 4
* New -compliance option iso_9660_level=number
* New -compliance option allow_dir_id_ext, -as mkisofs -disallow_dir_id_ext
* Disabled TOC emulation with -as mkisofs. May be re-enabled by --emul-toc.
libisoburn-0.6.6.pl00.tar.gz Sun Dec 12 2010
===============================================================================
libisoburn novelties:
* New API calls isoburn_igopt_set_disc_label(), isoburn_igopt_get_disc_label()
* New API calls isoburn_ropt_set_displacement(), isoburn_ropt_get_displacement()
xorriso novelties:
* Bug fix: -as mkisofs -print-size printed the size but also produced ISO image
* Build problem fix on Linux 2.4 in GNU xorriso libjte/checksum.c
* New -as mkisofs option -joliet-long
* New bootspec sparc_label=, new -as mkisofs options -sparc-boot , -sparc-label
* New option -displacement
libisoburn-0.6.4.pl00.tar.gz Tue Oct 26 2010
===============================================================================
libisoburn novelties:
* New API call isoburn_libjte_req()
* New API calls isoburn_igopt_attach_jte() and isoburn_igopt_detach_jte()
* New API call isoburn_igopt_set_tail_blocks()
* New API call isoburn_libjte_req()
xorriso novelties:
* New option -jigdo
* New -as mkisofs options -jigdo-* and -md5-list as of genisoimage
* New -as mkisofs options -checksum_algorithm_iso, -checksum_algorithm_template
* New bootspecs mips_path= and mipsel_path= for Debian MIPS releases
* New -as mkisofs options -mips-boot and -mipsel-boot
* New option -append_partition, -as mkisofs -append_partition
libisoburn-0.6.2.pl00.tar.gz Sat Sep 18 2010
===============================================================================
libisoburn novelties:
* New API function isoburn_igopt_set_part_offset()
* Hiding all non-API symbols from the linker by use of --version-script
* Now with history of release notes in ./ChangeLog file.
xorriso novelties:
* Bug fix: Regression with -hardlinks and -compliance old_rr, 0.4.2, Aug 2009
* New option -preparer_id, -as mkisofs options -p and -preparer
* New -boot_image specifier emul_type=none|hard_disk|floppy
* New boot_image boot specs partition_offset,partition_hd_cyl,partition_sec_hd
* Made behavior of -as mkisofs with unknown options more similar to original
* New -as mkisofs option -hard-disk-boot, enabled -b without -no-emul-boot
* New -as mkisofs option -e from Fedora genisoimage
* New -as mkisofs options -partition_offset,-partition_hd_cyl,-partition_sec_hd
libisoburn-0.6.0.pl00.tar.gz Fri Jul 02 2010
===============================================================================
libisoburn novelties:
xorriso novelties:
* New option -read_mkisofsrc interprets .mkisofsrc To be performed before -as
mkisofs. Performed automatically with program alias name "xorrisofs".
* Implemented -as mkisofs options -dir-mode, -file-mode, -abstract, -biblio,
-copyright
* Implemented -as mkisofs options -hide, -hide-joliet, -hide-list,
-hide-joliet-list
* New -as mkisofs option --boot-catalog-hide
* New option -hide, -find action -hide, -find test -hidden
* New -boot_image bootspec cat_hidden=on
* New options -copyright_file , -biblio_file , -abstract_file
* New find test -disk_name
* Enabled use of libreadline on Solaris
* Bug fix: -check_media patch_lba0= could install wrong image size
* Bug fix: -as mkisofs option -volset was wrongly interpreted like -volid
libisoburn-0.5.8.pl00.tar.gz Mon Jun 14 2010
===============================================================================
libisoburn novelties:
* xorriso source split into more modules, object code moved into libisoburn
xorriso novelties:
* New write extension option isoburn_igopt_no_emul_toc
* New -compliance rule no_emul_toc, new -as mkisofs --no-emul-toc
* Implemented -as cdrecord -V
* Implemented -as mkisofs options -U, -N, -l, -d, -allow-lowercase
libisoburn-0.5.6.pl00.tar.gz Tue May 04 2010
===============================================================================
libisoburn novelties:
xorriso novelties:
* Allowing up to 32 boot images
* New -boot_image bootspecs
efi_path=, platform_id=, sel_crit=, id_string=, next
* New -as mkisofs options --efi-boot, -eltorito-alt-boot
libisoburn-0.5.4.pl00.tar.gz Mon Apr 19 2010
===============================================================================
libisoburn novelties:
* New API call isoburn_igopt_set_system_area()
* New API call isoburn_igopt_set_pvd_times()
* New isoburn_igopt_set_relaxed() options: only_iso_versions, no_j_force_dots
xorriso novelties:
* New -boot_image any system_area=, -as mkisofs option -G
* New -boot_image grub partition_table=on, -as mkisofs --protective-msdos-label
* New -boot_image isolinux partition_table=on, -as mkisofs -isohybrid-mbr
* New option -volume_date, -as mkisofs --modification-date=
* New -find action mkisofs_r,-as mkisofs -r
* New -find action sort_weight, -as mkisofs --sort-weight
* New -compliance options only_iso_version, no_j_force_dots avoid
a bug in GRUB 1.96. They are default now.
libisoburn-0.5.2.pl00.tar.gz Tue Mar 30 2010
===============================================================================
xorriso novelties:
* xorriso documentation is now based on a hybrid format of Texinfo and man-
page. Copies included: .texi, .info, .1 (man page)
libisoburn-0.5.0.pl00.tar.gz Tue Feb 22 2010
===============================================================================
xorriso novelties:
* The former xorriso-standalone project is now GNU xorriso under GPLv3+. This
affects some documentation and the generator script, but not the license of
libisoburn or its program xorriso.
* Bug fix: xorriso -update_r could lead to SIGSEGV if applied to a data file
rather than a directory.
* Bug fix on FreeBSD: xorriso could leave the drive tray locked.
* New option -scsi_log
libisoburn-0.4.8.pl00.tar.gz Tue Jan 26 2010
===============================================================================
xorriso novelties:
* Bug fix: xorriso did not blank CD-RW with images that were prepared
on hard disk.
* New configure option --enable-libcdio for system adapter to libcdio-0.83git
libisoburn-0.4.6.pl00.tar.gz Wed Dec 09 2009
===============================================================================
xorriso novelties:
* New options -dvd_obs and -stdio_sync
* New configure option --enable-dvd-obs-64k
libisoburn-0.4.4.pl00.tar.gz Wed Oct 28 2009
===============================================================================
xorriso novelties:
* Bug fix: With -as cdrecord : -xa1 and -xamix were ignored although they do
matter.
* Option -toc now reports the individual media type. E.g. with a DVD+RW:
"Media product: RICOHJPN/W11/49 , Ricoh Company Limited"
* New option -pvd_info displays image id strings. New options -system_id , -
volset_id allow to set such image id strings.
* New option -mount_opts tries to circumvent an eventual ban to mount the same
device twice. Some Linux systems allow to mount two sessions of the same
media only if they get fooled via the loop device.
* New option -scdbackup_tag performs the task of the scdbackup MD5 checksum
filter inside xorriso.
Already fixed by patch releases of xorriso-0.4.2:
* Bug fix: -cut_out deleted previously cut-out pieces of the same file
* Bug fix libisofs: Filenames could lose blanks during a multi-session cycle
* Bug fix: -for_backup did not enable -xattr and -md5 if no drive was chosen
yet
* Bug fix: xorrisofs -help, xorrecord -help displayed original xorriso -help
libisoburn-0.4.2.pl02.tar.gz Thu Oct 08 2009
===============================================================================
* Bug fix: -for_backup did not enable -xattr and -md5 if no drive was chosen
yet
* Bug fix: xorrisofs -help, xorrecord -help displayed original xorriso -help
Libisoburn 0.4.2.pl01
===============================================================================
* Bug fix: xorriso option -cut_out deleted previously cut-out pieces of the
same file. The bug was introduced with release 0.1.4 in March 2008.
Libisoburn 0.4.2
===============================================================================
* New write options isoburn_igopt_session_md5, isoburn_igopt_file_md5,
isoburn_igopt_file_stability allow to record MD5 checksums of session and
single data files.
* New read option isoburn_ropt_nomd5 allows to read those MD5 sums when
importing an ISO image.
xorriso novelties:
* New option -md5, new -as mkisofs option --md5 allow to record in the image
MD5 checksums for the whole session and for each single data file.
* New options -check_md5, -check_md5_r allow to verify the whole session or
single files by comparing their image data with their MD5 sums.
* Options -compare, -compare_r, -update, update_r now can use recorded MD5.
* New -find actions check_md5, get_md5, make_md5 allow to check, to display or
to recompute MD5 checksums of data files. New find test -has_md5
distinguishes data files which have recorded MD5 from files which have none.
* New -find test -has_any_xattr and action get_any_xattr allow to inspect the
libisofs specific attributes of namespace "isofs".
* Options -lsl and lsdl now display correct link counts if -hardlinks is on.
* New option -calm_drive allows to reduce drive noise if no data reading is
intended for a while.
* New option -list_profiles allows to inquire and process the list of supported
media types.
* Bug fix: xorriso -as mkisofs did not understand the -C option of growisofs
any more. (Already fixed by release 0.4.0.pl01, 20 Jul 2009)
libisoburn-0.4.0.pl01.tar.gz Mon Jul 20 2009
===============================================================================
xorriso novelties:
* New option -hardlinks enables recording and restoring of hard link relations.
* Improved reading performance with -update_r and -extract.
* New option -for_backup as shortcut for -acl -xattr -hardlinks
* Operators with option -find : -not, -or, -and, (, ), -if, -then, -else
* New -find tests -wholename, -prune
* Bug fix: SIGSEGV with option -status and no search string
* Bug fix: -load volid did not perform pattern search
* Bug fix: Copies of overwriteable media on sequential were mistaken in ROM
drives
Libisoburn 0.4.0.pl01 release notes:
* Bug fix: xorriso -as mkisofs did not understand the -C option of growisofs
any more
libisoburn-0.3.8.pl00.tar.gz Sun Apr 19 2009
===============================================================================
libisoburn novelties:
* New API calls isoburn_ropt_set_auto_incharset() and
isoburn_ropt_get_auto_incharset()
xorriso novelties:
* New options -set_filter, -set_filter_r, -find -exec set_filter allow to
manipulate the content of data files on the fly.
* New option -zisofs, built-in filters --zisofs , --gzip , --gunzip enable
compression and decompression of data file content.
* New options -external_filter , -unregister_filter, -close_filter_list allow
arbitrary external processes to do content filtering.
* New options -show_stream, -show_stream_r allow to inspect the origin and the
filters of data files in an emerging image.
* New option -auto_charset based on xattr "isofs.cs" allows to tag an ISO
filesystem image with the character set name that is in use on the current
terminal.
libisoburn-0.3.6.pl00.tar.gz Mon Mar 16 2009
===============================================================================
xorriso novelties:
* Dummy MMC adapter of libburn allows compilation on systems other than Linux,
FreeBSD
* Default of -compliance has been changed to "old_rr", new rule "new_rr"
* New -stream_recording modes with start address or "data". "on" is now 32s.
libisoburn-0.3.4.pl00.tar.gz Sun Mar 01 2009
===============================================================================
* New isoburn_read_opts values: isoburn_ropt_noaaip, isoburn_ropt_noacl,
isoburn_ropt_noea
xorriso novelties:
* New option -acl enables ACL import and export
* New options -getfacl, -getfacl_r, -setfacl, -setfacl_r, -setfacl_list
* New find tests -has_acl, -has_no_acl , new find actions getfacl, setfacl
* New option -xattr enables import and export of Extended Attributes
* New options -getfattr, -getfattr_r, -setfattr, -setfattr_r, -setfattr_list
* New find tests -has_xattr, -has_aaip, new find actions getfattr, setfattr
* New -as mkisofs options --acl and --xattr
* New option -disk_dev_ino accelerates incremental backups
libisoburn-0.3.2.pl00.tar.gz Tue Jan 06 2009
===============================================================================
* New API function isoburn_get_mount_params()
* Now depending on libburn-0.6.0 which supports BD-R media
xorriso novelties:
* Bug fix: Options -extract and -extract_single were enabled with -osirrox off
* New options -mount , -mount_cmd , -session_string
* New -format modes by_size_ and fast_by_size_
* New option -assert_volid
* New option -drive_class for safety management of pseudo-drive access
libisoburn-0.3.0.pl00.tar.gz Tue Dec 2 2008
===============================================================================
* Now depending on libisofs-0.6.12 and libburn-0.5.6 to ensure use of their
recent bug fixes
xorriso novelties:
* New options -quoted_path_list, -quoted_not_list
* New option -backslash_codes for weird file names and terminal safety
* New options -charset, -in_charset, -out_charset
* New option -local_charset allows to override locale
* New option -application_id
* New option -compliance allows certain deviations from standards
* Suitable ISOLINUX boot images are made alternatively bootable via an MBR
* Bug fix: Forgot exit value registration to -return_with.
Thanks to Steve Dodd.
* Bug fix: -format as_needed did not recognize unformatted BD-RE
* Bug fix: disk patterns with relative addresses were not properly resolved
libisoburn-0.2.8.pl00.tar.gz Wed Oct 15 2008
===============================================================================
* Now depending on libisofs-0.6.10 and libburn-0.5.4 to ensure use of their
recent bug fixes
xorriso novelties:
* Ability to write and maintain bootable ISO images based on ISOLINUX
* New ./configure option --disable-libreadline to make binary more portable
* Bug fix: -as mkisofs -iso-level was accused to be an unknown option
* Bug fix: -follow link attributed random target filenames to looping links
libisoburn-0.2.6.pl00.tar.gz Sat Sep 20 2008
===============================================================================
xorriso novelties:
* Capability to insert and extract files far larger than 4 GB
* New option -file_size_limit, -as mkisofs now supports -iso-level 1 to 3
* New option -extract_cut
* New -error_behavior "file_extraction" behavior "best_effort"
* New option -check_media_defaults
* New option -list_delimiter
* Bug fix: -format full did not re-format already formatted DVD+RW
libisoburn-0.2.4.pl00.tar.gz Mo Aug 25 2008
===============================================================================
xorriso novelties:
* New option -check_media
* New -find test -damaged, new -find actions "report_damage", "report_lba"
* New -error_behavior occasion "file_extraction"
libisoburn-0.2.2.pl01.tar.gz Fr Jul 25 2008
===============================================================================
Libisoburn 0.2.2 release notes (Jul 19 2008)
* New API function isoburn_prepare_blind_grow()
* New flag bits with isoburn_set_msc1(), isoburn_read_iso_head()
xorriso novelties:
* New option -grow_blindly
* Options -C and -M for -as mkisofs emulation
* Options for -as cdrecord emulation: -multi, -msinfo, -isosize, tsize, --
grow_overwriteable_iso, write_start_address,
* New option -pacifier, more compatible pacifier with -as mkisofs
* make install creates aliases as symbolic links: osirrox, xorrisofs, xorrecord
* Can serve growisofs if started as xorrisofs, genisofs, mkisofs, genisoimage
pl01 changes (Jul 25 2008):
* Bug fix: Variable DESTDIR was not properly respected during make install
libisoburn-0.2.0.pl00.tar.gz Mon Jun 23 2008
===============================================================================
Libisoburn 0.2.0 release notes:
* New API functions isoburn_set_msgs_submit(), isoburn_drive_set_msgs_submit()
xorriso novelties:
* Bug fix: -chmod unintentionally performed o-x as first operation
* New options -cpax, -cp_rx, -cp_rax, -extract to restore files and trees from
ISO image to disk filesystem.
* New option -paste_in to copy ISO files into parts of disk files
* New options -map_l, -compare_l, -update_l, -extract_l
libisoburn-0.1.8.pl00.tar.gz Tue Jun 3 2008
===============================================================================
* Bug fix: Major,minor numbers of device files appeared as 0,1 in next session
* Bug fix: modifying to overwriteable target yielded unmountable results
xorriso novelties:
* New option -stream_recording for full speed with DVD-RAM and BD-RE
* New options -osirrox and -cpx allow to extract single files from ISO image
libisoburn-0.1.6.pl00.tar.gz Mon May 19 2008
===============================================================================
* Support for BD-RE (by depending on libburn-0.4.8)
* New API wrapper calls isoburn_toc_*() around libburn TOC inquiry calls
* New API call isoburn_read_iso_head() identifies ISO 9660 filesystems
* New API call isoburn_set_msc1() (like mount -o sbsector=)
xorriso novelties:
* Bug fix: -update_r and others did not work properly with relative paths
* New options -map and -map_single
* New options -not_paths, -not_leaf, -not_list, -not_mgt, -as mkisofs -m
* Emulated -toc on overwriteable media, new -toc layout with volume id
* New option -load makes alternative sessions accessible
* New -blank and -format modes 'as_needed'
* New option -list_formats and -format mode 'by_index_'
libisoburn-0.1.4.pl00.tar.gz Wed Apr 30 2008
===============================================================================
* Improved performance with reading directory trees
* xorriso: Improved attribute transfer from disk for target
* xorriso: Incremental backup functionality by new option -update_r
* xorriso: Options -cut_out and split_size map byte intervals of oversized
files into ISO files
* xorriso: Emulation of some basic mkisofs and cdrecord options
* Dynamically linkable with release version 0.6.4 of libisofs
Version 0.1.2 was not released as libisoburn
but only as xorriso standalone version. Wed Mar 12 2008
===============================================================================
* Bug fix: -report_about HINT or higher did not report at all
* Bug fix: speed=number without unit or media type letter was always CD speed
* Bug fix: it was possible to write to appendable media which was not -indev
* Bug fix: -follow param did not work for adding non-directory symbolic links
* Bug fix: It was not possible to -add /THIS=a /b=THIS
* Improved attribute transfer from disk for implicit target directories
* New option -as "cdrecord" emulates a narrow set of cdrecord gestures
* New option -as "mkisofs" emulates a narrow set of mkisofs gestures
* New option -publisher
* New option -errfile_log
* Support for DVD+R/DL media
* New options -compare, -compare_r and according -find -exec action
* New options -update, -update_r and according -find -exec action
* New -find actions "rm", "rm_r", new -findx -type "m" -exec "empty_iso_dir"
* New option -cut_out
libisoburn-0.1.0.pl01.tar.gz Fri Feb 15 2008
===============================================================================
* Initial release of libisoburn/xorriso
* libisoburn connects libisofs and libburn
* libisoburn emulates multi-session on media without session history
* xorriso is an integrated multi-session tool for ISO 9660 Rock Ridge images
* due to a subtle mistake in ABI usage with libisofs this release had to be
restricted to dynamic linking with exactly libisofs-0.6.2 where the mistake
does no harm. A version of libisoburn which is open to all future libisofs
versions will be released shortly after libisofs.0.6.4.

View File

@ -1,8 +1,4 @@
# Copyright (C) 2006 - 2008 Vreixo Formoso <metalpain2002@yahoo.es>
# Copyright (C) 2008 - 2019 Thomas Schmitt <scdbackup@gmx.net>
# Provided under GPL version 2 or later.
# ts A90315 : LIBBURNIA_PKGCONFDIR is defined OS specific in acinclude.m4
# was: pkgconfigdir=$(libdir)/pkgconfig
pkgconfigdir=$(LIBBURNIA_PKGCONFDIR)
@ -10,86 +6,27 @@ pkgconfigdir=$(LIBBURNIA_PKGCONFDIR)
libincludedir=$(includedir)/libisoburn
lib_LTLIBRARIES = libisoburn/libisoburn.la
ACLOCAL_AMFLAGS = -I ./
## ========================================================================= ##
# Build libraries
libisoburn_libisoburn_la_LDFLAGS = \
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) $(LIBLDFLAGS)
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
libisoburn_libisoburn_la_SOURCES = \
libisoburn/isoburn.h \
libisoburn/libisoburn.h \
libisoburn/burn_wrap.c \
libisoburn/data_source.c \
libisoburn/isoburn.c \
libisoburn/isoburn.h \
libisoburn/isofs_wrap.c \
\
xorriso/xorriso.h \
xorriso/xorriso_private.h \
xorriso/sfile.h \
xorriso/sfile.c \
xorriso/aux_objects.h \
xorriso/aux_objects.c \
xorriso/findjob.h \
xorriso/findjob.c \
xorriso/check_media.h \
xorriso/check_media.c \
xorriso/misc_funct.h \
xorriso/misc_funct.c \
xorriso/text_io.h \
xorriso/text_io.c \
xorriso/match.h \
xorriso/match.c \
xorriso/emulators.h \
xorriso/emulators.c \
xorriso/disk_ops.h \
xorriso/disk_ops.c \
xorriso/cmp_update.h \
xorriso/cmp_update.c \
xorriso/parse_exec.h \
xorriso/parse_exec.c \
xorriso/opts_a_c.c \
xorriso/opts_d_h.c \
xorriso/opts_i_o.c \
xorriso/opts_p_z.c \
\
xorriso/xorrisoburn.h \
xorriso/base_obj.h \
xorriso/base_obj.c \
xorriso/lib_mgt.h \
xorriso/lib_mgt.c \
xorriso/sort_cmp.h \
xorriso/sort_cmp.c \
xorriso/drive_mgt.h \
xorriso/drive_mgt.c \
xorriso/iso_img.h \
xorriso/iso_img.c \
xorriso/iso_tree.h \
xorriso/iso_tree.c \
xorriso/iso_manip.h \
xorriso/iso_manip.c \
xorriso/write_run.h \
xorriso/write_run.c \
xorriso/read_run.h \
xorriso/read_run.c \
xorriso/filters.h \
xorriso/filters.c \
xorriso/xorriso_timestamp.h \
xorriso/xorriso_buildstamp.h
libisoburn/libisoburn.h \
version.h
libisoburn_libisoburn_la_LIBADD = \
$(THREAD_LIBS) \
-lisofs \
-lburn
libinclude_HEADERS = \
libisoburn/libisoburn.h \
xorriso/xorriso.h
# libisoburn_libisoburn_la_CFLAGS = $(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
# $(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF) \
# $(XORRISO_DVD_OBS_64K)
libisoburn/libisoburn.h
## ========================================================================= ##
@ -113,16 +50,22 @@ bin_PROGRAMS = \
# cat xorriso/xorriso_buildstamp.h
xorriso_xorriso_CPPFLAGS = -Ilibisoburn
# xorriso_xorriso_CFLAGS = $(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
# $(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF) \
# $(XORRISO_DVD_OBS_64K)
xorriso_xorriso_CFLAGS = -DXorriso_with_maiN \
$(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
$(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF) \
$(XORRISO_DVD_OBS_64K)
xorriso_xorriso_LDADD = libisoburn/libisoburn.la -lisofs -lburn \
$(THREAD_LIBS) $(LIBBURN_ARCH_LIBS)
xorriso_xorriso_SOURCES = \
xorriso/xorriso.h \
xorriso/xorriso_main.c
xorriso/xorriso_private.h \
xorriso/xorriso.c \
xorriso/xorrisoburn.h \
xorriso/xorrisoburn.c \
xorriso/xorriso_timestamp.h \
xorriso/xorriso_buildstamp.h
# Install symbolic links to the xorriso binary
@ -134,7 +77,6 @@ install-exec-hook:
ln -s xorriso "$(DESTDIR)$(bindir)"/osirrox
if test -e "$(DESTDIR)$(bindir)"/xorrecord ; then rm "$(DESTDIR)$(bindir)"/xorrecord ; else echo ; fi
ln -s xorriso "$(DESTDIR)$(bindir)"/xorrecord
$(LIBBURNIA_LDCONFIG_CMD) "$(DESTDIR)$(libdir)" || echo 'NOTE: Explicit dynamic library configuration failed. If needed, configure manually for:' "$(DESTDIR)$(libdir)"
# Alternative to the disabled .PHONY above.
@ -144,20 +86,11 @@ buildstamp:
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
cat xorriso/xorriso_buildstamp.h
# For now make buildstamped has to be performed explicitly.
# For now make buildstamped has to be performed explicitely.
buildstamped: buildstamp
make
# "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 test/.libs
# Will be executed by "make check"
check-local:
xorriso/xorriso -no_rc -version -list_extras all
## Build companion applications
noinst_PROGRAMS = \
@ -180,14 +113,6 @@ xorriso_make_xorriso_1_CFLAGS =
xorriso_make_xorriso_1_LDADD =
xorriso_make_xorriso_1_SOURCES = xorriso/make_xorriso_1.c
# A Proof-of-concept for frontends, and xorriso-dd-target if on Linux kernel
bin_SCRIPTS = \
frontend/xorriso-tcltk \
$(XORRISO_DD_TARGET)
EXTRA_SCRIPTS = xorriso-dd-target/xorriso-dd-target
## ========================================================================= ##
## Build documentation (You need Doxygen for this to work)
@ -206,9 +131,7 @@ doc/html: doc/doxygen.conf
doc-upload: doc/html
scp -r $</* $(webhost):$(webpath)
## 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 \
@ -241,85 +164,25 @@ indent: $(indent_files)
nodist_pkgconfig_DATA = \
libisoburn-1.pc
man_MANS = \
xorriso/xorriso.1 \
xorriso/xorrisofs.1 \
xorriso/xorrecord.1 \
xorriso/xorriso-tcltk.1 \
$(XORRISO_DD_TARGET_MAN)
man_MANS = xorriso/xorriso.1
EXTRA_MANS = xorriso-dd-target/xorriso-dd-target.1
info_TEXINFOS = \
xorriso/xorriso.texi \
xorriso/xorrisofs.texi \
xorriso/xorrecord.texi \
xorriso/xorriso-tcltk.texi \
xorriso-dd-target/xorriso-dd-target.texi
# xorriso-dd-target.texi is hardcoded for now because of
# Makefile.am: error: texinfo file '@XORRISO_DD_TARGET_TEXI@' has
# unrecognized extension
# $(XORRISO_DD_TARGET_TEXI)
#
# EXTRA_TEXINFOS = xorriso-dd-target/xorriso-dd-target.texi
# To have a file in releng_generated_data. If the directory itself is listed
# in Makefile.am EXTRA_DIST, then its .svn subdir gets into the tarball.
releng/releng_generated_data/placeholder:
touch releng/releng_generated_data/placeholder
info_TEXINFOS = xorriso/xorriso.texi
EXTRA_DIST = \
bootstrap \
libisoburn-1.pc.in \
version.h.in \
doc/comments \
doc/doxygen.conf.in \
doc/partition_offset.wiki \
doc/qemu_xorriso.wiki \
doc/startup_file.txt \
frontend/frontend_pipes_xorriso.c \
frontend/README-tcltk \
frontend/xorriso-tcltk \
frontend/sh_on_named_pipes.sh \
frontend/xorriso_broker.sh \
frontend/grub-mkrescue-sed.sh \
xorriso-dd-target/xorriso-dd-target \
README \
AUTHORS \
CONTRIBUTORS \
COPYRIGHT \
COPYING \
INSTALL \
ChangeLog \
libisoburn/libisoburn.ver \
xorriso/changelog.txt \
xorriso/xorriso_buildstamp_none.h \
xorriso/README_gnu_xorriso \
xorriso/make_xorriso_standalone.sh \
xorriso/make_docs.sh \
xorriso/unite_html_b_line.c \
xorriso/convert_man_to_html.sh \
xorriso/man_xorriso_to_html.sh \
xorriso/man_xorrisofs_to_html.sh \
xorriso/man_xorrecord_to_html.sh \
releng/README \
releng/auto_cxx \
releng/auto_isocontent \
releng/auto_printsize \
releng/change_shell_to_use \
releng/codesamples/api_3lib.cpp \
releng/codesamples/api_xorriso.cpp \
releng/inc/releng_getopts.inc \
releng/jigdo-gen-md5-list \
releng/jigdo-gen-md5-list.1 \
releng/manual_burn \
releng/manual_devices \
releng/manual_isojigdo \
releng/releng_generated_data/placeholder \
releng/run_all_auto \
releng/template_new \
$(man_MANS)

2
NEWS
View File

@ -1,2 +0,0 @@
Please see ChangeLog for bug fixes and novelties.

209
README
View File

@ -4,9 +4,8 @@
libisoburn and xorriso. By Vreixo Formoso <metalpain2002@yahoo.es>
and Thomas Schmitt <scdbackup@gmx.net>
Integrated sub project of libburnia-project.org.
http://files.libburnia-project.org/releases/libisoburn-1.5.6.tar.gz
Copyright (C) 2006-2009 Vreixo Formoso,
Copyright (C) 2006-2023 Thomas Schmitt.
http://files.libburnia-project.org/releases/libisoburn-0.5.2.pl00.tar.gz
Copyright (C) 2006-2010 Vreixo Formoso, Thomas Schmitt.
Provided under GPL version 2 or later.
------------------------------------------------------------------------------
@ -19,14 +18,10 @@ The price for that is thorough specialization on data files in ISO-9660
filesystem images. So libisoburn is not suitable for audio (CD-DA) or any
other CD layout which does not entirely consist of ISO-9660 sessions.
xorriso is an application of libisoburn, libisofs, and libburn, which reads
commands from program arguments, files, stdin, or readline.
Its features are also available via a C language API of libisoburn.
xorriso is a command line application of libisoburn, libisofs, and libburn.
Currently they are fully supported on Linux with kernels >= 2.4,
on FreeBSD with ATAPI/CAM support enabled in the kernel, see atapicam(4),
on OpenSolaris (tested with kernel 5.11),
on NetBSD (tested with 6.1.2 and 6.1.3).
Currently they are fully 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 libburn will only offer POSIX i/o with disk
file objects, but no direct MMC operation on CD/DVD/BD drives.
@ -36,17 +31,17 @@ By using this software you agree to the disclaimer at the end of this text:
Compilation, First Glimpse, Installation
Dynamic library and compile time header requirements for libisoburn-1.5.6 :
- libburn.so.4 , version libburn-1.5.6 or higher
- libisofs.so.6 , version libisofs-1.5.6 or higher
Dynamic library and compile time header requirements for libisoburn-0.5.2 :
- libburn.so.4 , version libburn-0.7.6 or higher
- libisofs.so.6 , version libisofs-0.6.28 or higher
libisoburn and xorriso will not start with libraries which are older than their
include headers seen at compile time.
headers seen at compile time.
Obtain libisoburn-1.5.6.tar.gz, take it to a directory of your choice
Obtain libisoburn-0.5.2.pl00.tar.gz, take it to a directory of your choice
and do:
tar xzf libisoburn-1.5.6.tar.gz
cd libisoburn-1.5.6
tar xzf libisoburn-0.5.2.pl00.tar.gz
cd libisoburn-0.5.2
Within that directory execute:
@ -57,25 +52,11 @@ Then become superuser and execute
make install
which will make available libisoburn.so.1 and the program xorriso.
On GNU/Linux it 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 .
By use of a version script, the libisoburn.so library exposes no other function
names but those of the API definitions in <libisoburn/libisoburn.h> and
<libisoburn/xorriso.h>.
If -Wl,--version-script=... makes problems with the local compiler, then
disable this encapsulation feature by
./configure --disable-versioned-libs
make clean ; make
The ./configure script of libisoburn can check via pkg-config whether suitable
libburn and libisoburn are installed. Regrettably this test failed on several
systems due to local pkg-config problems. So it is disabled by default and may
be enabled by:
./configure --enable-pkg-check-modules
In this case, ./configure fails if no suitable installations are found.
For the API concepts and calls see
./libisoburn/libisoburn.h
as well as
/usr/lib/libisofs/libisofs.h
/usr/lib/libburn/libburn.h
xorriso
@ -90,32 +71,21 @@ xorriso binary depending on libburn.so, libisofs.so, libisoburn.so.
After installation documentation is available via
man xorriso
man xorrisofs
man xorrecord
Several alias links point to the xorriso binary:
xorrisofs starts xorriso with -as mkisofs emulation already enabled
xorrecord starts xorriso with -as cdrecord emulation already enabled
osirrox starts with -osirrox image-to-disk copying already enabled
By default libisoburn will depend on libreadline if the library and its
development header files are present at compile time. If not, then it will
try to depend on libedit and its header file.
Both conditional dependencies can be avoided by running
By default xorriso will depend on libreadline if the readline-dev headers
are present. This dependcy can be avoided by running
./configure --prefix=/usr --disable-libreadline
make clean ; make
Never omit the "make clean" command after switching enabling of libreadline.
Note that depending on libreadline-6 will cause libisoburn's license to
become "GPL version 3 or later".
If you want to explictely allow only the use of libedit, then do
./configure --prefix=/usr --disable-libreadline --enable-libedit
Never omit the "make clean" command after switching libreadline enabling.
Other deliberate dependency reduction options of ./configure are:
--disable-libacl avoid use of ACL functions like acl_to_text()
--disable-xattr avoid use of xattr functions like listxattr() on Linux
or extattr_list_file() on FreeBSD
--disable-xattr avoid use of xattr functions like listxattr()
--disable-zlib avoid use of zlib functions like compress2()
--disable-libjte avoid use of libjte for -jigdo command
xorriso allows to use external processes as file content filters. This is
a potential security risk which may be avoided by ./configure option
@ -130,115 +100,24 @@ if 64 KB rather than 32 KB are transmitted in each write operation.
--enable-dvd-obs-64k
libisoburn, libisofs, and libburn C language API
For the lower API concepts and calls see
./libisoburn/libisoburn.h
as well as
/usr/include/libisofs/libisofs.h
/usr/include/libburn/libburn.h
xorriso C language API
Actually the dynamically linked xorriso binary is only a small start program
for the xorriso API that is implemented inside libisoburn.
There are API calls for command readers and interpreters, and there are
API calls for each single command of xorriso.
Interested programmers should have a look into the API definition at
xorriso/xorriso.h
and the start program
xorriso/xorriso_main.c
The header file xorriso.h gets installed suitable for
#include <libisoburn/xorriso.h>
So after installation of a binary libisoburn package you may find it e.g. as
/usr/include/libisoburn/xorriso.h
xorriso under control of a (GUI) frontend process
The dialog mode allows frontend programs to connect via pipes to the standard
input and output of xorriso. Several commands of xorriso help with receiving
and parsing of reply messages.
As a proof of concept, there is the Tcl/Tk script xorriso-tcltk which can
be launched by this shell command:
xorriso-tcltk
Or in the xorriso build directory, without installation of xorriso:
xorriso/xorriso -launch_frontend frontend/xorriso-tcltk --stdio --
In the running GUI, click with the rightmost mouse button on any GUI element
to get its particular help text. The "Help" button at the upper right corner
gives a short introduction and instructions for some common use cases.
See also file frontend/README-tcltk.
See its Tcl code for getting an idea how this gets achieved.
The script is part of the tarball and gets installed by make install. If a
xorriso distro package does not install it, you may get it directly from
https://dev.lovelyhq.com/libburnia/libisoburn/blob/master/frontend/xorriso-tcltk
Further there is the C program frontend/frontend_pipes_xorriso.c which
forks a xorriso process and shows similar communication gestures as
xorriso-tcltk.
In particular it connects to xorriso via two pipes, sends commands, waits
for all replies of a command, picks info out of the xorriso message sieve,
and parses reply message lines into words.
The bash script frontend/sh_on_named_pipes.sh forks a xorriso process
connected to two pipes. It then runs a dialog loop, sends commands to xorriso,
and displays the replies.
The sh script frontend/xorriso_broker.sh is intended to execute xorriso
commands on a permanently running xorriso process.
It gets an id_string by which it looks for named pipes with a running xorriso
process. If no such pipe is found, then it starts a xorriso connected to
newly created pipes.
After this is done, the optionally given xorriso arguments are written into
the stdin pipe from where xorriso will read and execute them. The script will
end but the xorriso process will go on and wait for more commands.
Drives and Disk File Objects
The user of libisoburn applications needs operating system dependent
permissions for the CD/DVD/BD drives which shall be used.
On Linux, FreeBSD, NetBSD this means -rw-permissions, even if only reading is
intended. On Solaris one needs privileges "basic,sys_devices" and r-permission,
even if writing is intended.
The user of libisoburn applications needs rw-permission for the CD/DVD/BD
drives which shall be used, even if only reading is intended.
A list of rw-accessible drives can be obtained by
xorriso -devices
or by xorriso API call
Xorriso_option_devices()
or by libburn API call
resp. by libburn API call
burn_drive_scan()
A possible source of problems are hald or other automounters.
If you can spot a process "hald-addon-storage" with the address of
your desired drive, then consider to kill it.
A similar process "udisks-daemon: polling ..." can be seen on newer Linuxes.
On Debian GNU/Linux 6.0.2 amd64 there is
/lib/udev/rules.d/80-udisks.rules
where one can remove all CD drives ("sr*") from the list of automountable
devices:
KERNEL=="sd*|hd*|mmcblk*|mspblk*", ENV{UDISKS_PRESENTATION_NOPOLICY}="0"
# KERNEL=="sd*|hd*|sr*|mmcblk*|mspblk*", ENV{UDISKS_PRESENTATION_NOPOLICY}="0"
Copying the recognition criterion from
/etc/udev/rules.d/70-persistent-cd.rules
one can prevent automounting a single drive, too. E.g.:
SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:11.0-scsi-2:0:0:0", ENV{UDISKS_PRESENTATION_NOPOLICY}:="1"
If you cannot get rid of the automounter, try whether it helps to always load
the drive tray manually before starting a write run of xorriso. Wait until the
drive light is off and the mounted media appears.
Then try to unmount the mounted media before a write run.
If you cannot get rid of the automounter that easily, try whether it helps
to always load the drive tray manually before starting a write run of
xorriso. Wait until the drive light is off.
Better try to unmount an eventually mounted media before a write run.
Besides true optical drives, libisoburn can also address disk files as input or
@ -250,38 +129,15 @@ Note: xorriso by default prefixes "stdio:" to addresses outside the /dev tree
if they do not lead to an optical drive device file.
xorriso-dd-target
libisoburn comes with a script named
xorriso-dd-target/xorriso-dd-target
which uses the util-linux program lsblk to find suitable hard-disk-like
target devices for copying hard-disk bootable ISO images onto them. Such images
are offered by GNU/Linux distributions for installing their system.
xorriso-dd-target gets installed only if ./configure detects to run on a
GNU/Linux system. It refuses to start on non-Linux kernels or if program lsblk
is not found in /usr/sbin, /sbin, /usr/bin, /bin.
For introduction, examples, and details see in the build directory
man xorriso-dd-target/xorriso-dd-target.1
info xorriso-dd-target/xorriso-dd-target.info
Testing
For automated and manual tests of xorriso's functionality see file
releng/README.
Result comparison with self produced ISO images
We are quite sure that libisofs produces accurate representations of the disk
files. This opinion is founded on a lot of test burns and checks by a little
test program which compares files from the mounted image with the orignals
on disk. It uses the normal POSIX filesystem calls, i.e. no libburnia stuff.
This program is not installed systemwide but stays in the installation
directory of the libisoburn tarball as test/compare_file . Usually it is
directory of the xorriso tarball as test/compare_file . Usually it is
run as -exec payload of a find command. It demands at least three arguments:
The path of the file to compare, the prefix1 to be cut off from path
and the prefix2 which gets prepended afterwards to obtain the path of the
@ -323,7 +179,7 @@ libburnia-project.org
By Mario Danic <mario.danic@gmail.com>,
Vreixo Formoso <metalpain2002@yahoo.es>
Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006-2019 Mario Danic, Vreixo Formoso, Thomas Schmitt.
Copyright (C) 2006-2010 Mario Danic, Vreixo Formoso, Thomas Schmitt.
We will not raise any legal protest to dynamic linking of our libraries
with applications that are not under GPL, as long as they fulfill
@ -339,6 +195,3 @@ Libburn. By Derek Foreman <derek@signalmarketing.com> and
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
libisoburn does not stem from their code.
The libisoburn release contains xorriso-dd-target
Copyright (C) 2019 Nio Wiklund alias sudodus, Thomas Schmitt

View File

@ -1,8 +1,3 @@
dnl Copyright (C) 2008 - 2019 Thomas Schmitt <scdbackup@gmx.net>
dnl Copyright (C) 2000-2002, 2007-2009 Free Software Foundation, Inc.
dnl Provided under GPL version 2 or later.
AC_DEFUN([LIBBURNIA_SET_FLAGS],
[
case $target_os in
@ -10,12 +5,6 @@ freebsd*)
LDFLAGS="$LDFLAGS -L/usr/local/lib"
CPPFLAGS="$CPPFLAGS -I/usr/local/include"
;;
netbsd*)
LDFLAGS="$LDFLAGS -L/usr/local/lib -L/usr/pkg/lib"
CPPFLAGS="$CPPFLAGS -I/usr/local/include -I/usr/pkg/include"
;;
solaris*)
LDFLAGS="$LDFLAGS -L/usr/local/lib"
esac
])
@ -27,48 +16,26 @@ AC_DEFUN([TARGET_SHIZZLE],
AC_MSG_CHECKING([target operating system])
libburn_check_libcam=
LIBBURNIA_SUPP_ACL=none
LIBBURNIA_SUPP_FATTR=none
LIBBURNIA_LDCONFIG_CMD="echo 'No ldconfig run performed. If needed, configure manually for:'"
case $target in
*-*-linux*)
ARCH=linux
LIBBURN_ARCH_LIBS=
LIBBURNIA_SUPP_ACL=libacl
LIBBURNIA_SUPP_FATTR=xattr
LIBBURNIA_LDCONFIG_CMD=ldconfig
;;
*-*-freebsd*)
ARCH=freebsd
LIBBURN_ARCH_LIBS=-lcam
LIBBURNIA_SUPP_ACL=libacl
LIBBURNIA_SUPP_FATTR=extattr
# This may later be overridden by configure --enable-libdir-pkgconfig
LIBBURNIA_PKGCONFDIR=$(echo "$libdir" | sed 's/\/lib$/\/libdata/')/pkgconfig
;;
*-kfreebsd*-gnu*)
ARCH=freebsd
LIBBURN_ARCH_LIBS=-lcam
libburn_check_libcam=yes
;;
*-solaris*)
ARCH=solaris
LIBBURN_ARCH_LIBS=-lvolmgt
;;
*)
ARCH=
LIBBURN_ARCH_LIBS=
# AC_ERROR([You are attempting to compile for an unsupported platform])
;;
esac
AC_MSG_RESULT([$ARCH])
if test x"$libburn_check_libcam" = xyes
then
LIBBURNIA_CHECK_LIBCAM
fi
AC_MSG_RESULT([$ARCH])
])
@ -83,9 +50,8 @@ dnl From Bruno Haible.
dnl
AC_DEFUN([LIBBURNIA_CHECK_ICONV],
[
dnl Check whether it is allowed to link with -liconv
AC_MSG_CHECKING([for iconv() in separate -liconv ])
AC_MSG_CHECKING([for separate -liconv ])
libburnia_liconv="no"
libburnia_save_LIBS="$LIBS"
LIBS="$LIBS -liconv"
@ -99,13 +65,6 @@ AC_DEFUN([LIBBURNIA_CHECK_ICONV],
)
AC_MSG_RESULT([$libburnia_liconv])
if test x"$libburnia_save_LIBS" = x"$LIBS"
then
dnl GNU iconv has no function iconv() but libiconv() and a macro iconv()
dnl It is not tested whether this is detected by above macro.
AC_CHECK_LIB(iconv, libiconv, , )
fi
dnl Check for iconv(..., const char **inbuf, ...)
AC_MSG_CHECKING([for const qualifier with iconv() ])
AC_TRY_COMPILE([
@ -114,184 +73,13 @@ AC_DEFUN([LIBBURNIA_CHECK_ICONV],
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
], [], [libburnia_iconv_const=""], [libburnia_iconv_const="const"]
)
if test x$libburnia_iconv_const = xconst
then
AC_DEFINE_UNQUOTED([ICONV_CONST], [const])
else
AC_DEFINE_UNQUOTED([ICONV_CONST], [])
fi
AC_DEFINE_UNQUOTED([ICONV_CONST], [$libburnia_iconv_const])
test -z "$libburnia_iconv_const" && libburnia_iconv_const="no"
AC_MSG_RESULT([$libburnia_iconv_const])
])
dnl LIBBURNIA_ASSERT_ICONV is by Thomas Schmitt, libburnia project
dnl
AC_DEFUN([LIBBURNIA_ASSERT_ICONV],
[
if test x$XORRISO_ASSUME_ICONV = x
then
dnl Check for the essential gestures of libisofs/util.c
AC_MSG_CHECKING([for iconv() to be accessible now ])
AC_TRY_LINK([
#include <stdlib.h>
#include <wchar.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <stdio.h>
#include <limits.h>
#include <iconv.h>
#include <locale.h>
#include <langinfo.h>
#include <unistd.h>],
[iconv_t cd = iconv_open("","");
iconv(cd,NULL,NULL,NULL,NULL);
iconv_close(cd);
], [iconv_test="yes"], [iconv_test="no"]
)
AC_MSG_RESULT([$iconv_test])
if test x$iconv_test = xno
then
echo >&2
echo "Cannot get function iconv() to work. Configuration aborted." >&2
echo "Check whether your system needs a separate libiconv installed." >&2
echo "If it is installed but not found, try something like" >&2
echo ' export LDFLAGS="$LDFLAGS -L/usr/local/lib"' >&2
echo ' export CPPFLAGS="$CPPFLAGS -I/usr/local/include"' >&2
echo ' export LIBS="$LIBS -liconv"' >&2
echo "You may override this test by exporting variable" >&2
echo " XORRISO_ASSUME_ICONV=yes" >&2
echo >&2
(exit 1); exit 1;
fi
fi
])
dnl LIBBURNIA_TRY_EDITLINE is by Thomas Schmitt, libburnia project
dnl It performs the actual test compilation for editline.
dnl Variable LIBS has to be set by the caller.
AC_DEFUN([LIBBURNIA_TRY_EDITLINE],
[
AC_TRY_LINK([
#include <ctype.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <histedit.h>],
[EditLine *editline_handle; History *editline_history; HistEvent ev; int count;
editline_handle= el_init("dummy", stdin, stdout, stderr);
el_set(editline_handle, EL_EDITOR, "emacs");
editline_history= history_init();
history(editline_history, &ev, H_SETSIZE, 1000);
el_gets(editline_handle, &count);
], [editline_test="yes"], [editline_test="no"]
)
])
dnl LIBBURNIA_ASSERT_EDITLINE is by Thomas Schmitt, libburnia project
dnl It disables xorriso editline if not all needed functions are present
AC_DEFUN([LIBBURNIA_ASSERT_EDITLINE],
[
if test x$XORRISO_ASSUME_EDITLINE = x
then
dnl Check for the essential gestures of xorriso/text_io.c
AC_MSG_CHECKING([for desired functions in libedit])
libburnia_save_LIBS="$LIBS"
LIBS="$LIBS -ledit"
LIBBURNIA_TRY_EDITLINE
if test x$editline_test = xno
then
LIBS="$libburnia_save_LIBS"
LIBS="$LIBS -ledit"
LIBBURNIA_TRY_EDITLINE
fi
if test x$editline_test = xno
then
READLINE_DEF=
LIBS="$libburnia_save_LIBS"
fi
AC_MSG_RESULT([$editline_test $editline_msg])
fi
])
dnl LIBBURNIA_TRY_READLINE is by Thomas Schmitt, libburnia project
dnl It performs the actual test compilation for readline.
dnl Variable LIBS has to be set by the caller.
AC_DEFUN([LIBBURNIA_TRY_READLINE],
[
AC_TRY_LINK([
#include <ctype.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <readline/readline.h>
#include <readline/history.h>],
[HIST_ENTRY **hl;
readline("");
add_history("");
hl= history_list();
], [readline_test="yes"], [readline_test="no"]
)
])
dnl LIBBURNIA_ASSERT_READLINE is by Thomas Schmitt, libburnia project
dnl It disables xorriso readline if not all needed functions are present
AC_DEFUN([LIBBURNIA_ASSERT_READLINE],
[
if test x$XORRISO_ASSUME_READLINE = x
then
dnl Check for the essential gestures of xorriso/text_io.c
AC_MSG_CHECKING([for desired functions in libreadline])
readline_msg=
libburnia_save_LIBS="$LIBS"
LIBS="$LIBS -lreadline"
LIBBURNIA_TRY_READLINE
if test x$readline_test = xno
then
LIBS="$libburnia_save_LIBS"
LIBS="$LIBS -lreadline -lcurses"
LIBBURNIA_TRY_READLINE
if test x$readline_test = xyes
then
readline_msg=", with -lcurses"
fi
fi
if test x$readline_test = xno
then
READLINE_DEF=
LIBS="$libburnia_save_LIBS"
fi
AC_MSG_RESULT([$readline_test $readline_msg])
fi
])
dnl LIBISOBURN_ASSERT_VERS_LIBS is by Thomas Schmitt, libburnia project
dnl It tests whether -Wl,--version-script=... works with the compiler
AC_DEFUN([LIBISOBURN_ASSERT_VERS_LIBS],
[
libburnia_save_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS -Wl,--version-script=$srcdir/libisoburn/libisoburn.ver"
AC_TRY_LINK([#include <stdio.h>], [printf("Hello\n");],
[vers_libs_test="yes"], [vers_libs_test="no"])
if test x$vers_libs_test = xyes
then
LIBLDFLAGS="-Wl,--version-script=$srcdir/libisoburn/libisoburn.ver"
fi
LDFLAGS="$libburnia_save_LDFLAGS"
AC_SUBST(LIBLDFLAGS)
])
dnl LIBBURNIA_SET_PKGCONFIG is by Thomas Schmitt, libburnia project
dnl It determines the install directory for the *.pc file.
dnl LIBBURNIA_SET_PKGCONFIG determines the install directory for the *.pc file.
dnl Important: Must be performed _after_ TARGET_SHIZZLE
dnl
AC_DEFUN([LIBBURNIA_SET_PKGCONFIG],
@ -341,133 +129,3 @@ dnl For debugging only
])
dnl LIBBURNIA_TRY_TIMEZONE is by Thomas Schmitt, libburnia project
dnl It tests whether the global variable exists and is suitable for
dnl integer arithmetics.
AC_DEFUN([LIBBURNIA_TRY_TIMEZONE],
[
echo -n "checking for timezone variable ... "
AC_TRY_LINK([ #include <time.h> ], [long int i; i = 1 - timezone; ],
[LIBBURNIA_TIMEZONE="timezone"], [LIBBURNIA_TIMEZONE="0"]
)
echo "$LIBBURNIA_TIMEZONE"
])
dnl LIBBURNIA_CHECK_ARCH_LIBS is by Thomas Schmitt, libburnia project
dnl It tests whether the OS dependent libraries are available.
dnl With libisoburn they are needed only for the case that indirect linking
dnl does not work. So it is worth a try to omit them.
dnl $1 = "mandatory" or "optional" define the action if test linking fails.
dnl "silent" is like "optional" but without message.
AC_DEFUN([LIBBURNIA_CHECK_ARCH_LIBS],
[
libburnia_save_LIBS="$LIBS"
if test "x$LIBBURN_ARCH_LIBS" = x
then
dummy=dummy
else
LIBS="$LIBS $LIBBURN_ARCH_LIBS"
AC_TRY_LINK([#include <stdio.h>], [printf("Hello\n");],
[archlibs_test="yes"], [archlibs_test="no"])
LIBS="$libburnia_save_LIBS"
if test x$archlibs_test = xno
then
if test x"$1" = xmandatory
then
echo >&2
echo "FATAL: Test linking with mandatory library options failed: $LIBBURN_ARCH_LIBS" >&2
echo >&2
(exit 1); exit 1;
else
if test x"$1" = xoptional
then
echo "disabled linking with $LIBBURN_ARCH_LIBS (because not found)"
fi
LIBBURN_ARCH_LIBS=""
fi
else
if test x"$1" = xsilent
then
dummy=dummy
else
echo "enabled linking with $LIBBURN_ARCH_LIBS"
fi
fi
fi
])
dnl LIBBURNIA_CHECK_LINUX_SCSI is by Thomas Schmitt, libburnia project
dnl
AC_DEFUN([LIBBURNIA_CHECK_LINUX_SCSI],
[
dnl Check whether it is a Linux without scsi/scsi.h
libburn_scsi_disabled=
if test x"$ARCH" = xlinux
then
AH_TEMPLATE([Libburn_use_sg_dummY],
[Define to compile without OS specific SCSI features])
AC_MSG_CHECKING([for missing scsi/scsi.h on Linux])
AC_TRY_COMPILE([
#ifdef __linux
#include <scsi/scsi.h>
#endif
],
[;],
[AC_MSG_RESULT([no])],
[AC_DEFINE([Libburn_use_sg_dummY], [yes])
libburn_scsi_disabled=yes
AC_MSG_RESULT([yes])]
)
fi
if test x"$libburn_scsi_disabled" = xyes
then
echo "disabled operation of optical drives via SCSI"
fi
])
dnl LIBBURNIA_CHECK_LIBCAM is by Thomas Schmitt, libburnia project
dnl
AC_DEFUN([LIBBURNIA_CHECK_LIBCAM],
[
dnl Check whether libcam is requested for FreeBSD kernel but missing
libburn_scsi_disabled=
if test x"$LIBBURN_ARCH_LIBS" = x"-lcam"
then
AH_TEMPLATE([Libburn_use_sg_dummY],
[Define to compile without OS specific SCSI features])
AC_MSG_CHECKING([for missing libcam for SCSI on FreeBSD kernel])
dnl If libcam is not available, LIBBURN_ARCH_LIBS will be made empty
LIBBURNIA_CHECK_ARCH_LIBS(silent)
if test x"$LIBBURN_ARCH_LIBS" = x
then
AC_DEFINE([Libburn_use_sg_dummY], [yes])
libburn_scsi_disabled=yes
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
fi
fi
if test x"$LIBBURN_ARCH_LIBS" = x"-lcam"
then
AC_MSG_CHECKING([for missing libcam headers])
AC_TRY_COMPILE([
#include <stdio.h>
#include <camlib.h>
#include <cam/scsi/scsi_message.h>
#include <cam/scsi/scsi_pass.h>
],
[;],
[AC_MSG_RESULT([no])],
[AC_DEFINE([Libburn_use_sg_dummY], [yes])
libburn_scsi_disabled=yes
AC_MSG_RESULT([yes])]
)
fi
if test x"$libburn_scsi_disabled" = xyes
then
echo "disabled operation of optical drives via SCSI"
fi
])

View File

@ -1,11 +1,7 @@
#!/bin/sh -x
aclocal -I .
aclocal
libtoolize --copy --force
autoconf
# Not with libisoburn
# autoheader
automake --foreign --add-missing --copy --include-deps

View File

@ -1,6 +1,6 @@
AC_INIT([libisoburn], [1.5.7], [http://libburnia-project.org])
AC_INIT([libisoburn], [0.5.2], [http://libburnia-project.org])
AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h])
dnl AC_CONFIG_HEADER([config.h])
AC_CANONICAL_HOST
AC_CANONICAL_TARGET
@ -8,10 +8,9 @@ AC_CANONICAL_TARGET
LIBBURNIA_SET_FLAGS
AM_INIT_AUTOMAKE([subdir-objects])
AC_CONFIG_MACRO_DIR([./])
dnl Hint: Search list for version code aspects:
dnl /AC_INIT
dnl /AC_INIT(
dnl /ISOBURN_.*_VERSION
dnl /LT_.*
dnl /LIB.*_REQUIRED
@ -22,9 +21,9 @@ dnl configure.ac only rules the libtool revision numbering about
dnl LT_CURREN, LT_AGE, LT_REVISION where SONAME becomes LT_CURRENT - LT_AGE
dnl
dnl These three are only copies to provide libtool with unused LT_RELEASE
ISOBURN_MAJOR_VERSION=1
ISOBURN_MAJOR_VERSION=0
ISOBURN_MINOR_VERSION=5
ISOBURN_MICRO_VERSION=7
ISOBURN_MICRO_VERSION=2
dnl ISOBURN_VERSION=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION.$ISOBURN_MICRO_VERSION
@ -37,16 +36,16 @@ dnl Libtool versioning
dnl Generate libisoburn.so.1.x.y
dnl SONAME will become LT_CURRENT - LT_AGE
dnl
dnl ts C30607
dnl ### This is the release version 1.5.6 = libisoburn.so.1.113.0
dnl This is the development version after above stable release
dnl ### LT_CURRENT++, LT_AGE++ have not happened yet.
dnl LT_CURRENT++, LT_AGE++ has happened meanwhile.
dnl ts B00329
dnl This is the release version 0.5.2 = libisoburn.so.1.41.0
dnl ### This is the development version after above stable release
dnl LT_CURRENT++, LT_AGE++ have not happened yet.
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile.
dnl
dnl SONAME = 115 - 114 = 1 . Library name = libisoburn.so.1.114.0
dnl SONAME = 42 - 41 = 1 . Library name = libisoburn.so.1.41.0
LT_RELEASE=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION
LT_CURRENT=115
LT_AGE=114
LT_CURRENT=42
LT_AGE=41
LT_REVISION=0
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
@ -59,12 +58,12 @@ AC_SUBST(LT_CURRENT_MINUS_AGE)
AC_PREFIX_DEFAULT([/usr/local])
test "$prefix" = "NONE" && prefix=$ac_default_prefix
dnl ts B90405 : Disabled on advise of Ross Burton
dnl AM_MAINTAINER_MODE
AM_MAINTAINER_MODE
AM_PROG_CC_C_O
AC_C_CONST
AC_C_INLINE
AC_C_BIGENDIAN
dnl Large file support
AC_SYS_LARGEFILE
@ -74,51 +73,19 @@ if test ! $ac_cv_func_fseeko; then
AC_ERROR([Libburn requires largefile support.])
fi
if test x$LIBISOBURN_OLD_ICONV_CONFIGURE = x
then
dnl ts B00410 : To detect the need for -liconv and const argument of iconv()
LIBBURNIA_CHECK_ICONV
else
dnl Outdated: produces double -liconv and warnings about parameter mismatch
dnl If iconv(3) is in an extra lib, then it gets added to variable LIBS.
dnl If not, then no -liconv will be added.
AC_CHECK_LIB(iconv, iconv, , )
AC_CHECK_LIB(iconv, iconv, , )
dnl GNU iconv has no function iconv() but libiconv() and a macro iconv()
AC_CHECK_LIB(iconv, libiconv, , )
fi
AC_CHECK_LIB(iconv, libiconv, , )
AC_PROG_LIBTOOL
AC_SUBST(LIBTOOL_DEPS)
# LIBTOOL="$LIBTOOL --silent"
LIBTOOL="$LIBTOOL --silent"
AC_PROG_INSTALL
dnl GNU libtool checks stdint.h inttypes.h stdlib.h by default/unconditionally,
dnl but slibtool does not. So accept the ugly double check and -DHAVE_*_H
dnl arguments with GNU libtool.
dnl select.h seems to be ubiquitous, but was not used in libisoburn before 2025
AC_CHECK_HEADERS(stdint.h inttypes.h stdlib.h sys/select.h)
dnl Check for tm_gmtoff field in struct tm
AC_CHECK_MEMBER([struct tm.tm_gmtoff],
[AC_DEFINE(HAVE_TM_GMTOFF, 1,
[Define this if tm structure includes a tm_gmtoff entry.])],
,
[#include <time.h>])
dnl Whether timezone is an integer variable
AH_TEMPLATE([Libburnia_timezonE], [Either timezone or 0])
LIBBURNIA_TRY_TIMEZONE
if test x$LIBBURNIA_TIMEZONE = xtimezone
then
AC_DEFINE([Libburnia_timezonE], [timezone])
else
AC_DEFINE([Libburnia_timezonE], [0])
fi
AC_CHECK_HEADERS()
THREAD_LIBS=-lpthread
AC_SUBST(THREAD_LIBS)
@ -128,31 +95,12 @@ AC_SUBST(ARCH)
AC_SUBST(LIBBURNIA_PKGCONFDIR)
AC_SUBST(LIBBURN_ARCH_LIBS)
# Do not link libcam or libvolmgt if not available.
# (They are indirect dependency on FreeBSD or Solaris.)
LIBBURNIA_CHECK_ARCH_LIBS(optional)
dnl Determine target directory for libisoburn-*.pc
dnl Important: Must be performed _after_ TARGET_SHIZZLE
dnl
LIBBURNIA_SET_PKGCONFIG
dnl xorriso-dd-target is addicted to the Linux kernel and util-linux lsblk
if uname -s | grep '^Linux' >/dev/null
then
XORRISO_DD_TARGET=xorriso-dd-target/xorriso-dd-target
XORRISO_DD_TARGET_MAN=xorriso-dd-target/xorriso-dd-target.1
XORRISO_DD_TARGET_TEXI=xorriso-dd-target/xorriso-dd-target.texi
echo "enabled installation of xorriso-dd-target/xorriso-dd-target"
else
XORRISO_DD_TARGET=
XORRISO_DD_TARGET_MAN=
XORRISO_DD_TARGET_TEXI=
echo "disabled installation of xorriso-dd-target/xorriso-dd-target"
fi
AC_SUBST(XORRISO_DD_TARGET)
AC_SUBST(XORRISO_DD_TARGET_MAN)
AC_SUBST(XORRISO_DD_TARGET_TEXI)
AC_ARG_ENABLE(libreadline,
[ --enable-libreadline Enable use of libreadline by xorriso, default=yes],
@ -161,46 +109,15 @@ if test x$enable_libreadline = xyes; then
dnl Check whether there is readline-devel and readline-runtime.
dnl If not, erase this macro which would enable use of readline(),add_history()
READLINE_DEF="-DXorriso_with_readlinE"
if test x$XORRISO_OLD_READLINE_CONFIGURE = x
then
dnl ts B00411 : To disable readline if not all needed functions are present
LIBBURNIA_ASSERT_READLINE
else
dnl The empty yes case obviously causes -lreadline to be linked
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
dnl The X= in the yes case prevents that -lreadline gets linked twice
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
fi
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
else
READLINE_DEF=
echo "disabled libreadline"
fi
if test x$READLINE_DEF = x; then
if test x$enable_libreadline = xyes; then
libedit_deflt=yes
else
libedit_deflt=no
fi
AC_ARG_ENABLE(libedit,
[ --enable-libedit Enable use of libedit by xorriso if not libreadline,
default= setting of --enable-libreadline],
, enable_libedit=$libedit_deflt)
if test x$enable_libedit = xyes; then
READLINE_DEF="-DXorriso_with_editlinE"
LIBBURNIA_ASSERT_EDITLINE
else
READLINE_DEF=
echo "disabled libedit"
fi
fi
AC_SUBST(READLINE_DEF)
dnl ts A90329
dnl ACL and xattr do not need to be enabled in libisoburn or xorriso source
dnl but without AC_CHECK_LIB() xorriso will not be linked with -lacl .
@ -208,68 +125,32 @@ dnl On my Linux this does work with an ACL enabled libisofs but in general
dnl it seems not be right.
dnl So for now it seems to be best to do the same configuration for libisoburn
dnl and xorriso as for libisofs.
AC_ARG_ENABLE(libacl,
[ --enable-libacl Enable use of libacl by libisofs, default=yes],
, enable_libacl=yes)
LIBACL_DEF=
if test x$LIBBURNIA_SUPP_ACL = xlibacl
then
if test x$enable_libacl = xyes; then
if test x$enable_libacl = xyes; then
dnl Check whether there is libacl-devel and libacl-runtime.
dnl If not, erase this macro which would enable use of acl_to_text and others
LIBACL_DEF="-DLibisofs_with_aaip_acL"
LIBACL_DEF="-DLibisofs_with_aaip_acL"
dnl The empty yes case obviously causes -lacl to be linked
has_acl_h_but_no_func=0
AC_CHECK_HEADER(sys/acl.h, AC_CHECK_LIB(acl, acl_to_text, , has_acl_h_but_no_libacl=1 ), LIBACL_DEF= )
if test "$has_acl_h_but_no_libacl" = 1
then
AC_CHECK_LIB(c, acl_to_text, X= , LIBACL_DEF= )
fi
fi
fi
if test x$LIBACL_DEF = x-DLibisofs_with_aaip_acL
then
if test x$has_acl_h_but_no_libacl = x1
then
echo "enabled local processing of ACL"
else
echo "enabled libacl, local processing of ACL"
fi
AC_CHECK_HEADER(sys/acl.h, AC_CHECK_LIB(acl, acl_to_text, , LIBACL_DEF= ), LIBACL_DEF= )
else
echo "disabled local processing of ACL"
LIBACL_DEF=
fi
AC_SUBST(LIBACL_DEF)
AC_ARG_ENABLE(xattr,
[ --enable-xattr Enable use of extended file attributes by libisofs, default=yes],
, enable_xattr=yes)
XATTR_DEF=
if test x"$LIBBURNIA_SUPP_FATTR" = xxattr
then
if test "x$enable_xattr" = xyes; then
dnl Check whether there is the header for Linux xattr.
[ --enable-xattr Enable use of xattr by libisofs, default=yes],
, enable_xattr=yes)
if test x$enable_xattr = xyes; then
dnl Check whether there is the header for Linux xattr.
dnl If not, erase this macro which would enable use of listxattr and others
XATTR_DEF="-DLibisofs_with_aaip_xattR"
AC_CHECK_HEADER(attr/xattr.h, AC_CHECK_LIB(c, listxattr, X= ,
XATTR_DEF= ), XATTR_DEF= )
fi
elif test x"$LIBBURNIA_SUPP_FATTR" = xextattr
then
if test "x$enable_xattr" = xyes; then
XATTR_DEF="-DLibisofs_with_freebsd_extattR"
AC_CHECK_HEADER(sys/extattr.h, AC_CHECK_LIB(c, extattr_list_file, X=,
XATTR_DEF= ), XATTR_DEF= )
fi
fi
if test x$XATTR_DEF = x-DLibisofs_with_aaip_xattR
then
echo "enabled xattr, local processing of extended file attributes Linux style"
elif test x$XATTR_DEF = x-DLibisofs_with_freebsd_extattR
then
echo "enabled extattr, local processing of extended file attributes FreeBSD style"
XATTR_DEF="-DLibisofs_with_aaip_xattR"
AC_CHECK_HEADER(attr/xattr.h, AC_CHECK_LIB(c, listxattr, X= , XATTR_DEF= ), XATTR_DEF= )
else
echo "disabled local processing of extended file attributes"
XATTR_DEF=
fi
AC_SUBST(XATTR_DEF)
@ -294,33 +175,14 @@ else
fi
AC_SUBST(ZLIB_DEF)
dnl ts B00928
AC_ARG_ENABLE(libjte,
[ --enable-libjte Enable use of libjte >= 2.0 by xorriso, default=yes],
, enable_libjte=yes)
if test "x$enable_libjte" = xyes; then
LIBJTE_DEF="-DXorriso_with_libjtE"
AC_CHECK_HEADER(libjte/libjte.h, AC_CHECK_LIB(jte, libjte_set_checksum_algorithm, , LIBJTE_DEF= ), LIBJTE_DEF= )
else
LIBJTE_DEF=
fi
AC_SUBST(LIBJTE_DEF)
dnl ts B00107
dnl Just for the case that it is necessary to give link option -lcdio not only
dnl with libburn but also with libburn apps like xorriso.
dnl On SuSE 10.2 this is not needed. libburn finds libcdio on its own.
case $host_os in
cygwin*|mingw*)
default_libcdio=yes
;;
*)
default_libcdio=no
;;
esac
AC_ARG_ENABLE(libcdio,
[ --enable-libcdio Enable use of libcdio as system adapter, default=no (except on MSWindows)],
, enable_libcdio=$default_libcdio)
[ --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
@ -330,20 +192,11 @@ dnl The empty yes case obviously causes -lcdio to be linked
else
LIBCDIO_DEF=
fi
if test x$LIBCDIO_DEF = x
then
if test x$enable_libcdio = xyes
then
echo "WARNING: could not enable use of libcdio as system adapter"
fi
else
echo "enabled use of libcdio as system adapter"
fi
AC_SUBST(LIBCDIO_DEF)
AC_ARG_ENABLE(external-filters,
[ --enable-external-filters Enable use of external filter programs by xorriso, default=yes],
[ --enable-external-filters Enable use of external filter programs by xorriso, default=yes],
, enable_external_filters=yes)
if test x"$enable_external_filters" = xyes; then
EXTF_DEF="-DXorriso_allow_external_filterS"
@ -366,125 +219,43 @@ else
fi
AC_SUBST(EXTF_SUID_DEF)
AC_ARG_ENABLE(launch-frontend,
[ --enable-launch-frontend Enable start of piped frontend program by xorriso, default=yes],
, enable_launch_frontend=yes)
if test x"$enable_launch_frontend" = xyes; then
LFRONT_DEF="-DXorriso_allow_launch_frontenD"
echo "enabled xorriso command -launch_frontend"
else
LFRONT_DEF=
echo "disabled xorriso command -launch_frontend"
fi
AC_SUBST(LFRONT_DEF)
AC_ARG_ENABLE(launch-frontend-setuid,
[ --enable-launch-frontend-setuid Enable start of piped frontend program under setuid, default=no],
, enable_launch_frontend_setuid=no)
if test x$enable_launch_frontend_setuid = xyes; then
LFRONT_SUID_DEF="-DXorriso_allow_extf_suiD"
echo "enabled xorriso command -launch_frontend under setuid"
else
LFRONT_SUID_DEF=
echo "disabled xorriso command -launch_frontend under setuid"
fi
AC_SUBST(LFRONT_SUID_DEF)
AC_ARG_ENABLE(dvd-obs-64k,
[ --enable-dvd-obs-64k 64 KB default size for xorriso DVD writing, default=no],
, enable_dvd_obs_64=no)
[ --enable-dvd-obs-64k 64 KB default size for xorriso DVD/BD writing, default=no],
, enable_fifo_odirect=no)
if test x$enable_dvd_obs_64k = xyes; then
XORRISO_DVD_OBS_64K="-DXorriso_dvd_obs_default_64K"
echo "enabled xorriso write size default 64 KB on DVD"
echo "enabled xorriso write size default 64 KB on DVD and BD"
else
XORRISO_DVD_OBS_64K=
echo "disabled xorriso write size default 64 KB on DVD"
echo "disabled xorriso write size default 64 KB on DVD and BD"
fi
AC_SUBST(XORRISO_DVD_OBS_64K)
# Library versioning normally serves a complex purpose.
# Since libisoburn 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
LIBISOBURN_ASSERT_VERS_LIBS
if test x$vers_libs_test = xno
AC_CHECK_HEADER(libburn/libburn.h)
AC_CHECK_HEADER(libisofs/libisofs.h)
dnl Check for proper library versions
LIBBURN_REQUIRED=0.7.8
LIBISOFS_REQUIRED=0.6.28
PKG_CHECK_MODULES(LIBBURN, libburn-1 >= $LIBBURN_REQUIRED)
PKG_CHECK_MODULES(LIBISOFS, libisofs-1 >= $LIBISOFS_REQUIRED)
if test x$LIBCDIO_DEF = x
then
if test x$enable_libcdio = xyes
then
echo "disabled strict symbol encapsulation (test failed)"
else
echo "enabled strict symbol encapsulation"
echo "WARNING: could not enable use of libcdio as system adapter"
fi
else
echo "disabled strict symbol encapsulation"
fi
echo "enabled EXPERIMENTAL use of libcdio as system adapter"
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)
AC_CHECK_HEADER(libburn/libburn.h, LIBBURNIA_HAVE_LIBBURN=1, LIBBURNIA_HAVE_LIBBURN=0)
AC_CHECK_HEADER(libisofs/libisofs.h, LIBBURNIA_HAVE_LIBISOFS=1, LIBBURNIA_HAVE_LIBISOFS=0)
if test x$LIBBURNIA_HAVE_LIBBURN = x0; then
echo "FATAL: Lacking libburn development header file <libburn/libburn.h>" 2>&1
echo "HINT: You first have to install libburn before you can build libisoburn" 2>&1
fi
if test x$LIBBURNIA_HAVE_LIBISOFS = x0; then
echo "FATAL: Lacking libisofs development header file <libisofs/libisofs.h>" 2>&1
echo "HINT: You first have to install libisofs before you can build libisoburn" 2>&1
fi
if test x$LIBBURNIA_HAVE_LIBBURN = x0 -o x$LIBBURNIA_HAVE_LIBISOFS = x0; then
echo "ABORT: Lacking mandatory prerequisites" 2>&1
exit 1
fi
# ------- Visible mark in configure : Start of library check
# 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 libburn and libisofs , default=no],
, enable_pkg_check_modules=no)
if test x$enable_pkg_check_modules = xyes; then
dnl If PKG_CHECK_MODULES is to be used after this if-block,
dnl then it might be necessary to perform PKG_PROG_PKG_CONFIG before the block.
LIBBURN_REQUIRED=1.5.7
LIBISOFS_REQUIRED=1.5.6
PKG_CHECK_MODULES(LIBBURN, libburn-1 >= $LIBBURN_REQUIRED)
PKG_CHECK_MODULES(LIBISOFS, libisofs-1 >= $LIBISOFS_REQUIRED)
if test x$LIBCDIO_DEF = x; then
dummy=dummy
else
dnl For some reason this check may not be done earlier or else pkg-config
dnl is not found.
LIBCDIO_REQUIRED=0.83
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
fi
else
echo "checking for LIBBURN... skipped, no --enable-pkg-check-modules"
echo "checking for LIBISOFS... skipped, no --enable-pkg-check-modules"
if test x$LIBCDIO_DEF = x; then
dummy=dummy
else
echo "checking for LIBCDIO... skipped, no --enable-pkg-check-modules"
fi
fi
# ------- Visible mark in configure : End of library check
dnl Add compiler-specific flags
dnl See if the user wants aggressive optimizations of the code
@ -493,19 +264,17 @@ 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 -Wno-char-subscripts $CFLAGS"
CFLAGS="$CFLAGS -g -pedantic -Wall"
fi
CFLAGS="-DDEBUG $CFLAGS"
CFLAGS="$CFLAGS -DDEBUG"
fi
CFLAGS="$READLINE_DEF $LIBACL_DEF $XATTR_DEF $EXTF_DEF $EXTF_SUID_DEF $LFRONT_DEF $LFRONT_SUID_DEF $ZLIB_DEF $LIBJTE_DEF $XORRISO_DVD_OBS_64K $CFLAGS"
AC_CONFIG_FILES([
Makefile
doc/doxygen.conf

View File

@ -10,7 +10,7 @@ optical discs. This page is about its capability to read, manipulate, and
write ISO 9660 filesystems with Rock Ridge extensions. Media can be optical
media or filesystem objects.
Our scope is currently Linux 2.4 and 2.6, FreeBSD, OpenSolaris, or NetBSD.
Our scope is currently Linux 2.4 and 2.6, or FreeBSD .
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
@ -21,9 +21,7 @@ xorriso is an application of all three libraries which creates, loads,
manipulates and writes ISO 9660 filesystem images with Rock Ridge extensions.
Manipulation is not only adding or overwriting of files but also deletion,
renaming, and attribute changing. An incremental backup feature is provided.
The xorriso features are accessible via built-in command interpreters and
via a C language API.
See xorriso/README for more
SONAME:
libisoburn.so.1 (since 0.1.0, February 2008).
@ -34,7 +32,7 @@ libisoburn.so.1 (since 0.1.0, February 2008).
Our build system is based on autotools.
User experience tells us that you will need at least autotools version 1.7.
To build libisoburn go into its toplevel directory and execute:
To build libisoburn go into its toplevel directory and execute
- ./bootstrap (needed if you downloaded from SVN)
@ -42,28 +40,14 @@ To build libisoburn go into its toplevel directory and execute:
- make
To make the library and the xorriso application accessible for running and
software development:
To make the libraries accessible for running resp. developing applications
- make install
Read libisoburn/libisoburn.h for a description of the API.
See also README, xorriso/README, and the man page xorriso/xorriso.1 which
gives an idea of the capabilities provided by Libburnia.
For direct use as command line tool use the xorriso binary which among many
other features provides a mkisofs emulation via command "-as mkisofs".
See man page xorriso/xorriso.1 or GNU info document xorriso/xorriso.info.
If you want to link an own application with libisoburn, you have
two alternative APIs for choice:
- libisoburn, together with libburn and libisofs.
- xorriso, a complete representation of xorriso command line options.
It encapsulates the three lower level libraries.
Calls of both API families shall not be mixed.
For a description of the lbisoburn API read libisoburn/libisoburn.h
See file README for download and installation of a release tarball.
You will also have to install and understand the two libraries of the
Libburnia project which provide fundamental services:
libburn is the library by which preformatted data get onto optical media.
@ -71,15 +55,4 @@ See libburn/libburn.h for its API description.
libisofs is the library to handle ISO 9660 filesystems with Rock Ridge
extensions. Its API is described in libisofs/libisofs.h .
For xorriso features see its man page xorriso/xorriso.1 or
its GNU info document xorriso/xorriso.info.
For the corresponding C language API see libisoburn/xorriso.h (or
xorriso/xorriso.h in the build directory).
The implementation this API is part of libisoburn.
The xorriso command line tool gets installed as dynamically linked
binary together with libisoburn.
There is also a statically linked release named GNU xorriso.
See xorriso/README_gnu_xorriso for its download and installation.
*/

View File

@ -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.
@ -394,6 +401,12 @@ MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
# If the sources in your project are distributed over multiple directories
# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
# in the documentation. The default is NO.
SHOW_DIRECTORIES = NO
# The FILE_VERSION_FILTER tag can be used to specify a program or script that
# doxygen should invoke to get the current version for each file (typically from the
# version control system). Doxygen will invoke the program by executing (via
@ -482,9 +495,7 @@ INPUT_ENCODING = UTF-8
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
FILE_PATTERNS = libisoburn.h \
xorriso.h \
comments
FILE_PATTERNS =
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.
@ -694,6 +705,12 @@ HTML_FOOTER =
HTML_STYLESHEET =
# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
# files or namespaces will be aligned in HTML using tables. If set to
# NO a bullet list will be used.
HTML_ALIGN_MEMBERS = YES
# If the GENERATE_HTMLHELP tag is set to YES, additional index files
# will be generated that can be used as input for tools like the
# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
@ -928,6 +945,18 @@ GENERATE_XML = NO
XML_OUTPUT = xml
# The XML_SCHEMA tag can be used to specify an XML schema,
# which can be used by a validating XML parser to check the
# syntax of the XML files.
XML_SCHEMA =
# The XML_DTD tag can be used to specify an XML DTD,
# which can be used by a validating XML parser to check the
# syntax of the XML files.
XML_DTD =
# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
# dump the program listings (including syntax highlighting
# and cross-referencing information) to the XML output. Note that
@ -1121,8 +1150,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

View File

@ -1,424 +0,0 @@
### Libburnia Frequently Asked Questions
Please post your questions to
[GNU xorriso mailing list](https://lists.gnu.org/mailman/listinfo/bug-xorriso).
----------------------------------------------------------------------------
### Content:
Google favorites:
[xorriso not found](FAQ#xorriso_not_found)
[xorriso tutorial](FAQ#xorriso_tutorial)
[xorriso create ISO image](FAQ#xorriso_create_iso)
Burning:
[What is the difference between cdrskin and xorriso ?](FAQ#diff_cdrskin_xorriso)
[What does that SCSI error message mean ?](FAQ#scsi_error)
[Why is simultaneous burning with multiple drives so slow ?](FAQ#concurrent_burn)
Imaging:
[Is there a way to edit files inside the ISO image ?](FAQ#edit_files)
[For which architectures xorriso is able to create bootable images ?](FAQ#boot_arch)
[How to enable booting from USB stick ?](FAQ#isohybrid)
[What is partition offset feature all about?](FAQ#partition_offset)
[Partition offset bad on Apple ?](FAQ#partition_offset_apple)
Development:
[Where are the APIs of libburnia libraries described ?](FAQ#api_specs)
[I want to write a GUI on the top of libburnia libraries. Any pointers or recommendations ?](FAQ#gui_advise)
Miscellaneous:
[Where to see examples ?](FAQ#example_links)
[What personalities are supported by xorriso ?](FAQ#xorriso_aliases)
[What is xorriso dialog mode useful for ?](FAQ#xorriso_dialog_mode)
[Why is every second release missing ?](FAQ#version_numbers)
------------------------------------------------------------------------
### Google favorites
------------------------------------------------------------------------
##### xorriso not found <A NAME="xorriso_not_found">
This message is issued by programs which use [xorriso](Xorriso) for
producing ISO 9660 filesystem images. E.g. by GRUB2's grub-mkrescue.
Executable xorriso binaries are normally contained in software packages
named "libisoburn" or "xorriso".
If your operating system does not offer such a package, then consider
to get the [GNU xorriso](http://www.gnu.org/software/xorriso#download)
source tarball. For instructions read in its
[README file](http://www.gnu.org/software/xorriso/README_xorriso)
the paragraph "Compilation, First Glimpse, Installation".
With grub-mkrescue it is possible to use the resulting binary without further
installation. Just submit its absolute path with option `--xorriso=`. E.g.:
```
grub-mkrescue --xorriso=$HOME/xorriso-1.3.8/xorriso/xorriso -o output.iso
```
##### xorriso tutorial <A NAME="xorriso_tutorial">
There is not much more than the
[man xorriso examples](http://www.gnu.org/software/xorriso/man_1_xorriso.html#EXAMPLES)
Volunteers are wanted who make a collection of use cases, ask at bug-xorriso
for xorriso instructions to fulfill the needs, and describe both in a
user-readable manner.
Up to then, the GUI demo [xorriso-tcltk](https://dev.lovelyhq.com/libburnia/libisoburn/raw/branch/master/frontend/README-tcltk)
[(screenshot)](http://www.gnu.org/software/xorriso/xorriso-tcltk-screen.gif)
may serve as interactive exploration tool. It needs `xorriso` >= 1.2.6, `Tcl`,
`Tk` >= 8.4, optionally Tcl / Tk package `BWidget`.
```
xorriso-tcltk --script_log_file -
```
starts the GUI and will log the essential xorriso commands in the start
terminal. I.e. click on "Scan for drives" and learn that this operation
is triggered by xorriso command `-devices`.
Click the rightmost mouse button while being over any of the GUI elements
in order to get the particular help text for that element.
Have [man xorriso](http://www.gnu.org/software/xorriso/man_1_xorriso.html)
ready to learn what the particular commands mean.
##### xorriso create ISO image <A NAME="xorriso_create_iso">
```
xorriso -outdev $HOME/result.iso \
-map /home/me/sounds /sounds \
-map /home/me/pictures /pictures
```
This points the output to file `$HOME/result.iso`, which should not yet exist.
Then it maps disk directory `/home/me/sounds` to ISO directory `/sounds`,
and `/home/me/pictures` to `/pictures`.
At program end, the ISO image gets produced and the contents of the
two directory trees gets copied into the ISO.
If you have experience with program `mkisofs`, you may also use its
emulation by xorriso:
```
xorriso -as mkisofs \
-o $HOME/result.iso \
-graft-points \
/sounds=/home/me/sounds \
/pictures=/home/me/pictures
```
See [man xorriso](http://www.gnu.org/software/xorriso/man_1_xorriso.html)
for xorriso native commands.
See [man xorrisofs](http://www.gnu.org/software/xorriso/man_1_xorrisofs.html)
for its mkisofs emulation.
----------------------------------------------------------------------------
### Burning
----------------------------------------------------------------------------
##### What is the difference between cdrskin and xorriso ? <A NAME="diff_cdrskin_xorriso">
[cdrskin](Cdrskin) is a dedicated emulator of program cdrecord, based on
libburn. It tries to be as similar to cdrecord as is possible under that
premise.
[xorriso](Xorriso) is an integrated tool which creates, loads, manipulates,
and writes ISO 9660 filesystem images with Rock Ridge extensions.
It is based on libburn, libisofs, and libisoburn. One of its features is
the emulation of the corresponding tasks as done by mkisofs and cdrecord.
##### What does that SCSI error message mean ? <A NAME="scsi_error">
Error messages labled as "SCSI" stem from the drive. They are codes of
three hexadecimal numbers, like `[3 0C 00]`. The first number gives an overall
classification of the problem. The other two numbers give the particular
error description.
libburn translates known error codes into text messages. They consist of
two statements: the overall classification and the error description.
E.g. `[3 0C 00] Medium error. Write error.`
The classification allows a guess where the problem cause might sit:
2 `Drive not ready` : This is a well normal drive state and should be handled
by libburn. If you see this outside of DEBUG messages then it happened
at an unexpected occasion. Either libburn did its job wrong, or the hardware
suffers from blackouts. Hardware can be: drive, cable, bus controller.
Workaround: Check cables. If possible, try the drive at a different
bus controller.
3 `Medium error` : This indicates a problem between drive and medium. libburn
cannot directly cause such an error by any mistake. If drive and medium
are balancing on the edge of defect, it is possible that optional settings
can cause or prevent such errors. But in many cases of drive-medium conflicts
it is mere incident whether a burn run succeeds or not.
Workaround: Try other media or another drive.
4 `Drive error` : The drive or the bus controller accuse themselves of
doing it wrong. As with "Medium error" this might be aggravated or eased by
optional settings.
Workaround: Check cables. If possible, try the drive at a different
bus controller.
5 `Illegal request` : The drive did not like a command sent by libburn.
This may be normal. But if you see this outside of DEBUG messages, then
either the drive does not comply to MMC or libburn does not do its job right.
Workaround: Submit an error report to
[GNU xorriso mailing list](https://lists.gnu.org/mailman/listinfo/bug-xorriso).
B `Command aborted` : Seems to be generated by some bus controllers or
operating system SCSI drivers. The newest outbreak is said to be due to USB 3
and drivers which do not prevent power saving.
Workaround: Plug USB drives to USB 2 sockets or have a recent operating
system kernel. If this does not help, contact
[https://lists.gnu.org/mailman/listinfo/bug-xorriso GNU xorriso mailing list]
and be ready for experiments.
##### Why is simultaneous burning with multiple drives so slow ? <A NAME="concurrent_burn">
It is a known regression of Linux since about 2010 that operating more than
one drive at the same time via SCSI commands shows severe throughput problems.
See [the wiki page about this problem](ConcurrentLinuxSr) which offers two
alternative workarounds in userspace, explanantions of the reason,
and a link to a remedy proposal by courageous kernel modification.
----------------------------------------------------------------------------
### Imaging
----------------------------------------------------------------------------
##### Is there a way to edit files inside the ISO image ? <A NAME="edit_files">
File content cannot be altered. But files may be replaced by new copies from
the disk filesystem.
The main method of manipulating an existing ISO image is to append a session
with a new complete directory tree and the file content of the added or
overwritten files. Depending on the media type you get gaps between sessions
of up to 20 MB. So better try to do all foreseeable changes by one add-on
session.
##### For which architectures xorriso is able to create bootable images ? <A NAME="boot_arch">
Currently it supports systems with PC-BIOS for booting from CD, DVD, or BD
media, and from memory sticks or hard disks. The same feature range is
supported for systems with EFI firmware with x86 or ARM processor.
Further it supports machines with MIPS processor from SGI (Big Endian)
and DEC (Little Endian), and SUN SPARC machines.
(See [libisofs/doc/boot_sectors.txt](https://dev.lovelyhq.com/libburnia/libisofs/raw/branch/master/doc/boot_sectors.txt)
for technical details.)
Examples how to get an impression of the boot equipment of existing ISO 9660
images are on the wiki page about xorriso
[commands -report_system_area and -report_el_torito](ReportSystemArea).
##### How to enable booting from USB stick ? <A NAME="isohybrid">
In most cases, ISOs are prepared for PC-BIOS to boot the ISOLINUX boot loader.
This boot loader is normally started from CD, DVD or BD media via an El Torito
boot record. But if the ISO image resides on an USB stick or another
hard-disk-like device, then PC-BIOS ignores El Torito and rather expects a
Master Boot Record (MBR). Both boot record types can reside in the same ISO
image. Therefore it is possible to create an MBR that starts the boot image
file of ISOLINUX which is already target of the El Torito boot record.
This kind of MBR is called `isohybrid`. ISOLINUX provides
a program named `isohybrid` to patch existing images, but libisofs can create
an MBR already when producing the ISO image. See in
[manual page of xorriso](http://www.gnu.org/software/xorriso/man_1_xorriso.html)
option `-boot_image` with arguments `isolinux system_area=`,
and `-as mkisofs` option `-isohybrid-mbr`.
See [Wikipedia on MBR](http://en.wikipedia.org/wiki/Master_boot_record) for
general information about PC-DOS Master Boot Records, and
[ISOLINUX wiki](http://syslinux.zytor.com/wiki/index.php/ISOLINUX) for special
information about ISOLINUX. The wiki example with mkisofs can be performed
as well by help of xorriso option -as mkisofs.
A similar combination of El Torito and MBR is created by GRUB2 tool
grub-mkrescue. See [homepage of GNU GRUB 2](http://www.gnu.org/software/grub/)
for general information.
EFI firmware in its native mode boots by El Torito from CD, DVD or BD media,
and by partition table from USB stick or hard disk. Both, El Torito and
partition table, point to a FAT filesystem image, the EFI System Partition.
The partiton table may be either a DOS-style MBR partition table or a
[GUID Partition Table](https://en.wikipedia.org/wiki/GUID_Partition_Table).
The x86 program program in the MBR is ignored by EFI, which rather starts
a program from the FAT directory "\EFI\BOOT". The name of the program file
depends on the processor architecture: BOOTX64.EFI, BOOTIA32.EFI, BOOTARM.EFI,
BOOTAA64.EFI for x86 64 bit, x86 32 bit, ARM 32 bit, and ARM 64 bit,
respectively.
The boot equipment for other systems may well work from USB stick too.
But libburnia project has no tangible information about this.
##### What is partition offset feature all about? <A NAME="partition_offset">
If an MBR is present, then it contains a partition table with up to four
entries. The MBR is located at the very start of the ISO image. By
tradition the first partition should begin only after the range of MBR and
eventual supporting data blocks. On hard disk one often sees partition 1
starting at byte `63*512`. Further it is tradition that the payload filesystem
is mountable via one of the partitions.
The isohybrid MBR has its only partition start at byte 0. Thus it is mountable
but does not obey the tradition to begin only after the MBR.
The `grub-mkrescue` MBR on the other hand has partition 1 start at byte 512,i
which makes it unmountable. Only the unpartitioned base device can be mounted.
(On GNU/Linux
e.g. `/dev/sdb` is the base device whereas `/dev/sdb1` is its partition 1.)
The compromise offered by libisofs is to create a second superblock at
address `16*2048` and to let start partition 1 at this address. The second
superblock leads to a second directory tree which takes into account the
address difference between partition 1 and the base device. So the image
gets mountable via both devices and reserves 32 kB for boot manager software
where it may manipulate and augment the MBR.
(See [Partition Offset Wiki](PartitionOffset)
for examples.)
There are reports of machines which will not boot from USB stick if
partition offset is 0.
##### Partition offset bad on Apple ? <A NAME="partition_offset_apple">
Apple's "Snow Leopard" operating system refuses to mount Debian CD images
with non-zero partition offset.
The issue is not yet fully understood. For now one has to choose
between mountability on Apple "Snow Leopard" or bootability from USB stick
on Kontron CG2100 "carrier grade server".
----------------------------------------------------------------------------
### Developing
----------------------------------------------------------------------------
##### Where are the APIs of libburnia libraries described ? <A NAME="api_specs">
The decisive references are the inclusion headers of the libraries
`<libburn/libburn.h>`, `<libisofs/libisofs.h>`, `<libisoburn/libisoburn.h>`,
and `<libisoburn/xorriso.h>`.
Current git versions of these files:
[libburn/libburn.h](https://dev.lovelyhq.com/libburnia/libburn/raw/branch/master/libburn/libburn.h) ,
[libisofs/libisofs.h](https://dev.lovelyhq.com/libburnia/libisofs/raw/branch/master/libisofs/libisofs.h) ,
[libisoburn/libisoburn.h](https://dev.lovelyhq.com/libburnia/libisoburn/raw/branch/master/libisoburn/libisoburn.h) ,
[libisoburn/xorriso.h](https://dev.lovelyhq.com/libburnia/libisoburn/raw/branch/master/xorriso/xorriso.h)
##### I want to write a GUI on the top of libburnia libraries. Any pointers or recommendations ? <A NAME="gui_advise">
Most appreciated would be a GUI for xorriso which allows to copy files from
a view of the hard disk filesystem to a view of the ISO filesystem, and vice
versa. The xorriso implementation is located inside libisoburn.
Each option that is described in
[man 1 xorriso](http://www.gnu.org/software/xorriso/man_1_xorriso.html)
can be performed by a corresponding C function that is defined in
[xorriso.h](https://dev.lovelyhq.com/libburnia/libisoburn/raw/branch/master/xorriso/xorriso.h)
Further there are calls for library startup and shutdown, for problem
handling, and for the interpreters of xorriso's command line interface.
The xorriso API encapsulates calls to libisofs, libburn, and libisoburn.
An alternative to the xorriso C API is xorriso dialog mode.
[See below](FAQ#xorriso_dialog_mode).
The script
[xorriso-tcltk](https://dev.lovelyhq.com/libburnia/libisoburn/raw/branch/master/frontend/xorriso-tcltk)
demonstrates this approach. It is part of the
libisoburn release tarball and of the GNU xorriso tarball.
The known existing GUIs
[Xfburn](http://goodies.xfce.org/projects/applications/xfburn),
[Brasero](http://projects.gnome.org/brasero/),
[FlBurn](http://flburn.sourceforge.net/)
rather use libisofs and libburn directly.
(Please submit an URI if you want your libburnia GUI application mentioned
here.)
----------------------------------------------------------------------------
### Miscellaneous
----------------------------------------------------------------------------
##### Where to see examples ? <A NAME="example_links">
[xorriso examples](http://www.gnu.org/software/xorriso/man_1_xorriso.html#EXAMPLES) ,
[cdrskin examples](http://scdbackup.sourceforge.net/man_1_cdrskin_devel.html#EXAMPLES) ,
[libburner.c a minimal but complete burn program](https://dev.lovelyhq.com/libburnia/libburn/raw/branch/master/test/libburner.c).
##### What personalities are supported by xorriso ? <A NAME="xorriso_aliases">
The name by which xorriso is started may trigger certain features which
normally would need to be enabled by program options.
xorrisofs starts up in mkisofs emulation mode, which otherwise would have to
be entered by command `-as mkisofs`.
xorrecord starts up in cdrecord emulation mode, which is normally entered by
command `-as cdrecord`. This emulation is only able to write a single data
track as new session to blank or appendable media. No audio. No multiple
tracks in one session.
osirrox can copy files from ISO image to disk and to apply option -mount
to one or more of the existing ISO sessions. This is normally enabled by
option `-osirrox on:o_excl_off`.
##### What is xorriso dialog mode useful for ? <A NAME="xorriso_dialog_mode">
Dialog mode is initiated if `-dialog on` is among the program arguments.
It can be used to inspect and exploit existing ISO 9660 images or
to explore xorriso's behavior in order to develop the command sequence
for a batch run.
Frontend programmers may fork xorriso initiating a xorriso dialog session
(`-dialog on -use_readline off -pkt_output on -mark done`),
and interact with it from their own program via pipes connected to
xorriso's stdin and stdout. This is more efficient than forking xorriso
every now and then to perform various commands in order to complete
complex tasks like image size prediction.
The script
[xorriso-tcltk](https://dev.lovelyhq.com/libburnia/libisoburn/raw/branch/master/frontend/xorriso-tcltk)
demonstrates this approach. It is part of the
libisoburn release tarball and of the GNU xorriso tarball.
##### Why is every second release missing ? <A NAME="version_numbers">
Releases have an even third version number. Like 0.5.6 or 1.0.4.
During development the next higher odd number is used. E.g. 0.5.7 or 1.0.5.
The content of release tarballs does not get changed without changing
their name. The development tarballs of xorriso and cdrskin may change
their content without notice.
----------------------------------------------------------------------------
Site maintainer: Do not edit this wiki directly but rather the git version
of `libisoburn/doc/faq.wiki`. When done, paste it into the wiki editor.

View File

@ -1,47 +0,0 @@
The argument names listed here have been reserved by Vladimir Serbinenko
for grub-mkrescue.
Do not use them as options of -as mkisofs or as generic commands.
Keep in mind with generic commands:
Leading '-' is ignored, inner '-' is mapped to '_'.
http://lists.gnu.org/archive/html/grub-devel/2015-04/msg00122.html
Date: Wed, 29 Apr 2015 16:05:04 +0200
From: Vladimir '?-coder/phcoder' Serbinenko <phcoder@gmail.com>
Subject: Re: grub-mkrescue problems in argp_parse
-------------------------------------------------------------------
--arcs-boot
--compress
--core-compress
--directory
--fonts
--grub-glue-efi
--grub-mkimage
--grub-render-label
--install-modules
--label-bgcolor
--label-color
--label-font
--locale-directory
--locales
--modules
--output
--override-directory
--product-name
--product-version
--pubkey
--rom-directory
--sparc-boot
--themes
--themes-directory
--verbose
--xorriso
-?
-k
-------------------------------------------------------------------
Known traditional collisions:
-------------------------------------------------------------------
-o intentionally overloaded
-v unintentional
-d unintentional

View File

@ -1,226 +0,0 @@
The partition offset feature of libisofs can produce ISO 9660 images which bear
a quite conventional partition table if copied onto a USB stick. The first
partition marks the size of the ISO image but starts at a non-zero address.
Thus it marks a small part of the device as unclaimed by partitions and
available for storing boot loader code.
Nevertheless the USB stick is mountable via its overall device file as well as
via the partition device file. E.g. on GNU/Linux: `/dev/sdb` and `/dev/sdb1`.
This is achieved by two distinct sets of meta-data which refer to the same
file content.
The dual-mount feature supports Rock Ridge and Joliet too.
It is capable of multi-session.
Currently only offset 32 kB seems to make sense. Smaller offsets are prohibited
by fundamental assumptions of libisofs and libisoburn. Larger offsets would
extend the unclaimed area into vital blocks of the ISO image.
--------------------------------------------------------------------------
According to a
[thread of march 2011](http://www.syslinux.org/archives/2011-March/016527.html)
on Syslinux mailing list this enabled booting of a Kontron CG2100 server
from USB stick, which otherwise failed.
Regrettably the feature seems to prevent mounting of ISO 9660 images on
Apple "Snow Leopard" systems.
At least this is the outcome of a
[debian-cd thread of april 2011](http://lists.debian.org/debian-cd/2011/04/msg00029.html).
--------------------------------------------------------------------------
Example:
Testing mountability and ISOLINUX bootability from USB stick and CD.
Overview:
The test image was derived from one year old RIPLinux-9.3-non-X.iso which
has an isohybrid MBR. Syslinux version seems to be 3.82. That MBR and the file
tree from the mounted RIPLinux image was used to build a new ISO image
with 16 \* 2kB partition offset. Isohybrid MBR patching was done by xorriso.
Details:
The first 32 kB of an ISO 9660 image are called System Area and may host any
byte pattern. The first 512 bytes of RIPLinux-9.3-non-X.iso contain the
isohybrid capable MBR, which will be re-used in this example.
```
dd if=RIPLinux-9.3-non-X.iso bs=512 count=1 of=RIPLinux-9.3-non-X.mbr
```
Normally the isohybrid MBR is provided by the Syslinux
installation under the name `isohdp[fp]x*.bin` .
E.g. `/usr/lib/syslinux/isohdpfx.bin`
The files of the image are made accessible for reading
```
mount -o loop RIPLinux-9.3-non-X.iso /mnt
```
A new ISO image gets composed. The first three lines of arguments are taken
from the prescriptions of ISOLINUX wiki and adapted to the names used in
RIPLinux-9.3-non-X.iso.
Option `-isohybrid-mbr` imports the copied MBR and patches it
according to rules published by hpa on Syslinux mailing list.
Option `-partition_offset 16` causes the first partition to start at 2 kB block
number 16. It also prepares the image to be mountable by this partition, too.
```
xorriso -as mkisofs \
-o new_image.iso \
-b boot/isolinux/isolinux.bin -c boot/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-isohybrid-mbr RIPLinux-9.3-non-X.mbr \
-partition_offset 16 \
/mnt
```
The image was copied onto a USB stick
```
dd if=new_image.iso of=/dev/sdc
```
and plugged into a Debian system.
```
fdisk -lu /dev/sdb
```
yields
```
Device Boot Start End Blocks Id System
/dev/sdb1 * 64 120831 60384 17 Hidden HPFS/NTFS
```
I can mount `/dev/sdb` and `/dev/sdb1` alike:
```
mount /dev/sdb1 /mnt1
mount -o loop /dev/sdb /mnt
```
`-o loop` avoids failure with "mount: /dev/sdb already mounted or /mnt busy".
A comparison by
```
diff -r /mnt /mnt1
```
reports no difference.
Human readable files look ok.
Test-reading all content by
```
tar cf - /mnt | wc
```
yields a reasonable byte count of 60743680 and no errors.
The machine boots RIPLinux from this USB stick with no visible problems.
It can then mount `/dev/sdb` as well as `/dev/sdb1`.
The ISO image boots from CD too.
Mounting the partition can be simulated with an image file on hard disk by
cutting off the first partition_offset blocks of 2 KB:
```
dd if=new_image.iso of=partition_image.iso bs=2048 skip=16
mount -o loop partition_image.iso /mnt1
```
--------------------------------------------------------------------------
Another test was made with GRUB 2 by downloading
```
bzr branch http://bzr.savannah.gnu.org/r/grub/trunk/grub
```
Before building GRUB 2, the file
```
util/grub-mkrescue.in
```
was edited to replace in the options of the xorriso command:
```
--protective-msdos-label
```
by
```
-partition_offset 16 -no-pad
```
Then GRUB 2 was built and installed.
The resulting image from
```
./grub-mkrescue -o image.iso
```
was put onto USB stick. It passed the same tests on Debian
as above RIPLinux example. It boots to a GRUB prompt.
Due to option `-no-pad` the image is about 250 kB smaller than
the image produced by original `grub-mkrescue`. Else it would have grown by
about 50 kB.
Unpadded ISO images are safe except for burning on CD in TAO mode.
In this case problems may occur with reading the last few data blocks.
So when burning onto CD make sure to require SAO mode and/or to
require padding by 300 kB.
Burning on DVD or BD needs no such caution. Neither does copying
on USB stick or hard disk.
Program `fdisk` will complain about "different physical/logical" addresses.
This can be silenced by adding option
```
-partition_cyl_align on
```
at the cost of image padding up to the next full MB.
E.g. by 402 kB to 2 MB.
--------------------------------------------------------------------------
Open questions:
- Shall the partition of an isohybrid image be marked bootable ?
Currently xorriso keeps the 0x80 mark of an imported MBR
and the 0x80 mark which xorriso sets by its own MBR
preparations.
- If not to be marked bootable:
What equipment would the partition need to justify having the mark ?
------------------------------------------------------------------------
Application:
The partition offset feature can be controlled by libisofs API calls
```
int iso_write_opts_set_part_offset(IsoWriteOpts *opts,
uint32_t block_offset_2k,
int secs_512_per_head,
int heads_per_cyl);
int iso_write_opts_set_system_area(IsoWriteOpts *opts, char data[32768],
int options, int flag);
```
or by libisoburn calls
```
int isoburn_igopt_set_part_offset(struct isoburn_imgen_opts *opts,
uint32_t block_offset_2k,
int secs_512_per_head, int heads_per_cyl);
int isoburn_igopt_get_part_offset(struct isoburn_imgen_opts *opts,
uint32_t *block_offset_2k,
int *secs_512_per_head, int *heads_per_cyl);
int isoburn_igopt_set_system_area(struct isoburn_imgen_opts *o,
char data[32768], int options);
int isoburn_igopt_get_system_area(struct isoburn_imgen_opts *o,
char data[32768], int *options);
```
or by xorriso options
```
-boot_image any partition_offset=(2kb_block_adr)
-boot_image any partition_sec_hd=(number)
-boot_image any partition_hd_cyl=(number)
-boot_image any partition_cyl_align(on|auto|off)
-as mkisofs ... -partition_offset (2kb_block_adr) \
-partition_hd_cyl (number) \
-partition_sec_hd (number) \
-partition_cyl_align (on|auto|off) ...
```
As stated above, an offset larger than 16 would expose vital parts of the
ISO image as unclaimed space. Values smaller than 16 are not accepted.
So use either an offset of 16 blocks or keep the feature disabled by
offset 0.

View File

@ -1,518 +0,0 @@
This text describes how to set up a qemu virtual machine so that xorriso
on its guest GNU/Linux can operate a CD, DVD or BD recorder of the host
system.
The options follow proposals of Paolo Bonzini on qemu-devel mailing list.
My compliments for his patient guidance.
Basic knowledge about Debian and qemu was learned from
[GNU Hurd qemu page](http://www.gnu.org/s/hurd/hurd/running/qemu.html GNU Hurd qemu page).
----------------------------------------------------------------------
This start command works with `qemu-1.0-rc3`:
```
$ qemu \
-enable-kvm \
-nographic \
-m 512 \
-net nic,model=ne2k_pci \
-net user,hostfwd=tcp::5557-:22 \
-hda /dvdbuffer/i386-install.qemu \
-drive file=/dev/sr0,if=none,id=scsicd,format=raw \
-device virtio-blk-pci,drive=scsicd,logical_block_size=2048,physical_block_size=2048 \
-cdrom .../some_image.iso
```
This start command works with `qemu-2.1.2`:
```
$ qemu \
-enable-kvm \
-nographic \
-m 512 \
-net nic,model=ne2k_pci \
-net user,hostfwd=tcp::5557-:22 \
-hda /dvdbuffer/i386-install.qemu \
-cdrom .../some_image.iso \
-drive file=/dev/sr0,index=2,if=virtio
```
With these setups of `-drive` and `-device` it is necessary to have a
medium in the drive, when qemu gets started. Else it will refuse.
The guest system is accessible via ssh and scp at port 5557 of the
host system.
`/dev/sr0` is the address of the DVD drive which is handed over to the
guest system.
`.../some_image.iso` may be any readable file which shall serve as
virtual DVD-ROM. qemu is not happy without such a thing.
`/dvdbuffer/i386-install.qemu` is the disk image, where the guest operating
system was installed by:
```
$ qemu-img create /dvdbuffer/i386-install.qemu 8G
$ qemu \
-enable-kvm \
-m 512 \
-net nic,model=ne2k_pci \
-hda /dvdbuffer/i386-install.qemu \
-cdrom debian-6.0.3-i386-netinst.iso \
-boot d
```
Host system of my `qemu-1.0-rc3` test is Debian GNU/Linux 6.0.2 amd64.
With `qemu-2.1.2` it is Debian 8.1 amd64.
Both had access to the Internet when the guest was installed.
----------------------------------------------------------------------
Preparations on guest system Debian GNU/Linux 6.0.3 i386
There appears no `/dev/sr` for the passthrough drive. Thus libburn will not
list it by its drive search function. One may use it nevertheless. But
xorriso will only do so if prefix "mmc:" is used with the address:
```
-dev mmc:/dev/vda
```
The drive will be listed by libburn if there is a symbolic link `/dev/sr*`
pointing to it. On Debian 6, this link persists only if it is created
by an udev rule.
In `/lib/udev/rules.d/50-udev-default.rules`:
```
KERNEL=="vda", SYMLINK+="sr1"
```
libburn on Linux needs rw-permission for the drive's device node.
The virtual device `/dev/vda` is in group "disk". Usual for CD drives is
group "cdrom", to which i (or the Debian installer ?) have added my
normal user when i installed the guest system.
Like with the symbolic link, such a change persists on Debian 6 only as
udev rule.
In `/lib/udev/rules.d/91-permissions.rules`:
```
KERNEL=="vda", GROUP="cdrom"
```
This should yield
```
lrwxrwxrwx 1 root root 3 Nov 8 11:19 /dev/sr1 -> vda
brw-rw---- 1 root cdrom 254, 0 Nov 8 11:19 /dev/vda
```
xorriso version must be >= 1.1.8
```
$ xorriso -version
```
tells the versions of its components on stdout:
```
...
xorriso version : 1.1.8
...
```
If your distro's xorriso is too old, consider to get and build GNU xorriso.
```
http://ftpmirror.gnu.org/xorriso/xorriso-1.1.8.tar.gz
```
Do
```
$ tar xzf xorriso-1.1.8.tar.gz
$ cd xorriso-1.1.8
$ ./configure && make
```
Either do as superuser
```
# make install
```
or execute it where it was built as
```
$ ./xorriso/xorriso ...arguments...
```
After compilation, this binary does not depend on files in the build
directory. You may move it to any other location.
For details about the following xorriso commands, read
```
man xorriso
man ./xorriso/xorriso.1
```
or with the same content
```
info xorriso
info ./xorriso/xorriso.info
```
Or read the [online man page of xorriso](http://scdbackup.sourceforge.net/man_1_xorriso_devel.html).
Note that the sequence of xorriso arguments matters. They are commands
which get performed one after the other.
This differs from the behavior of mkisofs, cdrecord, et.al.,
which parse all arguments and then perform actions in a hardcoded
sequence.
Writing happens automatically if ISO filetree changes are pending
at the end of the program run. This is like with other burn tools.
(There is a command `-commit` for intermediate writing e.g. in dialog
mode.)
----------------------------------------------------------------------
Listing accessible drives:
```
$ xorriso -devices
```
shows on stdout:
```
0 -dev '/dev/sr0' rwrw-- : 'QEMU ' 'QEMU DVD-ROM'
1 -dev '/dev/sr1' rwrw-- : 'Optiarc ' 'BD RW BD-5300S'
```
----------------------------------------------------------------------
The burn tests are presented here for unformatted DVD-RW media.
The xorriso commands apply also to other types of optical media.
See "Other applicable media types:" further below.
----------------------------------------------------------------------
Inspecting drive and medium:
```
$ xorriso -outdev /dev/sr1 -toc
```
should show on stdout something like
```
Drive current: -dev '/dev/sr1'
Drive type : vendor 'Optiarc' product 'BD RW BD-5300S' revision '1.04'
Media current: DVD-RW sequential recording
Media product: RITEKW04 , Ritek Corp
Media status : is written , is closed
Media blocks : 306592 readable , 0 writable , 2298496 overall
TOC layout : Idx , sbsector , Size , Volume Id
ISO session : 1 , 0 , 106696s , ISOIMAGE
ISO session : 2 , 135536 , 108385s , ISOIMAGE
ISO session : 3 , 250240 , 56202s , ISOIMAGE
Media summary: 3 sessions, 271744 data blocks, 531m data, 0 free
```
----------------------------------------------------------------------
Blanking to single session capability:
This medium has to be blanked before further writing. For the DAO
test, one can save time by fast blanking, which xorriso normally
dislikes because the result is not capable of multi-session:
```
$ xorriso -outdev /dev/sr1 -blank deformat_quickest
```
should report on stderr
```
...
xorriso : UPDATE : Blanking ( 1.0% done in 2 seconds )
...
xorriso : UPDATE : Blanking ( 95.4% done in 36 seconds )
xorriso : UPDATE : Blanking ( 99.0% done in 37 seconds )
...
Media current: DVD-RW sequential recording
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data, 4489m free
```
Do not worry if the pacifier messages show no neat percentage progress.
Some drives report "1.0%" until they are done. Some report "1.0%"
after "99%".
----------------------------------------------------------------------
Writing a DAO session:
Use one or more moderately sized directories as input. Here: `/usr/bin`.
Terminate the list of `-add` arguments by argument `--`.
It is important to have command `-close on` among the arguments.
```
$ xorriso -md5 on -outdev /dev/sr1 -close on -add /usr/bin --
```
should report on stderr
```
...
xorriso : UPDATE : 594 files added in 1 seconds
...
xorriso : UPDATE : Thank you for being patient. Working since 2 seconds.
xorriso : UPDATE : Writing: 32s 0.1% fifo 100% buf 0% 0.1xD
...
xorriso : UPDATE : Writing: 2704s 5.1% fifo 11% buf 0% 3.9xD
...
xorriso : UPDATE : Writing: 20208s 38.2% fifo 52% buf 99% 4.0xD
...
xorriso : UPDATE : Writing: 52885s 100.0% fifo 0% buf 99% 0.0xD
ISO image produced: 52735 sectors
Written to media : 52885 sectors at LBA 0
Writing to '/dev/sr1' completed successfully.
```
Do not worry if there is no progress to see for a few dozen seconds
at the beginning.
The run will last at least as long as writing of 1 GB would need.
If you write less data, then there will be a lot of zero progress
messages at the end of writing.
----------------------------------------------------------------------
Checkreading the result:
```
$ xorriso -md5 on -indev /dev/sr1 -check_md5_r sorry / --
```
The word "sorry" sets the severity class of the event message, which is
emitted in case of MD5 mismatch. (See man xorriso, "Exception processing".)
This should report on stderr
```
...
Drive current: -indev '/dev/sr1'
Media current: DVD-RW sequential recording
Media status : is written , is closed
Media summary: 1 session, 52885 data blocks, 103m data, 0 free
Volume id : 'ISOIMAGE'
xorriso : UPDATE : 568079 content bytes read in 5 seconds
xorriso : UPDATE : 17074k content bytes read in 10 seconds
...
xorriso : UPDATE : 103.7m content bytes read in 35 seconds
File contents and their MD5 checksums match.
```
and the exit value should be 0, if no mismatch was reported.
A mismatch message would look like
```
...
MD5 MISMATCH: '/usr/bin/ncursesw5-config'
...
Mismatch detected between file contents and MD5 checksums.
xorriso : SORRY : Event triggered by MD5 comparison mismatch
xorriso : NOTE : Tolerated problem event of severity 'SORRY'
xorriso : NOTE : -return_with SORRY 32 triggered by problem severity SORRY
```
and the exit value would be non-zero.
----------------------------------------------------------------------
Blanking to multi-session capability:
```
$ xorriso -outdev /dev/sr1 -blank as_needed
```
This will need as long as writing the DVD-RW up to its end.
Blanking option `as_needed` lets xorriso decide what to do in order
to make the medium writable from scratch. With DVD-RW it will decide for
`-blank all`.
The report on stderr should end by
```
...
xorriso : UPDATE : Blanking ( 98.9% done in 902 seconds )
xorriso : UPDATE : Blanking ( 99.0% done in 903 seconds )
xorriso : UPDATE : Blanking ( 99.0% done in 904 seconds )
Blanking done
xorriso : NOTE : Re-assessing -outdev '/dev/sr1'
Drive current: -outdev '/dev/sr1'
Media current: DVD-RW sequential recording
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data, 4489m free
```
----------------------------------------------------------------------
Writing multiple sessions (DVD-RW write type Incremental):
This time do not perform command `-close on`, so that the medium
stays writable:
```
$ xorriso -md5 on -dev /dev/sr1 -add /usr/lib --
...
xorriso : UPDATE : Writing: 105280s 98.6% fifo 0% buf 77% 3.5xD
xorriso : UPDATE : Writing: 106796s 100.0% fifo 0% buf 62% 2.2xD
xorriso : UPDATE : Closing track/session. Working since 44 seconds
...
xorriso : UPDATE : Closing track/session. Working since 77 seconds
ISO image produced: 106646 sectors
Written to media : 106800 sectors at LBA 0
Writing to '/dev/sr1' completed successfully.
```
Checkread like after the DAO test:
```
$ xorriso -md5 on -indev /dev/sr1 -check_md5_r sorry / --
...
xorriso : UPDATE : 204.0m content bytes read in 63 seconds
File contents and their MD5 checksums match.
```
Writing the second session looks like the first one. Just use another
set of input files to get a visible change in the ISO 9660 file tree:
```
$ xorriso -md5 on -dev /dev/sr1 -add /usr/bin --
...
Written to media : 53408 sectors at LBA 135488
Writing to '/dev/sr1' completed successfully.
```
And checkread the whole tree of files (i.e. both sessions):
```
$ xorriso -md5 on -indev /dev/sr1 -check_md5_r sorry / --
...
xorriso : UPDATE : 307.8m content bytes read in 89 seconds
File contents and their MD5 checksums match.
```
At the end of writing a final session, the medium can be closed.
It will not take more writing unless it gets blanked or formatted.
So use command `-close on` to demand closing after writing.
```
$ xorriso -md5 on -dev /dev/sr1 -close on -add /usr/sbin --
...
Written to media : 16160 sectors at LBA 195056
Writing to '/dev/sr1' completed successfully.
```
Checkread
```
$ xorriso -md5 on -indev /dev/sr1 -check_md5_r sorry / --
...
Media current: DVD-RW sequential recording
Media status : is written , is closed
Media summary: 3 sessions, 176368 data blocks, 344m data, 4064m free
...
xorriso : UPDATE : 337.7m content bytes read in 97 seconds
File contents and their MD5 checksums match.
```
-----------------------------------------------------------------------------
If the drive tray can move by itself, you may now eject the medium:
```
$ xorriso -outdev /dev/sr1 -eject all
```
-----------------------------------------------------------------------------
Other applicable media types:
These test runs for sequential DVD-RW may be performed on CD-RW with the
same xorriso arguments. Be aware that `/usr/lib` will hardly fit on a CD.
So choose smaller directories for CD.
`-blank deformat_quickest` addresses a peculiarity of DVD-RW.
It will work on other media like `-blank fast`.
Except the blanking runs, the tests may also be performed on BD-R, DVD-R,
DVD+R, and CD-R. But you would waste two media by this.
The first session on CD will always be written with write type SAO,
further sessions will be written with TAO.
CD-R and DVD-R have a simulation mode. It can be enabled by xorriso
command `-dummy on`, but of course it will not produce readable results.
So this simulation is usable only for first sessions on blank media.
-----------------------------------------------------------------------------
Now for formatted overwritable media:
All blank, write and check runs of above tests "Writing multiple sessions"
may also be performed with DVD+RW, DVD-RAM, formatted DVD-RW, and BD-RE.
There is no way to close formatted media. The command `-close on`
gets silently ignored.
The write methods and states of formatted media differ from those of
sequential media. But xorriso presents to the user a unified
multi-session usage model, under the assumption that all emulated
sessions contain ISO 9660 filesystem images, which successively
build on each other.
So from the view of xorriso commands, the only task which makes
them differ from sequential media, is to apply optional formatting
or re-formatting.
A special case are BD-R, which xorriso may format but will not bring
into (pseudo-) overwritable state. Formatted BD-R perform Defect
Management by default, which checkreads during writing and replaces
bad block.
The mandatory formatting of unused DVD+RW and BD-RE is done by xorriso
automatically. Just start a normal write run. DVD-RAM are sold formatted.
xorriso treats overwritable media with a valid ISO 9660 filesystem as
appendable media. To make then writable from scratch, apply
`-blank as_needed`, which will actually write a few bytes into the PVD
(superblock) of the ISO filesystem to invalidate it.
De-formatting is only possible with DVD-RW. E.g. by `-blank deformat`.
-----------------------------------------------------------------------------
Format DVD-RW for overwriting without intermediate blanking,
or format BD-R for Defect Management:
```
$ xorriso -outdev /dev/sr1 -format as_needed
```
should report on stderr
```
...
xorriso : UPDATE : Formatting ( 99.0% done in 912 seconds )
Formatting done
xorriso : NOTE : Re-assessing -outdev '/dev/sr1'
Drive current: -outdev '/dev/sr1'
Media current: DVD-RW restricted overwrite
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data, 4488m free
```
As with blanking, one should not worry if the progress messages show
unplausible percentages. Some drives are more equal than others.
Formatting is said to be much stress to the medium. `-format` option
`as_needed` applies it only to yet unformatted media.
When performing above write tests, take care to use `-blank as_needed`
rather than `-blank deformat_quickest`. Else you will get a sequential
unformatted DVD-RW rather than a formatted DVD-RW which xorriso is
willing to write from scratch.
There is no use in a separate "DAO" test on overwritable media anyway.
-----------------------------------------------------------------------------
Change the formatted size of a BD-RE:
First learn about formatted size and proposals of other sizes.
(One can issue own wishes, too. See in man xorriso, command `-format`.)
```
$ xorriso -outdev /dev/sr1 -list_formats
```
should tell on stdout
```
...
Format status: formatted, with 23610.0 MiB
BD Spare Area: 0 blocks consumed, 131072 blocks available
Format idx 0 : 00h , 11826176s , 23098.0 MiB
Format idx 1 : 01h , 11564032s , 22586.0 MiB
Format idx 2 : 30h , 11826176s , 23098.0 MiB
Format idx 3 : 30h , 11564032s , 22586.0 MiB
Format idx 4 : 30h , 12088320s , 23610.0 MiB
Format idx 5 : 31h , 12219392s , 23866.0 MiB
```
So lets go back from 23610.0 MiB to the default size of 23098.0 MiB
```
$ xorriso -outdev /dev/sr1 -format by_index_2 -blank as_needed
...
Media summary: 2 sessions, 105470 data blocks, 206m data, 22.4g free
```
Although the heads of the old sessions might remain readable after
`-format`, better do not rely on this and a append `-blank as_needed` to
avoid any data corruption.
If you want to keep the data, then make at least a checkread run.
Check whether the size has changed:
```
$ xorriso -outdev /dev/sr1 -list_formats
```
should tell on stdout
```
...
Format status: formatted, with 23098.0 MiB
BD Spare Area: 0 blocks consumed, 393216 blocks available
...
```

View File

@ -1,22 +0,0 @@
# This is an example for a xorriso startup file.
# If found at one of the following addresses then its text lines will get
# executed by xorriso as commands before any of its program arguments:
# /etc/default/xorriso
# /etc/opt/xorriso/rc
# /etc/xorriso/xorriso.conf
# $HOME/.xorrisorc
# Note: Command -no_rc as first program argument prevents this execution.
# Disallow the use of hard disk /dev/sda and its partitions as
# pseudo-drive (e.g. as output target of an ISO image).
-drive_class banned /dev/sda*
# Allow the use of /dev/sdb, /dev/sdc, and /dev/sdd as pseudo-drives
# without the prefix "stdio:" which is usually required for device addresses
# which begin by "/dev/" but represent no CD drives.
-drive_class harmless /dev/sd[bcd]

View File

@ -1,127 +0,0 @@
------------------------------------------------------------------------------
xorriso-tcltk
------------------------------------------------------------------------------
Copyright (C) 2012 - 2013
Thomas Schmitt <scdbackup@gmx.net>, libburnia-project.org
Provided under BSD license: Use, modify, and distribute as you like.
------------------------------------------------------------------------------
xorriso-tcltk is mainly a proof of concept for a frontend that operates
xorriso in dialog mode.
Dependencies:
- xorriso ISO 9660 Rock Ridge filesystem manipulator and CD/DVD/BD burn program
- Tcl programming language
- Tk widget toolkit
- optionally the Tcl/Tk package BWidget
It exercises several fundamental gestures of communication:
- connecting via two pipes
- sending commands
- receiving replies
- inquiring the xorriso message sieve
- using the xorriso parsing service
Note that any other language than Tcl/Tk could be used, if it only can
do i/o via standard input and standard output or via named pipes.
Further it has to perform integer arithmetics and string manipulations.
And, well, a graphical widget set would be nice.
See man xorriso for a documentation of xorriso concepts and commands.
See man xorrecord for details of the burn image file feature.
Quick start
In the xorriso build directory, without installation of xorriso:
xorriso/xorriso -launch_frontend frontend/xorriso-tcltk --stdio --
After installation of xorriso by make install:
xorriso-tcltk
Overview of GUI
The window is separated into three main areas:
- Connection to xorriso.
- Management of drives and image files.
- Inspection, manipulation, and exploitation of xorriso ISO image model.
Click the rightmost mouse button while being over any of the GUI elements
in order to get the particular help text for that element.
There is no need to close the help window. Just click another element to
get another help text.
The "Help" button in the upper right corner gives a short overview and
instructions for several common use cases.
Program start options
The Tcl shell "wish" is allergic to options which start by "-h".
So here is the output of xorriso-tcltk --help :
------------------------------------------------------------------------
Usage:
frontend/xorriso-tcltk [options]
Options:
All options must be given with two dashes ("--option") in
order to distinguish them from any options of the Tcl shell.
--help
Print this text and exit.
--stdio
Establish connection to xorriso via stdin and stdout.
E.g. when letting xorriso start this frontend program:
xorriso -launch_frontend $(which xorriso-tcltk) --stdio --
--named_pipes cmd_fifo reply_fifo
Establish connection to a xorriso process started by:
xorriso -dialog on <cmd_fifo >reply_fifo
which is then ready for a run of:
xorriso-tcltk --named_pipes cmd_fifo reply_fifo
It is important that the parent of xorriso and of this
tcl/tk frontend opens the named pipe for commands before
it opens the named pipe for replies. This avoids deadlock.
--silent_start
Do not issue the start message xorriso-tcltk-version.
This works only if --silent_start is the first argument.
--no_extract
Do not allow extraction of files from ISO filesystem to
hard disk. This is not revokable during the program run.
--no_bwidget
Do not try to load the Tcl/Tk package BWidget which is
a prerequisite for the "/" file browser buttons.
--geometry {+|-}X{+|-}Y
Sets the position of the main window.
--click_to_focus
Chooses that input fields and list boxes get the keyboard
focus only when being clicked by the mouse. (Default)
--auto_focus
Chooses that the keyboard focus is where the mouse
pointer is.
--pipe_log_file path
Set a file address for logging of xorriso commands and
reply messages and enable this logging.
The log lines will be appended. Path "-" means stderr.
--script_log_file path
Set a file address for logging of essential xorriso
commands and enable this logging.
The log lines will be appended. Path "-" means stderr.
--script_log_all_commands
With logging of commands log non-essential commands too.
--use_command_move
Use xorriso command -move for the "Move to: button
if xorriso version is >= 1.2.8
--use_command_mv
Use xorriso command -mv for the "Move to:" button.
If neither --stdio nor --named_pipes is given, then this script
will try to locate itself in the filesystem and start a xorriso
run that launches it again.
In the running GUI, click with the rightmost mouse button on
any GUI element to get its particular help text.
------------------------------------------------------------------------

View File

@ -1,980 +0,0 @@
/* Beefed-up example from man 2 pipe
to illustrate how xorriso is to be used by frontend programs via two pipes.
Additionally there is a standalone implementation of Xorriso_parse_line().
Copyright 2012 Thomas Schmitt, <scdbackup@gmx.net>
Unaltered provided under BSD license.
You may issue licenses of your choice for derived code, provided that they
do not infringe anybody's right to do the same for this original code.
Build:
cc -g -o frontend_pipes_xorriso frontend_pipes_xorriso.c
Usage:
./frontend_pipes_xorriso [path_to_xorriso_binary | -h]
*/
#include <sys/wait.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
static int usage()
{
static char helptext[][80] = {
"usage: frontend_pipes_xorriso [path_to_xorriso|-h]",
"",
"Forks a process that runs xorriso and communicates with it via two pipes.",
"The command pipe sends payload commands and -mark commands. The reply pipe",
"receives -pkt_output lines which it dispatches to stdout and stderr.",
"The communication between both processes is made synchronous by the parent",
"awaiting the -mark message of the child.",
"Optionally the reply lines can be parsed into words. This is initiated by",
"meta command",
" @parse [prefix [separators [max_words [flag]]]]",
"which sets the four parameters for a function equivalent to",
"Xorriso_parse_line() (see xorriso.h). All reply will then be parsed and",
"non-empty word arrays are displayed. Meta command",
" @noparse",
"ends this mode.",
"Meta command",
" @drain_sieve",
"reports all recorded results of all installed message sieve filter rules.",
"For illustration perform this xorriso command sequence",
" -msg_op start_sieve - -outdev /dev/sr0 -msg_op clear_sieve - -toc",
"and then @drain_sieve.",
"@END@"
};
int i;
for (i = 0; strcmp(helptext[i], "@END@") != 0; i++)
fprintf(stderr, "%s\n", helptext[i]);
return(1);
}
/* Local helpers of parent process */
struct boss_state {
/* What the parent needs to know about its connection to xorriso */
/* The ends of the dialog pipes */
int command_fd;
int reply_fd;
/* For synchronization between boss and xorriso */
int mark_count;
char pending_mark[16];
/* Parsing_parameters. See xorriso.h Xorriso_parse_line */
int do_parse;
char progname[1024];
char prefix[1024];
char separators[256];
int max_words;
int flag;
/* A primitive catcher for result lines */
int reply_lines_size; /* 0= catching disabled */
char **reply_lines;
int reply_lines_count;
};
#define Frontend_xorriso_max_resulT 1000
/* Some basic gestures of this program: */
static int prompt_for_command(struct boss_state *boss,
char *line, int line_size);
static int transmit_command(struct boss_state *boss, char *line);
static int await_all_replies(struct boss_state *boss);
static int de_pkt_result(struct boss_state *boss);
static int drain_sieve(struct boss_state *boss);
int parse_line(char *progname, char *line,
char *prefix, char *separators, int max_words,
int *argc, char ***argv, int flag);
int dispose_parsed_words(int *argc, char ***argv);
/* Parent and child */
int main(int argc, char *argv[])
{
int command_pipe[2], reply_pipe[2];
pid_t cpid;
char *xorriso_path = "/usr/bin/xorriso";
if (argc > 1) {
if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "-help") == 0 ||
strcmp(argv[1], "--help") == 0) {
usage();
exit(0);
}
xorriso_path = argv[1];
}
if (pipe(command_pipe) == -1)
{ perror("pipe"); exit(1); }
if (pipe(reply_pipe) == -1)
{ perror("pipe"); exit(1); }
cpid = fork();
if (cpid == -1)
{ perror("fork"); exit(2); }
if (cpid == 0) {
/* Child redirects stdin and stdout. Then it becomes xorriso. */
char *xargv[8];
close(command_pipe[1]); /* Close unused write end */
close(reply_pipe[0]); /* Close unused read end */
/* Attach pipe ends to stdin and stdout */
close(0);
if (dup2(command_pipe[0], 0) == -1)
{ perror("dup2(,0)"); exit(1); }
close(1);
if (dup2(reply_pipe[1], 1) == -1)
{ perror("dup2(,1)"); exit(1); }
xargv[0] = xorriso_path;
xargv[1] = "-dialog";
xargv[2] = "on";
xargv[3] = "-pkt_output";
xargv[4] = "on";
xargv[5] = "-mark";
xargv[6] = "0"; /* corresponds to mark_count = 0 in parent */
xargv[7] = NULL;
execv(xorriso_path, xargv);
perror("execv"); exit(1);
} else {
/* Parent prompts user for command lines and prints xorriso replies.
It knows when all reply text of the pending command line has arrived
by watching for -mark reply pending_mark.
*/
int ret;
char line[4096];
struct boss_state boss;
close(command_pipe[0]); /* Close unused read end */
close(reply_pipe[1]); /* Close unused write end */
memset(&boss, 0, sizeof(boss));
boss.command_fd = command_pipe[1];
boss.reply_fd = reply_pipe[0];
strcpy(boss.progname, argv[0]);
boss.reply_lines = NULL;
/* Dialog loop */
sprintf(boss.pending_mark, "%d", boss.mark_count);
while (1) {
/* Wait for pending mark and print all replies */
ret = await_all_replies(&boss);
if (ret < 0)
break;
/* Prompt for command line */
ret = prompt_for_command(&boss, line, sizeof(line));
if (ret <= 0)
break;
/* Send line and -mark command */
ret = transmit_command(&boss, line);
if (ret <= 0)
break;
}
/* >>> if child is still operational: send -rollback_end */;
/* >>> wait a short while */;
/* >>> if not yet ended: kill child */;
wait(NULL); /* Wait for child */
exit(0);
}
}
/* ------------------- Local helpers of parent process -------------------- */
static int show_parsed(struct boss_state *boss, char *line);
static int record_reply_line(struct boss_state *boss, char *line);
static int make_reply_lines(struct boss_state *boss);
static int input_interpreter(char *line, struct boss_state *boss);
/* Ask the user for command input and trigger processing of meta commands.
*/
static int prompt_for_command(struct boss_state *boss,
char *line, int line_size)
{
int l, ret;
char *line_res;
while (1) {
fprintf(stderr, "+++ Enter a command and its parameters :\n");
line_res = fgets(line, line_size - 1, stdin);
if (line_res == NULL)
return(0);
l = strlen(line);
if (l == 0) {
line[0] = '\n';
line[1] = 0;
} else if (line[l - 1] != '\n') {
line[l] = '\n';
line[l + 1] = 0;
}
/* Interpret meta commands which begin by @ */
ret = input_interpreter(line, boss);
if (ret == 0)
return(1);
if (ret < 0)
return(-1);
}
}
/* Transmit a command (which must end by white space, e.g. newline)
and its unique synchronization mark.
*/
static int transmit_command(struct boss_state *boss, char *line)
{
int ret;
char mark_line[32];
ret = write(boss->command_fd, line, strlen(line));
if (ret == -1) {
perror("write");
return(0);
}
/* Produce new unique -mark text to watch for */
(boss->mark_count)++;
sprintf(boss->pending_mark, "%d", boss->mark_count);
sprintf(mark_line, "-mark %s\n", boss->pending_mark);
ret = write(boss->command_fd, mark_line, strlen(mark_line));
if (ret == -1) {
perror("write");
return(0);
}
return(1);
}
/* Read reply messages from xorriso and wait for the expected synchronization
mark. Messages can be printed or collected in boss->reply_lines.
*/
static int await_all_replies(struct boss_state *boss)
{
int count, remainder = 0, ret;
char buf[32769], *line, *npt;
while (1) {
count = read(boss->reply_fd, buf + remainder,
sizeof(buf) - 1 - remainder);
if (count == -1) {
perror("read");
return(-1);
}
if (count == 0) {
fprintf(stderr, "+++ EOF encountered by Master process\n");
return(-2);
}
for (npt = buf + remainder; npt < buf + count; npt++) {
if (*npt == 0) {
fprintf(stderr,
"+++ Protocol error : Reply contains 0-chars\n");
return(-1);
}
}
/* Split buf into lines */
buf[remainder + count] = 0; /* for convenience */
line = buf;
while (1) {
npt = strchr(line, '\n');
if (npt == NULL) {
/* Move line to start of buffer and set remainder */
if (line != buf) {
remainder = 0;
for (npt = line; *npt; npt++)
buf[remainder++] = *npt;
}
/* Now read more data in the hope to get a newline char */
break;
}
/* Interpret line */
*npt = 0;
if (line[0] == 'M') {
/* M-replies will be outdated until the pending command line
is completely done and the appended -mark command gets
into effect.
*/
if (strlen(line) < 6) {
fprintf(stderr,
"+++ Protocol error : M-channel line shorter than 6 chars\n");
return(-1);
}
if (strcmp(line + 5, boss->pending_mark) == 0) {
if ((line - buf) + strlen(line) + 1 < count) {
fprintf(stderr,
"+++ Protocol error : Surplus reply data after M-match\n");
fprintf(stderr, "%s\n", line + strlen(line) + 1);
return(-1);
}
return (1); /* Expected mark has arrived */
}
} else if (line[0] == 'R') {
/* R-replies are result lines of inquiry commands, like -ls.
They should be handled by specialized code which knows
how to parse and interpret them.
*/
if (boss->reply_lines_count < boss->reply_lines_size) {
ret = record_reply_line(boss, line);
if (ret <= 0)
return(ret);
} else
printf("%s\n", line);
} else {
/* I-replies are pacifiers, notifications, warnings, or
error messages. They should be handled by a general
message interpreter which determines their severity
and decides whether to bother the user.
*/
if (boss->reply_lines_count < boss->reply_lines_size) {
ret = record_reply_line(boss, line);
if (ret <= 0)
return(ret);
} else
fprintf(stderr, "%s\n", line);
}
/* Parse line and show words */
if (strlen(line) >= 5)
show_parsed(boss, line + 5);
line = npt + 1;
}
}
return(1);
}
/* Throw away I channel.
Unpack and reconstruct payload of R channel lines.
*/
static int de_pkt_result(struct boss_state *boss)
{
int i, l, w;
char *payload = NULL, *new_payload = NULL;
w = 0;
for (i = 0; i < boss->reply_lines_count; i++) {
if (boss->reply_lines[i][0] != 'R' ||
strlen(boss->reply_lines[i]) < 5)
continue;
if (payload == NULL) {
payload = strdup(boss->reply_lines[i] + 5);
} else {
l = strlen(payload);
new_payload = calloc(l + strlen(boss->reply_lines[i] + 5) + 1, 1);
if (new_payload == NULL)
goto no_mem;
strcpy(new_payload, payload);
strcpy(new_payload + l, boss->reply_lines[i] + 5);
free(payload);
payload = new_payload;
}
if (payload == NULL)
goto no_mem;
l = strlen(payload);
if (l > 0)
if (payload[l - 1] == '\n')
payload[l - 1] = 0;
if (boss->reply_lines[i][2] != '0') {
free(boss->reply_lines[w]);
boss->reply_lines[w] = payload;
w++;
payload = NULL;
}
}
for (i = w ; i < boss->reply_lines_count; i++) {
free(boss->reply_lines[i]);
boss->reply_lines[i] = NULL;
}
boss->reply_lines_count = w;
return(1);
no_mem:;
fprintf(stderr, "FATAL: Out of memory !\n");
return(-1);
}
/* Inquire and print all recorded message sieve results.
*/
static int drain_sieve(struct boss_state *boss)
{
int ret, i, j, names_size = 0, names_count = 0, first_result;
int number_of_strings, available, xorriso_ret, number_of_lines, k, r;
char **names = NULL, line[1024];
/* Install catcher for reply_lines */
ret = make_reply_lines(boss);
if (ret <= 0)
goto ex;
boss->reply_lines_size = Frontend_xorriso_max_resulT;
boss->reply_lines_count = 0;
/* Get list of filter rule names from -msg_op show_sieve */
ret = transmit_command(boss, "-msg_op show_sieve -\n");
if (ret <= 0)
goto ex;
ret = await_all_replies(boss);
if (ret <= 0)
goto ex;
ret = de_pkt_result(boss);
if (ret <= 0)
goto ex;
names = boss->reply_lines;
boss->reply_lines = NULL;
names_size = Frontend_xorriso_max_resulT;
names_count= boss->reply_lines_count;
ret = make_reply_lines(boss);
if (ret <= 0)
goto ex;
boss->reply_lines_size = Frontend_xorriso_max_resulT;
/* Inquire caught results of each name by -msg_op read_sieve
until return value is <= 0
*/
printf("--------------------------------------------------\n");
for (i = 0; i < names_count; i++) {
available = 1;
first_result = 1;
while (available > 0) {
boss->reply_lines_count = 0;
sprintf(line, "-msg_op read_sieve '%s'\n", names[i]);
ret = transmit_command(boss, line);
if (ret <= 0)
goto ex;
ret = await_all_replies(boss);
if (ret <= 0)
goto ex;
ret = de_pkt_result(boss);
if (ret <= 0)
goto ex;
if (boss->reply_lines_count < 2) {
fprintf(stderr, "drain_sieve: illegible result reply\n");
{ret= 0; goto ex;}
}
xorriso_ret = -1;
sscanf(boss->reply_lines[0], "%d", &xorriso_ret);
if(xorriso_ret <= 0)
break;
number_of_strings = -1;
sscanf(boss->reply_lines[1], "%d", &number_of_strings);
if(xorriso_ret < 0)
break;
if (first_result)
printf(" '%s' |\n", names[i]);
first_result = 0;
for (j = 0; names[i][j] != 0; j++)
printf("-");
printf("-----\n");
r = 2;
for (j = 0; j < number_of_strings && r < boss->reply_lines_count;
j++) {
number_of_lines = -1;
sscanf(boss->reply_lines[r], "%d", &number_of_lines);
r++;
printf("|");
for (k = 0; k < number_of_lines
&& r < boss->reply_lines_count; k++) {
printf("%s%s", boss->reply_lines[r],
k < number_of_lines - 1 ? "\n" : "");
r++;
}
printf("|\n");
}
}
if (first_result == 0)
printf("--------------------------------------------------\n");
}
/* Dispose all recorded results */
ret = transmit_command(boss, "-msg_op clear_sieve -\n");
if (ret <= 0)
goto ex;
ret = await_all_replies(boss);
if (ret <= 0)
goto ex;
ret = 1;
ex:;
/* Disable result catcher */
boss->reply_lines_size = 0;
if (names != NULL)
dispose_parsed_words(&names_size, &names);
return(ret);
}
/* ------------------------- Helpers of local helpers ---------------------- */
static int show_parsed(struct boss_state *boss, char *line)
{
int argc, ret = 0, i;
char **argv = NULL;
if (!boss->do_parse)
return(2);
ret = parse_line(boss->progname, line, boss->prefix, boss->separators,
boss->max_words, &argc, &argv, boss->flag);
if (ret <= 0 || argc <= 0)
return(0);
fprintf(stderr, "-----------------------------------------------------\n");
fprintf(stderr, "parse_line returns %d, argc = %d\n", ret, argc);
for (i = 0; i < argc; i++)
fprintf(stderr, "%2d : %s\n", i, argv[i]);
fprintf(stderr, "-----------------------------------------------------\n");
dispose_parsed_words(&argc, &argv); /* release memory */
return(1);
}
static int make_reply_lines(struct boss_state *boss)
{
int i;
if (boss->reply_lines != NULL)
return(1);
boss->reply_lines = calloc(Frontend_xorriso_max_resulT,
sizeof(char *));
if (boss->reply_lines == 0) {
fprintf(stderr, "FATAL: Out of memory !\n");
return(-1);
}
boss->reply_lines_count = 0;
boss->reply_lines_size = 0;
for (i = 0; i < Frontend_xorriso_max_resulT; i++)
boss->reply_lines[i] = NULL;
return(1);
}
static int record_reply_line(struct boss_state *boss, char *line)
{
if (boss->reply_lines[boss->reply_lines_count] != NULL)
free(boss->reply_lines[boss->reply_lines_count]);
boss->reply_lines[boss->reply_lines_count] = strdup(line);
if (boss->reply_lines[boss->reply_lines_count] == NULL) {
fprintf(stderr, "FATAL: Out of memory !\n");
return(-1);
}
boss->reply_lines_count++;
return(1);
}
static int input_interpreter(char *line, struct boss_state *boss)
{
int argc, ret = 0;
char **argv = NULL;
ret = parse_line(boss->progname, line, "", "", 6, &argc, &argv, 0);
if (ret <= 0 || argc <= 0)
return(0);
if (strcmp(argv[0], "@parse") == 0) {
boss->do_parse = 1;
boss->prefix[0] = 0;
if (argc > 1)
strcpy(boss->prefix, argv[1]);
boss->separators[0] = 0;
if (argc > 2)
strcpy(boss->separators, argv[2]);
boss->max_words = 0;
if (argc > 3)
sscanf(argv[3], "%d", &(boss->max_words));
boss->max_words = 0;
if (argc > 4)
sscanf(argv[4], "%d", &(boss->flag));
ret = 1;
} else if(strcmp(argv[0], "@noparse") == 0) {
boss->do_parse = 0;
ret = 1;
} else if(strcmp(argv[0], "@drain_sieve") == 0) {
ret= drain_sieve(boss);
} else {
ret = 0;
}
dispose_parsed_words(&argc, &argv); /* release memory */
return ret;
}
/* -------- Line-to-word parser equivalent to Xorriso_parse_line() -------- */
static int Sfile_sep_make_argv(char *progname, char *line, char *separators,
int max_words, int *argc, char ***argv, int flag);
int parse_line(char *progname, char *line,
char *prefix, char *separators, int max_words,
int *argc, char ***argv, int flag)
{
int ret, bsl_mode;
char *to_parse;
*argc = 0;
*argv = NULL;
to_parse = line;
bsl_mode = (flag >> 1) & 15;
if (prefix[0]) {
if (strncmp(line, prefix, strlen(prefix)) == 0) {
to_parse = line + strlen(prefix);
} else {
ret = 2; goto ex;
}
}
ret = Sfile_sep_make_argv(progname, to_parse, separators,
max_words, argc, argv,
(!(flag & 32)) | 4 | (bsl_mode << 5));
if (ret < 0) {
fprintf(stderr,
"%s : Severe lack of resources during command line parsing\n",
progname);
goto ex;
}
if (ret == 0) {
fprintf(stderr,
"%s : Incomplete quotation in %s line: %s\n",
progname, (flag & 32) ? "command" : "parsed", to_parse);
goto ex;
}
ex:;
if (ret <= 0)
Sfile_sep_make_argv("", "", "", 0, argc, argv, 2); /* release memory */
return(ret);
}
int dispose_parsed_words(int *argc, char ***argv)
{
Sfile_sep_make_argv("", "", "", 0, argc, argv, 2);
return(1);
}
/* -------------- Some helpers copied from xorriso/sfile.c ----------------- */
static int Sfile_destroy_argv(int *argc, char ***argv, int flag)
{
int i;
if(*argc>0 && *argv!=NULL){
for(i=0;i<*argc;i++){
if((*argv)[i]!=NULL)
free((*argv)[i]);
}
free((char *) *argv);
}
*argc= 0;
*argv= NULL;
return(1);
}
/* Converts backslash codes into single characters:
\a BEL 7 , \b BS 8 , \e ESC 27 , \f FF 12 , \n LF 10 , \r CR 13 ,
\t HT 9 , \v VT 11 , \\ \ 92
\[0-9][0-9][0-9] octal code , \x[0-9a-f][0-9a-f] hex code ,
\cX control-x (ascii(X)-64)
@param upto maximum number of characters to examine for backslash.
The scope of a backslash (0 to 3 characters) is not affected.
@param eaten returns the difference in length between input and output
@param flag bit0= only determine *eaten, do not convert
bit1= convert \000 to binary 0
*/
static int Sfile_bsl_interpreter(char *text, int upto, int *eaten, int flag)
{
char *rpt, *wpt, num_text[8], wdummy[8];
unsigned int num= 0;
*eaten= 0;
wpt= text;
for(rpt= text; *rpt != 0 && rpt - text < upto; rpt++) {
if(flag & 1)
wpt= wdummy;
if(*rpt == '\\') {
rpt++;
(*eaten)++;
if(*rpt == 'a') {
*(wpt++)= 7;
} else if(*rpt == 'b') {
*(wpt++)= 8;
} else if(*rpt == 'e') {
*(wpt++)= 27;
} else if(*rpt == 'f') {
*(wpt++)= 12;
} else if(*rpt == 'n') {
*(wpt++)= 10;
} else if(*rpt == 'r') {
*(wpt++)= 13;
} else if(*rpt == 't') {
*(wpt++)= 9;
} else if(*rpt == 'v') {
*(wpt++)= 11;
} else if(*rpt == '\\') {
*(wpt++)= '\\';
} else if(rpt[0] >= '0' && rpt[0] <= '7' &&
rpt[1] >= '0' && rpt[1] <= '7' &&
rpt[2] >= '0' && rpt[2] <= '7') {
num_text[0]= '0';
num_text[1]= *(rpt + 0);
num_text[2]= *(rpt + 1);
num_text[3]= *(rpt + 2);
num_text[4]= 0;
sscanf(num_text, "%o", &num);
if((num > 0 || (flag & 2)) && num <= 255) {
rpt+= 2;
(*eaten)+= 2;
*(wpt++)= num;
} else
goto not_a_code;
} else if(rpt[0] == 'x' &&
((rpt[1] >= '0' && rpt[1] <= '9') ||
(rpt[1] >= 'A' && rpt[1] <= 'F') ||
(rpt[1] >= 'a' && rpt[1] <= 'f'))
&&
((rpt[2] >= '0' && rpt[2] <= '9') ||
(rpt[2] >= 'A' && rpt[2] <= 'F') ||
(rpt[2] >= 'a' && rpt[2] <= 'f'))
) {
num_text[0]= *(rpt + 1);
num_text[1]= *(rpt + 2);
num_text[2]= 0;
sscanf(num_text, "%x", &num);
if(num > 0 && num <= 255) {
rpt+= 2;
(*eaten)+= 2;
*(wpt++)= num;
} else
goto not_a_code;
} else if(*rpt == 'c') {
if(rpt[1] > 64 && rpt[1] < 96) {
*(wpt++)= rpt[1] - 64;
rpt++;
(*eaten)++;
} else
goto not_a_code;
} else {
not_a_code:;
*(wpt++)= '\\';
rpt--;
(*eaten)--;
}
} else
*(wpt++)= *rpt;
}
*wpt= *rpt;
return(1);
}
#define SfileadrL 4096
static int Sfile_sep_make_argv(char *progname, char *line, char *separators,
int max_words, int *argc, char ***argv, int flag)
/*
bit0= read progname as first argument from line
bit1= just release argument list argv and return
bit2= abort with return(0) if incomplete quotes are found
bit3= eventually prepend missing '-' to first argument read from line
bit4= like bit2 but only check quote completeness, do not allocate memory
bit5+6= interpretation of backslashes:
0= no interpretation, leave unchanged
1= only inside double quotes
2= outside single quotes
3= everywhere
bit7= append a NULL element to argv
*/
{
int i,pass,maxl=0,l,argzaehl=0,bufl,line_start_argc, bsl_mode, ret= 0, eaten;
char *cpt,*start;
char *buf= NULL;
Sfile_destroy_argv(argc,argv,0);
if(flag&2)
{ret= 1; goto ex;}
if(flag & 16)
flag|= 4;
bsl_mode= (flag >> 5) & 3;
buf= calloc(strlen(line) + SfileadrL, 1);
if(buf == NULL)
{ret= -1; goto ex;}
for(pass=0;pass<2;pass++) {
cpt= line-1;
if(!(flag&1)){
argzaehl= line_start_argc= 1;
if(pass==0)
maxl= strlen(progname);
else
strcpy((*argv)[0],progname);
} else {
argzaehl= line_start_argc= 0;
if(pass==0) maxl= 0;
}
while(*(++cpt)!=0){
if(*separators) {
if(strchr(separators, *cpt) != NULL)
continue;
} else if(isspace(*cpt))
continue;
start= cpt;
buf[0]= 0;
cpt--;
if(max_words > 0 && argzaehl >= max_words && *cpt != 0) {
/* take uninterpreted up to the end */
cpt+= strlen(cpt) - 1;
}
while(*(++cpt)!=0) {
if(*separators) {
if(strchr(separators, *cpt) != NULL)
break;
} else if(isspace(*cpt))
break;
if(*cpt=='"'){
l= cpt-start; bufl= strlen(buf);
if(l>0) {
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
if(bsl_mode >= 3) {
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
if(ret <= 0)
goto ex;
}
}
l= strlen(buf);
start= cpt+1;
while(*(++cpt)!=0) if(*cpt=='"') break;
if((flag&4) && *cpt==0)
{ret= 0; goto ex;}
l= cpt-start; bufl= strlen(buf);
if(l>0) {
strncpy(buf + bufl, start, l);
buf[bufl + l]= 0;
if(bsl_mode >= 1) {
ret= Sfile_bsl_interpreter(buf + bufl, l, &eaten, 0);
if(ret <= 0)
goto ex;
}
}
start= cpt+1;
}else if(*cpt=='\''){
l= cpt-start; bufl= strlen(buf);
if(l>0) {
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
if(bsl_mode >= 3) {
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
if(ret <= 0)
goto ex;
}
}
l= strlen(buf);
start= cpt+1;
while(*(++cpt)!=0) if(*cpt=='\'') break;
if((flag&4) && *cpt==0)
{ret= 0; goto ex;}
l= cpt-start; bufl= strlen(buf);
if(l>0) {
strncat(buf,start,l);buf[bufl+l]= 0;
if(bsl_mode >= 2) {
ret= Sfile_bsl_interpreter(buf + bufl, l, &eaten, 0);
if(ret <= 0)
goto ex;
}
}
start= cpt+1;
}
if(*cpt==0) break;
}
l= cpt-start;
bufl= strlen(buf);
if(l>0) {
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
if(bsl_mode >= 3) {
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
if(ret <= 0)
goto ex;
}
}
l= strlen(buf);
if(pass==0){
if(argzaehl==line_start_argc && (flag&8))
if(buf[0]!='-' && buf[0]!=0 && buf[0]!='#')
l++;
if(l>maxl) maxl= l;
}else{
strcpy((*argv)[argzaehl],buf);
if(argzaehl==line_start_argc && (flag&8))
if(buf[0]!='-' && buf[0]!=0 && buf[0]!='#')
sprintf((*argv)[argzaehl],"-%s", buf);
}
argzaehl++;
if(*cpt==0) break;
}
if(pass==0){
if(flag & 16)
{ret= 1; goto ex;}
*argc= argzaehl;
if(argzaehl>0 || (flag & 128)) {
*argv= (char **) calloc((argzaehl + !!(flag & 128)), sizeof(char *));
if(*argv==NULL)
{ret= -1; goto ex;}
}
for(i=0;i<*argc;i++) {
(*argv)[i]= (char *) calloc(maxl + 1, 1);
if((*argv)[i]==NULL)
{ret= -1; goto ex;}
}
if(flag & 128)
(*argv)[*argc]= NULL;
}
}
ret= 1;
ex:
if(buf != NULL)
free(buf);
return(ret);
}

View File

@ -1,439 +0,0 @@
#!/bin/sh
# Copyright (C) 2015 - 2022
# Thomas Schmitt <scdbackup@gmx.net>, libburnia-project.org
# Provided under BSD license: Use, modify, and distribute as you like.
echo >&2
echo "frontend/grub-mkrescue-sed.sh manipulating xorriso arguments" >&2
echo >&2
# This script may be handed by its absolute path to grub-mkrescue
# via option --xorriso= . E.g.
#
# mkdir minimal
# touch minimal/empty-file.txt
# grub-mkrescue -o output.iso minimal \
# --xorriso=/home/thomas/xorriso-1.4.3./frontend/grub-mkrescue-sed.sh
#
# It will manipulate the xorriso arguments before they get executed by a
# xorriso program. Default is the neighboring ../../xorriso/xorriso program or,
# if that neighbor cannot be found, the system-wide installed xorriso.
#
# The mode "mjg" implements a layout which resembles Fedora LiveCD and Debian
# ISOs which are bootable by ISOLINUX for BIOS and GRUB2 for EFI.
# Its GPT is considered to be surplus, according to UEFI specs.
#
# The mode "mbr_only" implements an alternative layout according to UEFI 2.4,
# section 2.5.1 and table 16. No GTP, HFS+, or APM.
# This mode produces a mountable ISO 9660 partition 1 only if variable
# MKRESCUE_SED_PROTECTIVE is empty or set to "no".
#
# The mode "mbr_hfs" is like "mbr_only" but with HFS+ mentioned in APM.
# It is still compliant to UEFI with no potentially deceiving GPT.
# If you add xorrisofs option -part_like_isohybrid then no gap fillig APM
# partition will emerge.
#
# Mode "gpt_appended" represents the same layout as "mbr_only" by GPT rather
# than by MBR partition table. It differs from "original" by the fact that
# option -partition_offset 16 is implied and that the first partition may
# be used to mount the ISO 9660 filesystem. MKRESCUE_SED_PROTECTIVE is ignored,
# because neat GPT is indicated by the existence of a Protective MBR.
#
# These modes avoid duplicate storing of the EFI system partition "efi.img"
# by xorrisofs option -e "--interval:appended_partition_${partno}:all::"
# which is new to xorriso-1.4.4.
# If "_copy" is appended to the mode name, then the file /efi.img will
# appear in the ISO 9660 filesystem and traditional -e "/efi.img" is used.
#
# "mbr_only_copy" is supposed to work with unmodified xorriso >= 1.3.2
#
# Variation settings
#
# The environment variables MKRESCUE_SED_* override the following
# default settings:
# Manipulation mode:
# "mjg" = ESP in MBR+GPT+APM, with HFS+
# "mbr_only" = ESP in MBR, without HFS+
# "mbr_hfs" = ESP in MBR, HFS+ in APM
# "gpt_appended" = ESP in GPT, without HFS+
# $mode"_copy" = one of above modes, ESP in ISO and as appended partition
# "original" = pass arguments unchanged
mode="mbr_only"
if test -n "$MKRESCUE_SED_MODE"
then
mode="$MKRESCUE_SED_MODE"
fi
# First argument of -append_partition with mode "mjg". Values: 1 or 2.
partno=1
if test -n "$MKRESCUE_SED_PARTNO"
then
partno="$MKRESCUE_SED_PARTNO"
fi
# Replacement for option --protective-msdos-label. Either itself or empty text.
# If the environment variable contains the word "no", this means empty.
protective=""
if test -n "$MKRESCUE_SED_PROTECTIVE"
then
if test x"$MKRESCUE_SED_PROTECTIVE" = xno
then
protective=""
elif test x"$MKRESCUE_SED_PROTECTIVE" = xyes
then
protective="--protective-msdos-label"
else
protective="$MKRESCUE_SED_PROTECTIVE"
fi
fi
# "yes" shows xorriso arguments, "extra" additionally shows all input files.
debug=no
if test -n "$MKRESCUE_SED_DEBUG"
then
debug="$MKRESCUE_SED_DEBUG"
fi
# The path to the program that will be executed with the converted arguments.
if test -n "$MKRESCUE_SED_XORRISO"
then
xorriso="$MKRESCUE_SED_XORRISO"
else
# Prefer neighboring xorriso binary over system-wide installed one.
self_dir="$(dirname $(dirname "$0") )"
if test -x "$self_dir"/xorriso/xorriso
then
xorriso="$self_dir"/xorriso/xorriso
else
xorriso="xorriso"
fi
fi
# MKRESCUE_SED_XORRISO_ARGS will be used as first arguments of the xorriso run.
# (Trailing xorriso arguments may be simply added to the grub-mkrescue
# command line.)
# Each argument must be a single word. No whitespace. No quotation marks.
# "yes" in MKRESCUE_SED_IN_EFI_NO_PT overwrites the MBR partition table area
# in the EFI boot image by zeros. Some EFI implementations get stuck when
# seeing in the EFI partition a partition table entry which begins at LBA 0.
# "extra" not only zeros the partition table but also the MBR signature.
efi_zero_inner_pt=no
if test -n "$MKRESCUE_SED_IN_EFI_NO_PT"
then
efi_zero_inner_pt="$MKRESCUE_SED_IN_EFI_NO_PT"
fi
# "yes" in MKRESCUE_SED_UNPACK_EFI_TO_ISO causes the file tree from the FAT
# image efi.img to be unpacked by mcopy to a directory in /tmp which then
# gets mapped into the root directory of the emerging ISO 9660 filesystem.
# This enables a way of installing the result image onto a USB stick with
# FAT filesystem by simply copying its full file tree from ISO to FAT.
# Whether the payload files of the ISO will be able to work from FAT depends
# on their expectation towards file names and attributes.
# WARNING: Make sure that the files in efi.img do not collide with your
# payload files or with files added to the ISO by GRUB. Before using
# MKRESCUE_SED_UNPACK_EFI_TO_ISO, make a vanilla grub-mkrescue ISO
# with your payload, mount it and then its /efi.img file, then use
# program "find" on the mount point of efi.img to see all its files.
# Compare this with the output of "find" on the ISO mount point.
efi_unpack_to_iso=no
if test -n "$MKRESCUE_SED_UNPACK_EFI_TO_ISO"
then
efi_unpack_to_iso="$MKRESCUE_SED_UNPACK_EFI_TO_ISO"
fi
#
# Do the work
#
# grub-mkrescue inquires features by running these arguments
if test "$*" = "-as mkisofs -help"
then
"$xorriso" "$@"
exit $?
fi
echo "frontend/grub-mkrescue-sed.sh mode: $mode" >&2
echo >&2
if test x"$debug" = xyes -o x"$debug" = xextra
then
# Show arguments
echo "##### Begin of received arguments" >&2
echo "$0" >&2
for i in "$@"
do
echo "$i" >&2
done
echo "##### End of received arguments" >&2
echo >&2
fi
# Check for option -iso_mbr_part_type which is new in 1.4.8
iso_mbr_part_type=
if "$xorriso" -as mkisofs -help 2>&1 | grep iso_mbr_part_type >/dev/null
then
iso_mbr_part_type="-iso_mbr_part_type 0x00"
fi
# Look for the name of the /tmp directory with the GRUB2 files.
# It is the next argument after -r. But as default accept any /tmp/grub.*
next_is_dir=0
dir="."
for i in "$@"
do
if test x"$i" = x"-r"
then
next_is_dir=1
elif test $next_is_dir = 1
then
next_is_dir=0
if echo "$i" | grep '^/tmp/grub.' >/dev/null 2>&1
then
test -d "$i" && dir="$i"
fi
elif test "$dir" = "."
then
if echo "$i" | grep '^/tmp/grub.' >/dev/null 2>&1
then
test -d "$i" && dir="$i"
fi
fi
done
if test x"$debug" = xextra
then
# Show files on disk
find "$dir" 2>&1
echo 2>&1
fi
if test x"$efi_zero_inner_pt" = xyes -o x"$efi_zero_inner_pt" = xextra
then
did_dd=0
if test -e "$dir"/efi.img
then
# Look for 0x55 0xAA in bytes 510 and 511
magic=$(dd bs=1 skip=510 count=2 if="$dir"/efi.img 2>/dev/null | \
od -c | head -1 | awk '{print $2 " " $3}')
if test "$magic" = "U 252"
then
echo "Performing actions for MKRESCUE_SED_IN_EFI_NO_PT=$efi_zero_inner_pt" >&2
dd if=/dev/zero bs=1 seek=446 count=64 conv=notrunc of="$dir"/efi.img
did_dd=1
if test "$efi_zero_inner_pt" = extra
then
dd if=/dev/zero bs=1 seek=510 count=2 conv=notrunc of="$dir"/efi.img
fi
echo >&2
fi
fi
if test "$did_dd" = 0
then
echo >&2
echo "$0 : NOTE : No EFI image found or no MBR signature in it." >&2
echo "$0 : NOTE : Will not obey MKRESCUE_SED_IN_EFI_NO_PT=$efi_zero_inner_pt" >&2
echo >&2
fi
fi
efi_temp_tree=
if test x"$efi_unpack_to_iso" = xyes
then
if test -e "$dir"/efi.img
then
temp_tree=/tmp/grub-mkrescue-sed-et."$$"
# The mcopy command is the inverse of what grub-mkrescue does to pack it up
if mcopy -s -i "$dir"/efi.img ::/ "$temp_tree"
then
efi_temp_tree="$temp_tree"
if test x"$debug" = xyes -o x"$debug" = xextra
then
echo "Temporarily extracted $dir/efi.img to $temp_tree" >&2
echo >&2
if test x"$debug" = xextra
then
# Show extracted files
find "$temp_tree" >&2
echo >&2
fi
fi
elif test -e "$temp_tree"
then
rm -r "$temp_tree"
fi
if test -z "$efi_temp_tree"
then
echo >&2
echo "$0 : NOTE : Could not extract efi.img to $temp_tree" >&2
echo "$0 : NOTE : Thus cannot obey MKRESCUE_SED_UNPACK_EFI_TO_ISO." >&2
echo >&2
fi
fi
fi
efi_tmp_name=
if test x"$mode" = xmjg \
-o x"$mode" = xmbr_only \
-o x"$mode" = xgpt_appended \
-o x"$mode" = xmbr_hfs
then
# Move EFI partition image file out of the "$dir" tree, i.e. out of the ISO
efi_tmp_name=grub-mkrescue-sed-ei.$$
if test -e "$dir"/efi.img
then
mv "$dir"/efi.img /tmp/$efi_tmp_name
if test x"$debug" = xyes -o x"$debug" = xextra
then
echo "Temporarily moved $dir/efi.img to /tmp/$efi_tmp_name" >&2
echo >&2
fi
elif test -e /tmp/$efi_tmp_name
then
rm /tmp/$efi_tmp_name
fi
fi
if test x"$mode" = xmjg
then
# Exchange arguments for the experimental GRUB2 mjg layout
x=$(echo " $*" | sed \
-e "s/-efi-boot-part --efi-boot-image/-no-pad -append_partition $partno 0xef \/tmp\/$efi_tmp_name/" \
-e "s/--efi-boot efi\.img/-eltorito-alt-boot -e --interval:appended_partition_${partno}:all:: -no-emul-boot -isohybrid-gpt-basdat/" \
-e "s/--protective-msdos-label/$protective -part_like_isohybrid/" \
)
elif test x"$mode" = xmjg_copy
then
# Exchange arguments for the experimental GRUB2 mjg layout
x=$(echo " $*" | sed \
-e "s/-efi-boot-part --efi-boot-image/-no-pad -append_partition $partno 0xef \/tmp\/$(basename "$dir")\/efi.img/" \
-e "s/--efi-boot efi\.img/-eltorito-alt-boot -e efi.img -no-emul-boot -isohybrid-gpt-basdat/" \
-e "s/--protective-msdos-label/$protective -part_like_isohybrid/" \
)
elif test x"$mode" = xmbr_only
then
# Exchange arguments for no-HFS MBR-only layout
x=$(echo " $*" | sed \
-e "s/-efi-boot-part --efi-boot-image/$iso_mbr_part_type -no-pad -append_partition 2 0xef \/tmp\/$efi_tmp_name/" \
-e "s/--efi-boot efi\.img/-eltorito-alt-boot -e --interval:appended_partition_2:all:: -no-emul-boot/" \
-e "s/-hfsplus .*CoreServices\/boot.efi//" \
-e "s/--protective-msdos-label/$protective/" \
)
elif test x"$mode" = xmbr_only_copy
then
# Exchange arguments for no-HFS MBR-only layout
x=$(echo " $*" | sed \
-e "s/-efi-boot-part --efi-boot-image/$iso_mbr_part_type -no-pad -append_partition 2 0xef \/tmp\/$(basename "$dir")\/efi.img/" \
-e "s/-hfsplus .*CoreServices\/boot.efi//" \
-e "s/--protective-msdos-label/$protective/" \
)
elif test x"$mode" = xmbr_hfs
then
# Exchange arguments for MBR and HFS+ layout
x=$(echo " $*" | sed \
-e "s/-efi-boot-part --efi-boot-image/$iso_mbr_part_type -no-pad -append_partition 2 0xef \/tmp\/$efi_tmp_name/" \
-e "s/--efi-boot efi\.img/-eltorito-alt-boot -e --interval:appended_partition_2:all:: -no-emul-boot/" \
-e "s/--protective-msdos-label/$protective/" \
)
elif test x"$mode" = xmbr_hfs_copy
then
# Exchange arguments for MBR and HFS+ layout
x=$(echo " $*" | sed \
-e "s/-efi-boot-part --efi-boot-image/$iso_mbr_part_type -no-pad -append_partition 2 0xef \/tmp\/$(basename "$dir")\/efi.img/" \
-e "s/--protective-msdos-label/$protective/" \
)
elif test x"$mode" = xgpt_appended
then
# Exchange arguments for no-HFS MBR-only layout
x=$(echo " $*" | sed \
-e "s/-efi-boot-part --efi-boot-image/-no-pad -append_partition 2 0xef \/tmp\/$efi_tmp_name -appended_part_as_gpt -partition_offset 16/" \
-e "s/--efi-boot efi\.img/-eltorito-alt-boot -e --interval:appended_partition_2:all:: -no-emul-boot/" \
-e "s/-hfsplus .*CoreServices\/boot.efi//" \
)
elif test x"$mode" = xgpt_appended_copy
then
# Exchange arguments for no-HFS MBR-only layout
x=$(echo " $*" | sed \
-e "s/-efi-boot-part --efi-boot-image/-no-pad -append_partition 2 0xef \/tmp\/$(basename "$dir")\/efi.img -appended_part_as_gpt -partition_offset 16/" \
-e "s/-hfsplus .*CoreServices\/boot.efi//" \
)
elif test x"$mode" = xoriginal
then
# Pass arguments unchanged
x=" $*"
else
echo >&2
echo "$0 : FATAL : Unknown manipulation mode '$mode'." >&2
echo >&2
exit 1
fi
if echo "$efi_temp_tree" | grep '^/tmp/' >/dev/null
then
# Does the xorriso run end in native command mode ?
separator_seen=0
for i in "$@"
do
if test x"$i" = x--
then
separator_seen=1
fi
done
if test "$separator_seen" = 1
then
# Native mode possible: Enable it for sure and then use -map
x=" $x -- -map $efi_temp_tree /"
else
# Hopefully nobody finds a way to leave mkisofs emulation without "--" arg
x=" $x -graft-points /=$efi_temp_tree"
fi
fi
if test x"$debug" = xyes -o x"$debug" = xextra
then
echo "+ converted xorriso arguments:" >&2
echo " $x" >&2
echo >&2
fi
# Run xorriso binary with the converted arguments
use_gdb=no
if test "$use_gdb" = yes
then
gdb_file=/tmp/grub-mkrescue-sed-gdb
echo b assess_appended_gpt >$gdb_file
echo run $MKRESCUE_SED_XORRISO_ARGS $x >>$gdb_file
gdb -x $gdb_file "$xorriso"
ret=0
else
"$xorriso" $MKRESCUE_SED_XORRISO_ARGS $x
ret=$?
fi
# Move back the ESP if it was separated
if test -n "$efi_tmp_name" -a -e /tmp/$efi_tmp_name
then
mv /tmp/$efi_tmp_name "$dir"/efi.img
fi
# Remove possible extracted EFI partition tree
if echo "$efi_temp_tree" | grep '^/tmp/' >/dev/null
then
rm -r "$efi_temp_tree"
fi
exit $ret

Binary file not shown.

View File

@ -1,304 +0,0 @@
#!/bin/bash
#
# Demo of a shell frontend that communicates with a xorriso slave via
# two named pipes.
#
# This script creates two named pipes and starts xorriso with command
# -named_pipes_loop cleanup /tmp/xorriso_stdin_pipe_$$ xorriso_stdin_pipe_$$ -
# Its main loop prompts the user for commands, sends them to xorriso,
# receives the replies, and parses them by xorriso command
# -msg_op parse_silently. The resulting words are printed to stdout.
#
# xorriso removes the two pipes when it finishes execution of -named_pipes_loop
# regularly. (E.g. because of commands -end or -rollback_end or because of
# name loop control message "end_named_pipe_loop".)
# The vanishing of the pipe files tells this script that xorriso is gone.
#
#
# Copyright (C) 2013
# Thomas Schmitt <scdbackup@gmx.net>, libburnia-project.org
# Provided under BSD license: Use, modify, and distribute as you like.
#
# What xorriso program to use
xorriso=xorriso
if test o"$1" = o"-xorriso"
then
xorriso="$2"
fi
# Version of xorriso and minimum requirement by this script
export xorriso_version=
export xorriso_version_req=1.3.1
# Info about the xorriso slave process
export xorriso_is_running=0
export xorriso_pid=0
export xorriso_will_end=0
# Will be set to 1 before this script ends normally
export normal_end=0
# ---------------- An interpreter for quoted xorriso replies ----------------
# xorriso commands like -lsl wrap filenames into quotation marks in order
# to unambiguously represent any character byte except the 0-byte.
# This piece of code parses input strings into words by letting xorriso
# command -msg_op "parse_silently" do the hard work.
# The input strings should be composed by concatenating input lines with
# newline characters between them. Begin by submitting a single line (without
# newline at its end) and retry with an appended further line, if
# xorriso_parse
# returns 1. See below xorriso_cmd_and_handle_result() for an example.
# The parsed reply words.
# Valid are reply_array[0] to reply_array[reply_count-1)]
export reply_array
export reply_count
# Interpret reply of -msg_op parse
xorriso_recv_parse_reply() {
reply_count=0
unset reply_array
export reply_array
ret=-1
read ret
if test "$ret" -lt 0 -o -z "$ret"
then
echo "Unexpected text as first reply line of -msg_op parse" >&2
xorriso_is_running=0
return 2
fi
test "$ret" = 0 && return "1"
read num_strings
string_count=0
while true
do
test "$string_count" -ge "$num_strings" && break
read num_lines
line_count=0
acc=
while true
do
test "$line_count" -ge "$num_lines" && break
read line
test "$line_count" -gt 0 && acc="$acc"$'\n'
acc="$acc""$line"
line_count=$(($line_count + 1))
done
reply_array["$string_count"]="$acc"
string_count=$(($string_count + 1))
done
reply_count="$num_strings"
return 0
}
# Parse a quoted multi-line string into words
xorriso_parse() {
# $1 : The string which shall be parsed
# $2 : The number of concatenated input lines (= number of newlines + 1)
# return: 0= array is valid , 1= line incomplete , 2= other error
test "$xorriso_is_running" = 0 && return 1
xorriso_send_cmd "msg_op parse_silently "'"'"'' '' 0 0 $2"'"'$'\n'"$1" || \
return 2
xorriso_recv_parse_reply <"$result_pipe" || xorriso_is_running=0
ret=$?
test "$xorriso_is_running" = 0 && ret=2
return "$ret"
}
# ------------- End of interpreter for quoted xorriso replies --------------
# Send one or more command lines to xorriso
xorriso_send_cmd() {
# $1 : the lines to send
# >>> is it possible to have a timeout on echo ?
if test -p "$cmd_pipe"
then
echo -E "$1" >"$cmd_pipe"
else
xorriso_is_running=0
return 1
fi
}
# Make filenames safe for transport by wrapping them in quotes and
# escaping quotes in their text
xorriso_esc() {
echo -n "'"
echo -n "$1" | sed -e "s/'/'"'"'"'"'"'"'/g"
echo -n "'"
}
# A handler function for xorriso_cmd_and_handle_result
xorriso_reply_to_stdout() {
echo "${reply_array[*]}"
}
# Let a handler inspect the result lines of a xorriso command line
xorriso_cmd_and_handle_result() {
# $1: handler command word and possibly argument words
# $2: command line for xorriso
if test "$xorriso_is_running" = 0
then
return 1
fi
handler="$1"
xorriso_send_cmd "$2" || return 1
res=$(cat "$result_pipe")
ret=$?
if test "$xorriso_will_end" = 1 -o "$xorriso_is_running" = 0 -o "$ret" -ne 0
then
test -n "$res" && echo -n "$res"
xorriso_is_running=0
test "$ret" = 0 || return 1
return 0
fi
test -z "$res" && return 0
echo "$res" | \
while read line
do
line_count=1
while true
do
xorriso_parse "$line" "$line_count"
ret=$?
test "$ret" = 0 && break
if test "$ret" = 2
then
return 1
fi
read addon
line="$line"$'\n'"$addon"
line_count=$(expr "$line_count" + 1)
done
# One can now make use of reply_array[0...(reply_count-1)]
$handler
done
return 0
}
# Execute -version and let xorriso_version_handler interpret reply
xorriso_check_version() {
lookfor='^xorriso version : '
xorriso_version=$("$xorriso" -version 2>/dev/null | grep "$lookfor" | \
sed -e "s/${lookfor}//")
ret=$?
if test "$ret" -ne 0 -o "$xorriso_version" = ""
then
echo "SORRY: Program run '${xorriso}' -version did not yield a result." >&2
echo >&2
exit 2
fi
smallest=$((echo "$xorriso_version_req" ; echo "$xorriso_version" ) | \
sort | head -1)
test "$smallest" = "$xorriso_version_req" && return 0
echo "SORRY: xorriso version too old: ${xorriso_version} . Need at least xorriso-${xorriso_version_req} ." >&2
echo >&2
exit 2
}
# To be executed on exit
xorriso_cleanup() {
send_end_cmd=0
if test -p "$cmd_pipe" -a "$xorriso_is_running" = 1
then
if test "$normal_end" = 0
then
echo "Checking whether xorriso is still running ..." >&2
set -x
# Give xorriso time to abort
sleep 1
if ps | grep '^'"$xorriso_pid" >/dev/null
then
# >>> try to further confirm xorriso identity
send_end_cmd=1
fi
else
send_end_cmd=1
fi
fi
test "$normal_end" = 0 && set -x
if test "$send_end_cmd" = 1
then
echo "Sending xorriso an -end command ..." >&2
xorriso_send_cmd "end" && \
test -p "$result_pipe" && cat "$result_pipe" >/dev/null
fi
test -p "$cmd_pipe" && rm "$cmd_pipe"
test -p "$result_pipe" && rm "$result_pipe"
}
# ---------------------------------- main ---------------------------------
# Choose pipe names
export cmd_pipe=/tmp/xorriso_stdin_pipe_$$
export result_pipe=/tmp/xorriso_stdout_pipe_$$
# Check the program whether it is modern enough
xorriso_check_version "$xorriso"
# Prepare for then end of this script
trap xorriso_cleanup EXIT
# Create the pipes and start xorriso
mknod "$cmd_pipe" p
mknod "$result_pipe" p
"$xorriso" -abort_on NEVER -for_backup \
-named_pipe_loop cleanup:buffered "$cmd_pipe" "$result_pipe" "-" &
xorriso_pid=$!
xorriso_is_running=1
# Get a sign of life from xorriso before issuing the loop prompt
xorriso_cmd_and_handle_result xorriso_reply_to_stdout \
"print_info 'xorriso process ${xorriso_pid} started by $0'"
echo >&2
# Now get commands from the user, send them to xorriso and display them
# via the simple handler xorriso_reply_to_stdout()
while test "$xorriso_is_running" = 1
do
if test -p "$cmd_pipe"
then
echo -n "xorriso> " >&2
else
echo "$0 : Lost contact to xorriso process $xorriso_pid" >&2
xorriso_is_running=0
break
fi
read line
if echo "$line" | grep '^-*end$' >/dev/null
then
break
fi
if echo "$line" | grep '^-*rollback_end$' >/dev/null
then
xorriso_will_end=1
fi
xorriso_cmd_and_handle_result xorriso_reply_to_stdout "$line"
done
# Prevent set -x in the exit handler
normal_end=1

File diff suppressed because it is too large Load Diff

View File

@ -1,222 +0,0 @@
#!/bin/sh
# Copyright (C) 2015
# Thomas Schmitt <scdbackup@gmx.net>, libburnia-project.org
# Provided under BSD license: Use, modify, and distribute as you like.
# set -x
# ---------------------------- functions ---------------------------
usage() {
echo >&2
echo "usage: $0 "'\' >&2
echo " [-xorriso path] id_string [-dev] iso_adr [xorriso_arguments ...]" >&2
echo >&2
echo " This script looks for named pipe" >&2
echo ' /tmp/xorriso_stdin_pipe_${id_string}' >&2
echo " which is supposed to be connected to a xorriso process." >&2
echo " If not found, the stdin pipe and a stdout pipe get created" >&2
echo " and a xorriso dialog process gets started and connected." >&2
echo " Each character in id_string must match [-+:.,=@0-9A-Za-z]." >&2
echo " If iso_adr differs from the previous run with the same id_string," >&2
echo " then any changes on the previous ISO are committed as session" >&2
echo " before command -dev is performed to load the meta data of" >&2
echo " the newly addressed ISO." >&2
echo " After this is done, the optionally given xorriso_arguments" >&2
echo " are written into the stdin pipe from where xorriso will read" >&2
echo " them as commands and their parameters." >&2
echo >&2
}
# Make filenames safe for transport by wrapping them in quotes and
# escaping quotes in their text
xorriso_esc() {
echo -n "'"
echo -n "$1" | sed -e "s/'/'"'"'"'"'"'"'/g"
echo -n "'"
}
# Send one or more command lines to xorriso
xorriso_send_cmd() {
# $1 : the lines to send
# >>> is it possible to have a timeout on echo ?
if test -p "$cmd_pipe"
then
echo " $1" >"$cmd_pipe"
else
xorriso_is_running=0
return 1
fi
}
# Send command and wait for answer
xorriso_cmd_and_result() {
# $1: command line for xorriso
# $2: if not empty, grep expression for stdout
if test "$xorriso_is_running" = 0
then
return 1
fi
xorriso_send_cmd "$1" || return 1
if test -n "$2"
then
cat "$result_pipe"
else
grep "$2" <"$result_pipe"
fi
return 0
}
# ------------------------------- main -----------------------------
# Argument interpreter
if test "$#" -lt 2
then
usage "$0"
exit 1
fi
xorriso=xorriso
if test o"$1" = o"-xorriso"
then
xorriso="$2"
shift 2
fi
export xorriso_is_running=0
if test "$#" -lt 2
then
usage "$0"
exit 1
fi
id_string=$(echo "$1" | sed -e 's/[^-+:.,=@0-9A-Za-z]/_/g' )
shift 1
# Ignore second argument -dev
if test o"$1" = o"-dev"
then
shift 1
if test "$#" -lt 1
then
usage "$0"
exit 1
fi
fi
device="$1"
shift 1
# Perform the action
export cmd_pipe=/tmp/xorriso_stdin_pipe_$id_string
export result_pipe=/tmp/xorriso_stdout_pipe_$id_string
if test -p "$cmd_pipe"
then
xorriso_is_running=1
else
xorriso_is_running=0
fi
if test "$xorriso_is_running" = "0"
then
# xorriso is not started yet
# Check for xorriso version which knows command -named_pipe_loop
echo "Checking xorriso version ..." >&2
xorriso_version_req="1.3.2"
version=$("$xorriso" -version | grep '^xorriso version' |
sed -e 's/^xorriso version : //')
smallest=$( (echo "$xorriso_version_req" ; echo "$version" ) | \
sort | head -1)
if test "$smallest" = "$xorriso_version_req"
then
dummy=dummy
else
echo "$0 : FATAL : Need xorriso version >= $xorriso_version_req" >&2
echo "Found version: $version" >&2
exit 2
fi
if mknod "$cmd_pipe" p
then
echo "Created named pipe for xorriso commands: $cmd_pipe" >&2
else
echo "Failed to create named pipe for xorriso commands: $cmd_pipe" >&2
exit 3
fi
if mknod "$result_pipe" p
then
echo "Created named pipe for xorriso result channel: $result_pipe" >&2
else
echo \
"Failed to create named pipe for xorriso result channel: $result_pipe" >&2
if rm "$cmd_pipe"
then
echo "Removed named pipe for xorriso commands: $cmd_pipe" >&2
fi
exit 3
fi
echo "Starting xorriso process ..." >&2
"$xorriso" -abort_on NEVER -for_backup \
-named_pipe_loop cleanup:buffered "$cmd_pipe" "$result_pipe" "-" \
>&2 &
# (stdout is redirected to stderr, in order not to keep a pipe waiting for
# input from the still open stdout copy of the background process.
# -named_pipe_loop will disconnect xorriso result channel from stdout.)
xorriso_is_running=1
fi
# Inquire current xorriso -dev
xorriso_device=$(xorriso_cmd_and_result "-status -dev" "^-dev" | \
sed -e 's/^-dev //')
if echo " $device" | grep "^ '" >/dev/null
then
quoted="$device"
else
quoted=$(xorriso_esc "$device")
fi
if test "$xorriso_device" = "$quoted"
then
dummy=dummy
else
# Inquire the need for a -commit command
pending=$(xorriso_cmd_and_result "-changes_pending show_status" \
"^-changes_pending" \
| sed -e 's/^-changes_pending //')
if test "$pending" = "yes"
then
if xorriso_cmd_and_result "-commit"
then
dummy=dummy
else
exit 1
fi
fi
# Now change ISO filesystem
if xorriso_cmd_and_result "-dev $device"
then
xorriso_device="$device"
else
exit 1
fi
fi
test "$*" = "" && exit 0
if xorriso_cmd_and_result "$*"
then
dummy=dummy
else
exit 1
fi
exit 0

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,11 @@
/*
data source for libisoburn.
Copyright 2007 - 2012 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
Copyright 2007 - 2010 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
and Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
#ifdef HAVE_CONFIG_H
#include "../config.h"
#endif
#include <stdlib.h>
#include <string.h>
@ -33,7 +29,17 @@
#include "isoburn.h"
/* Cached reading of image tree data by multiple tiles */
/* Cached reading of image tree data */
/* Multi tile: 32 * 64 kB */
/* The size of a single tile.
Powers of 2 only ! Less than 16 makes not much sense.
*/
#define Libisoburn_tile_blockS 32
/* The number of tiles in the cache
*/
#define Libisoburn_cache_tileS 32
/* Debugging only: This reports cache loads on stderr.
@ -42,7 +48,7 @@
struct isoburn_cache_tile {
char *cache_data;
char cache_data[Libisoburn_tile_blockS * 2048];
uint32_t cache_lba;
uint32_t last_error_lba;
uint32_t last_aligned_error_lba;
@ -52,24 +58,8 @@ struct isoburn_cache_tile {
struct isoburn_cached_drive {
struct burn_drive *drive;
struct isoburn_cache_tile **tiles;
int num_tiles;
int tile_blocks;
struct isoburn_cache_tile tiles[Libisoburn_cache_tileS];
int current_age;
/**
Offset to be applied to all block addresses to compensate for an
eventual displacement of the block addresses relative to the image
start block address that was assumed when the image was created.
E.g. if track number 2 gets copied into a disk file and shall then
be loaded as ISO filesystem.
If displacement_sign is 1 then the displacement number will be
added to .read_block() addresses, if -1 it will be subtracted.
Else it will be ignored.
*/
uint32_t displacement;
int displacement_sign;
};
#define Libisoburn_max_agE 2000000000
@ -84,11 +74,11 @@ int ds_read_block(IsoDataSource *src, uint32_t lba, uint8_t *buffer)
off_t count;
uint32_t aligned_lba;
char msg[80];
struct isoburn_cache_tile **tiles;
struct isoburn_cache_tile *tiles;
struct isoburn_cached_drive *icd;
if(src == NULL || buffer == NULL)
/* It is not required by the specs of libisofs but implicitly assumed
/* It is not required by the specs of libisofs but implicitely assumed
by its current implementation that a data source read result <0 is
a valid libisofs error code.
*/
@ -109,28 +99,14 @@ int ds_read_block(IsoDataSource *src, uint32_t lba, uint8_t *buffer)
return ISO_ASSERT_FAILURE;
}
tiles = icd->tiles;
tiles = (struct isoburn_cache_tile *) icd->tiles;
if(icd->displacement_sign == 1) {
if(lba + icd->displacement < lba) {
address_rollover:;
return ISO_DISPLACE_ROLLOVER;
} else
lba += icd->displacement;
} else if(icd->displacement_sign == -1) {
if(lba < icd->displacement )
goto address_rollover;
else
lba -= icd->displacement;
}
aligned_lba= lba & ~(Libisoburn_tile_blockS - 1);
aligned_lba= lba & ~(icd->tile_blocks - 1);
for (i = 0; i < icd->num_tiles; i++) {
if(aligned_lba == tiles[i]->cache_lba &&
tiles[i]->cache_lba != 0xffffffff) {
(tiles[i]->cache_hits)++;
memcpy(buffer, tiles[i]->cache_data + (lba - aligned_lba) * 2048, 2048);
for(i=0; i<Libisoburn_cache_tileS; i++) {
if(aligned_lba == tiles[i].cache_lba && tiles[i].cache_lba != 0xffffffff) {
(tiles[i].cache_hits)++;
memcpy(buffer, tiles[i].cache_data + (lba - aligned_lba) * 2048, 2048);
count= 2048;
ds_inc_age(icd, i, 0);
return 1;
@ -140,53 +116,73 @@ address_rollover:;
/* find oldest tile */
oldest_age= Libisoburn_max_agE;
oldest= 0;
for(i = 0; i < icd->num_tiles; i++) {
if(tiles[i]->cache_lba == 0xffffffff) {
for(i= 0; i<Libisoburn_cache_tileS; i++) {
if(tiles[i].cache_lba == 0xffffffff) {
oldest= i;
break;
}
if(tiles[i]->age < oldest_age) {
oldest_age= tiles[i]->age;
if(tiles[i].age<oldest_age) {
oldest_age= tiles[i].age;
oldest= i;
}
}
tiles[oldest]->cache_lba= 0xffffffff; /* invalidate cache */
if(tiles[oldest]->last_aligned_error_lba == aligned_lba) {
tiles[oldest].cache_lba= 0xffffffff; /* invalidate cache */
if(tiles[oldest].last_aligned_error_lba == aligned_lba) {
ret = 0;
} else {
ret = burn_read_data(d, (off_t) aligned_lba * (off_t) 2048,
(char *) tiles[oldest]->cache_data,
icd->tile_blocks * 2048, &count, 2);
(char *) tiles[oldest].cache_data,
Libisoburn_tile_blockS * 2048, &count, 2);
}
if (ret <= 0 ) {
tiles[oldest]->last_aligned_error_lba = aligned_lba;
tiles[oldest].last_aligned_error_lba = aligned_lba;
/* Read-ahead failure ? Try to read 2048 directly. */
if(tiles[oldest]->last_error_lba == lba)
if(tiles[oldest].last_error_lba == lba)
ret = 0;
else
ret = burn_read_data(d, (off_t) lba * (off_t) 2048, (char *) buffer,
2048, &count, 0);
if (ret > 0)
return 1;
tiles[oldest]->last_error_lba = lba;
sprintf(msg, "ds_read_block(%lu) returns %lX",
(unsigned long) lba, (unsigned long) ret);
tiles[oldest].last_error_lba = lba;
#ifdef ISO_DATA_SOURCE_MISHAP
ret= ISO_DATA_SOURCE_MISHAP;
#else
/* <<< pre libisofs-0.6.7 */
/* It is not required by the specs of libisofs but implicitely assumed
...
But it is not possible to ignore FAILURE.
libisofs insists in original error codes, i.e. libisoburn cannot
change severity FAILURE associated with ISO_FILE_READ_ERROR.
So ISO_FILE_READ_ERROR is not an option and libisoburn has to
misuse ISO_FILE_CANT_WRITE, which is actually for image generation
and not for image reading.
This is quite wrong, although the error message text is unclear
enough to make it appear plausible.
*/
ret= ISO_FILE_CANT_WRITE;
#endif
if(ret >= 0)
ret = -1;
sprintf(msg, "ds_read_block(%lu) returns %d", (unsigned long) lba, ret);
isoburn_msgs_submit(NULL, 0x00060000, msg, 0, "DEBUG", 0);
return ISO_DATA_SOURCE_MISHAP;
return ret;
}
#ifdef Libisoburn_read_cache_reporT
fprintf(stderr, "Tile %2.2d : After %3d hits, new load from %8x , count= %d\n",
oldest, tiles[oldest]->cache_hits, aligned_lba, (int) count);
oldest, tiles[oldest].cache_hits, aligned_lba, (int) count);
#endif
tiles[oldest]->cache_lba= aligned_lba;
tiles[oldest]->cache_hits= 1;
tiles[oldest].cache_lba= aligned_lba;
tiles[oldest].cache_hits= 1;
ds_inc_age(icd, oldest, 0);
memcpy(buffer, tiles[oldest]->cache_data + (lba - aligned_lba) * 2048, 2048);
memcpy(buffer, tiles[oldest].cache_data + (lba - aligned_lba) * 2048, 2048);
count= 2048;
return 1;
@ -205,107 +201,11 @@ static int ds_close(IsoDataSource *src)
return 1;
}
static int isoburn_cache_tile_destroy(struct isoburn_cache_tile **o,
int flag)
{
if (*o == NULL)
return(0);
if ((*o)->cache_data != NULL)
free((*o)->cache_data);
free(*o);
*o = NULL;
return(1);
}
static int isoburn_cache_tile_new(struct isoburn_cache_tile **o,
int tile_blocks, int flag)
{
struct isoburn_cache_tile *t;
*o = t = calloc(1, sizeof(struct isoburn_cache_tile));
if (t == NULL)
goto fail;
t->cache_data = NULL;
t->cache_lba = 0xffffffff;
t->cache_hits = 0;
t->last_error_lba = 0xffffffff;
t->last_aligned_error_lba = 0xffffffff;
t->age= 0;
t->cache_data = calloc(1, tile_blocks * 2048);
if (t->cache_data == NULL)
goto fail;
return(1);
fail:;
isoburn_cache_tile_destroy(o, 0);
return(-1);
}
static int isoburn_cached_drive_destroy(struct isoburn_cached_drive **o,
int flag)
{
struct isoburn_cached_drive *c;
int i;
if (*o == NULL)
return(0);
c= *o;
if (c->tiles != NULL) {
for (i = 0; i < c->num_tiles; i++)
isoburn_cache_tile_destroy(&(c->tiles[i]), 0);
free(c->tiles);
}
free(c);
*o= NULL;
return(1);
}
static int isoburn_cached_drive_new(struct isoburn_cached_drive **o,
struct burn_drive *d, int cache_tiles,
int tile_blocks, int flag)
{
struct isoburn_cached_drive *icd;
int i, ret;
*o = icd = calloc(1,sizeof(struct isoburn_cached_drive));
if (*o == NULL)
return(-1);
icd->drive = d;
icd->tiles = NULL;
icd->num_tiles = cache_tiles;
icd->tile_blocks = tile_blocks;
icd->current_age = 0;
icd->displacement = 0;
icd->displacement_sign = 0;
icd->tiles = calloc(1, sizeof(struct isoburn_cache_tile *) * icd->num_tiles);
if (icd->tiles == NULL)
goto fail;
for (i = 0; i < icd->num_tiles; i++) {
ret = isoburn_cache_tile_new(&(icd->tiles[i]), icd->tile_blocks, 0);
if (ret <= 0)
goto fail;
}
return(1);
fail:;
isoburn_cached_drive_destroy(o, 0);
return(-1);
}
static void ds_free_data(IsoDataSource *src)
{
struct isoburn_cached_drive *icd;
if(src->data != NULL) {
icd= (struct isoburn_cached_drive *) src->data;
isoburn_cached_drive_destroy(&icd, 0);
}
/* nothing to do */;
if(src->data != NULL)
free(src->data);
src->data= NULL;
}
@ -322,34 +222,34 @@ int isoburn_data_source_shutdown(IsoDataSource *src, int flag)
}
IsoDataSource *isoburn_data_source_new(struct burn_drive *d,
uint32_t displacement, int displacement_sign,
int cache_tiles, int tile_blocks)
IsoDataSource *isoburn_data_source_new(struct burn_drive *d)
{
IsoDataSource *src;
IsoDataSource *ret;
struct isoburn_cached_drive *icd= NULL;
int ret;
int i;
if (d==NULL)
return NULL;
src = malloc(sizeof(IsoDataSource));
if (src == NULL)
return NULL;
ret = isoburn_cached_drive_new(&icd, d, cache_tiles, tile_blocks, 0);
if (ret <= 0) {
free(src);
ret = malloc(sizeof(IsoDataSource));
icd = calloc(1,sizeof(struct isoburn_cached_drive));
if (ret == NULL || icd == NULL)
return NULL;
ret->refcount = 1;
ret->read_block = ds_read_block;
ret->open = ds_open;
ret->close = ds_close;
ret->free_data = ds_free_data;
ret->data = icd;
icd->drive = d;
icd->current_age= 0;
for(i= 0; i<Libisoburn_cache_tileS; i++) {
icd->tiles[i].cache_lba = 0xffffffff;
icd->tiles[i].cache_hits = 0;
icd->tiles[i].last_error_lba = 0xffffffff;
icd->tiles[i].last_aligned_error_lba = 0xffffffff;
icd->tiles[i].age= 0;
}
src->version = 0;
src->refcount = 1;
src->read_block = ds_read_block;
src->open = ds_open;
src->close = ds_close;
src->free_data = ds_free_data;
src->data = icd;
icd->displacement = displacement;
icd->displacement_sign = displacement_sign;
return src;
return ret;
}
@ -359,11 +259,11 @@ static int ds_inc_age(struct isoburn_cached_drive *icd, int idx, int flag)
(icd->current_age)++;
if(icd->current_age>=Libisoburn_max_agE) { /* reset all ages (allow waste) */
for(i = 0; i < icd->num_tiles; i++)
(icd->tiles)[i]->age= 0;
for(i= 0; i<Libisoburn_cache_tileS; i++)
(icd->tiles)[i].age= 0;
icd->current_age= 1;
}
(icd->tiles)[idx]->age= icd->current_age;
(icd->tiles)[idx].age= icd->current_age;
return(1);
}

File diff suppressed because it is too large Load Diff

View File

@ -2,9 +2,8 @@
/*
Class struct of libisoburn.
Copyright 2007 - 2009 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
Copyright 2007 - 2025 Thomas Schmitt <scdbackup@gmx.net>
Copyright 2007 - 2010 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
and Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -13,23 +12,18 @@
/* for uint8_t */
#ifdef HAVE_STDINT_H
#include <stdint.h>
#else
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#endif
#endif
/* For emulated TOC of overwritable media.
/* For emulated TOC of overwriteable media.
Provides minimal info for faking a struct burn_toc_entry.
*/
struct isoburn_toc_entry {
int session;
int track_no; /* point */
off_t start_lba;
off_t track_blocks;
char *volid; /* For caching a volume id from emulated toc on overwritables */
int start_lba;
int track_blocks;
char *volid; /* For caching a volume id from emulated toc on overwriteables */
struct isoburn_toc_entry *next;
};
@ -42,26 +36,11 @@ int isoburn_toc_entry_new(struct isoburn_toc_entry **objpt,
int isoburn_toc_entry_destroy(struct isoburn_toc_entry **o, int flag);
/* Minimal size of target_iso_head which is to be written during
isoburn_activate_session().
Within this size there is everything that is needed for image access with
no partition offset. The actual target_iso_head buffer must be larger by
the evential partition offset.
/* Size of target_iso_head which is to be written during
isoburn_activate_session()
*/
#define Libisoburn_target_head_sizE (32*2048)
/* Maximum number of appended partitions. Effectively usable number depends
on system area type.
*/
#define Libisoburn_max_appended_partitionS 8
/*
Maximum length of a disc label text plus 1.
*/
#define Libisoburn_disc_label_sizE 129
struct isoburn {
@ -69,9 +48,9 @@ struct isoburn {
Most isoburn calls will use a burn_drive as object handle */
struct burn_drive *drive;
/* -1= inappropriate medium state detected
0= libburn multi-session medium, resp. undecided yet
1= random access medium */
/* -1= inappropriate media state detected
0= libburn multi-session media, resp. undecided yet
1= random access media */
int emulation_mode;
/* Although rarely used, libburn can operate on several
@ -82,26 +61,26 @@ struct isoburn {
/* If >= 0, this address is used as reply for isoburn_disc_get_msc1()
*/
off_t fabricated_msc1;
int fabricated_msc1;
/* If >= 0, this address is used in isoburn_disc_track_lba_nwa()
as reply parameter nwa.
(The other nwa parameters below apply only to the effective write address
on random access media. msc2 is handed to libisofs but not to libburn.)
*/
off_t fabricated_msc2;
int fabricated_msc2;
/* The nwa to be used for a first session on the present kind of overwritable
/* The nwa to be used for a first session on the present kind of overwriteable
media (usually Libisoburn_overwriteable_starT, but might be forced to 0)
*/
off_t zero_nwa;
int zero_nwa;
/* Start address as given by image examination (bytes, not blocks) */
off_t min_start_byte;
/* Aligned start address to be used for processing (counted in blocks) */
off_t nwa;
int nwa;
/* Truncate to .nwa an eventual regular file serving as output drive */
@ -113,37 +92,25 @@ struct isoburn {
*/
enum burn_disc_status fabricated_disc_status;
/* To be set if read errors occurred during media evaluation.
*/
int media_read_error;
/* Eventual emulated table of content read from the chain of ISO headers
on overwritable media.
on overwriteable media.
*/
struct isoburn_toc_entry *toc;
/* Indicator whether the most recent burn run worked :
/* Indicator wether the most recent burn run worked :
-1 = undetermined, ask libburn , 0 = failure , 1 = success
To be inquired by isoburn_drive_wrote_well()
*/
int wrote_well;
/* ISO head buffer to be filled by write run */
int target_iso_head_size;
uint8_t *target_iso_head;
/* The 2k offset which was read from a loaded image.
*/
uint32_t loaded_partition_offset;
/* Buffered ISO head from media (should that become part of
ecma119_read_opts ?) */
uint8_t target_iso_head[Libisoburn_target_head_sizE];
/* Libisofs image context */
IsoImage *image;
/* The start LBA of the image */
off_t image_start_lba;
/* The block data source from which the existing image is read.
*/
IsoDataSource *iso_data_source;
@ -165,12 +132,6 @@ struct isoburn {
void *msgs_submit_handle; /* specific to application method */
int msgs_submit_flag; /* specific to application method */
/* Forwarding an image generation option to the burn wrapper */
int do_tao;
/* Forwarding an image generation option to the burn wrapper */
int do_fsync;
};
@ -224,7 +185,7 @@ int isoburn_invalidate_iso(struct isoburn *o, int flag);
with no emulation activated by isoburn.
@param drive The drive to be searched for
@param flag unused yet
@return -1 unsuitable medium, 0 generic medium, 1 emulated medium.
@return -1 unsuitable media, 0 generic media, 1 emulated media.
*/
int isoburn_find_emulator(struct isoburn **pt,
struct burn_drive *drive, int flag);
@ -236,7 +197,7 @@ int isoburn_msgs_submit(struct isoburn *o, int error_code, char msg_text[],
int os_errno, char severity[], int flag);
/** Set the start address for an emulated add-on session. The value will
be rounded up to the alignment necessary for the medium. The aligned
be rounded up to the alignment necessary for the media. The aligned
value will be divided by 2048 and then put into o->nwa .
@param o The isoburn object to be programmed.
@param value The start address in bytes
@ -256,32 +217,17 @@ int isoburn_set_start_byte(struct isoburn *o, off_t value, int flag);
@return <=0 is failure , >0 success
*/
int isoburn_get_msc2(struct isoburn *o,
struct burn_write_opts *opts, off_t *msc2, int flag);
struct burn_write_opts *opts, int *msc2, int flag);
/** Get a data source suitable for read from a drive using burn_read_data()
function.
@param d drive to read from. Must be grabbed.
@param displacement will be added or subtracted to any block address
@param displacement_sign +1 = add , -1= subtract , else keep unaltered
@return the data source, NULL on error. Must be freed with libisofs
iso_data_source_unref() function. Note: this doesn't release
the drive.
*/
IsoDataSource *
isoburn_data_source_new(struct burn_drive *d,
uint32_t displacement, int displacement_sign,
int cache_tiles, int tile_blocks);
/** Default settings for above cache_tiles, tile_blocks in newly created
struct isoburn_read_opts.
*/
#define Libisoburn_default_cache_tileS 32
#define Libisoburn_default_tile_blockS 32
/** Maximum size of the cache in 2 kB blocks (1 GB)
*/
#define Libisoburn_cache_max_sizE (1024 * 512)
isoburn_data_source_new(struct burn_drive *d);
/** Disable read capabilities of a data source which was originally created
by isoburn_data_source_new(). After this any attempt to read will yield
@ -297,18 +243,6 @@ isoburn_data_source_new(struct burn_drive *d,
int isoburn_data_source_shutdown(IsoDataSource *src, int flag);
/** Check whether the size of target_iso_head matches the given partition
offset. Eventually adjust size.
*/
int isoburn_adjust_target_iso_head(struct isoburn *o,
uint32_t offst, int flag);
/** Initialize the root directory attributes of a freshly created image.
*/
int isoburn_root_defaults(IsoImage *image, int flag);
/**
* Options for image reading.
(Comments here may be outdated. API getter/setter function descriptions
@ -316,41 +250,20 @@ int isoburn_root_defaults(IsoImage *image, int flag);
minor correction only.)
*/
struct isoburn_read_opts {
int cache_tiles; /* number of cache tiles */
int cache_tile_blocks;
unsigned int norock:1; /*< Do not read Rock Ridge extensions */
unsigned int nojoliet:1; /*< Do not read Joliet extensions */
unsigned int noiso1999:1; /*< Do not read ISO 9660:1999 enhanced tree */
unsigned int do_ecma119_map:1; /* call iso_read_opts_set_ecma119_map() */
unsigned int map_mode:2; /* argument for do_ecma119_map */
unsigned int do_joliet_map:1; /* call iso_read_opts_set_joliet_map() */
unsigned int joliet_map_mode:1; /* for iso_read_opts_set_joliet_map */
/* ts A90121 */
unsigned int noaaip:1; /* Do not read AAIP for ACL and EA */
unsigned int noacl:1; /* Do not read ACL from external file objects */
unsigned int noea:1; /* Do not read XFS-style EA from externals */
/* ts C40716 */
unsigned int lfa_flags:1; /* Read Linux file attribute flags (chattr)
from external filesystem objects
*/
/* ts C40826 */
unsigned int lfa_only_settable:1; /* Ignore non-settable flags from
external filesystem objects
*/
/* ts C41010 */
unsigned int projid:1; /* Read XFS-style project ids from
external filesystem objects
*/
/* ts A90508 */
unsigned int noino:1; /* Discard eventual PX inode numbers */
/* ts A90810 */
unsigned int nomd5:2; /* Do not read eventual MD5 array */
unsigned int nomd5:1; /* Do not read eventual MD5 array */
unsigned int preferjoliet:1;
/*< When both Joliet and RR extensions are present, the RR
@ -370,19 +283,11 @@ struct isoburn_read_opts {
* Enable or disable methods to automatically choose an input charset.
* This eventually overrides input_charset.
*
* bit0= set the input character set automatically from
* bit0= allow to set the input character set automatically from
* attribute "isofs.cs" of root directory
*/
int auto_input_charset;
/**
* What to do in case of name longer than truncate_length:
* 0= throw FAILURE
* 1= truncate to truncate_length with MD5 of whole name at end
*/
int truncate_mode;
int truncate_length;
/* modified by the function isoburn_read_image */
unsigned int hasRR:1; /*< It will be set to 1 if RR extensions are present,
to 0 if not. */
@ -400,15 +305,7 @@ struct isoburn_read_opts {
uint32_t size; /**< Will be filled with the size (in 2048 byte block) of
* the image, as reported in the PVM. */
int tree_loaded; /* from iso_read_image_features_tree_loaded() */
int rr_loaded; /* from iso_read_image_features_rr_loaded */
unsigned int pretend_blank:1; /* always create empty image */
uint32_t displacement;
int displacement_sign;
};
@ -422,16 +319,12 @@ struct isoburn_imgen_opts {
/* Options for image generation */
int will_cancel :1;
int level; /**< ISO level to write at. */
/** Which extensions to support. */
unsigned int rockridge :1;
unsigned int joliet :1;
unsigned int iso1999 :1;
unsigned int hfsplus :1;
unsigned int fat :1;
/* Whether to mark suitable IsoNode as hardlinks in RRIP PX */
unsigned int hardlinks :1;
@ -443,22 +336,10 @@ struct isoburn_imgen_opts {
unsigned int session_md5 :1;
/* Produce and write MD5 checksums for each single IsoFile.
See parameter "files" of iso_write_opts_set_record_md5().
See parameter files of iso_write_opts_set_record_md5().
*/
unsigned int file_md5 :2;
/* On overwritable media or random access files do not write the first
session to LBA 32, but rather to LBA 0 directly.
*/
unsigned int no_emul_toc :1;
/* For empty files, symbolic links, and devices use the old ECMA-119 block
addresses in the range [0,31] rather than the address of the dedicated
empty block.
*/
unsigned int old_empty :1;
/* relaxed constraints */
/*
@ -466,52 +347,17 @@ struct isoburn_imgen_opts {
* but it is supposed to work on most moderns systems. Use with caution.
*/
/*
* Extra Caution: This option breaks any assumptions about names that
* are supported by ECMA-119 specifications.
* Omit any translation which would make a file name compliant to the
* ECMA-119 rules. This includes and exceeds omit_version_numbers,
* max_37_char_filenames, no_force_dots bit0, allow_lowercase.
*/
unsigned int untranslated_name_len;
/*
* Convert directory names for ECMA-119 similar to other file names, but do
* not force a dot or add a version number.
* This violates ECMA-119 by allowing one "." and especially ISO level 1
* by allowing DOS style 8.3 names rather than only 8 characters.
* (mkisofs and its clones seem to do this violation.)
*/
unsigned int allow_dir_id_ext :1;
/**
* Omit the version number (";1") at the end of the ISO-9660 identifiers.
* Version numbers are usually not used.
* bit0= omit version number with ECMA-119 and Joliet
* bit1= omit version number with Joliet alone
*/
unsigned int omit_version_numbers :2;
unsigned int omit_version_numbers :1;
/**
* Allow ISO-9660 directory hierarchy to be deeper than 8 levels.
*/
unsigned int allow_deep_paths :1;
/**
* If not allow_deep_paths is in effect, then it may become
* necessary to relocate directories so that no ECMA-119 file path
* has more than 8 components. These directories are grafted into either
* the root directory of the ISO image or into a dedicated relocation
* directory. For details see libisofs.h, iso_write_opts_set_rr_reloc().
*/
char *rr_reloc_dir; /* IsoNode name in root directory. NULL or
empty text means root itself. */
int rr_reloc_flags; /* bit0= mark auto-created rr_reloc_dir by RE
bit1= not settable via API (used internally)
*/
/**
* Allow path in the ISO-9660 tree to have more than 255 characters.
*/
@ -529,10 +375,8 @@ struct isoburn_imgen_opts {
* ISO-9660 forces filenames to have a ".", that separates file name from
* extension. libisofs adds it if original filename doesn't has one. Set
* this to 1 to prevent this behavior
* bit0= no forced dot with ECMA-119
* bit1= no forced dot with Joliet
*/
unsigned int no_force_dots :2;
unsigned int no_force_dots :1;
/**
* Allow lowercase characters in ISO-9660 filenames. By default, only
@ -546,40 +390,16 @@ struct isoburn_imgen_opts {
*/
unsigned int allow_full_ascii :1;
/**
* Like allow_full_ascii, but only allowing 7-bit characters.
* Lowercase letters get mapped to uppercase if not allow_lowercase is set.
* Gets overridden if allow_full_ascii is enabled.
*/
unsigned int allow_7bit_ascii :1;
/**
* Allow paths in the Joliet tree to have more than 240 characters.
*/
unsigned int joliet_longer_paths :1;
/**
* Allow leaf names in the Joliet tree to have up to 103 characters
* rather than 64.
*/
unsigned int joliet_long_names :1;
/**
* Use UTF-16BE rather than its subset UCS-2
*/
unsigned int joliet_utf16 :1;
/**
* Store timestamps as GMT rather than in local time.
*/
unsigned int always_gmt :1;
/**
* Store RRIP TF fields with 17-byte timestamps rather than 7-byte
* even if no timestamp is after year 2150
*/
unsigned int rrip_tf_long :1;
/**
* Write Rock Ridge info as of specification RRIP-1.10 rather than
* RRIP-1.12: signature "RRIP_1991A" rather than "IEEE_1282",
@ -590,16 +410,13 @@ struct isoburn_imgen_opts {
/**
* Store as ECMA-119 Directory Record timestamp the mtime
* of the source rather than the image creation time.
* The same can be ordered for Joliet and ISO 9660:1999
*/
unsigned int dir_rec_mtime :1;
unsigned int joliet_rec_mtime :1;
unsigned int iso1999_rec_mtime :1;
/**
* Write AAIP as extension according to SUSP 1.10 rather than SUSP 1.12.
* I.e. without announcing it by an ER field and thus without the need
* to precede the RRIP fields by an ES and to precede the AA field by ES.
* to preceed the RRIP fields by an ES and to preceed the AA field by ES.
*/
unsigned int aaip_susp_1_10 :1;
@ -642,19 +459,19 @@ struct isoburn_imgen_opts {
int fifo_size;
/** Output value: Block address of session start as evaluated from medium
/** Output value: Block address of session start as evaluated from media
and other options by libisoburn and libburn.
If <0 : Invalid
If >=0: Valid block number. Block size is always 2 KiB.
*/
off_t effective_lba;
int effective_lba;
/** Output value: Block address of data section start as predicted by
libisofs.
If < 16: Invalid
If >=16: Valid block number. Block size is always 2 KiB.
*/
off_t data_start_lba;
int data_start_lba;
/**
* If not empty: Parameters "name" and "timestamp" for a scdbackup stream
@ -671,132 +488,10 @@ struct isoburn_imgen_opts {
char scdbackup_tag_time[19];
char *scdbackup_tag_written;
/* Content of an embedded boot image. Valid if not NULL.
* In that case it must point to a memory buffer at least 32 kB.
*/
char *system_area_data;
/*
* bit0= make bytes 446 - 512 of the system area a partition
* table which reserves partition 1 from byte 63*512 to the
* end of the ISO image. Assumed are 63 secs/hed, 255 head/cyl.
* (GRUB protective msdos label.)
* This works with and without system_area_data.
*/
int system_area_options;
/* User settable PVD time stamps */
time_t vol_creation_time;
time_t vol_modification_time;
time_t vol_expiration_time;
time_t vol_effective_time;
/* To eventually override vol_modification_time by unconverted string
and timezone 0 */
char vol_uuid[17];
/* The number of unclaimed 2K blocks before start of partition 1 as of
the MBR in system area. If not 0 this will cause double volume
descriptor sets and double tree.
*/
uint32_t partition_offset;
/* Partition table parameter: 1 to 63, 0= disabled/default */
int partition_secs_per_head;
/* 1 to 255, 0= disabled/default */
int partition_heads_per_cyl;
/* Parameters and state of Jigdo Template Export environment.
*/
void *libjte_handle;
/* A trailing padding of zero bytes which belongs to the image
*/
uint32_t tail_blocks;
/* Disk file paths of content of PreP partition and EFI system partition */
char *prep_partition;
int prep_part_flag;
char *efi_boot_partition;
int efi_boot_part_flag;
/* Disk file paths of prepared images which shall be appended
after the ISO image and described by partition table entries in a MBR.
NULL means unused.
*/
char *appended_partitions[Libisoburn_max_appended_partitionS];
uint8_t appended_part_types[Libisoburn_max_appended_partitionS];
int appended_part_flags[Libisoburn_max_appended_partitionS];
uint8_t appended_part_type_guids[Libisoburn_max_appended_partitionS][16];
/* Flags in case that appended partitions show up in GPT:
bit0= appended_part_type_guids[same_index] is valid
*/
uint8_t appended_part_gpt_flags[Libisoburn_max_appended_partitionS];
/* If 1: With appended partitions: create protective MBR and mark by GPT
*/
int appended_as_gpt;
/* If 1: With appended partitions: mark by APM
*/
int appended_as_apm;
/* If 1: Apply isohybrid gestures to non-isohybrid situations
*/
int part_like_isohybrid;
/* isoburn_igopt_set_iso_mbr_part_type()
*/
int iso_mbr_part_type;
/* isoburn_igopt_set_iso_type_guid()
*/
uint8_t iso_gpt_type_guid[16];
/* bit0= iso_gpt_type_guid is valid
bit1= gaps in the image coverage are allowed
bit2= with bit1: do not sort GPT partition array by start block
bit3= with bit1: do not create partition 1 for ISO filesystem
*/
int iso_gpt_flag;
/* See libisoburn.h isoburn_igopt_set_gpt_guid()
*/
uint8_t gpt_guid[16];
int gpt_guid_mode;
/* Eventual name of the non-ISO aspect of the image. E.g. SUN ASCII label.
*/
char ascii_disc_label[Libisoburn_disc_label_sizE];
/* HFS+ image serial number.
* 00...00 means that it shall be generated by libisofs.
*/
uint8_t hfsp_serial_number[8];
/* Allocation block size of HFS+ : 0= auto , 512, or 2048
*/
int hfsp_block_size;
/* Block size of and in APM : 0= auto , 512, or 2048
*/
int apm_block_size;
/* Write mode for optical media:
* 0 = auto
* 1 = TAO, Incremental, no RESERVE TRACK
* -1 = SAO, DAO, RESERVE TRACK
*/
int do_tao;
/* Whether to fsync() stdio_drives after isoburn_activate_session() */
int do_fsync;
/* See libisoburn.h isoburn_igopt_set_max_ce_entries() */
uint32_t max_ce_entries;
int max_ce_entries_flag;
};
/* Alignment for session starts on overwritable media.
/* Alignment for session starts on overwriteable media.
(Increased from 16 to 32 blocks for aligning to BD-RE clusters.)
*/
#define Libisoburn_nwa_alignemenT 32
@ -823,20 +518,17 @@ struct isoburn_imgen_opts {
Libisoburn_nwa_alignemenT it should be possible to predict the start
of the next session header.
The LBA 0 header is written by isoburn_activate_session() already
with the first session. So the medium is mountable.
with the first session. So the media is mountable.
A problem arises with DVD-RW in Intermediate State. They cannot be
written by random access before they were written sequentially.
In this case, no copy of the session 1 header is maintained and no TOC
will be possible. Thus writing begins sequentially at LBA 0.
IMPORTANT: This macro gives the minimal size of an image header.
It has to be enlarged by the eventual partition offset.
*/
#define Libisoburn_overwriteable_starT \
((off_t) (Libisoburn_target_head_sizE/2048))
/* Wrappers for emulation of TOC on overwritable media */
/* Wrappers for emulation of TOC on overwriteable media */
struct isoburn_toc_track {
/* Either track or toc_entry are supposed to be NULL */
@ -860,7 +552,6 @@ struct isoburn_toc_disc {
struct isoburn_toc_track *tracks; /* storage array */
struct isoburn_toc_track **track_pointers; /* storage array */
int session_count;
int incomplete_session_count;
int track_count;
struct isoburn_toc_entry *toc;
};

View File

@ -6,15 +6,11 @@
/*
libisofs related functions of libisoburn.
Copyright 2007 - 2009 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
Copyright 2007 - 2024 Thomas Schmitt <scdbackup@gmx.net>
Copyright 2007 - 2010 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
#ifdef HAVE_CONFIG_H
#include "../config.h"
#endif
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
@ -32,8 +28,8 @@
#endif /* Xorriso_standalonE */
#include "libisoburn.h"
#include "isoburn.h"
#include "libisoburn.h"
#define BP(a,b) [(b) - (a) + 1]
@ -87,18 +83,6 @@ uint32_t iso_read_lsb(const uint8_t *buf, int bytes)
}
static
uint64_t iso_read_lsb64(const uint8_t *buf)
{
int i;
uint64_t ret = 0;
for (i=0; i < 8; i++)
ret += ((uint64_t) buf[i]) << (i * 8);
return ret;
}
/* API function. See libisoburn.h
*/
IsoImage *isoburn_get_attached_image(struct burn_drive *d)
@ -117,176 +101,38 @@ IsoImage *isoburn_get_attached_image(struct burn_drive *d)
}
/* API */
off_t isoburn_get_attached_start_lba_v2(struct burn_drive *d)
{
int ret;
struct isoburn *o= NULL;
ret = isoburn_find_emulator(&o, d, 0);
if (ret < 0 || o == NULL)
return -1;
if(o->image == NULL)
return -1;
return o->image_start_lba;
}
int isoburn_get_attached_start_lba(struct burn_drive *d)
{
off_t ret;
ret= isoburn_get_attached_start_lba_v2(d);
if(ret >= 0 && ret <= 0x7fffffff)
return((int) ret);
return(-1);
}
static void isoburn_idle_free_function(void *ignored)
{
return;
}
int isoburn_root_defaults(IsoImage *image, int flag)
{
IsoNode *root_node;
mode_t root_mode= 0755;
root_node= (IsoNode *) iso_image_get_root(image);
iso_node_set_permissions(root_node, root_mode);
return(1);
}
/* @return <=0 = error , 1 = ok , 2 = no ISO filesystem found
*/
int isoburn_make_iso_read_opts(struct burn_drive *d,
struct isoburn *o,
struct isoburn_read_opts *read_opts,
IsoReadOpts **ropts)
{
int ret, int_num;
off_t off_t_num, dummy;
uint32_t ms_block;
char *msg= NULL;
msg= calloc(1, 160);
*ropts= NULL;
ret = isoburn_disc_get_msc1_v2(d, &off_t_num);
if (ret <= 0)
{ret= -2; goto ex;}
if(off_t_num > 0xffffffff) {
sprintf(msg, "Start address is outside 32 bit range.");
isoburn_msgs_submit(o, 0x00060000, msg, 0, "FAILURE", 0);
{ret= 0; goto ex;}
}
ms_block= off_t_num;
if (o != NULL)
o->image_start_lba= ms_block;
ret = isoburn_read_iso_head_v2(d, off_t_num, &dummy, NULL, 0);
if (ret <= 0) {
sprintf(msg, "No ISO 9660 image at LBA %lu.",
(unsigned long int) ms_block);
isoburn_msgs_submit(o, 0x00060000, msg, 0, "WARNING", 0);
{ret= 2; goto ex;}
}
if(read_opts->displacement != 0 && abs(read_opts->displacement_sign) == 1) {
/* Apply reverse displacement to session start */
if(read_opts->displacement_sign == -1) {
if(ms_block+ read_opts->displacement < ms_block) {
displacement_rollover:;
sprintf(msg, "Displacement offset leads outside 32 bit range.");
isoburn_msgs_submit(o, 0x00060000, msg, 0, "FAILURE", 0);
{ret= 0; goto ex;}
}
ms_block+= read_opts->displacement;
} else {
if(ms_block < read_opts->displacement)
goto displacement_rollover;
ms_block-= read_opts->displacement;
}
}
ret = iso_read_opts_new(ropts, 0);
if (ret < 0) {
isoburn_report_iso_error(ret, "Cannot create write opts", 0, "FATAL", 0);
goto ex;
}
iso_read_opts_set_start_block(*ropts, ms_block);
iso_read_opts_set_no_rockridge(*ropts, read_opts->norock);
iso_read_opts_set_no_aaip(*ropts, read_opts->noaaip);
if(read_opts->nomd5 == 2)
int_num= 2;
else if(read_opts->nomd5 == 1)
int_num= 1;
else
int_num= 0;
iso_read_opts_set_no_md5(*ropts, int_num);
if(read_opts->do_ecma119_map)
iso_read_opts_set_ecma119_map(*ropts, read_opts->map_mode);
if(read_opts->do_joliet_map)
iso_read_opts_set_joliet_map(*ropts, read_opts->joliet_map_mode);
iso_read_opts_set_new_inos(*ropts, read_opts->noino);
iso_read_opts_set_no_joliet(*ropts, read_opts->nojoliet);
iso_read_opts_set_no_iso1999(*ropts, read_opts->noiso1999);
iso_read_opts_set_preferjoliet(*ropts, read_opts->preferjoliet);
iso_read_opts_set_default_permissions(*ropts,
read_opts->mode, read_opts->dirmode);
iso_read_opts_set_default_uid(*ropts, read_opts->uid);
iso_read_opts_set_default_gid(*ropts, read_opts->gid);
iso_read_opts_set_input_charset(*ropts, read_opts->input_charset);
iso_read_opts_auto_input_charset(*ropts, read_opts->auto_input_charset);
iso_read_opts_load_system_area(*ropts, 1);
iso_read_opts_keep_import_src(*ropts, 1);
ret= 1;
ex:;
if(ret <= 0) {
if(*ropts != NULL)
iso_read_opts_free(*ropts);
*ropts= NULL;
}
if(msg != NULL)
free(msg);
return(ret);
}
/* API function. See libisoburn.h
*/
int isoburn_read_image(struct burn_drive *d,
struct isoburn_read_opts *read_opts,
IsoImage **image)
{
int ret, ignore_aclea= 0;
int ret, int_num, dummy;
IsoReadOpts *ropts= NULL;
IsoReadImageFeatures *features= NULL;
char *msg= NULL;
uint32_t ms_block;
char msg[160];
enum burn_disc_status status= BURN_DISC_BLANK;
IsoDataSource *ds= NULL;
struct isoburn *o= NULL;
IsoImage *new_image= NULL;
msg= calloc(1, 160);
if(d != NULL) {
ret = isoburn_find_emulator(&o, d, 0);
if (ret < 0 || o == NULL)
{ret= 0; goto ex;}
return 0;
status = isoburn_disc_get_status(d);
o->image_start_lba= -1;
}
if(read_opts==NULL) {
isoburn_msgs_submit(o, 0x00060000,
"Program error: isoburn_read_image: read_opts==NULL",
0, "FATAL", 0);
{ret= -1; goto ex;}
return(-1);
}
if (d == NULL || status == BURN_DISC_BLANK || read_opts->pretend_blank) {
create_blank_image:;
@ -300,79 +146,77 @@ create_blank_image:;
isoburn_msgs_submit(o, 0x00060000,
"Program error: isoburn_read_image: image==NULL",
0, "FATAL", 0);
{ret= -1; goto ex;}
return -1;
}
/* create a new image */
ret = iso_image_new("ISOIMAGE", image);
if (ret < 0) {
isoburn_report_iso_error(ret, "Cannot create image", 0, "FATAL", 0);
goto ex;
return ret;
}
new_image= *image;
} else {
/* Blank new image for the drive */
if(o->image != NULL)
ignore_aclea= iso_image_get_ignore_aclea(o->image);
iso_image_unref(o->image);
ret = iso_image_new("ISOIMAGE", &o->image);
if (ret < 0) {
isoburn_report_iso_error(ret, "Cannot create image", 0, "FATAL", 0);
goto ex;
return ret;
}
if (image != NULL) {
if (image) {
*image = o->image;
iso_image_ref(*image); /*protects object from premature free*/
}
iso_image_set_ignore_aclea(o->image, ignore_aclea);
ret= isoburn_root_defaults(o->image, 0);
if(ret <= 0)
goto ex;
new_image= o->image;
}
ret= iso_image_set_truncate_mode(new_image, read_opts->truncate_mode,
read_opts->truncate_length);
if(ret < 0)
goto ex;
{ret= 1; goto ex;}
iso_image_set_ignore_aclea(*image,
(!!(read_opts->noacl)) | ((!!read_opts->noea) << 1) );
return 1;
}
if (status != BURN_DISC_APPENDABLE && status != BURN_DISC_FULL) {
isoburn_msgs_submit(o, 0x00060000,
"Program error: isoburn_read_image: incorrect disc status",
0, "FATAL", 0);
{ret= -4; goto ex;}
return -4;
}
memset((char *) &ropts, 0, sizeof(ropts));
/* create the data source */
ret= isoburn_make_iso_read_opts(d, o, read_opts, &ropts);
if(ret <= 0)
goto ex;
if(ret == 2) {
sprintf(msg, "Creating blank image.");
ret = isoburn_disc_get_msc1(d, &int_num);
if (ret <= 0)
return -2;
ms_block= int_num;
ret = isoburn_read_iso_head(d, int_num, &dummy, NULL, 0);
if (ret <= 0) {
sprintf(msg, "No ISO 9660 image at LBA %d. Creating blank image.", int_num);
isoburn_msgs_submit(o, 0x00060000, msg, 0, "WARNING", 0);
goto create_blank_image;
}
iso_image_set_ignore_aclea(o->image, read_opts->noacl | (read_opts->noea << 1)
| (read_opts->lfa_flags << 2)
| (read_opts->lfa_only_settable << 5)
| (read_opts->projid << 6));
/* Important: do not return until iso_read_opts_free() */
ret= iso_image_set_truncate_mode(o->image, read_opts->truncate_mode,
read_opts->truncate_length);
if(ret < 0)
goto ex;
ds = isoburn_data_source_new(d, read_opts->displacement,
read_opts->displacement_sign,
read_opts->cache_tiles, read_opts->cache_tile_blocks);
if (ds == NULL) {
isoburn_report_iso_error(ret, "Cannot create IsoDataSource object", 0,
"FATAL", 0);
ret= -1; goto ex;
/* create the data source */
ret = iso_read_opts_new(&ropts, 0);
if (ret < 0) {
isoburn_report_iso_error(ret, "Cannot create write opts", 0, "FATAL", 0);
return ret;
}
/* Important: do not return until iso_read_opts_free() */
iso_read_opts_set_start_block(ropts, ms_block);
iso_read_opts_set_no_rockridge(ropts, read_opts->norock);
iso_read_opts_set_no_aaip(ropts, read_opts->noaaip);
iso_read_opts_set_no_md5(ropts, read_opts->nomd5);
iso_read_opts_set_new_inos(ropts, read_opts->noino);
iso_read_opts_set_no_joliet(ropts, read_opts->nojoliet);
iso_read_opts_set_no_iso1999(ropts, read_opts->noiso1999);
iso_read_opts_set_preferjoliet(ropts, read_opts->preferjoliet);
iso_read_opts_set_default_permissions(ropts,
read_opts->mode, read_opts->dirmode);
iso_read_opts_set_default_uid(ropts, read_opts->uid);
iso_read_opts_set_default_gid(ropts, read_opts->gid);
iso_read_opts_set_input_charset(ropts, read_opts->input_charset);
iso_read_opts_auto_input_charset(ropts, read_opts->auto_input_charset);
ds = isoburn_data_source_new(d);
if(o->iso_data_source!=NULL)
iso_data_source_unref(o->iso_data_source);
o->iso_data_source= ds;
@ -382,15 +226,13 @@ create_blank_image:;
iso_tree_set_report_callback(o->image, NULL);
else
iso_tree_set_report_callback(o->image, o->read_pacifier);
ret = iso_image_import(o->image, ds, ropts, &features);
iso_tree_set_report_callback(o->image, NULL);
iso_read_opts_free(ropts);
ropts= NULL;
if (ret < 0) {
isoburn_report_iso_error(ret, "Cannot import image", 0, "FAILURE", 0);
goto ex;
return ret;
}
/* Important: do not return until free(features) */
if (image!=NULL) {
@ -402,181 +244,8 @@ create_blank_image:;
read_opts->hasIso1999 = iso_read_image_features_has_iso1999(features);
read_opts->hasElTorito = iso_read_image_features_has_eltorito(features);
read_opts->size = iso_read_image_features_get_size(features);
read_opts->tree_loaded = iso_read_image_features_tree_loaded(features);
read_opts->rr_loaded = iso_read_image_features_rr_loaded(features);
ret= 1;
ex:;
if(msg != NULL)
free(msg);
if(ropts != NULL)
iso_read_opts_free(ropts);
if(features != NULL)
iso_read_image_features_destroy(features);
return(ret);
}
/* API function. See libisoburn.h
*/
int isoburn_assess_written_features(struct burn_drive *d,
struct isoburn_read_opts *read_opts,
IsoReadImageFeatures **features,
struct isoburn_imgen_opts **imgen_opts,
int flag)
{
int ret, type, ext;
int64_t num_value;
void *pt_value;
size_t pt_size;
IsoReadOpts *ropts= NULL;
char *msg= NULL;
enum burn_disc_status status= BURN_DISC_BLANK;
IsoDataSource *ds= NULL;
struct isoburn *o= NULL;
IsoWriteOpts *write_opts= NULL;
msg= calloc(1, 160);
if(d != NULL) {
ret = isoburn_find_emulator(&o, d, 0);
if (ret < 0 || o == NULL)
{ret= 0; goto ex;}
status = isoburn_disc_get_status(d);
o->image_start_lba= -1;
}
if(read_opts==NULL) {
isoburn_msgs_submit(o, 0x00060000,
"Program error: isoburn_read_image: read_opts==NULL",
0, "FATAL", 0);
{ret= -1; goto ex;}
}
if (d == NULL || read_opts->pretend_blank ||
(status != BURN_DISC_APPENDABLE && status != BURN_DISC_FULL)) {
isoburn_msgs_submit(o, 0x00060000,
"Empty drive, unsuitable medium state, or read option 'pretend_blank'",
0, "FAILURE", 0);
{ret= 0; goto ex;}
}
ret= isoburn_make_iso_read_opts(d, o, read_opts, &ropts);
if(ret <= 0)
goto ex;
if(ret == 2)
{ret= 0; goto ex;}
/* ??? Only if o->iso_data_source == NULL ? */
ds = isoburn_data_source_new(d, read_opts->displacement,
read_opts->displacement_sign,
read_opts->cache_tiles, read_opts->cache_tile_blocks);
if (ds == NULL) {
isoburn_report_iso_error(ret, "Cannot create IsoDataSource object", 0,
"FATAL", 0);
ret= -1; goto ex;
}
if(o->iso_data_source != NULL)
iso_data_source_unref(o->iso_data_source);
o->iso_data_source= ds;
ret= iso_assess_written_features(ds, ropts, features, &write_opts);
if(ret < 0) {
isoburn_report_iso_error(ret, "Failed to assess ISO filesystem features",
0, "FAILURE", 0);
ret= 0; goto ex;
}
ret= isoburn_igopt_new(imgen_opts, 0);
if(ret <= 0)
goto ex;
/* Convert features to imgen_opts */
if(iso_read_image_feature_named(*features, "iso_level", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
isoburn_igopt_set_level(*imgen_opts, num_value);
ext= 0;
if(iso_read_image_feature_named(*features, "rock_ridge", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_rockridge * !!num_value;
if(iso_read_image_feature_named(*features, "joliet", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_joliet * !!num_value;
if(iso_read_image_feature_named(*features, "iso1999", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_iso1999 * !!num_value;
if(iso_read_image_feature_named(*features, "aaip", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_aaip * !!num_value;
if(iso_read_image_feature_named(*features, "record_md5_session", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_session_md5 * !!num_value;
if(iso_read_image_feature_named(*features, "record_md5_files", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_file_md5 * !!num_value;
isoburn_igopt_set_extensions(*imgen_opts, ext);
ext= 0;
if(iso_read_image_feature_named(*features, "omit_version_numbers", NULL, &type,
&num_value, &pt_value, &pt_size) == 1) {
if((num_value & 3) == 2)
ext|= isoburn_igopt_only_iso_versions;
else if(num_value & 3)
ext|= isoburn_igopt_omit_version_numbers;
}
if(iso_read_image_feature_named(*features, "allow_deep_paths", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_allow_deep_paths * !!num_value;
if(iso_read_image_feature_named(*features, "allow_longer_paths", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_allow_longer_paths * !!num_value;
if(iso_read_image_feature_named(*features, "max_37_char_filenames", NULL,
&type, &num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_max_37_char_filenames * !!num_value;
if(iso_read_image_feature_named(*features, "no_force_dots", NULL, &type,
&num_value, &pt_value, &pt_size) == 1) {
if(num_value & 1)
ext|= isoburn_igopt_only_iso_versions;
if(num_value & 2)
ext|= isoburn_igopt_no_force_dots;
}
if(iso_read_image_feature_named(*features, "allow_lowercase", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_allow_lowercase * !!num_value;
if(iso_read_image_feature_named(*features, "allow_full_ascii", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_allow_full_ascii * !!num_value;
if(iso_read_image_feature_named(*features, "joliet_longer_paths", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_joliet_longer_paths * !!num_value;
if(iso_read_image_feature_named(*features, "rrip_version_1_10", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_rrip_version_1_10 * !!num_value;
if(iso_read_image_feature_named(*features, "aaip_susp_1_10", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_aaip_susp_1_10 * !!num_value;
if(iso_read_image_feature_named(*features, "allow_dir_id_ext", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_allow_dir_id_ext * !!num_value;
if(iso_read_image_feature_named(*features, "joliet_long_names", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_joliet_long_names * !!num_value;
if(iso_read_image_feature_named(*features, "joliet_utf16", NULL, &type,
&num_value, &pt_value, &pt_size) == 1)
ext|= isoburn_igopt_joliet_utf16 * !!num_value;
isoburn_igopt_set_relaxed(*imgen_opts, ext);
if(iso_read_image_feature_named(*features, "untranslated_name_len", NULL,
&type, &num_value, &pt_value, &pt_size) == 1)
isoburn_igopt_set_untranslated_name_len(*imgen_opts, num_value);
ret= 1;
ex:;
if(msg != NULL)
free(msg);
if(ropts != NULL)
iso_read_opts_free(ropts);
if(write_opts != NULL)
iso_write_opts_free(write_opts);
return(ret);
iso_read_image_features_destroy(features);
return 1;
}
@ -599,42 +268,15 @@ int isoburn_attach_image(struct burn_drive *d, IsoImage *image)
if(o->image != NULL)
iso_image_unref(o->image);
o->image = image;
o->image_start_lba = -1;
return(1);
}
/* API */
int isoburn_attach_start_lba_v2(struct burn_drive *d, off_t lba, int flag)
{
int ret;
struct isoburn *o;
ret = isoburn_find_emulator(&o, d, 0);
if(ret < 0)
return ret;
if(o == NULL)
return 0;
if(o->image == NULL)
return 0;
o->image_start_lba = lba;
return 1;
}
int isoburn_attach_start_lba(struct burn_drive *d, int lba, int flag)
{
int ret;
ret= isoburn_attach_start_lba_v2(d, (off_t) lba, flag);
return(ret);
}
/* API function. See libisoburn.h
*/
int isoburn_activate_session(struct burn_drive *drive)
{
int ret, do_sync = 1;
int ret;
struct isoburn *o;
ret = isoburn_find_emulator(&o, drive, 0);
@ -650,250 +292,64 @@ int isoburn_activate_session(struct burn_drive *drive)
(o->fabricated_disc_status == BURN_DISC_BLANK &&
o->zero_nwa > 0)))
return 1;
ret = burn_drive_get_drive_role(drive);
if (ret != 1)
do_sync = !! o->do_fsync;
ret = burn_random_access_write(drive, (off_t) 0, (char*)o->target_iso_head,
o->target_iso_head_size, do_sync);
Libisoburn_target_head_sizE, 1);
return ret;
}
/** API @since 0.6.2
*/
int isoburn_get_img_partition_offset(struct burn_drive *drive,
uint32_t *block_offset_2k)
{
int ret;
struct isoburn *o;
ret = isoburn_find_emulator(&o, drive, 0);
if(ret < 0 || o == NULL)
return -1;
*block_offset_2k= o->loaded_partition_offset;
if(o->loaded_partition_offset == 0)
return(0);
if(o->target_iso_head_size == (off_t) Libisoburn_target_head_sizE
+ (off_t) 2048 * (off_t) o->loaded_partition_offset)
return(1);
return(2);
}
/* Try to read partition start and size block number from given GPT entry */
int isoburn_get_gpt_entry(struct isoburn *o, int partno,
uint64_t *start_lba, uint64_t *size, int flag)
{
uint32_t part_start, entry_count, entry_size, part_lba, end_lba;
uint8_t *gpt, *part;
/* Check for GPT header block */
gpt = o->target_iso_head + 512;
if(memcmp(gpt, "EFI PART", 8) != 0)
return(0);
if(gpt[8] != 0x00 || gpt[9] != 0x00 || gpt[10] != 0x01 || gpt[11] != 0x00)
return(0);
part_start = iso_read_lsb64(gpt + 72);
entry_count = iso_read_lsb64(gpt + 80);
entry_size = iso_read_lsb64(gpt + 84);
/* Read partition entry */
if(partno < 1)
return(0);
if(((uint64_t) partno) > entry_count)
return(0);
if(part_start * 512 + partno * entry_size > 32768)
return(0);
part = o->target_iso_head + part_start * 512 + (partno - 1) * entry_size;
part_lba = iso_read_lsb64(part + 32);
end_lba = iso_read_lsb64(part + 40);
if(end_lba < part_lba)
return(0);
*start_lba = part_lba;
*size = end_lba - part_lba + 1;
return(1);
}
/* Check for MBR signature and a first partition that starts at a 2k block
and ends where the image ends.
If not too large or too small, accept its start as partition offset.
*/
static int isoburn_inspect_partition(struct isoburn *o, uint32_t img_size,
int flag)
{
uint8_t *mbr, *part, *buf= NULL;
uint32_t offst, numsec;
uint64_t gpt_start_lba, gpt_size;
struct ecma119_pri_vol_desc *pvm;
off_t data_count;
int ret;
char *msg= NULL;
static int max_offst= 512 - 32;
buf= (uint8_t *) calloc(1, 2048);
msg= calloc(1, 160);
if(buf == NULL || msg == NULL)
{ret= -1; goto ex;}
mbr= o->target_iso_head;
part= mbr + 446;
if(mbr[510] != 0x55 || mbr[511] != 0xAA)
{ret= 2; goto ex;} /* not an MBR */
/* Does the first partition entry look credible ? */
if(part[0] != 0x80 && part[0] != 0x00)
{ret= 2; goto ex;} /* Invalid partition status */
if(part[1] == 0 && part[2] == 0 && part[3] == 0)
{ret= 2; goto ex;} /* Zero C/H/S start address */
offst= iso_read_lsb(part + 8, 4);
numsec= iso_read_lsb(part + 12, 4);
/* Is it GPT ? */
if(part[4] == 0xee && offst == 1) {
ret= isoburn_get_gpt_entry(o, 1, &gpt_start_lba, &gpt_size, 0);
if(ret > 0 && gpt_start_lba < ((uint64_t) 1) << 32 &&
gpt_size < ((uint64_t) 1) << 32) {
offst= gpt_start_lba;
numsec= gpt_size;
}
}
/* Does it match the normal ISO image ? */
if(offst < 64)
{ret= 2; goto ex;} /* Zero or unusably small partition start */
if((offst % 4) || (numsec % 4))
{ret= 2; goto ex;} /* Not aligned to 2k */
if(numsec < 72)
{ret= 2; goto ex;} /* No room for volume descriptors */
offst/= 4;
numsec/= 4;
if(offst + numsec > img_size)
{ret= 2; goto ex;} /* Partition end exceeds image end */
/* Is there a PVD at the partition start ? */
ret = burn_read_data(o->drive, (off_t) (offst + 16) * (off_t) 2048,
(char*) buf, 2048, &data_count, 32);
if(ret <= 0)
{ret= 2; goto ex;}
pvm = (struct ecma119_pri_vol_desc *) buf;
if (strncmp((char*) pvm->std_identifier, "CD001", 5) != 0)
{ret= 2; goto ex;} /* not a PVD */
if (pvm->vol_desc_type[0] != 1 || pvm->vol_desc_version[0] != 1
|| pvm->file_structure_version[0] != 1 )
{ret= 2; goto ex;} /* failed sanity check */
if(iso_read_lsb(pvm->vol_space_size, 4) + offst > img_size)
{ret= 2; goto ex;} /* Image ends do not match plausibly */
/* Now it is credible. Not yet clear is whether it is acceptable. */
o->loaded_partition_offset= offst;
/* If the partition start is too large: Report but do not accept. */
if(offst > (uint32_t) max_offst) {/* Not more than 1 MB of .target_iso_head */
sprintf(msg,
"Detected partition offset of %.f blocks. Maximum for load buffer is %d",
(double) offst, max_offst);
isoburn_msgs_submit(NULL, 0x00060000, msg, 0, "WARNING", 0);
{ret= 3; goto ex;}
}
/* Accept partition start and adjust buffer size */
ret= isoburn_adjust_target_iso_head(o, offst, 0);
if(ret <= 0)
goto ex;
ret= 1;
ex:;
if(buf != NULL)
free(buf);
if(msg != NULL)
free(msg);
return(ret);
}
/** Initialize the emulation of multi-session on random access media.
The need for emulation is confirmed already.
@param o A freshly created isoburn object. isoburn_create_data_source() was
already called, nevertheless.
@param flag bit0= read-only
@return <=0 error , 1 = success
*/
int isoburn_start_emulation(struct isoburn *o, int flag)
{
int ret, i, role;
off_t capacity = -1, dummy;
int ret, i, capacity = -1, role;
off_t data_count, to_read;
struct burn_drive *drive;
struct ecma119_pri_vol_desc *pvm;
enum burn_disc_status s;
char *path= NULL, *msg= NULL;
path= calloc(1, BURN_DRIVE_ADR_LEN);
msg= calloc(1, 2 * BURN_DRIVE_ADR_LEN);
if(path == NULL || msg == NULL)
{ret= -1; goto ex;}
if(o==NULL) {
isoburn_msgs_submit(NULL, 0x00060000,
"Program error: isoburn_start_emulation: o==NULL",
0, "FATAL", 0);
{ret= -1; goto ex;}
return -1;
}
drive= o->drive;
if(flag & 1)
o->fabricated_disc_status= BURN_DISC_FULL;
/* We can assume 0 as start block for image.
The data there point to the most recent session.
*/
role = burn_drive_get_drive_role(drive);
ret = burn_get_read_capacity_v2(drive, &capacity, 0);
ret = burn_get_read_capacity(drive, &capacity, 0);
if (ret <= 0)
capacity = -1;
if (role == 5) { /* random access write-only medium */
s = burn_disc_get_status(drive);
o->fabricated_disc_status= s;
burn_disc_track_lba_nwa_v2(drive, NULL, 0, &dummy, &(o->nwa));
if(o->nwa < o->zero_nwa)
o->zero_nwa= 0;
{ret= 1; goto ex;}
} else if (capacity > 0 || role == 2 || role == 4) {
if (capacity > 0 || role == 2) {
/* Might be a block device on a system where libburn cannot determine its
size. Try to read anyway. */
to_read = o->target_iso_head_size;
memset(o->target_iso_head, 0, to_read);
if(capacity > 0 && capacity * (off_t) 2048 < to_read)
to_read = capacity * (off_t) 2048;
memset(o->target_iso_head, 0, Libisoburn_target_head_sizE);
to_read = Libisoburn_target_head_sizE;
if(capacity > 0 && (off_t) capacity * (off_t) 2048 < to_read)
to_read = (off_t) capacity * (off_t) 2048;
ret = burn_read_data(drive, (off_t) 0, (char*)o->target_iso_head,
to_read, &data_count, 32 | 8);
to_read, &data_count, 2);
if (ret <= 0) {
/* an error means a disc with no ISO image */
o->media_read_error= 1;
if (ret == -2) {
path[0]= 0;
burn_drive_d_get_adr(drive, path);
sprintf(msg, "Pseudo drive '%s' does not allow reading", path);
isoburn_msgs_submit(NULL, 0x00060000, msg, 0, "NOTE", 0);
o->fabricated_disc_status= BURN_DISC_BLANK;
} else if (capacity > 0)
if (capacity > 0)
o->fabricated_disc_status= BURN_DISC_FULL;
else if(!(flag & 1))
o->fabricated_disc_status= BURN_DISC_BLANK;
{ret= 1; goto ex;}
else
o->fabricated_disc_status= BURN_DISC_BLANK;
return 1;
}
} else {
/* No read capacity means blank medium */
if(!(flag & 1))
o->fabricated_disc_status= BURN_DISC_BLANK;
{ret= 1; goto ex;}
/* No read capacity means blank media */
o->fabricated_disc_status= BURN_DISC_BLANK;
return 1;
}
/* check first 64K. If 0's, the disc is treated as a blank disc, and thus
@ -903,14 +359,13 @@ int isoburn_start_emulation(struct isoburn *o, int flag)
--i;
if (!i) {
if(!(flag & 1))
o->fabricated_disc_status= BURN_DISC_BLANK;
{ret= 1; goto ex;}
o->fabricated_disc_status= BURN_DISC_BLANK;
return 1;
}
pvm = (struct ecma119_pri_vol_desc *)(o->target_iso_head + 16 * 2048);
if (strncmp((char*)pvm->std_identifier, "CD001", 5) == 0) {
if (!strncmp((char*)pvm->std_identifier, "CD001", 5)) {
off_t size;
/* sanity check */
@ -918,44 +373,30 @@ int isoburn_start_emulation(struct isoburn *o, int flag)
|| pvm->file_structure_version[0] != 1 ) {
/* TODO for now I treat this as a full disc */
o->fabricated_disc_status= BURN_DISC_FULL;
{ret= 1; goto ex;}
return 1;
}
/* ok, PVM found, set size */
size = (off_t) iso_read_lsb(pvm->vol_space_size, 4);
ret= isoburn_inspect_partition(o, (uint32_t) size, 0);
if (ret <= 0)
goto ex;
size *= (off_t) 2048; /* block size in bytes */
isoburn_set_start_byte(o, size, 0);
if(!(flag & 1))
o->fabricated_disc_status= BURN_DISC_APPENDABLE;
} else if (strncmp((char*)pvm->std_identifier, "CDXX1", 5) == 0 ||
(strncmp((char*)pvm->std_identifier, "CDxx1", 5) == 0 &&
pvm->vol_desc_type[0] == 'x')) {
o->fabricated_disc_status= BURN_DISC_APPENDABLE;
} else if (!strncmp((char*)pvm->std_identifier, "CDXX1", 5)) {
/* empty image */
isoburn_set_start_byte(o, o->zero_nwa * 2048, 0);
if(!(flag & 1))
o->fabricated_disc_status= BURN_DISC_BLANK;
o->fabricated_disc_status= BURN_DISC_BLANK;
} else {
/* treat any disc in an unknown format as full */
o->fabricated_disc_status= BURN_DISC_FULL;
}
ret= 1;
ex:;
if(path != NULL)
free(path);
if(msg != NULL)
free(msg);
return(ret);
return 1;
}
/** Alters and writes the first 64 kB of a "medium" to invalidate
/** Alters and writes the first 64 kB of a "media" to invalidate
an ISO image. (It shall stay restorable by skilled humans, though).
The result shall especially keep libisoburn from accepting the medium
The result shall especially keep libisoburn from accepting the media
image as ISO filesystem.
@param o A fully activated isoburn object. isoburn_start_emulation()
was already called.
@ -963,32 +404,11 @@ ex:;
*/
int isoburn_invalidate_iso(struct isoburn *o, int flag)
{
int end_ed_found= 0, i;
char *head;
head= (char *) o->target_iso_head;
/*
* replace CD001 with CDXX1 in PVM.
* I think this is enought for invalidating an iso image
*/
memcpy(head + 16 * 2048 + 1, "CDXX1", 5);
/* Invalidate further ECMA-119 volume descriptors and possible UDF volume
recognition sequence */
for(i= 17 * 2048; i < 32 * 2048; i+= 2048) {
if(end_ed_found) {
if(head[i] == 0 && strncmp(head + i + 1, "BEA01", 5) == 0)
memcpy(head + i + 1, "BEAX1", 5);
else if(head[i] == 0 && strncmp(head + i + 1, "NSR", 3) == 0)
memcpy(head + i + 1, "NSRX", 4);
else if(head[i] == 0 && strncmp(head + i + 1, "TEA", 3) == 0)
memcpy(head + i + 1, "TEAX", 4);
} else if(strncmp(head + i + 1, "CD001", 5) == 0) {
if(((unsigned char *) head)[i] == 0xff)
end_ed_found= 1;
memcpy(head + i + 3, "XX", 2);
}
}
strncpy((char*)o->target_iso_head + 16 * 2048 + 1, "CDXX1", 5);
return isoburn_activate_session(o->drive);
}

File diff suppressed because it is too large Load Diff

View File

@ -1,390 +0,0 @@
LIBISOBURN1 {
global:
isoburn_activate_session;
isoburn_assess_written_features;
isoburn_attach_image;
isoburn_attach_start_lba;
isoburn_conv_name_chars;
isoburn_cancel_prepared_write;
isoburn_disc_available_space;
isoburn_disc_erasable;
isoburn_disc_erase;
isoburn_disc_get_msc1;
isoburn_disc_get_status;
isoburn_disc_pretend_full_uncond;
isoburn_disc_track_lba_nwa;
isoburn_disc_write;
isoburn_drive_aquire;
isoburn_drive_grab;
isoburn_drive_release;
isoburn_drive_scan_and_grab;
isoburn_drive_set_msgs_submit;
isoburn_drive_wrote_well;
isoburn_finish;
isoburn_get_attached_image;
isoburn_get_attached_start_lba;
isoburn_get_fifo_status;
isoburn_get_min_start_byte;
isoburn_get_mount_params;
isoburn_igopt_attach_jte;
isoburn_igopt_destroy;
isoburn_igopt_detach_jte;
isoburn_igopt_get_appended_as_apm;
isoburn_igopt_get_appended_as_gpt;
isoburn_igopt_get_data_start;
isoburn_igopt_get_disc_label;
isoburn_igopt_get_effective_lba;
isoburn_igopt_get_efi_bootp;
isoburn_igopt_get_extensions;
isoburn_igopt_get_fifo_size;
isoburn_igopt_get_gpt_guid;
isoburn_igopt_get_hfsp_block_size;
isoburn_igopt_get_hfsp_serial_number;
isoburn_igopt_get_iso_mbr_part_type;
isoburn_igopt_get_iso_type_guid;
isoburn_igopt_get_level;
isoburn_igopt_get_max_ce_entries;
isoburn_igopt_get_out_charset;
isoburn_igopt_get_over_mode;
isoburn_igopt_get_over_ugid;
isoburn_igopt_get_part_flags;
isoburn_igopt_get_part_like_isohybrid;
isoburn_igopt_get_part_type_guid;
isoburn_igopt_get_partition_img;
isoburn_igopt_get_prep_partition;
isoburn_igopt_get_pvd_times;
isoburn_igopt_get_relaxed;
isoburn_igopt_get_rr_reloc;
isoburn_igopt_get_scdbackup_tag;
isoburn_igopt_get_sort_files;
isoburn_igopt_get_stdio_endsync;
isoburn_igopt_get_system_area;
isoburn_igopt_get_tail_blocks;
isoburn_igopt_get_untranslated_name_len;
isoburn_igopt_get_write_type;
isoburn_igopt_new;
isoburn_igopt_set_appended_as_apm;
isoburn_igopt_set_appended_as_gpt;
isoburn_igopt_set_disc_label;
isoburn_igopt_set_efi_bootp;
isoburn_igopt_set_extensions;
isoburn_igopt_set_fifo_size;
isoburn_igopt_set_gpt_guid;
isoburn_igopt_set_hfsp_block_size;
isoburn_igopt_set_hfsp_serial_number;
isoburn_igopt_set_iso_mbr_part_type;
isoburn_igopt_set_iso_type_guid;
isoburn_igopt_set_level;
isoburn_igopt_set_max_ce_entries;
isoburn_igopt_set_out_charset;
isoburn_igopt_set_over_mode;
isoburn_igopt_set_over_ugid;
isoburn_igopt_set_part_flag;
isoburn_igopt_set_part_like_isohybrid;
isoburn_igopt_set_part_type_guid;
isoburn_igopt_set_partition_img;
isoburn_igopt_set_prep_partition;
isoburn_igopt_set_pvd_times;
isoburn_igopt_set_relaxed;
isoburn_igopt_set_rr_reloc;
isoburn_igopt_set_scdbackup_tag;
isoburn_igopt_set_sort_files;
isoburn_igopt_set_stdio_endsync;
isoburn_igopt_set_system_area;
isoburn_igopt_set_tail_blocks;
isoburn_igopt_set_untranslated_name_len;
isoburn_igopt_set_write_type;
isoburn_initialize;
isoburn_is_compatible;
isoburn_libburn_req;
isoburn_libisofs_req;
isoburn_libjte_req;
isoburn_needs_emulation;
isoburn_prepare_blind_grow;
isoburn_prepare_disc;
isoburn_prepare_new_image;
isoburn_read_image;
isoburn_read_iso_head;
isoburn_ropt_destroy;
isoburn_ropt_get_auto_incharset;
isoburn_ropt_get_data_cache;
isoburn_ropt_get_default_dirperms;
isoburn_ropt_get_default_perms;
isoburn_ropt_get_displacement;
isoburn_ropt_get_extensions;
isoburn_ropt_get_input_charset;
isoburn_ropt_get_size_what;
isoburn_ropt_get_tree_loaded;
isoburn_ropt_get_truncate_mode;
isoburn_ropt_new;
isoburn_ropt_set_auto_incharset;
isoburn_ropt_set_data_cache;
isoburn_ropt_set_default_dirperms;
isoburn_ropt_set_default_perms;
isoburn_ropt_set_displacement;
isoburn_ropt_set_extensions;
isoburn_ropt_set_input_charset;
isoburn_ropt_set_truncate_mode;
isoburn_set_msc1;
isoburn_set_msgs_submit;
isoburn_set_read_pacifier;
isoburn_set_truncate;
isoburn_sync_after_write;
isoburn_toc_disc_free;
isoburn_toc_disc_get_incmpl_sess;
isoburn_toc_disc_get_sectors;
isoburn_toc_disc_get_sessions;
isoburn_toc_drive_get_disc;
isoburn_toc_session_get_leadout_entry;
isoburn_toc_session_get_sectors;
isoburn_toc_session_get_tracks;
isoburn_toc_track_get_emul;
isoburn_toc_track_get_entry;
isoburn_version;
Xorriso__dispose_words;
Xorriso__get_patch_level_text;
Xorriso__is_compatible;
Xorriso__preset_signal_behavior;
Xorriso__severity_cmp;
Xorriso__severity_list;
Xorriso__version;
Xorriso_change_is_pending;
Xorriso_destroy;
Xorriso_dialog;
Xorriso_eval_problem_status;
Xorriso_execute_option;
Xorriso_fetch_outlists;
Xorriso_get_problem_status;
Xorriso_interpreter;
Xorriso_lst_destroy_all;
Xorriso_lst_get_next;
Xorriso_lst_get_prev;
Xorriso_lst_get_text;
Xorriso_make_return_value;
Xorriso_msgs_submit;
Xorriso_msgs_submit_void;
Xorriso_new;
Xorriso_option_abort_on;
Xorriso_option_abstract_file;
Xorriso_option_acl;
Xorriso_option_add;
Xorriso_option_add_plainly;
Xorriso_option_alter_date;
Xorriso_option_append_partition;
Xorriso_option_application_id;
Xorriso_option_application_use;
Xorriso_option_as;
Xorriso_option_assert_volid;
Xorriso_option_assess_indev_features;
Xorriso_option_auto_charset;
Xorriso_option_backslash_codes;
Xorriso_option_ban_stdio_write;
Xorriso_option_biblio_file;
Xorriso_option_blank;
Xorriso_option_boot_image;
Xorriso_option_calm_drive;
Xorriso_option_cdi;
Xorriso_option_cdx;
Xorriso_option_changes_pending;
Xorriso_option_charset;
Xorriso_option_check_md5;
Xorriso_option_check_media;
Xorriso_option_check_media_defaults;
Xorriso_option_chgrpi;
Xorriso_option_chmodi;
Xorriso_option_chowni;
Xorriso_option_clone;
Xorriso_option_close;
Xorriso_option_close_damaged;
Xorriso_option_close_filter_list;
Xorriso_option_commit;
Xorriso_option_commit_eject;
Xorriso_option_compare;
Xorriso_option_compliance;
Xorriso_option_concat;
Xorriso_option_copyright_file;
Xorriso_option_cp_clone;
Xorriso_option_cpri;
Xorriso_option_cpx;
Xorriso_option_cut_out;
Xorriso_option_data_cache_size;
Xorriso_option_dev;
Xorriso_option_devices;
Xorriso_option_dialog;
Xorriso_option_disk_dev_ino;
Xorriso_option_disk_pattern;
Xorriso_option_displacement;
Xorriso_option_drive_access;
Xorriso_option_drive_class;
Xorriso_option_dummy;
Xorriso_option_dvd_obs;
Xorriso_option_early_drive_test;
Xorriso_option_ecma119_map;
Xorriso_option_eject;
Xorriso_option_end;
Xorriso_option_errfile_log;
Xorriso_option_error_behavior;
Xorriso_option_external_filter;
Xorriso_option_extract;
Xorriso_option_extract_boot_images;
Xorriso_option_extract_cut;
Xorriso_option_file_name_limit;
Xorriso_option_file_size_limit;
Xorriso_option_find;
Xorriso_option_follow;
Xorriso_option_fs;
Xorriso_option_getfacli;
Xorriso_option_gid;
Xorriso_option_grow_blindly;
Xorriso_option_hardlinks;
Xorriso_option_help;
Xorriso_option_hfsplus;
Xorriso_option_hide;
Xorriso_option_history;
Xorriso_option_iso_nowtime;
Xorriso_option_iso_rr_pattern;
Xorriso_option_jigdo;
Xorriso_option_joliet;
Xorriso_option_joliet_map;
Xorriso_option_launch_frontend;
Xorriso_option_list_arg_sorting;
Xorriso_option_list_delimiter;
Xorriso_option_list_extras;
Xorriso_option_list_formats;
Xorriso_option_list_profiles;
Xorriso_option_list_speeds;
Xorriso_option_lnsi;
Xorriso_option_load;
Xorriso_option_logfile;
Xorriso_option_lsi;
Xorriso_option_lsx;
Xorriso_option_map;
Xorriso_option_map_l;
Xorriso_option_mark;
Xorriso_option_md5;
Xorriso_option_mkdiri;
Xorriso_option_modesty_on_drive;
Xorriso_option_mount;
Xorriso_option_mount_opts;
Xorriso_option_move;
Xorriso_option_msg_op;
Xorriso_option_mvi;
Xorriso_option_named_pipe_loop;
Xorriso_option_no_rc;
Xorriso_option_not_leaf;
Xorriso_option_not_list;
Xorriso_option_not_mgt;
Xorriso_option_not_paths;
Xorriso_option_options_from_file;
Xorriso_option_osirrox;
Xorriso_option_overwrite;
Xorriso_option_pacifier;
Xorriso_option_padding;
Xorriso_option_page;
Xorriso_option_paste_in;
Xorriso_option_path_list;
Xorriso_option_pathspecs;
Xorriso_option_pkt_output;
Xorriso_option_preparer_id;
Xorriso_option_print;
Xorriso_option_print_size;
Xorriso_option_prog;
Xorriso_option_prog_help;
Xorriso_option_prompt;
Xorriso_option_publisher;
Xorriso_option_pvd_info;
Xorriso_option_pwdi;
Xorriso_option_pwdx;
Xorriso_option_read_fs;
Xorriso_option_read_mkisofsrc;
Xorriso_option_reassure;
Xorriso_option_report_about;
Xorriso_option_report_el_torito;
Xorriso_option_report_system_area;
Xorriso_option_return_with;
Xorriso_option_rmi;
Xorriso_option_rockridge;
Xorriso_option_rollback;
Xorriso_option_rom_toc_scan;
Xorriso_option_rr_reloc_dir;
Xorriso_option_scdbackup_tag;
Xorriso_option_scsi_dev_family;
Xorriso_option_scsi_log;
Xorriso_option_session_log;
Xorriso_option_set_filter;
Xorriso_option_setfacl_listi;
Xorriso_option_setfacli;
Xorriso_option_setfattr_listi;
Xorriso_option_setfattri;
Xorriso_option_sh_style_result;
Xorriso_option_signal_handling;
Xorriso_option_sleep;
Xorriso_option_speed;
Xorriso_option_split_size;
Xorriso_option_status;
Xorriso_option_status_history_max;
Xorriso_option_stdio_sync;
Xorriso_option_stream_recording;
Xorriso_option_system_id;
Xorriso_option_tell_media_space;
Xorriso_option_temp_mem_limit;
Xorriso_option_toc;
Xorriso_option_toc_of;
Xorriso_option_uid;
Xorriso_option_unregister_filter;
Xorriso_option_update;
Xorriso_option_use_immed_bit;
Xorriso_option_use_readline;
Xorriso_option_version;
Xorriso_option_volid;
Xorriso_option_volset_id;
Xorriso_option_volume_date;
Xorriso_option_write_type;
Xorriso_option_xattr;
Xorriso_option_zisofs;
Xorriso_parse_line;
Xorriso_peek_outlists;
Xorriso_prescan_args;
Xorriso_process_errfile;
Xorriso_process_msg_queues;
Xorriso_program_arg_bsl;
Xorriso_pull_outlists;
Xorriso_push_outlists;
Xorriso_read_rc;
Xorriso_set_problem_status;
Xorriso_sieve_add_filter;
Xorriso_sieve_big;
Xorriso_sieve_clear_results;
Xorriso_sieve_dispose;
Xorriso_sieve_get_result;
Xorriso_start_msg_watcher;
Xorriso_startup_libraries;
Xorriso_stop_msg_watcher;
local: *;
};
LIBISOBURN1_1.5.8 {
isoburn_attach_start_lba_v2;
isoburn_disc_get_msc1_v2;
isoburn_disc_track_lba_nwa_v2;
isoburn_drive_release_v2;
isoburn_get_attached_start_lba_v2;
isoburn_get_mount_params_v2;
isoburn_igopt_get_data_start_v2;
isoburn_igopt_get_effective_lba_v2;
isoburn_igopt_get_gpt_with_gaps;
isoburn_igopt_set_gpt_with_gaps;
isoburn_prepare_blind_grow_v2;
isoburn_read_iso_head_v2;
isoburn_toc_disc_get_sectors_v2;
isoburn_toc_session_get_sectors_v2;
isoburn_toc_track_get_emul_v2;
Xorriso_option_chattri;
Xorriso_option_for_backup;
Xorriso_option_genisoimage_completion;
Xorriso_option_get_projid;
Xorriso_option_lfa_flags;
Xorriso_option_projid;
Xorriso_option_set_projid;
} LIBISOBURN1;

View File

@ -1,27 +0,0 @@
------------------------------------------------------------------------------
http:libburnia-project.org
------------------------------------------------------------------------------
Release Engineering Check List
TEST: releng
auto_* tests could be run altogether by ./run_all_auto
manual_* tests are to be run individually and manually
LOGS: http://people.debian.org/~danchev/libburnia/logs/releng/
TEST: cppcheck - static code checker
LOGS: http://people.debian.org/~danchev/libburnia/logs/cppcheck/
TEST: medistimator - checks the dialog mode of xorriso, size estimation
facility, and its ability of processing large trees. Running this
requires some specific knowledge of how the tool works, in order to
interpret the results and compare them with these from any previous
runs. The source is heavily commented.
FILE: http://anonscm.debian.org/gitweb/?p=users/danchev/medistimator.git;a=summary
LOGS: http://people.debian.org/~danchev/libburnia/logs/medistimator/
TEST: Debian ISO image builder logs
LOGS: http://cdbuilder.debian.org/cdimage-log/
TEST: Debian build daemon logs - several hardware architectures and kernels
LOGS: http://buildd.debian.org

View File

@ -1,300 +0,0 @@
------------------------------------------------------------------------------
http:libburnia-project.org
------------------------------------------------------------------------------
libisoburn/releng. By George Danchev <danchev@spnet.net>
and Thomas Schmitt <scdbackup@gmx.net>
Test suite for xorriso and libburnia libraries.
Copyright (C) 2011 - 2012 George Danchev
Copyright (C) 2011, 2012, 2019 Thomas Schmitt
Provided under GPL version 2 or later.
------------------------------------------------------------------------------
The impatient tester will build libisoburn according to its README and then do
cd ./releng
./run_all_auto -x ../xorriso/xorriso
More patient testers will first read the following description.
Those who simply lack the interpreter /bin/bash, may do
./change_shell_to_use
and then retry.
The test suite
Directory ./releng of libisoburn contains a collection of test scripts and
auxiliary data. They exercise some typical use cases of building libisoburn
applications and running the ISO 9660 filesystem manipulation and CD/DVD/BD
burn program xorriso.
It is assumed that libburn and libisofs are installed, so that libisoburn
can be configured and built. It is not mandatory that libisoburn is already
installed. The tests may use an installed xorriso program as well as a
freshly built one.
The test scripts explicitly demand /bin/bash as interpreter, although they
would run on certain other shells too. If you get an error message like
./run_all_auto: not found
then consider to install /bin/bash.
If you decide against that, see below "Alternative Shells".
There are two groups of test scripts:
auto_* gets started and watched by script run_all_auto.
These tests have a moderate resource consumption and do
not cause mechanical movements of drive trays.
manual_* gets started by the user if desired.
Manual tests may create larger sets of temporary files,
may download test data from the internet, may need
system privileges beyond the reach of a sandbox user,
and operate the mechanics of a CD drive.
Running automated tests
The test scripts expect to get run while the working directory is
./releng
of a libisoburn source tree. E.g.: libisoburn-1.1.4/releng
They create all their temporary files underneath
./releng/releng_generated_data
Some of these files are persistent between tests.
Nevertheless it is safe to empty ./releng/releng_generated_data after
tests are done. The directory itself must be kept.
To run the unobtrusive automatic tests, build libisoburn and xorriso,
go to directory ./releng, and execute
./run_all_auto -x ../xorriso/xorriso
or if you want to use an installed xorriso program:
./run_all_auto -x $(which xorriso)
./run_all_auto -x $(type -p xorriso)
There are several options which work with run_all_auto and any single test.
-x absolute or relative path to xorriso binary to be run.
-k keep self-generated data.
-c cleanup temporary data kept from previous run and exit.
-f simulate failure.
-h print this help text.
-- end of general options, begin of test specific options.
After option "--", there may be given options which are specific to
particular manually executable test scripts.
Manually executable tests
Currently there are the following tests which should have the attention of
the user or require sysadmin considerations before they are run:
./manual_devices -x ../xorriso/xorriso [-- [--dev device_file_to_use]
[--priv_cmd 'command [arg [arg ...]]']]
Exercises listing of all accessible optical drives and the examination of
a one of these drives. The user needs the permission to operate the CD
drives. This might involve the need for superuser authority.
The media tray of the examined drive will get loaded if it is not already.
If no option --dev is given, then the user gets asked which of the listed
drives to examine more closely.
If a privilege command and optional arguments are given with --priv_cmd,
then this command and arguments are used to launch the xorriso runs.
Command and arguments must be single words and be submitted altogether
as one single argument. On Solaris use: --priv_cmd pfexec
./manual_burn -x ../xorriso/xorriso [-- [--dev device_file_to_use]
[--priv_cmd 'command [arg [arg ...]]']
[--what ...directory...] [--any_media]]
Burns the content of the directory given with --what onto re-usable
media: CD-RW, DVD-RW, DVD-RAM, DVD+RW, BD-RE.
Other media types get refused, unless option --any_media is given.
Data, which are possibly present on the media, get overwritten.
The result gets check read and compared with the state of the input
directory. MD5 mismatch causes a test failure. Differences to the directory
state are reported but still regarded as success.
If a privilege command and optional arguments are given with --priv_cmd,
then this command and arguments are used to launch the xorriso runs.
Command and arguments must be single words and be submitted altogether
as one single argument. On Solaris use:
--priv_cmd pfexec
./manual_isojigdo -x ../xorriso/xorriso [-- [--md5 | --sha256]]
Exercises the production of a bootable Debian GNU/Linux image and its Jigdo
files. This test downloads a Debian daily image for i386 of about 350 MB,
extracts its content and composes a new image. Thus it needs about 1100 MB
of disk space in releng/releng_generated_data when unpacked. Adding the daily
image size itself, the total space used would peak at about 1.5 GB.
This test will only work with GNU xorriso or if libjte was installed already
when libisofs was built. Further it needs the program jigit-mkimage. Both
are part of package jigit, version >= 1.22, available at:
http://www.einval.com/~steve/software/JTE/
Currently jigit builds only in GNU environments.
debian-cd currently uses the --md5 format. In future it will use --sha256.
Any auto_* script can be run on its own. Some of them demand option -x.
All general options are accepted.
./auto_cxx
Not included in GNU xorriso.
Exercises inclusion of xorriso/xorriso.h and libisoburn/libisoburn.h
in C++ programs and linking of the libraries. It is possible to override the
use of g++ as compiler by shell variable CC. It might be necessary to set
compiler options by shell variable CFLAGS before running the test.
It might be necessary to hand over the install directory of libburn and
libisofs in shell variable LD_LIBRARY_PATH.
E.g. if on FreeBSD the include headers libisofs.h , libburn.h are not found:
export CFLAGS="-I/usr/local/include"
E.g. on GNU/Hurd, where libburn and libisofs are not found by the linker:
export LD_LIBRARY_PATH="/usr/local/lib"
./auto_isocontent -x ../xorriso/xorriso
Tests whether xorriso is able to record and restore two families of
hard links.
./auto_printsize -x ../xorriso/xorriso
Tests how long xorriso needs to compose a medium sized directory tree.
If programs mkisofs and/or genisomage are available, then the same test
is done with them.
----------------------------------------------------------------------------
What to do with FAIL results
The text output of the automatic tests is recorded in file
releng_generated_data/log.run_all_auto
Script ./run_all_auto will detect failure of particular tests and report
lines from the log file which contain problem indicating keywords:
NEVER,ABORT,FATAL,FAILURE,MISHAP,SORRY,WARNING,HINT,FAIL,ERROR,WRONG
If the program messages in log.run_all_auto do not explain the failure,
please contact mailing list libburn-hackers@pykix.org .
----------------------------------------------------------------------------
Alternative Shells
If you decided against installing /bin/bash, you may try to use your
current $SHELL by running
./change_shell_to_use
which will modify the test scripts named run_all_auto , auto_* ,manual_*.
Known to be suitable are the following shells
GNU/Linux: /bin/bash
FreeBSD 8: /bin/sh
Solaris: /bin/bash , /bin/i86/ksh93
In general, the shell should have Bourne shell ancestry.
The script does not choose an interpreter explicitly and is safe to be run
inline:
. ./change_shell_to_use
One may set any interpreter path by running a sub shell and changing its
variable SHELL. E.g. by:
( SHELL=/bin/my_shell" ; . ./change_shell_to_use )
----------------------------------------------------------------------------
Creating a new test script
If you want to provide an own test, manual or auto, then first invent a name
for it
test_name="releng/manual_"...some.name...
or
test_name="releng/auto_"...some.name...
Then copy file releng/template_new to $test_name.
Edit $test_name and process any line that begins by "# === TEMPLATE:".
Do what the line prescribes and then remove it from the script. You are
not done as long as such a line remains.
Your test must not start if no file
./inc/releng_getopts.inc
exists, i.e. if the current working directory is not ./releng.
If your test creates own files on disk, then it must do this underneath
directory
./releng_generated_data/$test_name (or $GEN_DATA_DIR, see below).
In case of failure, issue a line to stdout that begins by the word "FAIL",
followed by " : " and the name of the test (e.g. $SELF, see below).
Make sure that the test script finally returns a non-zero exit value.
This value should be between 1 and 28. Each type of failure should have its
own exit value.
Predefined are:
31 = Unknown option or unusable argument with known option
30 = Unexpected state of own directory for self generated files
29 = Not in ./releng directory or missing essential parts of ./releng
When exiting prematurely, make sure to call function cleanup.
Variables, general options, helper functions
The master script run_all_auto sets this variable:
RELENG_SCRIPT_RUN_BY_RUN_ALL_AUTO
1=supervised, the script is run by run_all_auto script
else=standalone, the script is run in standalone mode
The code piece inc/releng_getopts.inc should get executed inline at the
start of a test script. It initializes the following variables and sets
some of them according to the general options of the test suite:
SELF basename $0
GEN_DATA_DIR releng_generated_data/${SELF}
RELENG_XORRISO Path to xorriso binary. "" or "0" means no xorriso.
Default "0". Adjustable by option -x.
SIMULATE_FAILURE 0=normal operation, 1=test script shall simulate a failure.
Default 0. Setable to 1 by option -f.
CLEANUP 0=do not cleanup temporary data, 1=normal operation
Default 1. Setable to 0 by option -k.
SPECIFIC_HELP 0=normal operation, 1=print help text of script and exit 0
Default 0. Setable to 1 by option -h.
The code piece inc/releng_getopts.inc defines the following functions
for use by the single tests:
standalone_or_supervised This is internally called routine to print out
the running mode of the scripts - standalone,
supervised by run_all_auto.
No need to call it from the scripts themselves.
print_help Prints the help text for general options.
check_for_xorriso [-x]
Will exit with value 31 if no path to a xorriso binary
was defined by option -x of ./run_all_auto or a single
test.
Option -x of check_for_xorriso additionally tests whether
the given path leads to an executable program.
cleanup Removes the directory tree GEN_DATA_DIR after making
some safety checks.
boldify Try to set the terminal mode for future output to a more
noticeable style of writing.
unboldify Reset terminal mode to normal style of writing.
Specific options
Options which are specific to the test should begin with a double dash.
They may have further arguments.
Implement them in the prepared interpreter loop which begins after line
next_is=ignore
Specific options shall only be interpreted by tests which get run manually.
If you plan to introduce a specific option, look at the description of
existing tests whether one of them would match your needs. In that case,
please re-use the name of that existing option.

View File

@ -1,42 +0,0 @@
* Manpage examples turned into tests
Convert most examples from xorriso(1) manpage into tests.
* Enhance 'auto_isocontent'
Extend it to use some more demanding directory tree.
MD5s should be checked.
All file types as of stat(2) should be tested.
Test various comparisons:
xorriso provides built-in means for comparison:
xorriso -compare_r disk_path iso_rr_path
xorriso -indev my.iso -find / vs. find input_dir
bsdtar -xf my.iso vs. input_dir
* Test for wrong CD sizes would need a new test and probably an
automatic CD changer.
* Library unit tests - investigate the possibility to write some
cunit-based tests (http://cunit.sourceforge.net) for both
xorriso.h and libisoburn.h API's. The code samples could be put into
codesamples/ directory and run by auto_cxx or a separate auto_ script.
* ??? Still to decide:
Delete debian-testing-i386-businesscard.iso with ./run_all_auto -c
Contra: Currently remaining large files (like downloaded ISO images) are
simply left behind to be re-used and a boldified info message is shown
so the users can decide for themselves what to remove or leave as well.
Pro: Leaving 70 MB of image is quite obtrusive. Option -c is not run
under normal circumstances. So it could well be used for total cleanup.
Alternative: Specific option --remove_image.
* ??? Still to decide:
Have a script ./run_all_manual
Contra argument: if a releng sctipt is suitable to be run under a master
script run_all*, then this releng script should be put into auto_*
namespace , otherwise it is manual_*.
Pro: Tests may be manual because they demand lots of resources, not
because they need manual attention. In general the run_all_manual script
shall spare the user the plight to read the documentation. Instead it
shall present the manual tests, give an opportunity to skip the test,
and ask for parameters,

View File

@ -1,88 +0,0 @@
#!/bin/bash
# Copyright 2011 George Danchev <danchev@spnet.net>
# Licensed under GNU GPL version 2 or later
set -e
not_in_releng_exit() {
printf "\nPlease execute the tests from releng directory.\n\n"
exit 1
}
. inc/releng_getopts.inc || not_in_releng_exit
print_specific_help() {
cat << HLP
Specific options:
none yet.
Overview:
Tests both xorriso/xorriso.h and libisoburn/libisoburn.h
APIs for C++ cleanness.
HLP
}
if test "$SPECIFIC_HELP" = 1; then
print_specific_help
exit 0
fi
# xorriso binary is not needed for that particular test
SAMPLE_CODE_DIR=codesamples
CC=${CC:-g++}
# check compiler
if ! which "${CC}" >/dev/null 2>&1; then
printf "\n${SELF}: Not found: ${CC}. Install ${CC}.\n"
cleanup
exit 5
fi
# check data dir
if [ -d "${GEN_DATA_DIR}" ]; then
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
printf "\n${SELF}: use '${SELF} -c' to remove.\n"
exit 6
else
mkdir "${GEN_DATA_DIR}"
fi
INCLUDE_DIRS="-I../ -I../../libburn -I../../libisofs -I/usr/local/include -I/usr/pkg/include"
# process sample code tests
for SMPL in `ls "${SAMPLE_CODE_DIR}"/*.cpp`; do
# CMD_CPL="${CC} -I../ -L ../libisoburn/.libs/ ${CFLAGS} -lisoburn -o ${SMPL}.obj ${SMPL}"
CMD_CPL="${CC} -c ${INCLUDE_DIRS} ${CFLAGS} -o ${SMPL}.obj ${SMPL}"
printf "${SELF}: ${CMD_CPL}"
set +e
${CMD_CPL}
RET_CPL="$?"
if [ ${RET_CPL} = 0 -a -f ${SMPL}.obj ]; then
mv ${SMPL}.obj ${GEN_DATA_DIR}
printf "...ok\n"
else
printf "\nFAIL : ${SELF}: Compilation of ${SMPL}\n"
cleanup
exit 7
fi
# BASE=$(basename ${SMPL}.obj)
# printf "${SELF}: Running LD_LIBRARY_PATH=../libisoburn/.libs/:${LD_LIBRARY_PATH} ${GEN_DATA_DIR}/${BASE}"
# LD_LIBRARY_PATH=../libisoburn/.libs/:${LD_LIBRARY_PATH} ${GEN_DATA_DIR}/${BASE}
# RET_SMPL="$?"
# case ${RET_SMPL} in
# 0)
# printf "...ok\n"
# ;;
# *)
# printf "exit code: ${RET_SMPL}\n"
# cleanup
# exit 8
# ;;
# esac
set -e
done
# clean
cleanup
exit 0

View File

@ -1,400 +0,0 @@
#!/bin/bash
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
# Copyright 2011 George Danchev <danchev@spnet.net>
# Licensed under GNU GPL version 2 or later
# Test the correct handling of hardlinks by xorriso options
# -update_r , -hardlinks perform_update , and -extract
# If there is support for ACLs or xattr in xorriso and on the local system,
# then test recording and restoring of these features.
not_in_releng_exit() {
printf "\nPlease execute the tests from releng directory.\n\n"
exit 1
}
. inc/releng_getopts.inc || not_in_releng_exit
print_specific_help() {
cat << HLP
Specific options:
none yet.
Overview:
Tests ISO image contents by performing various
image generation, extractions and comparisons.
HLP
}
if test "$SPECIFIC_HELP" = 1; then
print_specific_help
exit 0
fi
if [ ! -x $RELENG_XORRISO ]; then
print_help
printf "\n${SELF}: -x absolute or relative path to binary to be run.\n\n"
exit 31
fi
# check data dir, if any and after checking -x xorriso
if [ -d "${GEN_DATA_DIR}" ]; then
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
printf "\n${SELF}: use '${SELF} -c' to remove.\n"
exit 8
else
mkdir "${GEN_DATA_DIR}"
fi
export xorriso=${RELENG_XORRISO}
export workdir=${GEN_DATA_DIR}
export image_file="$workdir"/xorriso_hardlinks.iso
export on_disk="$workdir"/xorriso_hardlinks_test_dir
export in_iso=""
export copy_on_disk="$workdir"/xorriso_hardlinks_copy_dir
export failure=0
export simulate_failure=${SIMULATE_FAILURE}
export next_is_xorriso=0
export next_is_rc=0
export bad=0
export report_about="-report_about UPDATE"
test -z "$in_iso" && in_iso="$on_disk"
# mkdir "$workdir" || bad=1
mkdir "$on_disk" || bad=1
if test "$bad" = 1
then
echo -e "\nFAIL : ${SELF} : Test environment error : Cannot make directories"
exit 3
fi
# All must be set at this point
printf "\n${SELF}: Setting up $on_disk with several hardlinks\n" >&2
echo test_content >"$on_disk"/file_1 || exit 1
echo test_content >"$on_disk"/file_2 || exit 1
ln "$on_disk"/file_1 "$on_disk"/file_1_link_a || exit 1
ln "$on_disk"/file_1 "$on_disk"/file_1_link_b || exit 1
ln "$on_disk"/file_2 "$on_disk"/file_2_link_a || exit 1
# trivial ISO 9660 image validation routine
is_valid_iso9660() {
ISOfile="$1"
if ! which file >/dev/null 2>&1; then
printf "\nFAIL : ${SELF}: Not found: file. Please install the file(1) utility.\n"
failure=1
return
fi
if [ ! -f ${ISOfile} ]; then
failure=1
printf "\nFAIL : ${SELF} : Not found: ${ISOfile}\n"
return
fi
file ${ISOfile}
if file ${ISOfile} | grep "ISO *9660" >/dev/null 2>&1; then
printf "\n${SELF}: Resulting ${ISOfile} OK. Looks like ISO 9660 filesystem.\n"
else
failure=1
printf "\nFAIL : ${SELF} : ${ISOfile} DOES NOT look like ISO 9660 filesystem data.\n"
fi
}
# Retrieve and evaluate return value of command run under return_wrapper
check_xorriso_return() {
ret=$(cat "$return_value_file")
rm "$return_value_file"
if test "$ret" = 0
then
return 0
fi
failure=1
echo
echo "FAIL : ${SELF} : xorriso run exited with value $ret"
return 1
}
# Create test file and find out whether ACLs and/or xattr are available.
#
# Users known on GNU/Linux and FreeBSD: root games daemon man
# Groups : daemon games bin sshd sys
# On both systems, ACLs are manipulated by setfacl/getfacl
#
acl_xattr_test_file="$on_disk"/acl_xattr_test_file
acl_xattr_copy_file="$copy_on_disk"/acl_xattr_test_file
acl_xattr_test_dir="$on_disk"/acl_xattr_test_dir
acl_xattr_iso_dir="$in_iso"/acl_xattr_test_dir
acl_xattr_copy_dir="$copy_on_disk"/acl_xattr_test_dir
mkdir "$acl_xattr_test_dir"
echo echo hello world >"$acl_xattr_test_file" || exit 1
sys=$(uname -s)
acls=no
default_acls=no
setfacl_opts=""
if ( setfacl -m u::rwx,g::r-x,o::---,u:root:rwx,g:sys:rwx,u:daemon:r--,mask::rwx \
"$acl_xattr_test_file" ) >/dev/null 2>&1
then
if ( getfacl "$acl_xattr_test_file" ) >/dev/null 2>&1
then
if ( setfacl -m u::rwx,g::r-x,o::---,u:root:rwx,g:sys:rwx,u:daemon:r--,mask::rwx \
"$acl_xattr_test_dir" ) >/dev/null 2>&1
then
acls=yes
# Setting of "default" ACLs will fail on FreeBSD. It will nevertheless be
# done in the image by a xorriso command. Restoring is supposed to skip
# "default" ACLs if none could be recorded.
if setfacl -m u::rwx,g::r-x,o::---,u:root:rwx,g:sys:rwx,u:daemon:r--,mask::rwx,d:u::rwx,d:g::r-x,d:o::---,d:u:root:rwx,d:g:sys:rwx,d:u:daemon:r--,d:mask::rwx "$acl_xattr_iso_dir" 2>/dev/null
then
default_acls=yes
fi
setfacl_opts="-setfacl u::rwx,g::r-x,o::---,u:root:rwx,g:sys:rwx,u:daemon:r--,mask::rwx,d:u::rwx,d:g::r-x,d:o::---,d:u:root:rwx,d:g:sys:rwx,d:u:daemon:r--,d:mask::rwx $acl_xattr_iso_dir --"
fi
fi
fi
# GNU/Linux and FreeBSD have different tools for Extended Attributes
xattrs=no
extattrs=no
# Try GNU/Linux style setattr/getattr
if ( setfattr -n user.test_xattr -v test_value "$acl_xattr_test_file" ) \
>/dev/null 2>&1
then
if ( getfattr -d "$acl_xattr_test_file" ) >/dev/null 2>&1
then
xattrs=yes
setfattr -n user.long_data -v 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 "$acl_xattr_test_file"
setfattr -n user.more_data -v 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 "$acl_xattr_test_file"
fi
fi
if test "$xattrs" = no
then
# Try FreeBSD style setextattr
if ( setextattr user test_xattr test_value "$acl_xattr_test_file" ) \
>/dev/null 2>&1
then
if ( getextattr user test_xattr "$acl_xattr_test_file" ) >/dev/null 2>&1
then
setextattr user long_data 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 "$acl_xattr_test_file"
setextattr user more_data 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 "$acl_xattr_test_file"
if ( lsextattr user "$acl_xattr_test_file" ) >/dev/null 2>&1
then
extattrs=yes
fi
fi
fi
fi
echo
echo "${SELF}: Detected sys='$sys' , acls=$acls , d_acls=$default_acls , xattrs=$xattrs , extattrs=$extattrs"
# Examine capabilities of xorriso
xorriso_acls=no
xorriso_xattrs=no
extras=$("$xorriso" -list_extras all 2>/dev/null)
if test "$?" = 0
then
if echo "$extras" | fgrep 'Local ACL : yes' >/dev/null 2>&1
then
xorriso_acls=yes
fi
if echo "$extras" | fgrep 'Local xattr : yes' >/dev/null 2>&1
then
xorriso_xattrs=yes
fi
fi
if test "$xorriso_acls" = no
then
acls=no
setfacl_opts=
fi
if test "$xorriso_xattrs" = no
then
xattrs=no
extattrs=no
fi
echo "${SELF}: Detected xorriso_acls=$xorriso_acls , xorriso_xattrs=$xorriso_xattrs"
echo
ls -l "$on_disk"/*
echo -e "\n${SELF}: Producing simple image via -o" >&2
"$xorriso" -as mkisofs "$on_disk" -o "$workdir"/image_minus_o.iso
is_valid_iso9660 "$workdir"/image_minus_o.iso
echo -e "\n${SELF}: Producing simple image via redirect" >&2
"$xorriso" -as mkisofs "$on_disk" > "$workdir"/image_redirected.iso
is_valid_iso9660 "$workdir"/image_redirected.iso
echo -e "\n${SELF}: Producing simple image via pipe" >&2
return_wrapper "$xorriso" -as mkisofs "$on_disk" | \
cat > "$workdir"/image_piped.iso
check_xorriso_return
is_valid_iso9660 "$workdir"/image_piped.iso
echo -e "\n${SELF}: Producing simple image with for_backup/update_r/hardlinks" >&2
"$xorriso" \
$report_about \
-version \
-for_backup \
-padding 0 \
-outdev "$image_file" \
-volid TEST_AUTO_ISOCONTENT \
-update_r "$on_disk" "$in_iso" \
$setfacl_opts \
-hardlinks perform_update
ret=$?
if test "$ret" -gt 0 -a "$ret" -lt 32
then
printf "\nFAIL : ${SELF} : xorriso write run failed\n\n"
cleanup
exit 1
fi
is_valid_iso9660 "$image_file"
# It must refuse to load and go on with -assert_volid and non-matching pattern.
msg=$(\
"$xorriso" \
-abort_on FATAL \
-return_with FAILURE 32 \
-assert_volid 'NON_MATCHING*' FATAL \
-indev "$image_file" \
2>&1
)
ret=$?
if test "$ret" -gt 0 -a "$ret" -lt 32
then
printf "\n${SELF}: Ok. -assert_volid snapped.\n"
elif test "$ret" -ne 0
then
failure=1
echo >&2
echo "$msg" >&2
printf "\nFAIL : ${SELF} : -assert_volid test not properly performed\n\n"
else
failure=1
printf "\nFAIL : ${SELF} : -assert_volid did not snap\n\n" >&2
fi
echo -e "\n${SELF}: Copying from image to temporary disk tree" >&2
"$xorriso" \
$report_about \
-for_backup \
-assert_volid 'TEST_AUTO_ISOCONT*' FATAL \
-indev "$image_file" \
-osirrox on \
-find "$in_iso" -exec lsdl -- \
-extract "$in_iso" "$copy_on_disk"
ret=$?
if test "$ret" -gt 0 -a "$ret" -lt 32
then
printf "\nFAIL : ${SELF} : xorriso file extraction run failed\n\n"
cleanup
exit 1
fi
if test "$simulate_failure" = 1
then
echo -e "\n${SELF}: SIMULATING FAILURE BY REMOVING AN EXTRACTED FILE" >&2
echo -e "\nFAIL : ${SELF} : Simulated failure caused by option -fail"
rm "$copy_on_disk"/file_1_link_b
fi
printf "\n${SELF}: Comparing original disk tree and temporary one..." >&2
diff -r "$on_disk" "$copy_on_disk"
if test "$?" -ne 0
then
echo -e "\nFAIL : ${SELF} : diff -r $on_disk $copy_on_disk reports differences" >&2
echo -e "\nFAIL : ${SELF} : diff -r reports differences"
failure=1
else
printf "OK" >&2
fi
printf "\n${SELF}: Checking for hardlinks being siblings...\n"
ls -l "$copy_on_disk"/*
x=$(echo $(ls -ld "$copy_on_disk"/*file* | awk '{print $2}'))
expected="1 3 3 3 2 2"
if test x"$x" = x"$expected"
then
printf "${SELF}: Checking for hardlinks being siblings done: ok.\n" >&2
else
printf "\nFAIL : ${SELF} : Link count of extracted files is not as expected." >&2
printf "\n${SELF}: Expected: $expected" >&2
printf "\n${SELF}: Got : $x\n" >&2
failure=1
fi
if test "$acls" = yes
then
printf "\n${SELF}: Checking ACLs ...\n" >&2
acl_on_disk=$(getfacl "$acl_xattr_test_file" | grep -v '^# file:' | sort)
acl_in_copy=$(getfacl "$acl_xattr_copy_file" | grep -v '^# file:' | sort)
if test "$acl_on_disk" = "$acl_in_copy"
then
printf "${SELF}: Checking ACLs done: ok.\n" >&2
else
printf "\nFAIL : ${SELF} : ACL mismatch between original and extracted copy\n"
printf "\nOriginal:\n${acl_on_disk}\n"
printf "\nCopy:\n${acl_in_copy}\n"
failure=1
fi
fi
if test "$xattrs" = yes
then
printf "\n${SELF}: Checking xattr via getfattr ...\n" >&2
xattr_on_disk=$(getfattr "$acl_xattr_test_file" | \
grep -v '^# file:' | grep -v '^$' | \sort)
xattr_in_copy=$(getfattr "$acl_xattr_copy_file" |
grep -v '^# file:' | grep -v '^$' | sort)
if test "$xattr_on_disk" = "$xattr_in_copy"
then
num_xattr=$(echo "$xattr_on_disk" | wc -l)
printf "${SELF}: Checking xattr done: $num_xattr attributes, ok.\n" >&2
else
printf "\nFAIL : ${SELF} : xattr mismatch between original and extracted copy\n"
printf "\nOriginal:\n${xattr_on_disk}\n"
printf "\nCopy:\n${xattr_in_copy}\n"
failure=1
fi
elif test "$extattrs" = yes
then
printf "\n${SELF}: Checking xattr via lsextattr and getextattr ...\n" >&2
lsext_on_disk=$(lsextattr -q user "$acl_xattr_test_file")
xattr_on_disk=$(for i in $lsext_on_disk ; do echo $i $(getextattr -q user $i "$acl_xattr_test_file"); done | sort)
lsext_in_copy=$(lsextattr -q user "$acl_xattr_copy_file")
xattr_in_copy=$(for i in $lsext_in_copy ; do echo $i $(getextattr -q user $i "$acl_xattr_copy_file"); done | sort)
if test "$xattr_on_disk" = "$xattr_in_copy"
then
num_xattr=$(echo "$xattr_on_disk" | wc -l)
printf "${SELF}: Checking xattr done: $num_xattr attributes, ok.\n" >&2
else
printf "\nFAIL : ${SELF} : xattr mismatch between original and extracted copy\n"
printf "\nOriginal:\n${xattr_on_disk}\n"
printf "\nCopy:\n${xattr_in_copy}\n"
failure=1
fi
fi
#
echo
cleanup
# Report result
echo
if test "$failure" = 1
then
printf "${SELF}: FAILED"
echo
exit 1
else
printf "${SELF}: Passed"
echo
fi
exit 0

View File

@ -1,149 +0,0 @@
#!/bin/bash
# Copyright 2011 George Danchev <danchev@spnet.net>
# Licensed under GNU GPL version 2 or later
set -e
not_in_releng_exit() {
printf "\nPlease execute the tests from releng directory.\n\n"
exit 1
}
# Include common bits
. inc/releng_getopts.inc || not_in_releng_exit
print_specific_help() {
cat << HLP
Specific options:
none yet.
Overview:
Test performance of print_size against various input tree.
Optionally compare with genisoimage and mkisofs.
HLP
}
if test "$SPECIFIC_HELP" = 1; then
print_specific_help
exit 0
fi
# Each test should decide whether or not it needs
# a xorriso binary to test, since some do compilations only.
if [ ! -x $RELENG_XORRISO ]; then
print_help
printf "\n${SELF}: -x absolute or relative path to binary to be run.\n\n"
exit 31
fi
# check data dir, if any and after checking -x xorriso
if [ -d "${GEN_DATA_DIR}" ]; then
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
printf "\n${SELF}: use '${SELF} -c' to remove.\n"
exit 8
else
mkdir "${GEN_DATA_DIR}"
fi
#
DIR_UPPER=32
FILE_UPPER=10
# All must be set at this point
# TODO: work out a smarter way to quickly generate different
# types of trees (long, deep, etc)
printf "\n${SELF}: Generating sample tree in ${GEN_DATA_DIR} :\n"
count=0
date
# Hopefully the for-loops are much faster than while-loops with arithmetics
# This needs 7/4*DIR_UPPER+FILE_UPPER (= 66) while-iterations
#
i1_list=
i1=0
o1=$(expr ${DIR_UPPER} / 4)
while test $i1 -lt $o1
do
i1_list="$i1_list $i1"
i1=$(expr $i1 + 1)
done
i2_list=
i2=0
o2=$(expr ${DIR_UPPER} / 2)
while test $i2 -lt $o2
do
i2_list="$i2_list $i2"
i2=$(expr $i2 + 1)
done
i3_list=
i3=0
while test $i3 -lt ${DIR_UPPER}
do
i3_list="$i3_list $i3"
i3=$(expr $i3 + 1)
done
i_file_list=
i_file=0
while test $i_file -lt ${FILE_UPPER}
do
i_file_list="$i_file_list $i_file"
i_file=$(expr $i_file + 1)
done
#
# plus 1/8*DIR_UPPER*DIR_UPPER*DIR_UPPER*FILE_UPPER (= 40960) for-iterations
#
for i1 in $i1_list
do
for i2 in $i2_list
do
for i3 in $i3_list
do
mkdir -p ${GEN_DATA_DIR}/DirOne$i1/DirTwo$i2/DirThree$i3
for i_file in $i_file_list
do
echo -n \
> ${GEN_DATA_DIR}/DirOne$i1/DirTwo$i2/DirThree$i3/File_${i_file}
count=$((count + 1))
done
done
done
echo " ${count} files created ..."
done
printf "done.\n"
date
du -s "${GEN_DATA_DIR}"
printf "\n${SELF}: Performing several print size runs to neutralize possible disk cache impact.\n"
# run xorriso
if [ -x ${RELENG_XORRISO} ]; then
for run in 1 2 3; do
printf "\n${SELF}: Running ${RELENG_XORRISO} -as mkisofs -quiet -print-size ${GEN_DATA_DIR}. Trial: ${run}.\n"
time ${RELENG_XORRISO} -as mkisofs -quiet -print-size ${GEN_DATA_DIR}
done
fi
# try to run genisoimage
if which genisoimage >/dev/null 2>&1; then
RELENG_GENISOIMAGE=`which genisoimage`
for run in 1 2 3; do
printf "\n${SELF}: Running ${RELENG_GENISOIMAGE} -quiet -print-size ${GEN_DATA_DIR}. Trial: ${run}.\n"
time ${RELENG_GENISOIMAGE} -quiet -print-size ${GEN_DATA_DIR}
done
fi
# try to run mkisofs
if which mkisofs >/dev/null 2>&1; then
RELENG_MKISOFS=`which mkisofs`
for run in 1 2 3; do
printf "\n${SELF}: Running ${RELENG_MKISOFS} -quiet -print-size ${GEN_DATA_DIR}. Trial: ${run}.\n"
time ${RELENG_MKISOFS} -quiet -print-size ${GEN_DATA_DIR}
done
fi
#
cleanup
#
exit 0

View File

@ -1,39 +0,0 @@
# check whether we are in releng and create dir
mkdir_ret=29
if test -d releng_generated_data
then
if test -d releng_generated_data/change_shell_to_use
then
mkdir_ret=0
else
mkdir releng_generated_data/change_shell_to_use
mkdir_ret=$?
fi
fi
if test "$mkdir_ret" = 0
then
for i in run_all_auto auto_* manual_*
do
temp=releng_generated_data/change_shell_to_use/temp_file
c=$(wc -l "$i" | awk '{print $1}')
line=$(head -n 1 "$i")
if echo x"$line" | grep '^x#!' >/dev/null 2>&1
then
cp "$i" "$temp"
echo '#!'"$SHELL" > "$temp"
tail -n "$(expr $c - 1)" "$i" >> "$temp"
mv "$temp" "$i"
echo "Changed to #!$SHELL : $i"
fi
done
rmdir releng_generated_data/change_shell_to_use
else
echo "change_shell_to_use: Missing directory ./releng_generated_data" >&2
echo "or cannot create directory ./releng_generated_data/change_shell_to_use" >&2
echo "change_shell_to_use: Run aborted"
test 1 = 0
fi

View File

@ -1,34 +0,0 @@
// Just to ensure we are C++-clean. This should not spit too much noise
/* Copyright 2011 George Danchev <danchev@spnet.net>
* Released into the public domain
*/
#if __WORDSIZE == 32
#define _LARGEFILE_SOURCE 1
#define _FILE_OFFSET_BITS 64
#endif
#include <iostream>
#include <inttypes.h>
//extern "C" {
#include "libburn/libburn.h"
#include "libisofs/libisofs.h"
// using namespace burn;
// (this was needed to before rev.4062 of libisoburn)
#include "libisoburn/libisoburn.h"
//}
int main() {
int major=-1, minor=-1, micro=-1;
isoburn_version(&major, &minor, &micro);
if (major<0 || minor<0 || micro<0)
return -1;
std::cout
<< " major:" << major
<< " minor:" << minor
<< " micro:" << micro
;
return 0;
}

View File

@ -1,30 +0,0 @@
// Just to ensure we are C++-clean. This should not spit too much noise
/* Copyright 2011 George Danchev <danchev@spnet.net>
* Released into the public domain
*/
#if __WORDSIZE == 32
#define _LARGEFILE_SOURCE 1
#define _FILE_OFFSET_BITS 64
#endif
#include <iostream>
#include <inttypes.h>
//extern "C" {
#include "xorriso/xorriso.h"
//}
int main() {
int major=-1, minor=-1, micro=-1;
Xorriso__version(&major, &minor, &micro);
if (major<0 || minor<0 || micro<0)
return -1;
std::cout
<< " major:" << major
<< " minor:" << minor
<< " micro:" << micro
;
return 0;
}

View File

@ -1,204 +0,0 @@
# Copyright 2011 George Danchev <danchev@spnet.net>
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
# Licensed under GNU GPL version 2 or later
SELF=$(basename $0)
RELENG_XORRISO=0
SIMULATE_FAILURE=0
CLEANUP=1
SPECIFIC_HELP=0
START_DIR_DONT_CHANGE=`pwd`
GEN_DATA_DIR=releng_generated_data/${SELF}
#############################################
standalone_or_supervised() {
case "${RELENG_SCRIPT_RUN_BY_RUN_ALL_AUTO}" in
1)
echo "${SELF}: Running in Supervised mode"
;;
*)
echo "${SELF}: Running in Standalone mode"
;;
esac
}
# Unconditionally shout out the invocation mode - standalone or supervised
standalone_or_supervised
#############################################
print_help() {
cat << EOF
Usage: $SELF -x path/to/xorriso [-k] [-f] [-c] [-h]
[-- ...test specific options...]
General options:
-x absolute or relative path to xorriso binary to be run.
-k keep self-generated data.
-c cleanup self-generated data kept from previous run and exit.
-f simulate failure.
-h print this help text
-- end of general options, begin of test specific options.
EOF
}
#############################################
boldify() {
if which tput >/dev/null 2>&1
then
tput smso || dummy_variable=1
fi
}
#############################################
unboldify() {
if which tput >/dev/null 2>&1
then
tput rmso || dummy_variable=1
fi
}
#############################################
cleanup() {
if [ ${CLEANUP} -eq 1 ]; then
# safety net, just in case -> we want to be in the starting
# directory before removing whatever self-generated stuff
if [ -d "${GEN_DATA_DIR}" ]; then
cd "${START_DIR_DONT_CHANGE}" || exit 2
# Verify once again we are in the releng_generated_data directory
# Check for both returned code of grep and returned matching string
# There is no "readlink -e" on FreeBSD
READ_CANON_EXISTS=`cd "${GEN_DATA_DIR}" 2>/dev/null && pwd`
DIR_NAME_GEN_DATA=`dirname "${READ_CANON_EXISTS}"`
set +e
# There is no "grep -P" on FreeBSD
RET_NON_EMPTY_STRING=`echo "${DIR_NAME_GEN_DATA}" | grep "[a-zA-Z0-9_][a-zA-Z0-9_]*/releng_generated_data$"`
GREP_RET_GEN_DATA="$?"
case "${GREP_RET_GEN_DATA}" in
0)
if [ x"${RET_NON_EMPTY_STRING}" != x"" ]; then
# now call the nastiness
chmod -R +w ${GEN_DATA_DIR}
rm -rf ${GEN_DATA_DIR}
# boldify
printf "${SELF}: Removed (self-generated) %s\n" ${GEN_DATA_DIR}
# unboldify
else
printf "FAIL : ${SELF} : Safety check for being in releng_generated_data directory.\n"
printf "FAIL : ${SELF} : GREP returned empty string: ${RET_NON_EMPTY_STRING}.\n"
printf "FAIL : ${SELF} : Skipped trying to remove ${GEN_DATA_DIR} directory. Exiting.\n"
fi
;;
*)
printf "FAIL : ${SELF} : Safety check for being in releng_generated_data directory.\n"
printf "FAIL : ${SELF} : GREP returned code: ${GREP_RET_GEN_DATA}.\n"
printf "FAIL : ${SELF} : Skipped trying to remove ${GEN_DATA_DIR} directory. Exiting.\n"
exit 30
;;
esac
else
printf "${SELF}: ${GEN_DATA_DIR} does not exist. Nothing to clean.\n"
fi
else
# boldify
printf "${SELF}: Leaving (self-generated) %s\n" ${GEN_DATA_DIR}
# unboldify
fi
}
#############################################
check_for_xorriso() {
# $1: if "-x" then check executability
if test -z "$RELENG_XORRISO" -o "$RELENG_XORRISO" = "0"
then
print_help
# print_specific_help
echo
echo "${SELF}: Need -x absolute or relative path to xorriso binary."
echo
exit 31
fi
if [ x"$1" = x"-x" -a ! -x "$RELENG_XORRISO" ]
then
print_help
# print_specific_help
echo
echo "${SELF}: Path given by option -x does not lead to an executable file."
echo "Given is: '$RELENG_XORRISO'"
if test "$RELENG_XORRISO" = "xorriso"
then
xorriso=$(type -p xorriso)
if test -n "xorriso"
then
echo "Hint: Try '$xorriso'"
fi
fi
echo
exit 31
fi
}
#############################################
# To catch the exit value of a command in a pipe
return_value_file="$GEN_DATA_DIR"/wrapper_"$$"_return_value
return_wrapper()
{
cmd="$1"
shift 1
"$cmd" "$@"
RET="$?"
echo "$RET" >"$return_value_file"
return "$RET"
}
#############################################
next_is=
for i in "$@"
do
if test "$next_is" = "ignore"
then :
elif test "$next_is" = "x"
then
RELENG_XORRISO="$i"
next_is=
elif test x"$i" = x"-x"
then
next_is="x"
elif test x"$i" = x"-k"
then
CLEANUP=0
elif test x"$i" = x"-c"
then
CLEANUP=1
cleanup
exit 0
elif test x"$i" = x"-f"
then
SIMULATE_FAILURE=1
elif test x"$i" = x"-h"
then
print_help
SPECIFIC_HELP=1
elif test x"$i" = x"--"
then
# Begin of private arguments for caller
next_is="ignore"
else
echo >&2
echo "Unknown general option: $i" >&2
print_help
exit 31
fi
done
if test "$next_is" = x
then
echo >&2
echo "Option -x expects an argument (the path to the xorriso program)" >&2
print_help
exit 31
fi

View File

@ -1,20 +0,0 @@
#!/bin/bash
set -e
. releng_getopts.inc
boldify
printf "\ntesting boldify and unboldify..."
unboldify
printf "\nSELF =${SELF}"
printf "\nRELENG_XORRISO =${RELENG_XORRISO}"
printf "\nSIMULATE_FAILURE =${SIMULATE_FAILURE}"
printf "\nCLEANUP =${CLEANUP}"
printf "\nSPECIFIC_HELP =${SPECIFIC_HELP}"
printf "\nSTART_DIR_DONT_CHANGE =${START_DIR_DONT_CHANGE}"
printf "\nGEN_DATA_DIR =${GEN_DATA_DIR}"
printf "\n"
exit 0

View File

@ -1,222 +0,0 @@
#!/bin/sh
# Copyright (c) 2010, 2011 George Danchev <danchev@spnet.net>
# Copyright (c) 2010, 2011, 2019 Thomas Schmitt <scdbackup@gmx.net>
# This script is distributed according to the terms of the GNU GPL v2.
# This should be better rewritten in C at some future point. Ref: pwd code.
# Create a list of checksums encoded in hexadecimal format and print to
# standard output. Checksum may be MD5 or SHA256.
# Format Description
# A line in the emerging file is to be composed as follows:
#
# The checksum of the file content must be encoded in the aprropriate number
# of hex digits.
# [0-9afAF]
#
# Next come two blanks.
#
# The byte size of the file content must be encoded in 12 decimal digits
# or blanks.
#
# Next come two blanks.
#
# The rest of the line up to the newline character is a semi-literal file
# address. Its basename has to be the same as the basename of the data file
# when it is used as one of the input files for the jigdo file generator.
# The semi-literal address and the address mapping define what will be
# listed as file address in the jigdo file.
# The address may bear at its start a literal text that shall be recognized by
# the address mapping (e.g. -jigdo-map) of the jigdo file generator.
# The rest of the address must be usable as file address in both situations:
# When the jigdo file gets generated, and when the jigdo file gets read
# to inflate the template file into the original payload image.
# The address mappings at both occasions can be used to adapt to a change
# of the absolute location of the listed files.
# Between both mappings, the parent directory is represented by a symbolic
# text, like "Debian:".
# A simple strategy to cope with this is to write absolute paths into the
# checksum file, and to use matching absolute paths in the -jigdo-map
# directives. Keep in mind that mapping is purely literal. Symbolic links
# are neither resolved nor can they confuse the mapping.
set -e
SELF=jigdo-gen-md5-list
VER=0.3
OPT_ABSOLUTE=1
# The checksum type to produce: md5 , sha256
checksum_type=md5
hex_length=32
md5_cmd=
# On FreeBSD there is "md5" rather than "md5sum".
# Furthermore, the FreeBSD shell reports missing commands to inherited stderr,
# regardless that the attempt itself has redirected stderr. Thus a sub shell
# is needed to hide the protest.
choose_checksum_cmd() {
if test "$checksum_type" = "md5"
then
if ( md5sum --help ) >/dev/null 2>&1
then
md5_cmd=md5sum
elif ( md5 -s test ) >/dev/null 2>&1
then
md5_cmd=md5
else
echo "$0 : Programs md5sum and md5 failed to work" >&2
exit 2
fi
elif test "$checksum_type" = "sha256"
then
if ( sha256sum --help ) >/dev/null 2>&1
then
md5_cmd=sha256sum
elif ( sha256 -s test ) >/dev/null 2>&1
then
md5_cmd=sha256
else
echo "$0 : Programs sha256sum and sha256 failed to work" >&2
exit 2
fi
fi
}
usage() {
cat << USAGE
usage: $SELF [option] DIR FILE ...
Print a Jigdo checksum file to stdout. One line per FILE and per file in DIR.
-m, --md5 produce MD5 checksums (default)
-s, --sha256 produce SHA256 checksums
-a, --make-absolute make absolute paths, avoiding any symlinks (default)
-l, --keep-literal leave paths untouched, literally as supplied
-v, --version print version
-h, --help print help
-e, --examples print examples
USAGE
}
examples() {
cat << EXAMPLES
examples:
$SELF datadir datafile
$SELF --keep-literal datadir datafile
find . -type f | xargs $SELF
find . -exec $SELF '{}' ';'
EXAMPLES
}
md5list() {
item="$1"
if test $OPT_ABSOLUTE -eq 1; then
dn=`dirname "$item"` # dirname
fn=`basename "$item"` # filename
od=`pwd -P` # old dir
cd "$dn" || exit 1
item=`pwd -P`/"$fn" # absolute physical file path, avoiding all symlinks
cd "$od" || exit 1
fi
if test "$md5_cmd" = "md5sum"
then
MD5=`md5sum "$item" | awk '{print $1}'`
elif test "$md5_cmd" = "md5"
then
MD5=`md5 -q "$item"`
elif test "$md5_cmd" = "sha256sum"
then
MD5=`sha256sum "$item" | awk '{print $1}'`
elif test "$md5_cmd" = "sha256"
then
MD5=`sha256 -q "$item"`
else
echo "$0 : Internal error : Checksum mode unknown : $md5_cmd" >&2
exit 2
fi
SIZ=`ls -ld "$item" | awk '{print $5}'`
printf '%'"$hex_length"'s %12s %s\n' "$MD5" "$SIZ" "$item"
}
walkdir() {
DR="$1"
for item in `find "$DR" -type f`
do
md5list "$item"
done
}
# main()
if test "$1" = "" ; then
usage
exit 1
fi
for i in "$@"
do
case "$i" in
--md5|-m)
checksum_type=md5
hex_length=32
;;
--sha256|-s)
checksum_type=sha256
hex_length=64
;;
--make-absolute|-a)
OPT_ABSOLUTE=1;
shift;
;;
--keep-literal|-l)
OPT_ABSOLUTE=0;
shift;
;;
--version|-v)
printf '%s %s\n' "$SELF" "$VER"
exit 0
;;
--help|-h)
usage
exit 0
;;
--examples|-e)
examples
exit 0
# *)
# usage
# exit 1
# ;;
esac
done
choose_checksum_cmd
for i in "$@"
do
if echo "$i" | grep '^-' >/dev/null ; then
dummy=dummy
elif test -d "$i" ; then
DR="$i"
if test $OPT_ABSOLUTE -eq 1; then
od=`pwd -P` # old dir
cd "$DR" || exit 1
DR=`pwd -P` # absolute physical dir path, avoiding all symlinks
cd "$od" || exit 1
fi
walkdir "$DR"
elif test -f "$i" ; then
FL="$i"
md5list "$FL"
else
usage
exit 1
fi;
done
exit 0

View File

@ -1,30 +0,0 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.38.2.
.TH JIGDO-GEN-MD5-LIST "1" "October 2010" "jigdo-gen-md5-list 0.1" "User Commands"
.SH NAME
jigdo-gen-md5-list \- create a list of MD5sums encoded in hexadecimal format and print to standard output
.SH DESCRIPTION
usage: jigdo\-gen\-md5\-list [option] DIR FILE ...
.TP
\fB\-a\fR, \fB\-\-make\-absolute\fR
make absolute paths, avoiding any symlinks (default)
.TP
\fB\-l\fR, \fB\-\-keep\-literal\fR
leave paths untouched, literally as supplied
.TP
\fB\-v\fR, \fB\-\-version\fR
print version
.TP
\fB\-h\fR, \fB\-\-help\fR
print help
.TP
\fB\-e\fR, \fB\-\-examples\fR
print examples
.SH FORMAT
File format is described in the beginning of the script itself.
.SH "SEE ALSO"
xorriso(1), jigdo-lite(1), jigit-mkimage(1)
.SH AUTHOR
Written by George Danchev <danchev@spnet.net> and Thomas Schmitt <scdbackup@gmx.net>

View File

@ -1,256 +0,0 @@
#!/bin/bash
# Copyright 2011 George Danchev <danchev@spnet.net>
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
#
# Licensed under GNU GPL version 2 or later
set -e
# set -x
print_specific_help() {
cat << HLP
Specific options:
--dev path use path as drive address. Default: /dev/cdrw
--what path use path as address of the directory which shall
be copied into an ISO 9660 filesystem on media.
--any_media allow non re-usable MMC media, like CD-R or DVD+R.
Allow paths to non-existing files, but disallow paths
to existing regular files.
--priv_cmd 'command [arg [arg ...]]'
With drive operations execute xorriso as argument
of the given command (e.g. pfexec, sudo) with the
optionally given arguments: command arg arg xorriso ...
Command and arguments must be single words.
Overview:
Test burning to re-usable media CD-RW, DVD-RW, DVD-RAM, DVD+RW, BD-RE.
By default, one-time usable media will be rejected deliberately.
HLP
}
wait_for_dev () {
# $1 = device address
timeout=30
counter=0
while test "$counter" -lt "$timeout"
do
if test -e "$1"
then
echo
return 0
fi
if test "$counter" = 0
then
echo
echo "Not existing: $dev"
echo "Will wait up to $timeout seconds for it to appear."
fi
counter=$(expr $counter + 1)
echo -n "$counter "
sleep 1
done
echo
return 1
}
getopts_inc=inc/releng_getopts.inc
if test -e "$getopts_inc"
then
. "$getopts_inc"
if test "$SPECIFIC_HELP" = 1
then
print_specific_help
exit 0
fi
else
echo >&2
echo "File not found: $getopts_inc" >&2
echo "Are we in the ./releng directory of a libisoburn SVN checkout ?" >&2
echo "(Please execute the tests from that ./releng directory.)" >&2
echo >&2
exit 29
fi
# Set default values for specific option variables.
dev=/dev/cdrw
what=../xorriso
any_media=0
priv_cmd=
# Interpret specific options, they begin after the first --.
next_is=ignore
for i in "$@"
do
if test "$next_is" = "ignore"
then
if test "$i" = "--"
then
next_is=""
fi
elif test "$next_is" = "dev"
then
dev="$i"
next_is=""
elif test "$next_is" = "what"
then
what="$i"
next_is=""
elif test "$next_is" = "priv_cmd"
then
priv_cmd="$i"
next_is=""
elif test "$i" = "--dev"
then
next_is="dev"
elif test "$i" = "--what"
then
next_is="what"
elif test "$i" = "--any_media"
then
any_media=1
elif test "$i" = "--priv_cmd"
then
next_is="priv_cmd"
else
echo >&2
echo "Unknown test specific option: $i" >&2
print_help
print_specific_help
exit 31
fi
done
check_for_xorriso -x
# check data dir, if any and after checking -x xorriso
if [ -d "${GEN_DATA_DIR}" ]; then
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
printf "\n${SELF}: use '${SELF} -c' to remove.\n"
exit 30
else
mkdir "${GEN_DATA_DIR}"
fi
#####################################################################
# Inspect drive address
if test -e "$dev"
then
if test "$any_media" = 1 -a -f "$dev"
then
echo "FAIL : ${SELF} : --dev $dev leads to an existing regular file"
echo
cleanup
exit 31
fi
else
if test "$any_media" = "0"
then
echo "FAIL : ${SELF} : --dev $dev does not lead to an existing file"
echo
cleanup
exit 31
fi
fi
# Inspect media
set +e
wait_for_dev "$dev"
res=$(${priv_cmd} "$RELENG_XORRISO" -outdev "$dev" 2>&1)
ret=$?
set -e
if test "$ret" -ne 0
then
echo "$res" >&2
echo "FAIL : ${SELF} : Non-zero exit value $ret with: ${priv_cmd} $RELENG_XORRISO -outdev $dev"
echo
cleanup
exit 1
elif echo "$res" | grep '^Media current:' >/dev/null 2>&1
then
media=$(echo "$res" | grep '^Media current:' | \
sed -e 's/^Media current: //')
echo "Detected media: '$media'"
if test "$media" = "CD-RW" -o "$media" = "DVD-RW sequential recording" -o \
"$media" = "DVD-RW restricted overwrite" -o "$media" = "DVD-RAM" -o \
"$media" = "DVD+RW" -o "$media" = "BD-RE"
then
echo "Recognized as re-usable."
elif test "$media" = "is not recognizable"
then
echo "FAIL : ${SELF} : No recognizable media detected in: '$dev'"
echo
cleanup
exit 2
elif test "$any_media" = 1
then
echo "Accepted media only because of option --any_media : '$media'"
else
echo "FAIL : ${SELF} : No re-usable media detected, but: '$media'"
echo
cleanup
exit 2
fi
fi
# Perform burn run
echo ${priv_cmd} "$RELENG_XORRISO" -for_backup -outdev "$dev" -blank as_needed -map "$what" /test
set +e
wait_for_dev "$dev"
${priv_cmd} "$RELENG_XORRISO" \
-for_backup \
-outdev "$dev" \
-blank as_needed \
-map "$what" /test
ret=$?
set -e
if test "$ret" -ne 0
then
echo "FAIL : ${SELF} : Non-zero exit value with burn run: $ret"
echo
cleanup
exit 1
fi
if test "$SIMULATE_FAILURE" = 1
then
echo "FAIL : ${SELF} : Simulated failure caused by option -f"
if test -f "$dev"
then
# Alter image
dd if=/dev/urandom bs=2K count=1 \
of="$dev" conv=notrunc seek=400
else
cleanup
exit 1
fi
fi
# Check read
echo ${priv_cmd} "$RELENG_XORRISO" -for_backup -indev "$dev" \
-check_media event=FATAL -- \ -check_md5_r FATAL / --
set +e
wait_for_dev "$dev"
${priv_cmd} "$RELENG_XORRISO" \
-for_backup \
-indev "$dev" \
-print '---check_media:' -check_media event=FATAL -- \
-print '---check_md5_r:' -check_md5_r FATAL / -- \
-print '---compare_r:' -md5 off -compare_r "$what" /test
ret=$?
set -e
if test "$ret" -ne 0
then
echo "FAIL : ${SELF} : Non-zero exit value with checkread run: $ret"
echo
cleanup
exit 1
fi
echo "Ok. Burn test passed."
echo
cleanup
exit 0

View File

@ -1,188 +0,0 @@
#!/bin/bash
# Copyright 2011 George Danchev <danchev@spnet.net>
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
# Licensed under GNU GPL version 2 or later
# set -e
print_specific_help() {
cat << HLP
Specific options:
--dev path Suppress dialog and use path as drive address.
--priv_cmd 'command [arg [arg ...]]'
With drive operations execute xorriso as argument
of the given command (e.g. pfexec, sudo) with the
optionally given arguments: command arg arg xorriso ...
Command and arguments must be single words.
Overview:
Test device scanning and list of speeds.
HLP
}
# Include common bits and interpret general options
getopts_inc=inc/releng_getopts.inc
if test -e "$getopts_inc"
then
. "$getopts_inc"
if test "$SPECIFIC_HELP" = 1
then
print_specific_help
exit 0
fi
else
echo >&2
echo "File not found: $getopts_inc" >&2
echo "Are we in the ./releng directory of a libisoburn SVN checkout ?" >&2
echo "(Please execute the tests from that ./releng directory.)" >&2
echo >&2
exit 2
fi
# Interpret private options, they begin after the first --.
dev=
priv_cmd=
next_is=ignore
for i in "$@"
do
if test "$next_is" = "ignore"
then
if test "$i" = "--"
then
next_is=""
fi
elif test "$next_is" = "dev"
then
dev="$i"
next_is=""
elif test "$next_is" = "priv_cmd"
then
priv_cmd="$i"
next_is=""
elif test "$i" = "--dev"
then
next_is="dev"
elif test "$i" = "--priv_cmd"
then
next_is="priv_cmd"
else
echo >&2
echo "Unknown test specific option: $i" >&2
print_help
print_specific_help
exit 31
fi
done
# Insist in having a xorriso
check_for_xorriso -x
has_device_links=$("$RELENG_XORRISO" -help 2>/dev/null | fgrep ' -device_links')
if test -n "$has_device_links"
then
devices_opt="-device_links"
else
devices_opt="-devices"
fi
#
get_speeds() {
echo -e "\n${SELF}: Running: ${priv_cmd} ${RELENG_XORRISO} -report_about WARNING -outdev ${1} -toc -list_formats -list_profiles out -list_speeds"
${priv_cmd} "$RELENG_XORRISO" -report_about WARNING -outdev "$1" \
-print '---toc :' -toc \
-print '---list_formats :' -list_formats \
-print '---list_profiles :' -list_profiles out \
-print '---list_speeds :' -list_speeds
}
cat_var() {
# $1 = variable to put out with line feeds
cat <<+
$1
+
}
get_devices() {
# $1 = if not empty: device lines from xorriso -devices or -device_links
# $2 = if not empty: suppress dialog and use $2 as input
if test -n "$1"
then
DEVICES="$1"
else
DEVICES=$( ${priv_cmd} "$RELENG_XORRISO" $devices_opt 2>/dev/null | grep "\-dev")
fi
NUM_DEV=$(cat_var "$DEVICES" | wc -l)
case "${NUM_DEV}" in
0)
echo -e "\n${SELF}: No drives found."
exit 1
;;
1)
echo -e "\n${SELF}: 1 drive found:\n"
;;
*)
echo -e "\n${SELF}: ${NUM_DEV} drives found:\n"
;;
esac
echo =================================================================
echo "$DEVICES"
echo =================================================================
OUTDEV=$( cat_var "$DEVICES" | head -1 | \
sed -e "s/[0-9] *-dev '\//\//" -e "s/'.*$//" )
if test -n "$2"
then
x="$2"
else
echo >&2
echo "WARNING: The following tests might pull in the drive tray." >&2
echo " Best is if you now put in a suitable media and" >&2
echo " load it manually, so nobody gets surprised. :))" >&2
echo >&2
echo "Which drive to examine ? (Empty input = ${OUTDEV})" >&2
read x
fi
if test -n "$x"
then
OUTDEV="$x"
fi
get_speeds "$OUTDEV"
}
# main
"$RELENG_XORRISO" -version
echo -e "\n${SELF}: Running: $RELENG_XORRISO $devices_opt ..."
devices=$( ${priv_cmd} "$RELENG_XORRISO" -report_about WARNING $devices_opt | grep "\-dev")
RET="$?"
if test "$SIMULATE_FAILURE" = 1
then
echo "===" >&2
echo "=== SIMULATING FAILURE BY OVERRIDING EXIT VALUE OF XORRISO" >&2
echo "===" >&2
echo "FAIL : ${SELF} : Simulated failure caused by option -f"
RET=1
fi
case ${RET} in
0)
get_devices "$devices" "$dev"
RET="$?"
if test "$RET" = 0
then :
else
echo "FAIL : ${SELF} : Device scan or single drive listing failed"
exit "$RET"
fi
;;
*)
boldify
echo -ne "\n${SELF}: ${priv_cmd} ${RELENG_XORRISO} $devices_opt returned ${RET}."
unboldify
echo -e "\n${SELF}: Already mounted?"
df -kh
exit 1
esac
exit 0

View File

@ -1,320 +0,0 @@
#!/bin/bash
# Copyright 2011, 2019 Thomas Schmitt <scdbackup@gmx.net>
# Copyright 2011 George Danchev <danchev@spnet.net>
# Licensed under GNU GPL version 2 or later
set -e
not_in_releng_exit() {
printf "\nPlease execute the tests from releng directory.\n\n"
exit 1
}
. inc/releng_getopts.inc || not_in_releng_exit
print_specific_help() {
cat << HLP
Specific options:
--md5 use MD5 checksums (default)
--sha256 use SHA256 checksums
Overview:
Match the resulting ISO image representation
against the jigdo representation.
HLP
}
if test "$SPECIFIC_HELP" = 1; then
print_specific_help
exit 0
fi
# Set default values for specific option variables.
checksum_type=md5
# Interpret specific options, they begin after the first --.
next_is=ignore
for i in "$@"
do
if test "$next_is" = "ignore"
then
if test "$i" = "--"
then
next_is=""
fi
elif test "$i" = "--md5"
then
checksum_type=md5
elif test "$i" = "--sha256"
then
checksum_type=sha256
else
echo >&2
echo "Unknown test specific option: $i" >&2
print_help
print_specific_help
exit 31
fi
done
if [ ! -x $RELENG_XORRISO ]; then
print_help
printf "\n${SELF}: -x absolute or relative path to binary to be run.\n\n"
exit 30
fi
# check data dir, if any and after checking -x xorriso
if [ -d "${GEN_DATA_DIR}" ]; then
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
printf "\n${SELF}: use './${SELF} -c' to remove.\n"
exit 1
else
mkdir "${GEN_DATA_DIR}"
fi
TMP_DATA_DIR=releng_generated_data
IMG_EXTRACT_DIR=${GEN_DATA_DIR}/${SELF}_extracted_tree
RELENG_DIR="${IMG_EXTRACT_DIR}"
RELENG_ISOLINUX_BIN="isolinux/isolinux.bin"
RELENG_BOOT_CAT="isolinux/boot.cat"
RELENG_IMG=t1
RES=""
REMOTE_URL="http://cdimage.debian.org/cdimage/daily-builds/daily/arch-latest/i386/iso-cd"
REMOTE_IMG="debian-testing-i386-netinst.iso"
# check for required items
if [ "${RELENG_XORRISO}" = "" -o "${RELENG_DIR}" = "" -o "${RELENG_IMG}" = "" ]; then
echo -e "\n${SELF}: xorriso_cmd IN_dir and OUT_image are required\n"
exit 2
fi
# All must be set at this point
printf "${SELF}: Config items:"
printf "\n\txorriso_cmd=${RELENG_XORRISO}\n\tIN_dir=${RELENG_DIR}\n\tOUT_image=${RELENG_IMG}.iso"
printf "\n\tIN_isolinux=${RELENG_ISOLINUX_BIN}\n\tOUT_bootcat=${RELENG_BOOT_CAT}\n"
RES="${RELENG_IMG}.iso ${RELENG_IMG}.new ${RELENG_IMG}.md5 ${RELENG_IMG}.jigdo ${RELENG_IMG}.template"
# xorriso version details, incl. underlying libraries
# "${RELENG_XORRISO}" -version
# check whether the binary support JTE
set +e
RETSTR_VER_JTE=`"${RELENG_XORRISO}" --version 2>/dev/null | grep "libjte * in use"`
RETCODE_VER_JTE="$?"
set -e
case ${RETCODE_VER_JTE} in
0)
printf "\n${SELF}: Found JTE support with ${RELENG_XORRISO} : ${RETSTR_VER_JTE}"
;;
*)
printf "\nFAIL : ${SELF} : Not found JTE support in ${RELENG_XORRISO}. Quit."
printf "\n${SELF}: JTE not supported with this xorriso build. Install jigit >=1.18 and rebuild."
printf "\n${SELF}: http://www.einval.com/~steve/software/JTE/\n"
cleanup
exit 4
;;
esac
# grab remote ISO image, to decompose
if [ -L "${TMP_DATA_DIR}"/"${REMOTE_IMG}" ]; then
printf "\n${SELF}: Found symbolic link ${TMP_DATA_DIR}"/"${REMOTE_IMG}\n"
ls -ld ${TMP_DATA_DIR}"/"${REMOTE_IMG}
elif [ ! -f "${TMP_DATA_DIR}"/"${REMOTE_IMG}" ]; then
printf "\n${SELF}: Downloading ${REMOTE_URL}/${REMOTE_IMG}\n"
if wget -V >/dev/null 2>&1
then
set +e
wget --no-check-certificate -T20 -t3 \
-O "${TMP_DATA_DIR}"/"${REMOTE_IMG}" "${REMOTE_URL}"/"${REMOTE_IMG}"
WGET_RET="$?"
set -e
elif fetch -T 20 -o "${TMP_DATA_DIR}"/"${REMOTE_IMG}" \
"${REMOTE_URL}"/"${REMOTE_IMG}"
then
WGET_RET=0
else
echo
echo "FAIL: ${SELF} : Neither wget nor fetch are present and willing to work"
cleanup
exit 10
fi
case ${WGET_RET} in
0)
echo -e "\n${SELF}: Downloading successfully completed.\n"
;;
*)
echo -e "\nFAIL : ${SELF} : wget returned code: $WGET_RET\n"
rm "${TMP_DATA_DIR}"/"${REMOTE_IMG}"
cleanup
exit 5
;;
esac
else
printf "\n${SELF}: Found ISO image: ${TMP_DATA_DIR}/${REMOTE_IMG}\n"
fi
# check for extraction directory existence
if [ -d "${IMG_EXTRACT_DIR}" ]; then
printf "\n${SELF}: Found ${IMG_EXTRACT_DIR}. Please cleanup.\n"
cleanup
exit 6
else
mkdir "${IMG_EXTRACT_DIR}"
fi
# extract image content
CMD_EXTRACT="${RELENG_XORRISO} -indev ${TMP_DATA_DIR}/${REMOTE_IMG} \
-osirrox on:auto_chmod_on \
-extract / ${IMG_EXTRACT_DIR} \
"
# TODO: drop set +e|-e block, catch exit code instead when
# the boot catalog warnings get completely resolved.
echo -e "${SELF}: Extracting ISO image:\n${CMD_EXTRACT}\n"
set +e
${CMD_EXTRACT}
set -e
# grab an MBR
ISOHYBRID_MBR="${GEN_DATA_DIR}/isohybrid.mbr"
dd if="${TMP_DATA_DIR}/${REMOTE_IMG}" bs=1K count=32 of="${ISOHYBRID_MBR}"
# create FAT partition
APPEND_PART="${GEN_DATA_DIR}/fatpart.fat"
MKFS_MSDOS="/sbin/mkfs.msdos"
if [ -x "${MKFS_MSDOS}" ]; then
"${MKFS_MSDOS}" -n Bla -C "${APPEND_PART}" 8192
APPEND_PART_CMD="-append_partition 2 0x01 ${APPEND_PART}"
else
APPEND_PART_CMD=
# printf "\nFAIL : ${SELF} : Not found: ${MKFS_MSDOS}"
# printf "\n${SELF}: Not found: "${MKFS_MSDOS}". Install dosfstools."
# printf "\n${SELF}: http://www.daniel-baumann.ch/software/dosfstools/\n"
# cleanup
# exit 7
fi
# GENERAL section
CMD="${RELENG_XORRISO} \
-as mkisofs \
-quiet \
-o ${GEN_DATA_DIR}/${RELENG_IMG}.iso \
-R \
-V ISOJIGDO \
-partition_offset 16 \
-J -joliet-long \
"
# BOOT section
if [ -f "${IMG_EXTRACT_DIR}"/"${RELENG_ISOLINUX_BIN}" -a -f "${ISOHYBRID_MBR}" ]
then
CMD="$CMD \
-b ${RELENG_ISOLINUX_BIN} \
-c ${RELENG_BOOT_CAT} \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-isohybrid-mbr ${ISOHYBRID_MBR} \
-partition_offset 16 \
"
else
printf "\n${SELF}: FAIL to compose the boot section.\n"
cleanup
exit 8
fi
if [ -n "${APPEND_PART_CMD}" -a -f "${APPEND_PART}" ]; then
CMD="$CMD \
${APPEND_PART_CMD}
"
fi
# JIGDO section
JIGDO_JIGDO=${GEN_DATA_DIR}/${RELENG_IMG}.jigdo
JIGDO_TEMPLATE=${GEN_DATA_DIR}/${RELENG_IMG}.template
JIGDO_MAP_RHV=$(cd ${RELENG_DIR} 2>/dev/null && pwd)
JIGDO_MAP="Debian=${JIGDO_MAP_RHV}/"
# create jigdo MD5 list in base64 format
JIGDO_GEN_MD5=${GEN_DATA_DIR}/${RELENG_IMG}.md5
printf "${SELF}: Creating $checksum_type list in hex format in ${JIGDO_GEN_MD5}..."
set +e
./jigdo-gen-md5-list "--""$checksum_type" ${RELENG_DIR} > ${JIGDO_GEN_MD5}
ret=$?
set -e
if test "$ret" = 0
then
printf "Done.\n"
else
printf "\nFAIL : ${SELF}: ./jigdo-gen-md5-list returns $ret"
cleanup
exit 9
fi
CMD="$CMD \
-jigdo-template-compress gzip \
-jigdo-checksum-algorithm "$checksum_type" \
-checksum_algorithm_iso md5,sha1,sha256,sha512 \
-checksum_algorithm_template md5,sha1,sha256,sha512 \
-jigdo-jigdo ${JIGDO_JIGDO} \
-jigdo-template ${JIGDO_TEMPLATE} \
-jigdo-map ${JIGDO_MAP} \
-checksum-list ${JIGDO_GEN_MD5} \
-jigdo-min-file-size 1024 \
"
CMD="$CMD ${RELENG_DIR}"
# Run the whole compound command
echo -e "${SELF}: Creating ISO and jigdo representations:\n$CMD\n"
${CMD}
# Create another imange this time from jigdo files
if which jigit-mkimage >/dev/null 2>&1; then
printf "${SELF}: Creating new ISO from jigdo files..."
jigit-mkimage \
-t ${JIGDO_TEMPLATE} \
-j ${JIGDO_JIGDO} \
-m ${JIGDO_MAP} \
-o ${GEN_DATA_DIR}/${RELENG_IMG}.new
printf "Done.\n"
else
printf "\n${SELF}: Not found: jigit-mkimage. Install jigit."
printf "\n${SELF}: http://www.einval.com/~steve/software/JTE/\n"
cleanup
exit 10
fi
# trap the exit code of diff and let the Universe explode
diff ${GEN_DATA_DIR}/${RELENG_IMG}.iso ${GEN_DATA_DIR}/${RELENG_IMG}.new
DIFF_RET="$?"
case ${DIFF_RET} in
0)
echo -e "${SELF}: Match: diff ${GEN_DATA_DIR}/${RELENG_IMG}.iso ${GEN_DATA_DIR}/${RELENG_IMG}.new"
;;
*)
echo -e "FAIL : ${SELF} : diff returned code: $DIFF_RET\n"
;;
esac
# sort out the cruft
cleanup
# warn about downloaded image left behind
if [ -f "${TMP_DATA_DIR}"/"${REMOTE_IMG}" ]; then
printf "${SELF}: Leaving "
ls -sh "${TMP_DATA_DIR}"/"${REMOTE_IMG}"
fi
# last hints
if [ -d ${GEN_DATA_DIR} ]; then
printf "\n${SELF}: HINT: manual checks remained to be done:\n"
printf " * ${GEN_DATA_DIR}/${RELENG_IMG}.iso boots from USB stick and/or optical media.\n"
printf " * appended FAT partition is mountable.\n"
printf " * xorriso -indev ${GEN_DATA_DIR}/${RELENG_IMG}.iso -pvd_info\n"
printf " * fdisk -lu ${GEN_DATA_DIR}/${RELENG_IMG}.iso\n"
fi
exit 0

View File

@ -1,277 +0,0 @@
#!/bin/bash
# Copyright 2011 George Danchev <danchev@spnet.net>
# Copyright 2011 - 2014 Thomas Schmitt <scdbackup@gmx.net>
# Licensed under GNU GPL version 2 or later
set -e
export RELENG_SCRIPT_RUN_BY_RUN_ALL_AUTO=1
SELF=$(basename "$0")
GEN_DATA_DIR=releng_generated_data
CLOG=${GEN_DATA_DIR}/log.${SELF}
CLOG_PREV=${CLOG}.prev
PASSED_OPTIONS="$@"
RELENG_XORRISO=
CLEANUP_LOG=0
# It is not a good idea to include inc/releng_getopts.inc with the
# master script as it calls the subordinate scripts and they include
# this file too, and we want to avoid sharing variable with subshells
if [ ! -f inc/releng_getopts.inc ]; then
printf "\nPlease execute the tests from releng directory.\n\n"
exit 1
fi
# To catch the exit value of a command in a pipe
return_value_file="$GEN_DATA_DIR"/run_all_"$$"_return_value
return_wrapper()
{
cmd="$1"
shift 1
"$cmd" "$@"
RET="$?"
echo "$RET" >"$return_value_file"
return "$RET"
}
# Using only bash builtin commands.
# On 4 year old amd64 x2 3000 MHz, xterm local,it counts 22471 lines per second
# On 2 year old amd64 x4 2600 MHz, ssh remote, it counts 35348 lines per second
count_lines()
{
# $1 if not empty: start count
line=
if test -n "$1"
then
count="$1"
else
count=0
fi
while read line
do
count=$(($count + 1))
printf "\r %4d lines logged ... " "$count" >&2
printf "%s\n" "$line"
done
return 0
}
#############################################
# copied from releng/inc/releng_getopts.inc which is not included here.
boldify() {
if which tput >/dev/null 2>&1
then
tput smso || dummy_variable=1
fi
}
unboldify() {
if which tput >/dev/null 2>&1
then
tput rmso || dummy_variable=1
fi
}
#############################################
print_usage()
{
cat << HLP
${SELF} runs executables from releng directory starting with auto_*,
and passing them its own options. stdout/stderr output is stored in:
./${CLOG} (last run) and
./${CLOG_PREV} (previous run)
Usage: ${SELF} -x path/to/xorriso [-k] [-c] [-h]
-x absolute or relative path to xorriso binary to be run.
-k keep self-generated data in ./${GEN_DATA_DIR}.
-c cleanup self-generated data kept from previous run and exit.
-h print this help text
Examples:
# run xorriso and keep the self-generated data
$ ./${SELF} -x path/to/xorriso -k
# clean up self-generated data from previous run
$ ./${SELF} -c
HLP
}
#############################################
if [ ! "${1}" ]; then
print_usage
exit 0
fi
next_is=
for i in "$@"
do
if test x"$i" = x"-h" -o x"$i" = x"--h" -o x"$i" = x"-help" -o x"$i" = x"--help"
then :
print_usage
exit 0
fi
if test "$next_is" = "ignore"
then :
elif test "$next_is" = "x"
then
RELENG_XORRISO="$i"
next_is=
elif test x"$i" = x"-x"
then
next_is="x"
elif test x"$i" = x"-c"
then
CLEANUP_LOG=1
fi
done
#############################################
if test "$next_is" = x
then
echo
echo "Option -x expects an argument (the path to the xorriso program)"
exit 31
fi
########################################################
if [ -f "${CLOG}" ]; then
mv "${CLOG}" "${CLOG_PREV}"
fi
> ${CLOG}
if [ -x "${RELENG_XORRISO}" ]; then
echo "_OVERVIEW_______________________________________________________________" >> ${CLOG}
date -u >> ${CLOG}
${RELENG_XORRISO} --version >> ${CLOG}
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" >> ${CLOG}
fi
DSTART=`date -u`
echo "${SELF}: Started at ${DSTART}" | tee -a ${CLOG}
E1=`date '+%s'`
exit_value=0
# require ^auto_, avoid running (your)self explicitly
for s in `ls | grep ^auto_ | grep -v ${SELF} | sort -n`; do
if [ -x ${s} -a ! -d ${s} ]; then
echo >> ${CLOG}
echo >> ${CLOG}
echo "_STARTING_TEST_________________________________________________________" >> ${CLOG}
echo "${SELF}: Running ./${s} ${PASSED_OPTIONS} :" \
| tee -a ${CLOG}
T1=`date '+%s'`
set +e
return_wrapper ./${s} ${PASSED_OPTIONS} 2>&1 | count_lines >> ${CLOG}
RET=$(cat "$return_value_file")
rm "$return_value_file"
# echo "RET='$RET'" >/dev/tty
T2=`date '+%s'`
TS=`expr ${T2} - ${T1}`
case ${RET} in
0)
echo "done in ${TS} sec. ok."
;;
*)
exit_value=2
printf "done in ${TS} sec. "
boldify
printf "FAIL -> EXIT CODE $RET"
unboldify
echo
;;
esac
set -e
fi
done
DEND=`date -u`
echo | tee -a ${CLOG}
echo -n "${SELF}: Stopped at ${DEND}." | tee -a ${CLOG}
if [ "${CLEANUP_LOG}" -eq 1 ]; then
if [ -f "${CLOG}" ]; then
rm -f "${CLOG}"
echo # | tee -a ${CLOG}
echo -n "${SELF}: Removed my own log ${CLOG}." # | tee -a ${CLOG}
fi
if [ -f "${CLOG_PREV}" ]; then
rm -f "${CLOG_PREV}"
echo # | tee -a ${CLOG}
echo "${SELF}: Removed my own log ${CLOG_PREV}." # | tee -a ${CLOG}
fi
else
E2=`date '+%s'`
if [ ${E2} -eq ${E1} ]; then
echo " Total elapsed 0 sec." | tee -a ${CLOG}
else
ES=`expr ${E2} - ${E1}`
echo " Total elapsed ${ES} sec." | tee -a ${CLOG}
fi
#####
echo >> ${CLOG}
echo "_SUMMARY________________________________________________________________" >> ${CLOG}
echo "${SELF}: Trivial log examination: ${CLOG}" | tee -a ${CLOG}
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" | tee -a ${CLOG}
# severity classes of libdax_msgs.h in libburn and libisofs
# List of boring keywords:
# 'UPDATE|NOTE|DEBUG|ALL' - not considered interesting for lazy log inspection.
# List of interesting keywords:
# thrown by xorriso and underlying libraries
LIST_KWD="NEVER|ABORT|FATAL|FAILURE|MISHAP|SORRY|WARNING|HINT"
# thrown by others
LIST_KWD="${LIST_KWD}|FAIL|ERROR|WRONG"
if [ -f "${CLOG}" ]; then
set +e
# lines, perl regex, leading tabs
grep -n -E "${LIST_KWD}" "${CLOG}"
RET_GREP="$?"
ok=0
case ${RET_GREP} in
0) # found
;;
1) # not found
echo "${SELF}: Log file looks clear." # | tee -a ${CLOG}
ok=1
;;
*) #
echo "${SELF}: grep returned EXIT CODE: ${RET_GREP}." # | tee -a ${CLOG}
;;
esac
if test "$ok" = 0 && test "$exit_value" = 0
then
exit_value=1
fi
set -e
fi
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" | tee -a ${CLOG}
##### TODO: work out a less noisy diff'ing technique!
if [ -f "${CLOG_PREV}" -a -f "${CLOG}" ]; then
echo "${SELF}: See diff against previous log file (might be long):" | tee -a ${CLOG}
echo "diff -Naur ${CLOG_PREV} ${CLOG} | less" | tee -a ${CLOG}
fi
fi
#
boldify
echo # | tee -a ${CLOG}
echo "${SELF}: Leaving the following cruft in ${GEN_DATA_DIR}:" # | tee -a ${CLOG}
unboldify
ls -lth "${GEN_DATA_DIR}" # | tee -a ${CLOG}
# Fin
if test "$exit_value" = 0
then
echo "${SELF}: +++ Test run and its log look like success."
else
echo
echo "${SELF}: --- Test run detected some failures."
echo
fi
exit $exit_value

View File

@ -1,135 +0,0 @@
#!/bin/bash
# Copyright 2011 George Danchev <danchev@spnet.net>
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
# === TEMPLATE: Add your own copyright here
#
# Licensed under GNU GPL version 2 or later
# === TEMPLATE: Remove this remark before releasing this script.
#
# This is a template for creating a new libisoburn/releng test.
# It is supposed that you have read releng/README before you begin to work
# here.
#
# Step 1: Invent a name for your test
# test_name="manual_"...some.name...
# or
# test_name="auto_"...some.name...
#
# Step 2: Copy releng/template_new to $test_name
#
# Step 3: Edit $test_name and process any line that begins by
# "# === TEMPLATE:". Do what the line prescribes and then remove it
# from the script. You are not done as long as such a line remains.
#
# === TEMPLATE: End of remark to remove
set -e
# === TEMPLATE: Describe your own specific options (if any) and the test
print_specific_help() {
cat << HLP
Specific options:
--option Explanation of specific option
Overview:
Short explanation of test purpose and activities.
HLP
}
getopts_inc=inc/releng_getopts.inc
if test -e "$getopts_inc"
then
. "$getopts_inc"
if test "$SPECIFIC_HELP" = 1
then
print_specific_help
exit 0
fi
else
echo >&2
echo "File not found: $getopts_inc" >&2
echo "Are we in the ./releng directory of a libisoburn SVN checkout ?" >&2
echo "(Please execute the tests from that ./releng directory.)" >&2
echo >&2
exit 29
fi
# === TEMPLATE: Decide whether the test will have own options,
# === TEMPLATE: apart from those interpreted by inc/releng_getopts.inc
# === TEMPLATE: If not, then remove this interpreter code.
# Set default values for specific option variables. E.g.:
# dev=
# Interpret specific options, they begin after the first --.
next_is=ignore
for i in "$@"
do
if test "$next_is" = "ignore"
then
if test "$i" = "--"
then
next_is=""
fi
# === TEMPLATE: Implement interpretation of specific options. Like:
# elif test "$next_is" = "dev"
# then
# dev="$i"
# next_is=""
# elif test "$i" = "--dev"
# then
# next_is="dev"
else
echo >&2
echo "Unknown test specific option: $i" >&2
print_help
print_specific_help
exit 31
fi
done
# === TEMPLATE: End of own option interpreter code.
# Each test should decide whether or not it needs
# a xorriso binary to test, since some do compilations only.
# === TEMPLATE: Decide whether you need a xorriso program.
# === TEMPLATE: If not, then remove this function call
check_for_xorriso -x
# check data dir, if any and after checking -x xorriso
# === TEMPLATE: Decide whether your test will possibly create own files.
# === TEMPLATE: If yes, then create your files underneath ${GEN_DATA_DIR}.
# === TEMPLATE: The name in this variable is set by inc/releng_getopts.inc .
# === TEMPLATE: If not, then remove this if ... fi statement.
if [ -d "${GEN_DATA_DIR}" ]; then
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
printf "\n${SELF}: use '${SELF} -c' to remove.\n"
exit 30
else
mkdir "${GEN_DATA_DIR}"
fi
#####################################################################
# === TEMPLATE: Perform your test activities here.
# === TEMPLATE: In case of failure, issue a line to stdout that begins by
# === TEMPLATE: the word "FAIL", and make sure that the test script finally
# === TEMPLATE: returns a non-zero exit value.
# === TEMPLATE: 31 = Unknown option or unusable argument with known option
# === TEMPLATE: 30 = Unexpected state of own directory for self generated files
# === TEMPLATE: 29 = Not in ./releng directory or missing essential parts
# === TEMPLATE: 1 to 28 = test specific exit values
# === TEMPLATE: When exiting prematurely, make sure to call cleanup.
cleanup
exit 0

View File

@ -5,7 +5,7 @@
To compare tree /media/dvd and /original/dir :
find /media/dvd -exec compare_file '{}' /media/dvd /original/dir ';'
Copyright 2008 - 2024 Thomas Schmitt, <scdbackup@gmx.net>
Copyright 2008 - 2010 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
@ -13,10 +13,6 @@
cc -g -o compare_file compare_file.c
*/
#ifdef HAVE_CONFIG_H
#include "../config.h"
#endif
#include <ctype.h>
#include <sys/types.h>
#include <unistd.h>
@ -28,10 +24,6 @@
#include <string.h>
#include <time.h>
/* O_BINARY is needed for Cygwin but undefined elsewhere */
#ifndef O_BINARY
#define O_BINARY 0
#endif
/* @param flag bit0= single letters */
char *Ftypetxt(mode_t st_mode, int flag)
@ -103,7 +95,6 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag)
int ret, differs= 0, r1, r2, fd1= -1, fd2= -1, i, done;
char buf1[4096], buf2[4096], a[4096], ttx1[40], ttx2[40];
off_t r1count= 0, r2count= 0, diffcount= 0, first_diff= -1;
double dcount;
ret= lstat(adr1, &s1);
if(ret==-1) {
@ -112,12 +103,10 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag)
}
strcpy(a, Ftypetxt(s1.st_mode, 1));
strcat(a, " ");
if(adrc[0]) {
if(strlen(a) + strlen(adrc) < 4096)
strcat(a, adrc);
} else {
if(adrc[0])
strcat(a, adrc);
else
strcat(a, ".");
}
ret= lstat(adr2, &s2);
if(ret==-1) {
@ -137,13 +126,11 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag)
differs= 1;
}
if(s1.st_uid != s2.st_uid) {
printf("%s : st_uid : %lu <> %lu\n",
a, (unsigned long) s1.st_uid, (unsigned long) s2.st_uid);
printf("%s : st_uid : %d <> %d\n", a, s1.st_uid, s2.st_uid);
differs= 1;
}
if(s1.st_gid != s2.st_gid) {
printf("%s : st_gid : %lu <> %lu\n",
a, (unsigned long) s1.st_gid, (unsigned long) s2.st_gid);
printf("%s : st_gid : %d <> %d\n", a, s1.st_gid, s2.st_gid);
differs= 1;
}
if((S_ISCHR(s1.st_mode) && S_ISCHR(s2.st_mode)) ||
@ -187,12 +174,12 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag)
}
}
if(S_ISREG(s1.st_mode) && S_ISREG(s2.st_mode)) {
fd1= open(adr1, O_RDONLY | O_BINARY);
fd1= open(adr1, O_RDONLY);
if(fd1==-1) {
printf("- %s : cannot open() : %s\n", adr1, strerror(errno));
return(0);
}
fd2= open(adr2, O_RDONLY | O_BINARY);
fd2= open(adr2, O_RDONLY);
if(fd2==-1) {
printf("- %s : cannot open() : %s\n", adr2, strerror(errno));
close(fd1);
@ -242,13 +229,9 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag)
if(diffcount>0 || r1count!=r2count) {
if(first_diff<0)
first_diff= (r1count>r2count ? r2count : r1count);
if(r1count > r2count)
dcount= diffcount + (r1count - r2count);
else
dcount= diffcount + (r2count - r1count);
printf("%s : %s : differs by at least %.f bytes. First at %.f\n", a,
(s1.st_mtime==s2.st_mtime ? "CONTENT":"content"),
dcount, (double) first_diff);
(double) (diffcount + abs(r1count-r2count)), (double) first_diff);
differs= 1;
}
}
@ -265,12 +248,6 @@ int main(int argc, char **argv)
int ret, i, with_ctime= 1;
char adr1[4096], adr2[4096], adrc[4096];
if(sizeof(off_t) < 8) {
fprintf(stderr,
"%s : FATAL : Compile time misconfiguration. sizeof(off_t) too small.\n\n",
argv[0]);
exit(4);
}
if(argc<4) {
fprintf(stderr, "usage: %s path prefix1 prefix2\n", argv[0]);
exit(2);
@ -280,7 +257,7 @@ int main(int argc, char **argv)
with_ctime= 0;
else {
fprintf(stderr, "%s : Option not recognized: '%s'\n", argv[0], argv[i]);
exit(2);
exit(1);
}
}
@ -289,25 +266,10 @@ int main(int argc, char **argv)
argv[0], argv[1], argv[2]);
exit(2);
}
if(strlen(argv[1]) >= 4096) {
fprintf(stderr, "path exceeds size limit of 4095\n");
exit(3);
}
if(strlen(argv[1]) - strlen(argv[2]) > 4000) {
fprintf(stderr, "common address part exceeds size limit of 4000\n");
exit(3);
}
if(strlen(argv[3]) + 1 + strlen(argv[1]) - strlen(argv[2]) >= 4096) {
fprintf(stderr, "prefix2 exceeds size limit of 4095\n");
exit(3);
}
strcpy(adr1, argv[1]);
strcpy(adrc, argv[1]+strlen(argv[2]));
strcpy(adr2, argv[3]);
if(!(adrc[0] == '/' || adrc[0] == 0 ||
(strlen(adr2) > 0 && adr2[strlen(adr2) - 1] == '/')))
strcat(adr2, "/");
strcat(adr2, adrc);
sprintf(adr2, "%s%s%s",
argv[3], (adrc[0]=='/' || adrc[0]==0 ? "" : "/"), adrc);
ret= Compare_2_files(adr1, adr2, adrc, (with_ctime<<1));
exit(ret<=0);

View File

@ -1,370 +0,0 @@
#!/bin/bash
echo >&2
echo "THIS SCRIPT IS DEPRECATED ! USE ITS SUCCESSOR: merge_debian_isos" >&2
echo >&2
echo "The script merge_2_debian_isos still exists only because it was mentioned">&2
echo "in Debian bug 1011343. The successor can merge more than two ISOs.">&2
echo "So do not edit this script to remove this warning and the 'exit 7' line.">&2
echo >&2
exit 7
usage() {
echo "usage: $(basename "$0") "'\' >&2
echo " boot_iso boot_mount add_iso add_mount result_iso [for_dist]" >&2
echo >&2
echo "Mounts by sudo the boot_iso at directory boot_mount and add_iso at" >&2
echo "add_mount, if not already mounted that way. Then both Debian pools" >&2
echo "and package lists get merged and a new ISO 9660 image result_iso" >&2
echo "is produced, which must not yet exist." >&2
echo "If boot_iso is bootable then the new image will be bootable by the" >&2
echo "same means." >&2
echo "This script creates the following temporary tree and files which" >&2
echo "must not yet exist in the current working directory:" >&2
echo " ./merged_dists , ./merged_md5sum.txt , ./merged_REAMDE.txt" >&2
echo " ./temp_file" >&2
echo "The optional sixth argument for_dist should only be given if" >&2
echo "this script refuses to work and proposes to give this argument." >&2
echo "Exported non-empty variable MERGE_DATE enforces a particular" >&2
echo "date string in the text which gets prepended to /README.txt ." >&2
echo "Exported non-empty variable XORRISO overrides command xorriso," >&2
echo "which may be needed if installed xorriso is older than 1.4.2." >&2
echo "Example using GNU xorriso-1.5.4 instead of /usr/bin/xorriso:" >&2
echo " export XORRISO="'$HOME'"/xorriso-1.5.4/xorriso/xorriso" >&2
echo " $(basename "$0") debian-11.2.0-amd64-DVD-1.iso /mnt/iso1 "'\' >&2
echo " debian-11.2.0-amd64-DVD-2.iso /mnt/iso2 merged.iso" >&2
}
if test "$#" -lt 5
then
usage
exit 1
fi
BOOT_ISO="$1"
BOOT_ISO_MOUNT="$2"
ADD_ISO="$3"
ADD_ISO_MOUNT="$4"
RESULT_ISO="$5"
# The sixth argument is optional
FOR_DIST="$6"
## Check arguments
if test -e "$RESULT_ISO"
then
echo "--- A file '""$RESULT_ISO""' is already existing." >&2
echo "--- Will not overwrite it by the resulting ISO image." >&2
exit 1
fi
if test -e merged_dists || test -e merged_md5sum.txt || test -e temp_file \
|| test -e merged_README.txt
then
echo "--- At least one of ./merged_dists, ./merged_md5sum.txt, ./temp_file," >&2
echo "--- or merged_README.txt is already existing. Will not overwrite them." >&2
exit 1
fi
if test "$BOOT_ISO" = "$RESULT_ISO" || test "$BOOT_ISO" = "$ADD_ISO" || \
test "$ADD_ISO" = "$RESULT_ISO"
then
echo "--- At least two of the three given ISO image paths are equal." >&2
echo "--- boot_iso and add_iso must exist and differ, result_iso must not exist." >&2
usage
exit 1
fi
## Mount and copy out the files which need to be changed
do_mount_1=1
x=$(mount | grep " $BOOT_ISO_MOUNT " | awk '{print $1}')
if test -n "$x"
then
i1=$(ls -i "$x" | awk '{print $1}')
i2=$(ls -i "$BOOT_ISO" | awk '{print $1}')
if test "$i1" = "$i2"
then
do_mount_1=0
echo "Note: Found $BOOT_ISO already mounted at $BOOT_ISO_MOUNT"
fi
fi
if test "$do_mount_1" = 1
then
echo "Note: sudo mount $BOOT_ISO $BOOT_ISO_MOUNT"
sudo mount "$BOOT_ISO" "$BOOT_ISO_MOUNT" || exit 3
fi
cp -a "$BOOT_ISO_MOUNT/dists" merged_dists
cp -a "$BOOT_ISO_MOUNT/md5sum.txt" merged_md5sum.txt
chmod -R u+w merged_dists
chmod u+w merged_md5sum.txt
do_mount_2=1
x=$(mount | grep " $ADD_ISO_MOUNT " | awk '{print $1}')
if test -n "$x"
then
i1=$(ls -i "$x" | awk '{print $1}')
i2=$(ls -i "$ADD_ISO" | awk '{print $1}')
if test "$i1" = "$i2"
then
do_mount_2=0
echo "Note: Found $ADD_ISO already mounted at $ADD_ISO_MOUNT"
fi
fi
if test "$do_mount_2" = 1
then
echo "Note: sudo mount $ADD_ISO $ADD_ISO_MOUNT"
if sudo mount "$ADD_ISO" "$ADD_ISO_MOUNT"
then
dummy=dummy
else
if test "$do_mount_1"
then
sudo umount "$BOOT_ISO_MOUNT"
fi
exit 3
fi
fi
## Helper functions
# Put out the list of checksummed paths as listed in /dists/$dist/Release
extract_checksum_paths() {
mode=0
cat "$1" | \
while true
do
read x || break
if test "$x" = "MD5Sum:" || test "$x" = "SHA1:" \
|| test "$x" = "SHA256:" || test "$x" = "SHA512:"
then
if test "$mode" = 0
then
mode=1
elif test "$mode" = 1
then
break
fi
elif test "$mode" = 1
then
echo "$x"
fi
done
}
# Put out the part before the first checksum field
extract_release_head() {
cat "$1" | \
while true
do
read x || break
if test "$x" = "MD5Sum:" || test "$x" = "SHA1:" \
|| test "$x" = "SHA256:" || test "$x" = "SHA512:"
then
break
fi
echo "$x"
done
}
## Determine which Debian release is on BOOT_ISO
dist=
for i in $(ls -1d "$BOOT_ISO_MOUNT"/dists/*)
do
if test -d "$i"
then
if test -L "$i"
then
continue
fi
test -n "$dist" && dist="$dist "
dist="$dist""$(basename $i)"
fi
done
if test -z "$dist"
then
if test -z "$FOR_DIST"
then
echo "--- Cannot determine Debian release from directories in /dists" >&2
echo "--- (You may provide the release name as sixth argument)" >&2
echo >&2
usage
exit 2
fi
elif test "$(echo "$dist" | wc -w)" -gt 1
then
if test -z "$FOR_DIST"
then
echo "--- More than one Debian release found in /dists: $dist" >&2
echo "--- (You may provide the release name as sixth argument)" >&2
echo >&2
usage
exit 2
fi
fi
if test -n "$FOR_DIST"
then
echo "Note: Overriding release name '$dist' by '""$FOR_DIST""'" >&2
dist="$FOR_DIST"
fi
if test -d "$BOOT_ISO_MOUNT"/dists/"$dist"
then
echo "Note: Will work along $BOOT_ISO_MOUNT"/dists/"$dist"/Release >&2
else
echo "--- Cannot find directory $BOOT_ISO_MOUNT"/dists/"$dist" >&2
exit 2
fi
## Prepend info to /README.txt
if test -z "$MERGE_DATE"
then
MERGE_DATE=$(date +'%Y%m%d-%H:%M')
fi
printf 'Result of a run of %s at %s\r\n' \
"$(basename $0)" "$MERGE_DATE" >temp_file
printf 'Package pools and Packages lists were merged.\r\n' >>temp_file
printf 'The other files stem from the first input ISO.\r\n' >>temp_file
printf '\r\n' >>temp_file
printf 'Input ISO: %s\r\n' "$BOOT_ISO" >>temp_file
head -2 "$BOOT_ISO_MOUNT"/README.txt >>temp_file
printf '\r\n' >>temp_file
printf 'Input ISO: %s\r\n' "$ADD_ISO" >>temp_file
head -2 "$ADD_ISO_MOUNT"/README.txt >>temp_file
printf '\r\n' >>temp_file
printf '%s%s\r\n' " --------------------------------------" \
"----------------------------------------" >>temp_file
printf '\r\n' >>temp_file
cat "$BOOT_ISO_MOUNT"/README.txt >>temp_file
mv temp_file merged_README.txt
## Merge package description files with those from "$ADD_ISO"
# /md5sum.txt seems to be the only overall package list
cat merged_md5sum.txt "$ADD_ISO_MOUNT"/md5sum.txt | sort >temp_file
mv temp_file merged_md5sum.txt
# Determine the files which are mentioned with checksum in main Release files
path_list=$( (extract_checksum_paths merged_dists/"$dist"/Release
extract_checksum_paths "$ADD_ISO_MOUNT"/dists/"$dist"/Release ) \
| awk '{print $3}' | sort | uniq )
# Merge .gz files (Release should not be merged. Unclear what others need.)
for i in $path_list
do
if echo "$i" | grep -v '.gz$' >/dev/null
then
continue
fi
if test -e merged_dists/"$dist"/"$i"
then
if test -e "$ADD_ISO_MOUNT"/dists/"$dist"/"$i"
then
if test "$(gunzip <merged_dists/"$dist"/"$i" | tail -1)" = ""
then
empty_line=
else
empty_line=echo
fi
( gunzip <merged_dists/"$dist"/"$i"
$empty_line
gunzip <"$ADD_ISO_MOUNT"/dists/"$dist"/"$i" ) | gzip >temp_file
mv temp_file merged_dists/"$dist"/"$i"
fi
elif test -e "$ADD_ISO_MOUNT"/dists/"$dist"/"$i"
then
if test -e $(dirname merged_dists/"$dist"/"$i")
then
dummy=dummy
else
mkdir -p $(dirname merged_dists/"$dist"/"$i")
fi
cp "$ADD_ISO_MOUNT"/dists/"$dist"/"$i" merged_dists/"$dist"/"$i"
fi
test -e temp_file && rm temp_file
done
## Update dists/"$dist"/Release
extract_release_head merged_dists/"$dist"/Release >temp_file
# Re-create "MD5Sum:", "SHA256:", "SHA512:" sections
for cmd in md5sum sha1sum sha256sum sha512sum
do
if type "$cmd" >/dev/null
then
case "$cmd" in
md5sum) echo "MD5Sum:" ;;
sha1sum) echo "SHA1:" ;;
sha256sum) echo "SHA256:" ;;
sha512sum) echo "SHA512:" ;;
esac
for i in $path_list
do
file=merged_dists/"$dist"/"$i"
if test -e "$file"
then
sum=$("$cmd" "$file" | awk '{print $1}')
size=$(stat -c '%s' "$file")
elif test -e "$file".gz
then
sum=$(gunzip <"$file".gz | "$cmd" | awk '{print $1}')
size=$(gunzip <"$file".gz | wc -c)
else
continue
fi
list_path=$(echo "$file" | sed -e 's/^merged_dists\/'"$dist"'\///')
printf ' %s %8ld %s\n' "$sum" "$size" "$list_path"
done
fi
done >>temp_file
mv temp_file merged_dists/"$dist"/Release
## Produce the new ISO image
if test -z "$XORRISO"
then
XORRISO=xorriso
fi
"$XORRISO" \
-indev "$BOOT_ISO" \
-outdev "$RESULT_ISO" \
-map "$ADD_ISO_MOUNT"/pool /pool \
-map merged_dists /dists \
-map merged_md5sum.txt /md5sum.txt \
-map merged_README.txt /README.txt \
-chown_r 0 /dists /md5sum.txt /README.txt -- \
-chgrp_r 0 /dists /md5sum.txt /README.txt -- \
-chmod_r a-w /dists /md5sum.txt -- \
-chmod_r a=r /README.txt -- \
-boot_image any replay \
-stdio_sync off \
-padding included \
-compliance no_emul_toc
## Clean up
if test "$do_mount_1" = 1
then
sudo umount "$BOOT_ISO_MOUNT"
fi
if test "$do_mount_2" = 1
then
sudo umount "$ADD_ISO_MOUNT"
fi
rm -r merged_dists merged_md5sum.txt merged_README.txt

File diff suppressed because it is too large Load Diff

View File

@ -1,293 +0,0 @@
.\" Hey, EMACS: -*- nroff -*-
.\"
.\" IMPORTANT NOTE:
.\"
.\" The original of this file is kept in test/merge_debian_isos.texi
.\" This here was generated by program xorriso/make_xorriso_1
.\"
.\"
.\" 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 MERGE_DEBIAN_ISOS 1 "Version 1.5.7, Jun 07, 2023"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
.\" .nh disable hyphenation
.\" .hy enable hyphenation
.\" .ad l left justify
.\" .ad b justify to both left and right margins
.\" .nf disable filling
.\" .fi enable filling
.\" .br insert line break
.\" .sp <n> insert n+1 empty lines
.\" for manpage-specific macros, see man(7)
.nh
.SH NAME
merge_debian_isos \- Program to merge multiple debian\-cd ISO images
.SH SYNOPSIS
.B merge_debian_isos
result_iso mount_template iso1 iso2 [... isoN]
.br
.SH DESCRIPTION
.PP
\fBmerge_debian_isos\fR
mounts by \fBsudo\fR the ISO 9660 images iso1 to isoN at directories
mount_template1 to mount_templateN, if not already mounted that way.
Then the Debian pools and package lists get merged and a new
ISO 9660 image result_iso is produced by a run of \fBxorriso\fR.
If iso1 is bootable then
the new image will be bootable by the same means.
.br
.PP
The file depicted by result_iso must not yet exist or has to be a
device which is acceptable for Linux\-specific helper script
\fBxorriso\-dd\-target\fR. If xorriso\-dd\-target agrees and the user
confirms by input "yes" then xorriso will be run under sudo.
.br
Exempted from this evaluation are addresses which begin by "mmc:"
for an optical drive on Linux, BSDs, Solaris, or by "stdio:/dev/"
for which the user takes full and dangerous responsibility.
.br
Special result_iso path \fBxorriso\-dd\-target\-plug\-test\fR determines
on systems with Linux kernel the target USB stick by a dialog around plugging
it in.
xorriso will be run under sudo, if xorriso\-dd\-target agrees and
the user confirms by input "yes".
.br
.PP
At least the parent directory of argument \fBmount_template\fR must already
exist or has to be given by a plain name without "/" so that it can be
created in the current directory. (I.e. without even "./".)
.br
All arguments must be single words without using quotation marks.
None of the isoN must be equal to another isoM.
.br
.PP
This script creates and finally removes the following temporary tree
and files which must not yet exist in the current working directory:
./merged_dists , ./merged_md5sum.txt , ./merged_REAMDE.txt
./temp_file
.br
Further it creates and finally removes directories mount_template*
if they are needed and do not exist when the script starts. If the
parent directory in the mount_template path does not exist and
its path contains no "/" then it gets created and finally removed.
The script depends on the following programs:
.br
awk, basename, cat, chmod, cp, date, dirname, expr, fgrep, grep,
gunzip, gzip, head, ls, md5sum, mkdir, mount, mv, rm, rmdir,
sed, sh, sha256sum, sort, stat, sudo, umount, uniq, xorriso
.br
With device writing involving helper script xorriso\-dd\-target:
.br
dd, Linux kernel, lsblk, sleep, tr, uname, wc, whoami,
xorriso\-dd\-target
.br
Recommended are: sha1sum, sha512sum
.SS
.br
.SH OPTIONS
.br
.PP
merge_debian_isos has no command line options besides the input words described
above, but it reacts on some environment variables.
.br
See section ENVIRONMENT.
.br
.PP
If less than 4 arguments are given, the script will print its help text to
standard error and exit with non\-zero value, indicating failure.
.SS
.SH EXAMPLES
.SS
.B Overview of examples:
Merge DVD images 1 to 5
.br
Use GNU xorriso instead of installed xorriso
.br
Write result directly to an optical drive
.br
Write result directly and safely to USB stick (Linux only)
.br
Write result directly and unsafely to USB stick
.SS
.B Merge DVD images 1 to 5
The resulting image will be named "merged.iso".
.br
Directory ./merge_mount/ will be created if not yet existing.
.br
merge_debian_isos merged.iso merge_mount/iso \\
debian\-11.2.0\-amd64\-DVD\-[12345].iso
.br
Expect to see some harmless warnings like
.br
xorriso : WARNING : \-volid text does not comply to ISO 9660 / ECMA 119 rules
libisofs: WARNING : Cannot add /debian to Joliet tree. Symlinks can only be added to a Rock Ridge tree.
libisofs: WARNING : Image size exceeds 1024 cylinders. Cannot align partition.
.SS
.B Use GNU xorriso instead of installed xorriso
merge_debian_isos will refuse to work if the installed version of xorriso
is older than 1.4.2. In this case consider to download and compile the
GNU xorriso tarball from
.br
https://www.gnu.org/software/xorriso/#download
.br
You may use it without installing it after compilation and thus without
disturbing your system's package management. Assumed that you unpacked the
xorriso\-1.5.6 tarball in your $HOME directory and have successfully compiled
it, do:
.br
export XORRISO="$HOME"/xorriso\-1.5.6/xorriso/xorriso
.br
merge_debian_isos merged.iso merge_mount/iso \\
debian\-11.2.0\-amd64\-DVD\-[12345].iso
.SS
.B Write result directly to an optical drive
xorriso is able to burn optical media on GNU/Linux (/dev/sr*),
Solaris (/dev/rdsk/*) , FreeBSD (/dev/cd*) , NetBSD (/dev/rcd*),
and OpenBSD (/dev/rcd*). Get a list of available optical drive devices by:
.br
xorriso \-devices
.br
It might be that you need superuser powers for this and then have to enable
access to the device file for the user who runs merge_debian_isos.
.br
In order to directly write the merged ISO image to an optical medium,
use the desired device file path with prefix "mmc:":
.br
merge_debian_isos mmc:/dev/sr0 merge_mount/iso \\
debian\-11.2.0\-amd64\-DVD\-[12345].iso
.SS
.B Write result directly and safely to USB stick (Linux only)
The Linux\-specific script \fBxorriso\-dd\-target\fR evaluates device files
whether they and their content look unimportant enough for being overwritten
by an image file.
.br
This mainly means that the storage device is attached to USB and contains
no filesystems which are not of type FAT or ISO 9660.
.br
You may get xorriso\-dd\-target by:
.br
wget \\
https://dev.lovelyhq.com/libburnia/libisoburn/raw/master/xorriso\-dd\-target/xorriso\-dd\-target
chmod u+x xorriso\-dd\-target
.br
Consider to also download xorriso\-dd\-target.sig and to verify the script by
.br
gpg \-\-verify xorriso\-dd\-target.sig xorriso\-dd\-target
.br
Announce the storage location of the downloaded xorriso\-dd\-target:
.br
export XORRISO_DD_TARGET_PATH="$(pwd)"
.br
The prepared use case in merge_debian_isos uses the xorriso\-dd\-target
option \-plug_test under \fBsudo\fR, which asks the user for first having
the desired USB stick unplugged so that the unwanted devices can get
registered. Then it asks the user to plug in the USB stick, so that it gets
recognized as desired target.
.br
xorriso\-dd\-target evaluates the content and decides whether it looks
disposable enough. If so, then it allows merge_debian_isos to write its
result to the device.
.br
merge_debian_isos xorriso\-dd\-target\-plug\-test merge_mount/iso \\
debian\-11.2.0\-amd64\-DVD\-[12345].iso
.SS
.B Write result directly and unsafely to USB stick
On operating systems other than GNU/Linux or with storage devices not
acceptable to xorriso\-dd\-target it is possible to remove all safety
precautions beyond those of xorriso, which can be overcome by "blanking"
the device.
.br
So after due evaluation of the device situation and on your very own risk
you may use the device path prefix "stdio:", possibly with superuser powers:
.br
xorriso \-outdev stdio:/dev/sdd \-blank as_needed
merge_debian_isos stdio:/dev/sdd merge_mount/iso \\
debian\-11.2.0\-amd64\-DVD\-[12345].iso
For details about "stdio:" and pseudo\-blanking non\-optical devices read
man xorriso.
.br
The xorriso run in merge_debian_isos ignores locally defined xorriso startup
files (by command \-no_rc).
.SH FILES
For now, no files are defined for configuration.
.SH ENVIRONMENT
The following environment variables influence the program behavior:
.br
Exported non\-empty variable MERGE_DATE enforces a particular
date string in the text which gets prepended to /README.txt .
.br
Exported non\-empty variable MERGE_FOR_DIST enforces the use of a
particular directory in /dists of iso1. Normally only one
such directory is found and thus no need to set MERGE_FOR_DIST.
.br
Exported non\-empty variable MERGE_KEEP_ISO prevents the removal
of result_iso after xorriso indicated failure of production.
.br
Exported non\-empty variable XORRISO gives the path to a xorriso binary,
which will be used instead of the system\-wide installed xorriso binary.
This may be needed if installed xorriso is older than 1.4.2.
.br
If XORRISO is set to "dummy" then no new ISO will emerge.
.br
Exported non\-empty variable XORRISO_DD_TARGET_PATH names the
directory where to find xorriso\-dd\-target, which evaluates the
suitability of result_iso devices or does the plug\-test dialog.
.br
.SH SEE ALSO
.BR xorriso(1),
.BR xorriso-dd-target(1),
.SH BUGS
To report bugs, request help, or suggest enhancements for
\fBmerge_debian_isos\fR,
please send electronic mail to the public list <bug\-xorriso@gnu.org>.
If more privacy is desired, mail to <scdbackup@gmx.net>.
.br
Please describe what you expect the program to do, the program arguments
which you used, the messages of \fBmerge_debian_isos\fR, and the
undesirable outcome of your program run.
.br
Expect to get asked more questions before solutions can be proposed.
.SH AUTHOR
Thomas Schmitt <scdbackup@gmx.net>
.br
for libburnia\-project.org
.SH COPYRIGHT
Copyright (c) 2023 Thomas Schmitt
.br
Permission is granted to distribute this text freely. It shall only be
modified in sync with the technical properties of merge_debian_isos.
If you make use of the license to derive modified versions of merge_debian_isos
then you are entitled to modify this text under that same license.
.SH CREDITS
\fBmerge_debian_isos\fR was originally developed with advise and testing
by Zhang Boyang in the course of Debian bug #1011343. Steve McIntyre provided
information about various file aspects of debian\-cd ISO images.

View File

@ -1,359 +0,0 @@
This is merge_debian_isos.info, produced by makeinfo version 5.2 from
merge_debian_isos.texi.
merge_debian_isos - sh script to merge multiple debian-cd ISO images
Copyright (C) 2023 Thomas Schmitt
Permission is granted to distribute this text freely.
INFO-DIR-SECTION Archiving
START-INFO-DIR-ENTRY
* Merge_debian_isos: (merge_debian_isos). Merge debian-cd ISO images to a single image
END-INFO-DIR-ENTRY

File: merge_debian_isos.info, Node: Top, Next: Overview, Up: (dir)
merge_debian_isos 1.5.7
***********************
merge_debian_isos - Program to merge multiple debian-cd ISO images
* Menu:
* Overview:: Overview
* Options:: Options
* Examples:: Examples
* Files:: Files
* Environ:: Environment
* Seealso:: See also
* Bugreport:: Reporting bugs
* Legal:: Author, Copyright, Credits
* CommandIdx:: Alphabetic Option List
* ConceptIdx:: Alphabetic List of Concepts and Objects

File: merge_debian_isos.info, Node: Overview, Next: Options, Prev: Top, Up: Top
1 Overview
**********
'merge_debian_isos' mounts by *sudo* the ISO 9660 images iso1 to isoN at
directories mount_template1 to mount_templateN, if not already mounted
that way. Then the Debian pools and package lists get merged and a new
ISO 9660 image result_iso is produced by a run of *xorriso*. If iso1 is
bootable then the new image will be bootable by the same means.
The file depicted by result_iso must not yet exist or has to be a
device which is acceptable for Linux-specific helper script
*xorriso-dd-target*. If xorriso-dd-target agrees and the user confirms
by input "yes" then xorriso will be run under sudo.
Exempted from this evaluation are addresses which begin by "mmc:" for an
optical drive on Linux, BSDs, Solaris, or by "stdio:/dev/" for which the
user takes full and dangerous responsibility.
Special result_iso path *xorriso-dd-target-plug-test* determines on
systems with Linux kernel the target USB stick by a dialog around
plugging it in. xorriso will be run under sudo, if xorriso-dd-target
agrees and the user confirms by input "yes".
At least the parent directory of argument *mount_template* must
already exist or has to be given by a plain name without "/" so that it
can be created in the current directory. (I.e. without even "./".)
All arguments must be single words without using quotation marks. None
of the isoN must be equal to another isoM.
This script creates and finally removes the following temporary tree
and files which must not yet exist in the current working directory:
./merged_dists , ./merged_md5sum.txt , ./merged_REAMDE.txt ./temp_file
Further it creates and finally removes directories mount_template* if
they are needed and do not exist when the script starts. If the parent
directory in the mount_template path does not exist and its path
contains no "/" then it gets created and finally removed. The script
depends on the following programs:
awk, basename, cat, chmod, cp, date, dirname, expr, fgrep, grep, gunzip,
gzip, head, ls, md5sum, mkdir, mount, mv, rm, rmdir, sed, sh, sha256sum,
sort, stat, sudo, umount, uniq, xorriso
With device writing involving helper script xorriso-dd-target:
dd, Linux kernel, lsblk, sleep, tr, uname, wc, whoami, xorriso-dd-target
Recommended are: sha1sum, sha512sum

File: merge_debian_isos.info, Node: Options, Next: Examples, Prev: Overview, Up: Top
2 Options
*********
merge_debian_isos has no command line options besides the input words
described above, but it reacts on some environment variables.
If less than 4 arguments are given, the script will print its help
text to standard error and exit with non-zero value, indicating failure.

File: merge_debian_isos.info, Node: Examples, Next: Files, Prev: Options, Up: Top
3 Examples
**********
* Menu:
* ExPlain:: Merge DVD images 1 to 5
* ExXorriso:: Use GNU xorriso instead of installed xorriso
* ExOptical:: Write result directly to an optical drive
* ExDdTarget:: Write result directly and safely to USB stick (Linux only)
* ExStdio:: Write result directly and unsafely to USB stick

File: merge_debian_isos.info, Node: ExPlain, Next: ExXorriso, Prev: Options, Up: Examples
3.1 Merge DVD images 1 to 5
===========================
The resulting image will be named "merged.iso".
Directory ./merge_mount/ will be created if not yet existing.
merge_debian_isos merged.iso merge_mount/iso \
debian-11.2.0-amd64-DVD-[12345].iso
Expect to see some harmless warnings like
xorriso : WARNING : -volid text does not comply to ISO 9660 / ECMA
119 rules
libisofs: WARNING : Cannot add /debian to Joliet tree. Symlinks can
only be added to a Rock Ridge tree.
libisofs: WARNING : Image size exceeds 1024 cylinders. Cannot align
partition.

File: merge_debian_isos.info, Node: ExXorriso, Next: ExOptical, Prev: ExPlain, Up: Examples
3.2 Use GNU xorriso instead of installed xorriso
================================================
merge_debian_isos will refuse to work if the installed version of
xorriso is older than 1.4.2. In this case consider to download and
compile the GNU xorriso tarball from
https://www.gnu.org/software/xorriso/#download
You may use it without installing it after compilation and thus without
disturbing your system's package management. Assumed that you unpacked
the xorriso-1.5.6 tarball in your $HOME directory and have successfully
compiled it, do:
export XORRISO="$HOME"/xorriso-1.5.6/xorriso/xorriso
merge_debian_isos merged.iso merge_mount/iso \
debian-11.2.0-amd64-DVD-[12345].iso

File: merge_debian_isos.info, Node: ExOptical, Next: ExDdTarget, Prev: ExXorriso, Up: Examples
3.3 Write result directly to an optical drive
=============================================
xorriso is able to burn optical media on GNU/Linux (/dev/sr*), Solaris
(/dev/rdsk/*) , FreeBSD (/dev/cd*) , NetBSD (/dev/rcd*), and OpenBSD
(/dev/rcd*). Get a list of available optical drive devices by:
xorriso -devices
It might be that you need superuser powers for this and then have to
enable access to the device file for the user who runs
merge_debian_isos.
In order to directly write the merged ISO image to an optical medium,
use the desired device file path with prefix "mmc:":
merge_debian_isos mmc:/dev/sr0 merge_mount/iso \
debian-11.2.0-amd64-DVD-[12345].iso

File: merge_debian_isos.info, Node: ExDdTarget, Next: ExStdio, Prev: ExOptical, Up: Examples
3.4 Write result directly and safely to USB stick (Linux only)
==============================================================
The Linux-specific script *xorriso-dd-target* evaluates device files
whether they and their content look unimportant enough for being
overwritten by an image file.
This mainly means that the storage device is attached to USB and
contains no filesystems which are not of type FAT or ISO 9660.
You may get xorriso-dd-target by:
wget \
https://dev.lovelyhq.com/libburnia/libisoburn/raw/master/xorriso-dd-target/xorriso-dd-target
chmod u+x xorriso-dd-target
Consider to also download xorriso-dd-target.sig and to verify the
script by
gpg -verify xorriso-dd-target.sig xorriso-dd-target
Announce the storage location of the downloaded xorriso-dd-target:
export XORRISO_DD_TARGET_PATH="$(pwd)"
The prepared use case in merge_debian_isos uses the xorriso-dd-target
option -plug_test under *sudo*, which asks the user for first having the
desired USB stick unplugged so that the unwanted devices can get
registered. Then it asks the user to plug in the USB stick, so that it
gets recognized as desired target.
xorriso-dd-target evaluates the content and decides whether it looks
disposable enough. If so, then it allows merge_debian_isos to write its
result to the device.
merge_debian_isos xorriso-dd-target-plug-test merge_mount/iso \
debian-11.2.0-amd64-DVD-[12345].iso

File: merge_debian_isos.info, Node: ExStdio, Next: Files, Prev: ExDdTarget, Up: Examples
3.5 Write result directly and unsafely to USB stick
===================================================
On operating systems other than GNU/Linux or with storage devices not
acceptable to xorriso-dd-target it is possible to remove all safety
precautions beyond those of xorriso, which can be overcome by "blanking"
the device.
So after due evaluation of the device situation and on your very own
risk you may use the device path prefix "stdio:", possibly with
superuser powers:
xorriso -outdev stdio:/dev/sdd -blank as_needed
merge_debian_isos stdio:/dev/sdd merge_mount/iso \
debian-11.2.0-amd64-DVD-[12345].iso
For details about "stdio:" and pseudo-blanking non-optical devices
read man xorriso.
The xorriso run in merge_debian_isos ignores locally defined xorriso
startup files (by command -no_rc).

File: merge_debian_isos.info, Node: Files, Next: Environ, Prev: Examples, Up: Top
4 Files
*******
For now, no files are defined for configuration.

File: merge_debian_isos.info, Node: Environ, Next: Seealso, Prev: Files, Up: Top
5 Environ
*********
The following environment variables influence the program behavior:
Exported non-empty variable MERGE_DATE enforces a particular date string
in the text which gets prepended to /README.txt .
Exported non-empty variable MERGE_FOR_DIST enforces the use of a
particular directory in /dists of iso1. Normally only one such
directory is found and thus no need to set MERGE_FOR_DIST.
Exported non-empty variable MERGE_KEEP_ISO prevents the removal of
result_iso after xorriso indicated failure of production.
Exported non-empty variable XORRISO gives the path to a xorriso binary,
which will be used instead of the system-wide installed xorriso binary.
This may be needed if installed xorriso is older than 1.4.2.
If XORRISO is set to "dummy" then no new ISO will emerge.
Exported non-empty variable XORRISO_DD_TARGET_PATH names the directory
where to find xorriso-dd-target, which evaluates the suitability of
result_iso devices or does the plug-test dialog.

File: merge_debian_isos.info, Node: Seealso, Next: Bugreport, Prev: Environ, Up: Top
6 See also
**********
xorriso(1), xorriso-dd-target(1)

File: merge_debian_isos.info, Node: Bugreport, Next: Legal, Prev: Seealso, Up: Top
7 Reporting bugs
****************
To report bugs, request help, or suggest enhancements for
'merge_debian_isos', please send electronic mail to the public list
<bug-xorriso@gnu.org>. If more privacy is desired, mail to
<scdbackup@gmx.net>.
Please describe what you expect the program to do, the program
arguments which you used, the messages of 'merge_debian_isos', and the
undesirable outcome of your program run.
Expect to get asked more questions before solutions can be proposed.

File: merge_debian_isos.info, Node: Legal, Next: CommandIdx, Prev: Bugreport, Up: Top
8 Author, Copyright, Credits
****************************
8.1 Author
==========
Thomas Schmitt <scdbackup@gmx.net>
for libburnia-project.org
8.2 Copyright
=============
Copyright (c) 2023 Thomas Schmitt
Permission is granted to distribute this text freely. It shall only be
modified in sync with the technical properties of merge_debian_isos. If
you make use of the license to derive modified versions of
merge_debian_isos then you are entitled to modify this text under that
same license.
8.3 Credits
===========
'merge_debian_isos' was originally developed with advise and testing by
Zhang Boyang in the course of Debian bug #1011343. Steve McIntyre
provided information about various file aspects of debian-cd ISO images.

File: merge_debian_isos.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top
9 Alphabetic Options List
*************************

File: merge_debian_isos.info, Node: ConceptIdx, Next: Top, Prev: CommandIdx, Up: Top
10 Alphabetic List of Concepts and Objects
******************************************
[index]
* Menu:
* Bugs, reporting: Bugreport. (line 6)
* Examples: Examples. (line 6)
* merge_debian_isos, options: Options. (line 6)
* Problems, reporting: Bugreport. (line 6)

Tag Table:
Node: Top417
Node: Overview1014
Node: Options3381
Node: Examples3771
Node: ExPlain4196
Node: ExXorriso4870
Node: ExOptical5664
Node: ExDdTarget6448
Node: ExStdio7971
Node: Files8883
Node: Environ9039
Node: Seealso10104
Node: Bugreport10253
Node: Legal10838
Node: CommandIdx11666
Node: ConceptIdx11813

End Tag Table

Binary file not shown.

View File

@ -1,446 +0,0 @@
\input texinfo @c -*-texinfo-*-
@c %**start of header
@setfilename merge_debian_isos.info
@settitle merge_debian_isos 1.5.7
@c %**end of header
@c
@c man-ignore-lines begin
@dircategory Archiving
@direntry
* Merge_debian_isos: (merge_debian_isos). Merge debian-cd ISO images to a single image
@end direntry
@c man-ignore-lines end
@c
@c Notes about embedded man page:
@c This texinfo code contains the necessary info to produce a man page.
@c One can produce it by applying the following rules:
@c The first line gets discarded.
@c Line start "@c man " will become "", the remainder is put out unaltered.
@c Lines "@*" will be converted to ".br"
@c "@c man-ignore-lines N" will discard N following lines.
@c "@c man-ignore-lines begin" discards all following lines
@c up to "@c man-ignore-lines end".
@c Line blocks of "@menu" "@end menu" will be discarded.
@c "@item word words" becomes "\fBword\fR words".
@c @b{...}, @command{...}, @dfn{...}, @emph{...}, @strong{...}
@c get mapped to \fB...\fR .
@c @abbr{...}, @code{...}, @file{...}, @i{...}, @option{...}, @r{...},
@c @ref{...}, @samp{...},@var{...}, get mapped to ... .
@c @ref{...}, @xref{...} get mapped to empty text.
@c @email{...} gets mapped to <...> .
@c Mapped {...} content is subject to the rules except {...} mapping.
@c @minus{} will become "-".
@c @@ , @{, @} will get stripped of their first @.
@c Other lines which begin by "@" will be discarded.
@c In lines not stemming from "@c man", "\" becomes "\\"
@c "-" which are not preceded by an uneven number of "\" will get
@c prepended one "\".
@c
@c
@c man .\" Hey, EMACS: -*- nroff -*-
@c man .\"
@c man .\" IMPORTANT NOTE:
@c man .\"
@c man .\" The original of this file is kept in test/merge_debian_isos.texi
@c man .\" This here was generated by program xorriso/make_xorriso_1
@c man .\"
@c man .\"
@c man .\" First parameter, NAME, should be all caps
@c man .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
@c man .\" other parameters are allowed: see man(7), man(1)
@c man .TH MERGE_DEBIAN_ISOS 1 "Version 1.5.7, Jun 07, 2023"
@c man .\" Please adjust this date whenever revising the manpage.
@c man .\"
@c man .\" Some roff macros, for reference:
@c man .\" .nh disable hyphenation
@c man .\" .hy enable hyphenation
@c man .\" .ad l left justify
@c man .\" .ad b justify to both left and right margins
@c man .\" .nf disable filling
@c man .\" .fi enable filling
@c man .\" .br insert line break
@c man .\" .sp <n> insert n+1 empty lines
@c man .\" for manpage-specific macros, see man(7)
@c man .nh
@c man-ignore-lines begin
@copying
merge_debian_isos - sh script to merge multiple debian-cd ISO images
Copyright @copyright{} 2023 Thomas Schmitt
@quotation
Permission is granted to distribute this text freely.
@end quotation
@end copying
@c man-ignore-lines end
@titlepage
@title Manual of GNU xorriso companion merge_debian_isos 1.5.7
@author Thomas Schmitt
@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage
@contents
@ifnottex
@node Top
@top merge_debian_isos 1.5.7
@c man-ignore-lines 1
@c man .SH NAME
merge_debian_isos - Program to merge multiple debian-cd ISO images
@end ifnottex
@menu
* Overview:: Overview
* Options:: Options
* Examples:: Examples
* Files:: Files
* Environ:: Environment
* Seealso:: See also
* Bugreport:: Reporting bugs
* Legal:: Author, Copyright, Credits
* CommandIdx:: Alphabetic Option List
* ConceptIdx:: Alphabetic List of Concepts and Objects
@end menu
@node Overview, Options, Top, Top
@chapter Overview
@c man .SH SYNOPSIS
@c man .B merge_debian_isos
@c man result_iso mount_template iso1 iso2 [... isoN]
@c man .br
@c man .SH DESCRIPTION
@c man .PP
@command{merge_debian_isos}
mounts by @strong{sudo} the ISO 9660 images iso1 to isoN at directories
mount_template1 to mount_templateN, if not already mounted that way.
Then the Debian pools and package lists get merged and a new
ISO 9660 image result_iso is produced by a run of @strong{xorriso}.
If iso1 is bootable then
the new image will be bootable by the same means.
@*
@sp 1
@c man .PP
The file depicted by result_iso must not yet exist or has to be a
device which is acceptable for Linux-specific helper script
@strong{xorriso-dd-target}. If xorriso-dd-target agrees and the user
confirms by input "yes" then xorriso will be run under sudo.
@*
Exempted from this evaluation are addresses which begin by "mmc:"
for an optical drive on Linux, BSDs, Solaris, or by "stdio:/dev/"
for which the user takes full and dangerous responsibility.
@*
Special result_iso path @strong{xorriso-dd-target-plug-test} determines
on systems with Linux kernel the target USB stick by a dialog around plugging
it in.
xorriso will be run under sudo, if xorriso-dd-target agrees and
the user confirms by input "yes".
@*
@sp 1
@c man .PP
At least the parent directory of argument @strong{mount_template} must already
exist or has to be given by a plain name without "/" so that it can be
created in the current directory. (I.e. without even "./".)
@*
All arguments must be single words without using quotation marks.
None of the isoN must be equal to another isoM.
@*
@sp 1
@c man .PP
This script creates and finally removes the following temporary tree
and files which must not yet exist in the current working directory:
./merged_dists , ./merged_md5sum.txt , ./merged_REAMDE.txt
./temp_file
@*
Further it creates and finally removes directories mount_template*
if they are needed and do not exist when the script starts. If the
parent directory in the mount_template path does not exist and
its path contains no "/" then it gets created and finally removed.
The script depends on the following programs:
@*
awk, basename, cat, chmod, cp, date, dirname, expr, fgrep, grep,
gunzip, gzip, head, ls, md5sum, mkdir, mount, mv, rm, rmdir,
sed, sh, sha256sum, sort, stat, sudo, umount, uniq, xorriso
@*
With device writing involving helper script xorriso-dd-target:
@*
dd, Linux kernel, lsblk, sleep, tr, uname, wc, whoami,
xorriso-dd-target
@*
Recommended are: sha1sum, sha512sum
@c man .SS
@node Options, Examples, Overview, Top
@chapter Options
@cindex merge_debian_isos, options
@c man .br
@c man .SH OPTIONS
@c man .br
@c man .PP
merge_debian_isos has no command line options besides the input words described
above, but it reacts on some environment variables.
@c man .br
@c man See section ENVIRONMENT.
@*
@sp 1
@c man .PP
If less than 4 arguments are given, the script will print its help text to
standard error and exit with non-zero value, indicating failure.
@c man .SS
@node Examples, Files, Options, Top
@chapter Examples
@c man .SH EXAMPLES
@c man .SS
@c man .B Overview of examples:
@c man Merge DVD images 1 to 5
@c man .br
@c man Use GNU xorriso instead of installed xorriso
@c man .br
@c man Write result directly to an optical drive
@c man .br
@c man Write result directly and safely to USB stick (Linux only)
@c man .br
@c man Write result directly and unsafely to USB stick
@cindex Examples
@menu
* ExPlain:: Merge DVD images 1 to 5
* ExXorriso:: Use GNU xorriso instead of installed xorriso
* ExOptical:: Write result directly to an optical drive
* ExDdTarget:: Write result directly and safely to USB stick (Linux only)
* ExStdio:: Write result directly and unsafely to USB stick
@end menu
@c man .SS
@c man .B Merge DVD images 1 to 5
@node ExPlain, ExXorriso, Options, Examples
@section Merge DVD images 1 to 5
The resulting image will be named "merged.iso".
@*
Directory ./merge_mount/ will be created if not yet existing.
@*
@sp 1
merge_debian_isos merged.iso merge_mount/iso \
debian-11.2.0-amd64-DVD-[12345].iso
@*
@sp 1
Expect to see some harmless warnings like
@*
@sp 1
xorriso : WARNING : -volid text does not comply to ISO 9660 / ECMA 119 rules
libisofs: WARNING : Cannot add /debian to Joliet tree. Symlinks can only be added to a Rock Ridge tree.
libisofs: WARNING : Image size exceeds 1024 cylinders. Cannot align partition.
@c man .SS
@c man .B Use GNU xorriso instead of installed xorriso
@node ExXorriso, ExOptical, ExPlain, Examples
@section Use GNU xorriso instead of installed xorriso
merge_debian_isos will refuse to work if the installed version of xorriso
is older than 1.4.2. In this case consider to download and compile the
GNU xorriso tarball from
@*
https://www.gnu.org/software/xorriso/#download
@*
You may use it without installing it after compilation and thus without
disturbing your system's package management. Assumed that you unpacked the
xorriso-1.5.6 tarball in your $HOME directory and have successfully compiled
it, do:
@*
@sp 1
export XORRISO="$HOME"/xorriso-1.5.6/xorriso/xorriso
@*
@sp 1
merge_debian_isos merged.iso merge_mount/iso \
debian-11.2.0-amd64-DVD-[12345].iso
@c man .SS
@c man .B Write result directly to an optical drive
@node ExOptical, ExDdTarget, ExXorriso, Examples
@section Write result directly to an optical drive
xorriso is able to burn optical media on GNU/Linux (/dev/sr*),
Solaris (/dev/rdsk/*) , FreeBSD (/dev/cd*) , NetBSD (/dev/rcd*),
and OpenBSD (/dev/rcd*). Get a list of available optical drive devices by:
@*
@sp 1
xorriso -devices
@*
@sp 1
It might be that you need superuser powers for this and then have to enable
access to the device file for the user who runs merge_debian_isos.
@*
@sp 1
In order to directly write the merged ISO image to an optical medium,
use the desired device file path with prefix "mmc:":
@*
@sp 1
merge_debian_isos mmc:/dev/sr0 merge_mount/iso \
debian-11.2.0-amd64-DVD-[12345].iso
@c man .SS
@c man .B Write result directly and safely to USB stick (Linux only)
@node ExDdTarget, ExStdio, ExOptical, Examples
@section Write result directly and safely to USB stick (Linux only)
The Linux-specific script @strong{xorriso-dd-target} evaluates device files
whether they and their content look unimportant enough for being overwritten
by an image file.
@*
This mainly means that the storage device is attached to USB and contains
no filesystems which are not of type FAT or ISO 9660.
@*
You may get xorriso-dd-target by:
@*
@sp 1
wget \
https://dev.lovelyhq.com/libburnia/libisoburn/raw/master/xorriso-dd-target/xorriso-dd-target
chmod u+x xorriso-dd-target
@*
@sp 1
Consider to also download xorriso-dd-target.sig and to verify the script by
@*
@sp 1
gpg --verify xorriso-dd-target.sig xorriso-dd-target
@*
@sp 1
Announce the storage location of the downloaded xorriso-dd-target:
@*
@sp 1
export XORRISO_DD_TARGET_PATH="$(pwd)"
@*
@sp 1
The prepared use case in merge_debian_isos uses the xorriso-dd-target
option -plug_test under @strong{sudo}, which asks the user for first having
the desired USB stick unplugged so that the unwanted devices can get
registered. Then it asks the user to plug in the USB stick, so that it gets
recognized as desired target.
@*
xorriso-dd-target evaluates the content and decides whether it looks
disposable enough. If so, then it allows merge_debian_isos to write its
result to the device.
@*
@sp 1
merge_debian_isos xorriso-dd-target-plug-test merge_mount/iso \
debian-11.2.0-amd64-DVD-[12345].iso
@c man .SS
@c man .B Write result directly and unsafely to USB stick
@node ExStdio, Files, ExDdTarget, Examples
@section Write result directly and unsafely to USB stick
On operating systems other than GNU/Linux or with storage devices not
acceptable to xorriso-dd-target it is possible to remove all safety
precautions beyond those of xorriso, which can be overcome by "blanking"
the device.
@*
So after due evaluation of the device situation and on your very own risk
you may use the device path prefix "stdio:", possibly with superuser powers:
@*
@sp 1
xorriso -outdev stdio:/dev/sdd -blank as_needed
merge_debian_isos stdio:/dev/sdd merge_mount/iso \
debian-11.2.0-amd64-DVD-[12345].iso
For details about "stdio:" and pseudo-blanking non-optical devices read
man xorriso.
@*
The xorriso run in merge_debian_isos ignores locally defined xorriso startup
files (by command -no_rc).
@node Files, Environ, Examples, Top
@chapter Files
@c man .SH FILES
For now, no files are defined for configuration.
@c man .SH ENVIRONMENT
@node Environ, Seealso, Files, Top
@chapter Environ
The following environment variables influence the program behavior:
@*
Exported non-empty variable MERGE_DATE enforces a particular
date string in the text which gets prepended to /README.txt .
@*
Exported non-empty variable MERGE_FOR_DIST enforces the use of a
particular directory in /dists of iso1. Normally only one
such directory is found and thus no need to set MERGE_FOR_DIST.
@*
Exported non-empty variable MERGE_KEEP_ISO prevents the removal
of result_iso after xorriso indicated failure of production.
@*
Exported non-empty variable XORRISO gives the path to a xorriso binary,
which will be used instead of the system-wide installed xorriso binary.
This may be needed if installed xorriso is older than 1.4.2.
@*
If XORRISO is set to "dummy" then no new ISO will emerge.
@*
Exported non-empty variable XORRISO_DD_TARGET_PATH names the
directory where to find xorriso-dd-target, which evaluates the
suitability of result_iso devices or does the plug-test dialog.
@*
@c man .SH SEE ALSO
@c man .BR xorriso(1),
@c man .BR xorriso-dd-target(1),
@c man-ignore-lines begin
@node Seealso, Bugreport, Environ, Top
@chapter See also
xorriso(1), xorriso-dd-target(1)
@c man-ignore-lines end
@c man .SH BUGS
@node Bugreport, Legal, Seealso, Top
@chapter Reporting bugs
@cindex Bugs, reporting
@cindex Problems, reporting
To report bugs, request help, or suggest enhancements for
@command{merge_debian_isos},
please send electronic mail to the public list @email{bug-xorriso@@gnu.org}.
If more privacy is desired, mail to @email{scdbackup@@gmx.net}.
@*
@sp 1
Please describe what you expect the program to do, the program arguments
which you used, the messages of @command{merge_debian_isos}, and the
undesirable outcome of your program run.
@*
@sp 1
Expect to get asked more questions before solutions can be proposed.
@c man .SH AUTHOR
@node Legal, CommandIdx, Bugreport, Top
@chapter Author, Copyright, Credits
@section Author
Thomas Schmitt <scdbackup@@gmx.net>
@*
for libburnia-project.org
@c man .SH COPYRIGHT
@section Copyright
Copyright (c) 2023 Thomas Schmitt
@*
Permission is granted to distribute this text freely. It shall only be
modified in sync with the technical properties of merge_debian_isos.
If you make use of the license to derive modified versions of merge_debian_isos
then you are entitled to modify this text under that same license.
@c man .SH CREDITS
@section Credits
@command{merge_debian_isos} was originally developed with advise and testing
by Zhang Boyang in the course of Debian bug #1011343. Steve McIntyre provided
information about various file aspects of debian-cd ISO images.
@c man-ignore-lines begin
@node CommandIdx, ConceptIdx, Legal, Top
@chapter Alphabetic Options List
@printindex ky
@node ConceptIdx, Top, CommandIdx, Top
@chapter Alphabetic List of Concepts and Objects
@printindex cp
@c man-ignore-lines end
@bye

View File

@ -1,165 +0,0 @@
#!/bin/sh
#
# check_debian_iso, copyright 2011,2024 Thomas Schmitt <scdbackup@gmx.net>
# License: GPLv2 or later
# Tested on: Little-endian GNU/Linux with bash
# Little-endian FreeBSD-8 with sh and "md5 -q"
# Little-endian Solaris 5.11 with ksh93
# Big-endian GNU/Linux with bash
prog=`basename "$0"`
usage() {
echo "Usage: $prog Checksum_file [U:]Item [Image_file] [Checksum_command]" >&2
echo "Reads the checksum of a Debian installation image from Checksum_file" >&2
echo "and compares it with the ISO 9660 image in Image_file. Suitable" >&2
echo "for verifying optical media, because trailing garbage is ignored." >&2
echo "The Item in the Checksum_file is depicted either by its complete" >&2
echo "file name (e.g. debian-6.0.3-amd64-CD-1.iso) or by a text piece" >&2
echo "between '-' and '.iso' in the file name. The first match is used." >&2
echo "Text pieces for debian-update images must be prefixed by 'U:'." >&2
echo "If no Image_file is given, then the item file name is used instead." >&2
echo "Checksum_command is normally deduced from Checksum_file name." >&2
echo "It must read data from standard input and its first word written" >&2
echo "to standard output must be the checksum. Default commands are" >&2
echo "md5sum, sha1sum, sha256sum, sha512sum." >&2
echo "Examples:" >&2
echo " $prog MD5SUMS debian-6.0.3-amd64-netinst.iso" >&2
echo " $prog MD5SUMS netinst" >&2
echo " $prog MD5SUMS debian-6.0.3-amd64-DVD-1.iso /dev/dvd" >&2
echo " $prog MD5SUMS 1 /dev/dvd" >&2
echo " $prog MD5SUMS 2 /dev/dvd" >&2
echo " $prog MD5SUMS U:1 /dev/dvd" >&2
echo " $prog MD5SUMS kde-CD-1 /dev/cdrom" >&2
echo " $prog SHA512SUMS businesscard /dev/cdrom" >&2
echo " $prog MD5SUMS 1 /dev/cd0 'md5 -q'" >&2
}
if test -z "$1" -o "$1" = "-h" -o "$1" = "--help" -o -z "$2"
then
usage
exit 1
fi
sums="$1"
vol="$2"
file="$3"
checksummer=md5sum
if test -n "$4"
then
checksummer="$4"
else
base=`basename "$sums"`
if test "$base" = "SHA1SUMS"
then
checksummer=sha1sum
elif test "$base" = "SHA256SUMS"
then
checksummer=sha256sum
elif test "$base" = "SHA512SUMS"
then
checksummer=sha512sum
fi
fi
update=""
update_v="-v"
use_fgrep=""
if echo "$vol" | grep '^debian-.*\.iso$' >/dev/null
then
use_fgrep=1
elif echo "$vol" | grep '^U:' >/dev/null
then
update=" update"
update_v=""
vol=`echo "$vol" | sed -e 's/^U://'`
fi
if test -n "$use_fgrep"
then
line_from_list=`fgrep "$vol" "$sums" | head -1`
else
line_from_list=`grep '.*-'"$vol"'\.iso$' "$sums" | grep $update_v "update" | head -1`
fi
sum_from_list=`echo "$line_from_list" | awk '{print $1}'`
name_from_list=`echo "$line_from_list" | awk '{print $2}'`
if test -z "$sum_from_list"
then
if test -n "$use_fgrep"
then
echo "Could not find item '${vol}' in '$sums'" >&2
else
echo "Could not find$update item '.*-${vol}.iso' in '$sums'" >&2
fi
exit 4
fi
if test -z "$file"
then
file="$name_from_list"
fi
# Logical block size is assumed with 2048 bytes. Neither genisoimage
# nor xorriso produce other sizes, and even the Linux kernel seems to
# have this size hardcoded.
# At byte 16 * 2048 starts the Primary Volume Descriptor (superblock)
# of the image. The magic number values should be ECMA-119 Volume
# Descriptor Type 0x01 and Standard Identifier "CD001".
# The way how these 6 bytes group to 16-bit words indicates the byte
# sex (endianness) of the local machine. The ECMA-119 Volume Space Size
# is stored as little-endian 32-bit number at PVD byte 80, and as big-endian
# 32-bit number at PVD byte 84.
# od -d is used because it guarantees unsigned integer of predictable
# size. Formats -i and -l depend on sizeof(int).
magic=`(dd if="$file" bs=2048 skip=16 count=1 |
dd bs=1 count=6 | od -x | head -1 | \
awk '{print $2 " " $3 " " $4}') 2>/dev/null`
if test "$magic" = "4301 3044 3130"
then
lo=`(dd if="$file" bs=2048 skip=16 count=1 | \
dd bs=1 skip=80 count=2 | od -d | head -1 | \
awk '{print $2}') 2>/dev/null`
hi=`(dd if="$file" bs=2048 skip=16 count=1 | \
dd bs=1 skip=82 count=2 | od -d | head -1 | \
awk '{print $2}') 2>/dev/null`
elif test "$magic" = "0143 4430 3031"
then
lo=`(dd if="$file" bs=2048 skip=16 count=1 | \
dd bs=1 skip=86 count=2 | od -d | head -1 | \
awk '{print $2}') 2>/dev/null`
hi=`(dd if="$file" bs=2048 skip=16 count=1 | \
dd bs=1 skip=84 count=2 | od -d | head -1 | \
awk '{print $2}') 2>/dev/null`
elif test -e "$file"
then
echo "Does not look like an ISO 9660 filesystem: '$file' magic='$magic'" >&2
exit 2
else
echo "File not found: '$file'" >&2
exit 5
fi
# The two 16 bit numbers, which are of the appropriate byte sex,
# get combined to a 32 bit number.
blocks=`expr "$lo" + "$hi" '*' 65536`
echo "Piping $blocks blocks of '$file' through '$checksummer'" >&2
echo "to verify checksum list item '$name_from_list'." >&2
sum_from_file=`dd if="$file" bs=2048 count="$blocks" | $checksummer | head -1 | awk '{print $1}'`
if test "$sum_from_list" = "$sum_from_file"
then
echo "Ok: '$file' matches$update '$name_from_list' in '$sums'"
else
echo "Found: $sum_from_file" >&2
echo "Expected: $sum_from_list" >&2
echo "MISMATCH: '$file' checksum differs from '$name_from_list' in '$sums'"
exit 3
fi
exit 0

View File

@ -1,8 +0,0 @@
-----BEGIN PGP ARMORED FILE-----
Version: GnuPG v1
Comment: Use "gpg --dearmor" for unpacking
iEYEABECAAYFAmbYVioACgkQ6cvfwKvAqFS4IQCeJE88Pf75Lj8Ca83ue80nNR4M
Xn4AniMkFTsCsd4DfLHmgXjpeFPtInkN
=OytZ
-----END PGP ARMORED FILE-----

View File

@ -1,961 +0,0 @@
#!/bin/sh
# Copyright (c) 2019 - 2023
# Nio Wiklund alias sudodus <nio dot wiklund at gmail dot com>
# Thomas Schmitt <scdbackup@gmx.net>
# Provided under GPL version 2 or later.
# All names of variables and functions begin by "xdt_" in order to facilitate
# the re-use of this code by inclusion or forking and expansion.
# Before using most of the functions it is necessary to run
# xdt_init ; xdt_reset_job
# The only function which may be run earlier is xdt_set_lang_c .
# The function xtd_main gets run by the code at the end of this file
# if $no_xorriso_dd_target_run is empty. It implements what xdt_print_usage
# announces.
xdt_print_version() {
echo "xorriso-dd-target , version 1.5.7 , 2023.06.07.200919"
}
## This obtrusive setting shall make the script safe against exotic locales.
## Supposed to stabilize grep expression interpretation and error messages.
## It is optional but highly advisable.
xdt_set_lang_c() {
export LANG=C
export LC_ALL=C
return 0
}
## This function has to be called before any real work can be done.
xdt_init() {
# Check whether we are on GNU/Linux
if uname -s | grep -v '^Linux' >/dev/null
then
echo "This program is entirely specialized on Linux kernel device names." >&2
echo "Found to be on: '$(uname -s)'" >&2
return 2
fi
# Accept sudo-executable commands only in well known directories.
# (Listed with increasing priority.)
xdt_lsblk_cmd=
xdt_dd_cmd=
xdt_umount_cmd=
if test "$(whoami)" = "root"
then
xdt_sudo_x_dir_list="/usr/bin /bin /usr/sbin /sbin"
else
xdt_sudo_x_dir_list="/usr/sbin /sbin /usr/bin /bin"
fi
for xdt_i in $xdt_sudo_x_dir_list
do
if test -x "$xdt_i"/lsblk
then
xdt_lsblk_cmd="$xdt_i"/lsblk
fi
if test -x "$xdt_i"/dd
then
xdt_dd_cmd="$xdt_i"/dd
fi
if test -x "$xdt_i"/umount
then
xdt_umount_cmd="$xdt_i"/umount
fi
done
if test -z "$xdt_lsblk_cmd"
then
echo "No executable program lsblk found in: $xdt_sudo_x_dir_list" >&2
return 5
fi
return 0
}
xdt_print_usage() {
echo "usage: $0 [options] [device_name [device_name ...]]"
echo
echo "Looks on GNU/Linux for USB and Memory Card devices and evaluates"
echo "whether the found devices are plausible targets for image copying."
echo "If no device names and no -list_all are given, then a plain list of"
echo "advisable device names is printed to stdout. One per line."
echo "Device names must not begin by '-' and must be single words. They must"
echo "not begin by '/dev/'. E.g. 'sdc' is valid, '/dev/sdc' is not valid."
echo "If device names are given, then they get listed with advice shown."
echo "If one of the given device names gets not advised, the exit value is 1."
echo
echo "The option -plug_test can determine the desired target device by"
echo "inquiring the system with unplugged device and then with plugged one."
echo
echo "Only if option -DO_WRITE is given and -list_all is not, and if exactly"
echo "one advisable device is listed, it really gets overwritten by the"
echo "file content of the given -image_file. In this case the exit value"
echo "is zero if writing succeeded, non-zero else."
echo "Option -dummy prevents this kind of real action and rather shows the"
echo "unmount and write commands on stdout."
echo
echo "Options:"
echo " -plug_test Find the target device by asking the user to press"
echo " Enter when the desired target is _not_ plugged in,"
echo " to then plug it in, and to press Enter again."
echo " This overrides device names and option -list_all."
echo " The found device is then shown with advice, vendor,"
echo " and model. Option -DO_WRITE is obeyed if given."
echo " -list_all Print list of all found devices with advice, vendor"
echo " and model. One per line. Ignore any device names."
echo " Ignore -DO_WRITE."
echo " -list_long With each line printed by -list_all or a submitted"
echo " device name, let lsblk print info which led to the"
echo " shown reasons."
echo " -with_vendor_model Print vendor and model with each submitted device"
echo " name."
echo " -max_size n[M|G|T] Set upper byte size limit for advisable devices."
echo " Plain numbers get rounded down to full millions."
echo " Suffix: M = million, G = billion, T = trillion."
echo " Be generous to avoid problems with GB < GiB."
echo " -min_size n[M|G|T] Set lower byte size limit for advisable devices."
echo " After processing like with -max_size, one million"
echo " gets added to the size limit."
echo " -look_for_iso Demand presence of an ISO 9660 filesystem. If so,"
echo " any further filesystem type is acceptable on that"
echo " device. Else only ISO 9660 and VFAT are accepted."
echo " -with_sudo Run '$xdt_lsblk_cmd -o FSTYPE' by sudo."
echo " If no filesystems are detected and the program"
echo " has no superuser power, the device is not advised."
echo " If -DO_WRITE is given, run umount and dd by sudo."
echo " -trust_lsblk_udev Suppress the reason no_fs_while_not_su- if lsblk"
echo " is linked with libudev.so. In this case it is"
echo " likely that lsblk can retrieve FSTYPE even if"
echo " run by a non-priviledged user."
echo " -image_file PATH Set the path of the image file which shall be"
echo " written to a device. Its size will be set as"
echo " -min_size."
echo " -DO_WRITE Write the given -image_file to the one advisable"
echo " device that is found. If more than one such device"
echo " is found, then they get listed but no writing"
echo " happens. In this case, re-run with one of the"
echo " advised device names to get a real write run."
echo " -no_pacifier Do not use dd options to print progress messages"
echo " and to perform synchronized output."
echo " -dummy Report the -DO_WRITE actions but do not perform"
echo " them."
echo " -dummy_force If a single device name is given, do a run of"
echo " -dummy -DO_WRITE even against the advice of"
echo " this program. This probably shows you ways to"
echo " shoot your own foot."
echo " -version Print version text and then end the program."
echo " -help Print this text to stdout and then end the program."
echo "Examples:"
echo " $0 -with_sudo -list_all"
echo " $0 sdc"
echo " $0 -with_sudo -image_file debian-live-10.0.0-amd64-xfce.iso -DO_WRITE -dummy"
echo " $0 -with_sudo -image_file debian-live-10.0.0-amd64-xfce.iso -DO_WRITE -plug_test"
echo
return 0
}
# Roughly convert human readable sizes and plain numbers to 1 / million
xdt_round_down_div_million() {
sed \
-e 's/^[0-9][0-9][0-9][0-9][0-9][0-9]$/0/' \
-e 's/^[0-9][0-9][0-9][0-9][0-9]$/0/' \
-e 's/^[0-9][0-9][0-9][0-9]$/0/' \
-e 's/^[0-9][0-9][0-9]$/0/' \
-e 's/^[0-9][0-9]$/0/' \
-e 's/^[0-9]$/0/' \
-e 's/\.[0-9]*//' \
-e 's/[0-9][0-9][0-9][0-9][0-9][0-9]$//' \
-e 's/[Mm]$//' \
-e 's/[Gg]$/000/' \
-e 's/[Tt]$/000000/'
return 0
}
## Check for harmless name or number in program argument
xdt_check_parameter() {
if test "X$2" = "Xdevice_name"
then
if echo "X$1" | grep '[^A-Za-z0-9_/-]' >/dev/null
then
echo "SORRY: Given device name contains unexpected character. Ok: [A-za-z0-9_/-]" >&2
return 12
elif echo "X$1" | grep '^X-' >/dev/null
then
echo "SORRY: Given device name begins by '-' character." >&2
return 15
fi
elif test "X$2" = "Ximage_file"
then
if echo "X$1" | grep '[$`[*?<>|&!{\]' >/dev/null
then
echo "SORRY: Given image file name contains unexpected character. Not ok: "'[$`[*?<>|&!{\]' >&2
return 15
elif echo "X$1" | grep '^X[-(]' >/dev/null
then
echo "SORRY: Given image file name begins by problematic character. Not ok: "'[-(]' >&2
return 15
fi
else
if echo "X$1" | grep -v '^X[0-9][0-9]*[0-9MGTmgt]$' >/dev/null
then
echo "SORRY: Number for $2 too short or bad character. Ok: [0-9][0-9MGTmgt]" >&2
return 14
fi
fi
return 0
}
### Assessing arguments and setting up the job
# Settings
xdt_reset_job() {
xdt_list_all=
xdt_do_list_long=
xdt_show_reasons=
xdt_look_for_iso=
xdt_devs=
xdt_devs_named=
xdt_max_size=
xdt_with_vendor_model=
xdt_with_sudo=
xdt_image_file=
xdt_do_write=
xdt_dummy_run=
xdt_dummy_force=
xdt_no_pacifier=
xdt_do_plug_test=
xdt_trust_lsblk_udev=
# Status
xdt_sudo_cmd=
xdt_have_su_power=
xdt_end_after_setup=
xdt_dev_end=
xdt_dd_bs="bs=1M"
xdt_dd_silent=
return 0
}
## Predict superuser power. Possibly enable sudo with lsblk -o FSTYPE and dd.
## Also predict whether lsblk -o FSTYPE will bring results as non-root.
xdt_predict_su_power() {
if test "$(whoami)" = "root"
then
xdt_have_su_power=y
elif test -n "$xdt_with_sudo"
then
echo "Testing sudo to possibly get password prompting done now:" >&2
if sudo "$xdt_lsblk_cmd" -h >/dev/null
then
echo "sudo $xdt_lsblk_cmd seems ok." >&2
echo >&2
xdt_sudo_cmd=sudo
xdt_have_su_power=y
else
echo "FAILURE: Cannot execute program $xdt_lsblk_cmd by sudo" >&2
return 11
fi
fi
# lsblk linked with libudev.so usually can obtain filesystem info
# without superuser powers.
if test -n "$xdt_trust_lsblk_udev"
then
if ldd "$xdt_lsblk_cmd" | grep '\blibudev\.so' >/dev/null
then
xdt_lsblk_fs_wo_su=y
fi
fi
return 0
}
## Sets xdt_variables according to its arguments
xdt_arg_interpreter() {
xdt_next_is=
for xdt_i in "$@"
do
# The next_is option parameter readers get programmed by the -options
if test "$xdt_next_is" = "max_size"
then
xdt_check_parameter "$xdt_i" -max_size || return "$?"
xdt_max_size="$(echo "$xdt_i" | xdt_round_down_div_million)"
xdt_next_is=
elif test "$xdt_next_is" = "min_size"
then
xdt_check_parameter "$xdt_i" -min_size || return "$?"
xdt_min_size="$(echo "$xdt_i" | xdt_round_down_div_million)"
xdt_min_size="$(expr $xdt_min_size + 1)"
xdt_next_is=
elif test "$xdt_next_is" = "image_file"
then
xdt_check_parameter "$xdt_i" image_file || return "$?"
xdt_image_file="$xdt_i"
xdt_min_size="$(stat -c '%s' "$xdt_i" \
| xdt_round_down_div_million)"
if test -z "$xdt_min_size"
then
echo "FAILURE: Cannot obtain size of -image_file '$xdt_i'" >&2
return 13
else
xdt_min_size="$(expr $xdt_min_size + 1)"
fi
xdt_next_is=
elif test "X$xdt_i" = "X-list_all"
then
xdt_list_all=y
xdt_with_vendor_model=y
xdt_show_reasons=y
elif test "X$xdt_i" = "X-list_long"
then
xdt_do_list_long=y
elif test "X$xdt_i" = "X-plug_test"
then
xdt_do_plug_test=y
elif test "X$xdt_i" = "X-max_size"
then
xdt_next_is="max_size"
elif test "X$xdt_i" = "X-min_size"
then
xdt_next_is="min_size"
elif test "X$xdt_i" = "X-with_vendor_model"
then
xdt_with_vendor_model=y
elif test "X$xdt_i" = "X-look_for_iso"
then
xdt_look_for_iso=y
elif test "X$xdt_i" = "X-trust_lsblk_udev"
then
xdt_trust_lsblk_udev=y
elif test "X$xdt_i" = "X-with_sudo"
then
xdt_with_sudo=y
elif test "X$xdt_i" = "X-image_file"
then
xdt_next_is="image_file"
elif test "X$xdt_i" = "X-dummy"
then
xdt_dummy_run=y
elif test "X$xdt_i" = "X-dummy_force"
then
xdt_dummy_run=y
xdt_do_write=y
xdt_dummy_force=y
elif test "X$xdt_i" = "X-DO_WRITE"
then
xdt_do_write=y
elif test "X$xdt_i" = "X-no_pacifier"
then
xdt_no_pacifier=y
elif test "X$xdt_i" = "X-version"
then
xdt_print_version
xdt_end_after_setup=y
return 0
elif test "X$xdt_i" = "X-help"
then
xdt_print_usage
xdt_end_after_setup=y
return 0
elif echo "X$xdt_i" | grep -v '^X-' >/dev/null
then
xdt_check_parameter "$xdt_i" device_name || return "$?"
xdt_devs_named=y
xdt_devs="$xdt_devs $xdt_i"
xdt_show_reasons=y
else
echo "$0 : Unknown option: '$xdt_i'" >&2
echo >&2
echo "For a help text run: $0 -help" >&2
return 16
fi
done
xdt_predict_su_power || return "$?"
# Prepare for using dd pacifier if desired and available
# Prepare for using silent dd with GPT backup erasure if available
xdt_dd_bs="bs=1M"
xdt_dd_silent=
if test -n "$xdt_dd_cmd"
then
if test -z "$xdt_no_pacifier" && \
"$xdt_dd_cmd" if=/dev/zero of=/dev/null count=1 \
bs=1M status=progress oflag=dsync 2>/dev/null
then
xdt_dd_bs="bs=1M status=progress oflag=dsync"
fi
if "$xdt_dd_cmd" if=/dev/zero of=/dev/null count=1 bs=512 status=none \
2>/dev/null
then
xdt_dd_silent="status=none"
fi
fi
return 0
}
## Obtain a blank separated list of top-level names which do not look like
## CD, floppy, RAM dev, or loop device.
xdt_collect_devices() {
"$xdt_lsblk_cmd" -d -n -o NAME \
| grep -v '^sr[0-9]' \
| grep -v '^fd[0-9]' \
| grep -v '^zram[0-9]' \
| grep -v '^loop[0-9]' \
| tr '\n\r' ' '
return 0
}
## Let lsblk print extra info for the given devices
xdt_list_long() {
if test -z "$xdt_do_list_long"
then
return 0
fi
$xdt_sudo_cmd "$xdt_lsblk_cmd" -o NAME,SIZE,FSTYPE,TRAN,LABEL \
/dev/"$1"
echo
return 0
}
## Trying to find the desired device by watching plug-in effects
xdt_plug_in_watcher() {
# How long to wait for a first device to appear, how long to wait for more
xdt_wait_span_0=10
xdt_wait_span_1=5
xdt_found_devices=
echo >&2
echo "Caused by option -plug_test: Attempt to find the desired device" >&2
echo "by watching it appear after being plugged in." >&2
echo >&2
echo "Step 1:" >&2
echo "Please make sure that the desired target device is plugged _out_ now." >&2
echo "If it is currently plugged in, make sure to unmount all its filesystems" >&2
echo "and then unplug it." >&2
echo "Press the Enter key when ready." >&2
read xdt_dummy
xdt_old_device_list=' '$(xdt_collect_devices)' '
# <<< Mock-up to save USB socket wear-off by erasing items from old_device_list
# <<< Their presence in new_device_list will let them appear as fresh plugs
# xdt_old_device_list=' '$(echo -n $xdt_old_device_list | sed -e 's/sdc//')' '
echo "Found and noted as _not_ desired: $xdt_old_device_list" >&2
echo >&2
echo "Step 2:" >&2
echo "Please plug in the desired target device and then press the Enter key." >&2
read xdt_dummy
echo -n "Waiting up to $xdt_wait_span_0 seconds for a new device to be listed ..." >&2
xdt_end_time="$(expr $(date +'%s') + "$xdt_wait_span_0")"
while test $(date +'%s') -le "$xdt_end_time"
do
xdt_new_device_list=' '$(xdt_collect_devices)' '
for xdt_i in $xdt_new_device_list
do
if echo "$xdt_old_device_list $xdt_found_devices " \
| grep -F -v ' '"$xdt_i"' ' >/dev/null
then
echo " found: $xdt_i" >&2
xdt_found_devices="$xdt_found_devices $xdt_i"
xdt_end_time=$(expr $(date +'%s') + "$xdt_wait_span_1")
echo -n "Now waiting $xdt_wait_span_1 seconds to let it settle ..." >&2
fi
done
sleep 1
echo -n '.' >&2
done
echo >&2
if test -z "$xdt_found_devices"
then
echo "SORRY: No new candidate device was found." >&2
return 8
fi
xdt_num=$(echo $xdt_found_devices | wc -w)
if test "$xdt_num" -gt 1
then
echo "SORRY: More than one new candidate device appeared: $xdt_found_devices" >&2
return 9
fi
echo "Found and noted as desired device: $xdt_found_devices" >&2
if test -n "$xdt_devs"
then
echo "(-plug_test is overriding device list given by arguments: $xdt_devs )" >&2
fi
if test -n "$xdt_list_all"
then
echo "(-plug_test is overriding -list_all)" >&2
xdt_list_all=
fi
xdt_devs_named=y
xdt_with_vendor_model=y
xdt_show_reasons=y
xdt_devs=$(echo -n $xdt_found_devices)
echo >&2
return 0
}
## Evaluation of available devices and suitability
xdt_list_devices() {
if test -n "$xdt_list_all"
then
xdt_devs=
fi
if test -z "$xdt_devs"
then
# Obtain list of top-level names which do not look like CD, floppy, RAM dev
xdt_devs=$(xdt_collect_devices)
fi
xdt_not_advised=0
for xdt_name in $xdt_devs
do
# Collect reasons
xdt_yucky=
xdt_reasons=
xdt_good_trans=
xdt_good_fs=
xdt_bad_trans=
xdt_bad_fs=
# Unwanted device name patterns
if (echo "$xdt_name" | grep '^sd[a-z][1-9]' >/dev/null) \
|| (echo "$xdt_name" | grep '^mmcblk.*p[0-9]' >/dev/null) \
|| (echo "$xdt_name" | grep '^nvme.*p[0-9]' >/dev/null)
then
xdt_yucky=y
xdt_reasons="${xdt_reasons}looks_like_disk_partition- "
elif echo "$xdt_name" | grep '^sr[0-9]' >/dev/null
then
xdt_yucky=y
xdt_reasons="${xdt_reasons}looks_like_cd_drive- "
elif echo "$xdt_name" | grep '^fd[0-9]' >/dev/null
then
xdt_yucky=y
xdt_reasons="${xdt_reasons}looks_like_floppy- "
elif echo "$xdt_name" | grep '^loop[0-9]' >/dev/null
then
xdt_yucky=y
xdt_reasons="${xdt_reasons}looks_like_loopdev- "
elif echo "$xdt_name" | grep '^zram[0-9]' >/dev/null
then
xdt_yucky=y
xdt_reasons="${xdt_reasons}looks_like_ramdev- "
fi
# >>> recognize the device from which Debian Live booted
# Connection type. Normally by lsblk TRAN, but in case of mmcblk artificial.
if echo "$xdt_name" | grep '^mmcblk[0-9]' >/dev/null
then
xdt_transports="mmcblk"
elif echo "$xdt_name" | grep -F "/" >/dev/null
then
xdt_transports=not_an_expected_name
xdt_reasons="${xdt_reasons}name_with_slash- "
else
xdt_transports=$("$xdt_lsblk_cmd" -n -o TRAN /dev/"$xdt_name")
fi
for xdt_trans in $xdt_transports
do
if test "$xdt_trans" = "usb" || test "$xdt_trans" = "mmcblk"
then
xdt_good_trans="${xdt_trans}+"
elif test -n "$xdt_trans"
then
xdt_bad_trans="$xdt_trans"
xdt_yucky=y
if test "$xdt_transports" = "not_an_expected_name"
then
xdt_dummy=dummy
else
if echo "$xdt_reasons" | grep -F -v "not_usb" >/dev/null
then
xdt_reasons="${xdt_reasons}not_usb- "
fi
fi
fi
done
if test -z "$xdt_good_trans" && test -z "$xdt_bad_trans"
then
xdt_yucky=y
xdt_reasons="${xdt_reasons}no_bus_info- "
elif test -z "$xdt_bad_trans"
then
xdt_reasons="${xdt_reasons}$xdt_good_trans "
fi
# Wanted or unwanted filesystem types
xdt_fstypes=$($xdt_sudo_cmd "$xdt_lsblk_cmd" -n -o FSTYPE \
/dev/"$xdt_name")
if test "$?" -gt 0
then
xdt_fstypes="lsblk_fstype_error"
fi
# Get overview of filesystems
xdt_has_iso=
xdt_has_vfat=
xdt_has_other=
for xdt_fstype in $xdt_fstypes
do
if test "$xdt_fstype" = "iso9660"
then
xdt_has_iso=y
if echo "$xdt_good_fs" | grep -F -v "has_$xdt_fstype" >/dev/null
then
xdt_good_fs="${xdt_good_fs}has_${xdt_fstype}+ "
fi
elif test "$xdt_fstype" = "vfat"
then
xdt_has_vfat=y
if echo "$xdt_good_fs" | grep -F -v "has_$xdt_fstype" >/dev/null
then
xdt_good_fs="${xdt_good_fs}has_${xdt_fstype}+ "
fi
elif test -n "$xdt_fstype"
then
xdt_has_other=y
if echo "$xdt_bad_fs" | grep -F -v "has_$xdt_fstype" >/dev/null
then
xdt_bad_fs="${xdt_bad_fs}has_${xdt_fstype}- "
fi
fi
done
# Decide whether the found filesystems look dispensible enough
xdt_reasons="${xdt_reasons}${xdt_good_fs}${xdt_bad_fs}"
if test "${xdt_bad_fs}${xdt_good_fs}" = "" \
&& test -z "$xdt_have_su_power" && test -z "$xdt_lsblk_fs_wo_su"
then
xdt_yucky=y
xdt_reasons="${xdt_reasons}no_fs_while_not_su- "
elif test -n "$xdt_look_for_iso"
then
if test -n "$xdt_has_iso"
then
xdt_reasons="${xdt_reasons}look_for_iso++ "
else
xdt_yucky=y
xdt_reasons="${xdt_reasons}no_iso9660- "
fi
elif test -n "$xdt_has_other"
then
xdt_yucky=y
fi
# Optional tests for size
if test -n "$xdt_max_size" || test -n "$xdt_min_size"
then
xdt_dev_bytes=$("$xdt_lsblk_cmd" -n -b -o SIZE /dev/"$xdt_name" | head -1)
xdt_size=$(echo "$xdt_dev_bytes" | xdt_round_down_div_million)
if test -z "$xdt_size"
then
xdt_yucky=y
xdt_reasons="${xdt_reasons}lsblk_no_size- "
fi
fi
if test -n "$xdt_max_size" && test -n "$xdt_size"
then
if test "$xdt_size" -gt "$xdt_max_size"
then
xdt_yucky=y
xdt_reasons="${xdt_reasons}size_too_large- "
fi
fi
if test -n "$xdt_min_size" && test -n "$xdt_size"
then
if test "$xdt_size" -lt "$xdt_min_size"
then
xdt_yucky=y
xdt_reasons="${xdt_reasons}size_too_small- "
fi
fi
# Now decide overall and report
xdt_descr=
if test -n "$xdt_with_vendor_model"
then
xdt_descr=": "$("$xdt_lsblk_cmd" -n -o VENDOR,MODEL \
/dev/"$xdt_name" | tr '\n\r' ' ' | tr -s ' ')
fi
if test -n "$xdt_yucky"
then
if test -n "$xdt_show_reasons"
then
echo "$xdt_name : NO : $xdt_reasons$xdt_descr"
xdt_list_long "$xdt_name"
fi
xdt_not_advised=1
else
if test -n "$xdt_show_reasons"
then
echo "$xdt_name : YES : $xdt_reasons$xdt_descr"
xdt_list_long "$xdt_name"
else
echo "$xdt_name"
fi
fi
done
return 0;
}
## Puts list of mounted (sub-)devices of $1 into $mounted_devs
xdt_list_mounted_of() {
xdt_partitions=$("$xdt_lsblk_cmd" -l -n -p -o NAME /dev/"$1" \
| grep -v '^'/dev/"$1"'$' \
| tr '\n\r' ' ')
xdt_mounted_devs=
for xdt_i in /dev/"$1" $xdt_partitions
do
# Show the found mount lines and add their device paths to list
xdt_mount_line=$(mount | grep '^'"$xdt_i"' ')
if test -n "$xdt_mount_line"
then
echo " $xdt_mount_line"
xdt_mounted_devs="$xdt_mounted_devs $xdt_i"
fi
done
return 0
}
## Unmount xdt_mounted_devs (maybe filled by xdt_list_mounted_of)
## $1 : base device name
xdt_unmount() {
if test -z "$xdt_mounted_devs"
then
return 0
fi
for xdt_i in $xdt_mounted_devs
do
if test -n "$xdt_dummy_run"
then
echo " $xdt_sudo_cmd $xdt_umount_cmd $xdt_i"
elif $xdt_sudo_cmd "$xdt_umount_cmd" "$xdt_i"
then
echo "Unmounted: $xdt_i"
else
echo "FAILURE: Non-zero exit value with: $xdt_sudo_cmd $xdt_umount_cmd $xdt_i" >&2
return 7
fi
done
# Check again if any mount points still exist
if test -z "$xdt_dummy_run"
then
xdt_list_mounted_of "$1"
if test -n "$xdt_mounted_devs"
then
echo "FAILURE: $xdt_sudo_cmd $xdt_umount_cmd could not remove all mounts: $xdt_mounted_devs" >&2
return 7
fi
fi
return 0
}
## Does the work of unmounting and dd-ing
## $1 : image file path
## $2 : base device name
xdt_write_image() {
if test -z "$xdt_umount_cmd"
then
echo "No executable program umount found in: $xdt_sudo_x_dir_list" >&2
return 6
fi
echo "Looking for mount points of $2:"
xdt_mounted_devs=
xdt_list_mounted_of "$2"
if test -n "$xdt_dummy_force"
then
echo "AGAINST THE ADVICE BY THIS PROGRAM, a daring user could do:"
xdt_dummy_run=y
elif test -n "$xdt_dummy_run"
then
echo "Would do if not -dummy:"
fi
xdt_unmount "$2" || return "$?"
if test -z "$xdt_dd_cmd"
then
echo "No executable program dd found in: $xdt_sudo_x_dir_list" >&2
return 6
fi
# Erase possible GPT backup table at end of device
# if expr can properly divide device size by 512
xdt_dev_bytes=$("$xdt_lsblk_cmd" -n -b -o SIZE /dev/"${2}" | head -1)
if test -n "$xdt_dev_bytes"
then
xdt_dev_end=$(expr "$xdt_dev_bytes" / 512 2>/dev/null)
if test "$(expr "$xdt_dev_end" '*' 512 2>/dev/null)" = "$xdt_dev_bytes"
then
xdt_dev_end=$(expr "$xdt_dev_end" - 1)
else
xdt_dev_end=
fi
fi
xdt_gpt_erase_line="$xdt_sudo_cmd $xdt_dd_cmd if=/dev/zero of=/dev/'${2}' bs=512 seek='$xdt_dev_end' count=1 $xdt_dd_silent"
xdt_copy_line="$xdt_sudo_cmd $xdt_dd_cmd if='${1}' of=/dev/'${2}' $xdt_dd_bs ; sync"
if test -n "$xdt_dummy_run"
then
if test -n "$xdt_dev_end"
then
echo " $xdt_gpt_erase_line"
fi
echo " $xdt_copy_line"
else
echo "Performing:"
if test -n "$xdt_dev_end"
then
echo " $xdt_gpt_erase_line"
$xdt_sudo_cmd "$xdt_dd_cmd" if=/dev/zero of=/dev/"${2}" bs=512 seek="$xdt_dev_end" count=1 $xdt_dd_silent
fi
echo " $xdt_copy_line"
$xdt_sudo_cmd "$xdt_dd_cmd" if="${1}" of=/dev/"${2}" $xdt_dd_bs
xdt_ret="$?"
sync
if test "$xdt_ret" -ne 0
then
echo "FAILURE: $xdt_sudo_cmd $xdt_dd_cmd was not successful" >&2
return 18
fi
fi
if test -n "$xdt_dummy_force"
then
echo "BE SMART. BE CAUTIOUS. BEWARE."
fi
return 0
}
## Inspects the result of listing, decides whether writing is advisable,
## and starts the write run
xdt_decide_writing()
{
xdt_with_vendor_model=
xdt_show_reasons=
xdt_candidates=$(xdt_list_devices | tr '\n\r' ' ')
xdt_num_cand=$(echo $xdt_candidates | wc -w)
xdt_num_devs=$(echo $xdt_devs| wc -w)
if test -n "$xdt_dummy_force" && test "$xdt_num_devs" -ne 1
then
echo "SORRY: Refusing -dummy_force with not exactly one device given." >&2
return 10
fi
if test -n "$xdt_dummy_force" && test -n "$xdt_dummy_run" \
&& test "$xdt_num_cand" -ne 1
then
# -dummy_force in a situation where the program would normally refuse
echo
echo "Overriding any advice because of -dummy_force"
xdt_candidates="$xdt_devs"
xdt_num_cand=1
elif test -n "$xdt_dummy_force"
then
# Downgrade -dummy_force to -dummy in order to avoid the ugly warning
xdt_dummy_force=
xdt_dummy_run=y
fi
if test "$xdt_num_cand" -eq 1
then
if test -n "$xdt_image_file"
then
if test -n "$xdt_do_plug_test"
then
echo >&2
echo "Step 3:" >&2
if test -n "$xdt_dummy_run"
then
echo "This would be the last chance to abort. Enter the word 'yes' to see -dummy report." >&2
else
echo "Last chance to abort. Enter the word 'yes' to start REAL WRITING." >&2
fi
read xdt_dummy
if test "X$xdt_dummy" = "Xyes" || test "X$xdt_dummy" = "X'yes'" \
|| test "X$xdt_dummy" = 'X"yes"'
then
xdt_dummy=dummy
else
echo "WRITE RUN PREVENTED by user input '$xdt_dummy'." >&2
return 17
fi
fi
xdt_write_image "$xdt_image_file" $xdt_candidates || return "$?"
else
xdt_candidates=$(echo $xdt_candidates)
if test -n "$xdt_dummy_run"
then
echo "Would simulate writing to /dev/$xdt_candidates if an -image_file were given."
else
echo "Would write to /dev/$xdt_candidates if an -image_file were given."
fi
return 0
fi
elif test "$xdt_num_cand" -gt 1
then
echo "WILL NOT WRITE ! More than one candidate found for target device:" >&2
xdt_show_reasons=y
xdt_with_vendor_model=y
xdt_devs="$xdt_candidates"
xdt_list_devices >&2
echo "HINT: Unplug the unwanted devices from the machine," >&2
echo " or work with option -plug_test," >&2
echo " or add the desired name out of {$(echo $xdt_candidates | sed -e 's/ /,/g')} as additional argument." >&2
return 3
else
if test -n "$xdt_devs_named"
then
echo "NO CANDIDATE FOR TARGET DEVICE AMONG THE GIVEN NAMES !" >&2
else
echo "NO CANDIDATE FOR TARGET DEVICE FOUND !" >&2
fi
echo "Overall available devices:" >&2
xdt_list_all=y
xdt_list_long=
xdt_show_reasons=y
xdt_with_vendor_model=y
xdt_list_devices >&2
return 4
fi
return 0
}
## The main function which runs the others in standalone mode
xdt_main()
{
xdt_set_lang_c
xdt_init || return "$?"
xdt_reset_job
xdt_arg_interpreter "$@" || return "$?"
if test -n "$xdt_end_after_setup"
then
return 0
fi
if test -n "$xdt_do_plug_test"
then
xdt_plug_in_watcher || return "$?"
fi
xdt_list_devices || return "$?"
if test -z "$xdt_list_all" && test -n "$xdt_do_write"
then
xdt_decide_writing || return "$?"
fi
if test -n "$xdt_devs_named"
then
return $xdt_not_advised
fi
return 0
}
if test -z "$no_xorriso_dd_target_run"
then
xdt_main "$@" || exit "$?"
fi

View File

@ -1,575 +0,0 @@
.\" Hey, EMACS: -*- nroff -*-
.\"
.\" IMPORTANT NOTE:
.\"
.\" The original of this file is kept in xorriso/xorriso-dd-target.texi
.\" This here was generated by program xorriso/make_xorriso_1
.\"
.\"
.\" 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 XORRISO-DD-TARGET 1 "Version 1.5.7, Jun 07, 2023"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
.\" .nh disable hyphenation
.\" .hy enable hyphenation
.\" .ad l left justify
.\" .ad b justify to both left and right margins
.\" .nf disable filling
.\" .fi enable filling
.\" .br insert line break
.\" .sp <n> insert n+1 empty lines
.\" for manpage-specific macros, see man(7)
.nh
.SH NAME
xorriso\-dd\-target \- Device evaluator and disk image copier for GNU/Linux
.SH SYNOPSIS
.B xorriso-dd-target
[ options ] [ device_names ]
.br
.SH DESCRIPTION
.PP
\fBxorriso\-dd\-target\fR
evaluates block devices of the Linux kernel whether they are suitable targets
for a disk image file and optionally copies the image file to one of them.
.br
It is specialized on the device names of the \fBLinux kernel\fR and uses the
capabilities of util\-linux program \fBlsblk\fR.
Therefore it refuses to run on non\-Linux kernels.
.br
.PP
The main purpose of xorriso\-dd\-target is to inspect the device files
of disk\-like storage media and to judge whether they look like removable
devices with disposable content.
.br
If a single plausible candidate is detected, then the program is willing to
copy a disk image file onto it. This will overwrite or make inaccessible the
previous partition table and all previous data content of the target device.
.br
\fBSuperuser power\fR is often needed for filesystem type identification,
for possible unmounting, and for possible image writing.
Option \fB\-with_sudo\fR offers a way to gain this power only for those
tasks and to run the program elsewise with a normal user's power.
.br
If a particular disk image file is intended as copy source, then
its path should be given by option \-image_file, so that its size can be used
as decision criterion.
.PP
Following are use case descriptions with examples:
.br
- List plain device names
.br
- List all devices with reasoning
.br
- Evaluate particular given devices
.br
- Detect intended device by plugging
.br
- Write image to an advised device
.br
- Show commands for writing to a not advised device
.br
.SS
\fBList plain device names:\fR
.br
The most simple and most boring use case is a program run without device names
and without options \-list_all, \-plug_test, \-DO_WRITE, \-dummy_force.
It prints on standard output (stdout) only the names of advisable devices
without "/dev/" prefix. One name per line and without any reasoning text.
.br
The possible sudo password prompt, the message line about sudo, and the
empty line after it do not go to stdout.
.br
Example:
.br
$ xorriso\-dd\-target \-with_sudo
.br
Testing sudo to possibly get password prompting done now:
.br
[sudo] password for thomas:
.br
sudo /bin/lsblk seems ok.
sde
.SS
\fBList all devices with reasoning:\fR
.br
For the more curious user, there is option \fB\-list_all\fR which prints
the evaluation of each disk\-like device that is listed by program lsblk.
Optical drives, floppy disks, RAM block devices, loop devices are excluded,
though.
.br
Each device is shown by one line of the form
.br
name : advice : reasoning : info
.br
\fBname\fR is the device name without "/dev/" prefix.
.br
\fBadvice\fR is either "YES" or "NO". "YES" indicates that the device
appears to be pluggable disk\-like, not used as system disk or sincere data
storage, and \- if tested \- of sufficient or plausible size.
.br
\fBreasoning\fR is a blank separated list of words with either suffix '+'
for an inviting device property or '\-' for a prohibitive property. Normally
a single '\-' reason disqualifies the device from being advisable. Only if
option \-look_for_iso is given, a reason "has_XYZ\-" can be overridden by
the presence of an ISO 9660 filesystem on the device.
.br
\fBinfo\fR is composed from VENDOR and MODEL as told by lsblk.
.br
Option \fB\-list_long\fR causes with each line an additional listing of
the information provided by lsblk which led to the shown reasons.
.br
Example:
.br
$ xorriso\-dd\-target \-with_sudo \-list_all
.br
...
.br
sda : NO : not_usb\- has_vfat+ has_ext4\- : ATA Samsung SSD 850
.br
sdb : NO : not_usb\- has_swap\- has_ext4\- : ATA WDC WD20EFRX\-68A
.br
sdc : YES : usb+ has_iso9660+ has_vfat+ : Intenso Ultra Line
.br
sdd : NO : usb+ has_iso9660+ has_vfat+ has_ext2\- : SanDisk Cruzer
.SS
\fBEvaluate particular given devices:\fR
.br
If \fBdevice names\fR are given instead of option \-list_all, then only
these devices are inspected. Their result gets listed without the ": info"
part, unless option \fB\-with_vendor_model\fR is given.
.br
Device names must not begin by '\-' and must be single words composed of
the characters [A\-za\-z0\-9_/\-]. They should not contain '/'. E.g. 'sdc' is
valid, '/dev/sdc' is not valid.
.br
If one of the given device names gets not advised, the exit value is 1.
.br
It makes few sense to give device names which are not listed by \-list_all.
.br
Examples:
.br
$ xorriso\-dd\-target \-with_sudo sdc
.br
...
.br
sdc : YES : usb+ has_iso9660+ has_vfat+
.br
$ xorriso\-dd\-target \-with_sudo \-with_vendor_model sdc
.br
...
.br
sdc : YES : usb+ has_iso9660+ has_vfat+ : Intenso Ultra Line
.br
$ xorriso\-dd\-target sdc
.br
sdc : NO : usb+ no_fs_while_not_su\-
.SS
\fBDetect intended device by plugging:\fR
.br
Option \fB\-plug_test\fR triggers an interactive method to unambiguously
determine the intended target device candidate. It consists of 2 or 3 steps.
.br
\fBStep 1\fR is to have the intended storage device \fBunplugged\fR and
to confirm this by pressing the Enter key at the program's prompt. The program
will then assess the list of not wanted devices.
.br
\fBStep 2\fR is to \fBplug in\fR the intended storage device and to
confirm this by pressing the Enter key a second time. The program will wait
up to 10 seconds for a disk\-like storage device which is not in the list of
not wanted devices.
The user may wait with key pressing until the device blinking looks like it
is ready.
.br
Only if a single new device is found, the program will go on as if a single
device name was given. Option \-list_all and any device names given as arguments
will be ignored.
.br
\fBStep 3\fR happens only if options \-DO_WRITE or \-dummy_force are given.
The program asks for a final input of the word 'yes' before real or simulated
writing begins.
.br
Example:
.br
$ xorriso\-dd\-target \-with_sudo \-plug_test
.br
...
.br
Caused by option \-plug_test: Attempt to find the desired device
by watching it appear after being plugged in.
.br
Step 1:
.br
Please make sure that the desired target device is plugged _out_ now.
.br
If it is currently plugged in, make sure to unmount all its filesystems
.br
and then unplug it.
.br
Press the Enter key when ready.
.br
.br
Found and noted as _not_ desired: sda sdb sdc
.br
Step 2:
.br
Please plug in the desired target device and then press the Enter key.
.br
.br
Waiting up to 10 seconds for a new device to be listed ... found: sdd
.br
Now waiting 5 seconds to let it settle .........
.br
Found and noted as desired device: sdd
.br
.br
sdd : NO : usb+ has_iso9660+ has_vfat+ has_ext2\- : SanDisk Cruzer
.SS
\fBWrite image to an advised device:\fR
.br
Only if option \fB\-DO_WRITE\fR is given and \-list_all is not, and if exactly
one advisable device is listed, it really gets overwritten by the file content
of the given \-image_file. In this case the exit value is zero if writing
succeeded, non\-zero else.
.br
Option \fB\-dummy\fR prevents this kind of real action and rather shows the
planned umount and dd commands on stdout.
.br
Example:
.br
$ xorriso\-dd\-target \-with_sudo \-plug_test \-DO_WRITE \\
.br
\-image_file debian\-live\-10.0.0\-amd64\-xfce.iso
.br
... sudo messages and above plug test steps 1 and 2 ...
.br
.br
sde : YES : usb+ has_iso9660+ has_vfat+
.br
Step 3:
.br
Last chance to abort. Enter the word 'yes' to start REAL WRITING.
.br
yes
.br
Looking for mount points of sde:
.br
/dev/sde1 on /mnt/iso type iso9660 (ro,relatime)
.br
/dev/sde2 on /mnt/fat type vfat (rw,...,errors=remount\-ro)
.br
Unmounted: /dev/sde1
.br
Unmounted: /dev/sde2
.br
Performing:
.br
sudo /bin/dd if=/dev/zero of=/dev/'sde' bs=512 seek='245759999'
.br
count=1 status=none
.br
sudo /bin/dd if='debian\-live\-10.0.0\-amd64\-xfce.iso' of=/dev/'sde'
.br
bs=1M status=progress oflag=dsync ; sync
.br
... dd messages ...
.br
The first dd run shall erase a possible GPT backup header. It is performed only
if the local program "expr" can deal with the byte size of the device.
.SS
\fBShow commands for writing to a not advised device:\fR
.br
There should be no way to convince xorriso\-dd\-target of writing to a target
device which it does not deem advisable. Please report any set of arguments
that can be misused for that.
.br
The outmost complicity to potentially unwise actions is offered by
option \fB\-dummy_force\fR. If given together with a single device name or
with option \-plug_test it will act like \-dummy \-DO_WRITE with this device,
even if it looks not advisable. I.e. it will show the shell commands which the
program does not dare to perform.
.br
Example:
.br
$ xorriso\-dd\-target \-with_sudo \-list_long \-dummy_force sdd \\
.br
\-image_file debian\-live\-10.0.0\-amd64\-xfce.iso
.br
...
.br
sdd : NO : usb+ has_iso9660+ has_vfat+ has_ext2\-
.br
NAME SIZE FSTYPE TRAN LABEL
.br
sdd 3.8G iso9660 usb d\-live 9.5.0 xf i386
.br
|\-sdd1 1.9G iso9660 d\-live 9.5.0 xf i386
.br
|\-sdd2 320K vfat
.br
`\-sdd3 512M ext2
.br
.br
Overriding any advice because of \-dummy_force
.br
Looking for mount points of sdd:
.br
/dev/sdd1 on /mnt/iso type iso9660 (ro,relatime)
.br
/dev/sdd2 on /mnt/fat type vfat (rw,...,errors=remount\-ro)
.br
/dev/sdd3 on /mnt/ext type ext2 (rw,relatime)
.br
AGAINST THE ADVICE BY THIS PROGRAM, a daring user could do:
.br
sudo /bin/umount /dev/sdd1
.br
sudo /bin/umount /dev/sdd2
.br
sudo /bin/umount /dev/sdd3
.br
sudo /bin/dd if=/dev/zero of=/dev/'sdd' bs=512 seek='7864318'
.br
count=1 status=none
.br
sudo /bin/dd if='debian\-live\-10.0.0\-amd64\-xfce.iso' of=/dev/sdd
.br
bs=1M status=progress oflag=dsync ; sync
.br
BE SMART. BE CAUTIOUS. BEWARE.
.SS
\fBAlphabetical List of positive and negative reasons:\fR
.br
As stated with use case "List all devices", \fBreasons\fR are words with
either suffix '+' for an inviting device property or '\-' for a prohibitive
property.
.br
Normally a single '\-' reason disqualifies the device from being advisable.
.br
.PP
\fBhas_XYZ\-\fR
.br
A filesystem of type XYZ is detected on base device or partition and is
spoiling the impression of a device with disposable content.
.br
\fBhas_iso9660+\fR
.br
An ISO 9660 filesystem is detected.
.br
\fBhas_vfat+\fR
.br
A FAT (MS\-DOS\-like) filesystem is detected.
.br
\fBlook_for_iso++\fR
.br
Option \-look_for_iso is given and an ISO 9660 filesystem is detected.
This reason overrides any "has_XYZ\-" reason.
.br
\fBlooks_like_cd_drive\-\fR
.br
A given device name looks like the name of an optical drive: sr[0\-9]*.
Use program \fBxorrecord\fR for this kind of devices.
.br
\fBlooks_like_disk_partition\-\fR
.br
A given device name looks like the name of a partition. Expected are names
of base devices, like "sde", not of their partitions, like "sde1".
.br
\fBlooks_like_floppy\-\fR
.br
A given device name looks like the name of a floppy disk drive: fd[0\-9]*.
.br
\fBlooks_like_loopdev\-\fR
.br
A given device name looks like the name of a loop device: loop[0\-9]*.
.br
\fBlooks_like_ramdev\-\fR
.br
A given device name looks like the name of a RAM block device: zram[0\-9]*.
.br
\fBlsblk_no_size\-\fR
.br
A size test is given by \-max_size, \-min_size, or \-image_file but the size of
the device cannot be inquired by lsblk. This is supposed to happen only with
given inappropriate device names.
.br
\fBmmcblk+\fR
.br
The device name looks like a directly connected memory card.
.br
\fBname_with_slash\-\fR
.br
A given device name contains '/' characters.
.br
\fBno_bus_info\-\fR
.br
The device is not a memory card and lsblk reports nothing about the way how
it is connected to the computer.
.br
\fBno_fs_while_not_su\-\fR
.br
No filesystem is reported by lsblk and the program does not believe to have
run it with superuser powers. There is the risk that lsblk silently failed
to detect existing filesystems.
.br
\fBno_iso9660\-\fR
.br
Option \-look_for_iso is given but no ISO 9660 filesystem is detected.
.br
\fBnot_usb\-\fR
.br
The device is not a memory card and lsblk reports that it is connected by
something other than USB.
.br
\fBsize_too_large\-\fR
.br
Option \-max_size is given with a size smaller than the size of the device.
.br
\fBsize_too_small\-\fR
.br
Option \-min_size or \-image_file is given with size or file size larger than
the size of the device.
.br
\fBusb+\fR
.br
The device is reported by lsblk to be connected via USB.
.br
.SS
.br
.SH OPTIONS
.br
.PP
.TP
\fB\-plug_test\fR
Find the target device by asking the user to press the Enter key when the
desired target is _not_ plugged in, to then plug it in, and to press Enter
again.
.br
This overrides device names and option \-list_all.
The found device is then shown with advice, vendor, and model.
.br
Option \-DO_WRITE is obeyed if given.
In this case, the word 'yes' has to be entered to let unmounting and writing
begin.
.TP
\fB\-list_all\fR
Print list of all found devices with advice, vendor and model. One per line.
Ignore any device names. Ignore \-DO_WRITE.
.TP
\fB\-list_long\fR
After each result line, which shows reasons, add an additional listing of
the information provided by lsblk which led to the reasons and add an empty
line.
.TP
\fB\-with_vendor_model\fR
Print vendor and model with each submitted device name.
.TP
\fB\-max_size\fR n[M|G|T]
Set the upper byte size limit for advisable devices. Plain numbers get rounded
down to full millions. As suffix are recognized: M = million, G = billion,
T = trillion.
.br
Be generous to avoid problems with GB < GiB.
.TP
\fB\-min_size\fR n[M|G|T]
Set the lower byte size limit for advisable devices. After processing like
with \-max_size, one million gets added to the size limit.
.TP
\fB\-look_for_iso\fR
Demand presence of an ISO 9660 filesystem. If so, then any further filesystem
type is acceptable on that device.
.br
If this option is missing, only ISO 9660 and VFAT filesystems are accepted.
.TP
\fB\-with_sudo\fR
Run 'lsblk \-o FSTYPE' by sudo. If no filesystems are detected on a device while
the program has no superuser power, then the device is not advised. Option
\-with_sudo avoids this refusal without the need to run the whole
program as superuser.
.br
If \-DO_WRITE \-with_sudo is given, then the programs umount and dd will be run
by sudo, too.
.TP
\fB\-trust_lsblk_udev\fR
Suppress the reason no_fs_while_not_su\- if lsblk is linked with libudev.so.
In this case it is likely that lsblk can retrieve FSTYPE even if run
by a non\-priviledged user.
.br
This option is intended for use by frontend programs which are certain
that they do not encounter a udev\-using version of lsblk which nevertheless
fails to detect existing filesystems. Human users should better acquire
superuser powers if reason no_fs_while_not_su\- is reported.
.TP
\fB\-image_file\fR PATH
Set the path of the image file which shall be written to a device. Its size
will be set as \-min_size.
.TP
\fB\-DO_WRITE\fR
Write the given \-image_file to the one advisable device that is found. If more
than one such device is found, then they get listed but no writing happens.
.br
In this case, to get a real write run, consider unplugging unneeded devices,
or using option \-plug_test, or a re\-run with one of the advised device names
as additional argument.
.TP
\fB\-no_pacifier\fR
Do not use dd options to print progress messages and to perform synchronized
output. These options are used by default if program dd offers progress
messages.
.TP
\fB\-dummy\fR
Report the \-DO_WRITE actions but do not perform them.
.TP
\fB\-dummy_force\fR
If a single device name is given, do a run of \-dummy \-DO_WRITE even against
the advice of this program. This probably shows you ways to shoot your own
foot.
.TP
\fB\-version\fR
Print the program name, version text, and timestamp to stdout and then end
the program.
.TP
\fB\-help\fR
Print the help text to stdout and then end the program.
.SH EXAMPLES
Examples are given in the above description of use cases.
.SH FILES
For now, no files are defined for configuration.
.SH SEE ALSO
.BR lsblk(8),
.BR umount(8),
.BR dd(1),
.BR xorrecord(1)
.SH BUGS
To report bugs, request help, or suggest enhancements for
\fBxorriso\-dd\-target\fR,
please send electronic mail to the public list <bug\-xorriso@gnu.org>.
If more privacy is desired, mail to <scdbackup@gmx.net>.
.br
Please describe what you expect the program to do, the program arguments
which you used, the messages of \fBxorriso\-dd\-target\fR, and the
undesirable outcome of your program run.
.br
Expect to get asked more questions before solutions can be proposed.
.SH AUTHOR
Thomas Schmitt <scdbackup@gmx.net>
.br
for libburnia\-project.org
.SH COPYRIGHT
Copyright (c) 2019 \- 2023 Thomas Schmitt
.br
Permission is granted to distribute this text freely. It shall only be
modified in sync with the technical properties of xorriso\-dd\-target.
If you make use of the license to derive modified versions of xorriso\-dd\-target
then you are entitled to modify this text under that same license.
.SH CREDITS
\fBxorriso\-dd\-target\fR is developed in cooperation with Nio Wiklund alias
sudodus.

View File

@ -1,578 +0,0 @@
This is xorriso-dd-target.info, produced by makeinfo version 5.2 from
xorriso-dd-target.texi.
xorriso-dd-target - Device evaluator and disk image copier for GNU/Linux
Copyright (C) 2023 Thomas Schmitt
Permission is granted to distribute this text freely.
INFO-DIR-SECTION Archiving
START-INFO-DIR-ENTRY
* Xorriso-dd-target: (xorriso-dd-target). Device evaluator and disk image copier for GNU/Linux
END-INFO-DIR-ENTRY

File: xorriso-dd-target.info, Node: Top, Next: Overview, Up: (dir)
xorriso-dd-target 1.5.7
***********************
xorriso-dd-target - Device evaluator and disk image copier for GNU/Linux
* Menu:
* Overview:: Overview
* Options:: Options
* Examples:: Examples
* Files:: Files
* Seealso:: See also
* Bugreport:: Reporting bugs
* Legal:: Author, Copyright, Credits
* CommandIdx:: Alphabetic Option List
* ConceptIdx:: Alphabetic List of Concepts and Objects

File: xorriso-dd-target.info, Node: Overview, Next: Options, Prev: Top, Up: Top
1 Overview
**********
'xorriso-dd-target' evaluates block devices of the Linux kernel whether
they are suitable targets for a disk image file and optionally copies
the image file to one of them.
It is specialized on the device names of the *Linux kernel* and uses the
capabilities of util-linux program *lsblk*. Therefore it refuses to run
on non-Linux kernels.
The main purpose of xorriso-dd-target is to inspect the device files
of disk-like storage media and to judge whether they look like removable
devices with disposable content.
If a single plausible candidate is detected, then the program is willing
to copy a disk image file onto it. This will overwrite or make
inaccessible the previous partition table and all previous data content
of the target device.
*Superuser power* is often needed for filesystem type identification,
for possible unmounting, and for possible image writing. Option
*-with_sudo* offers a way to gain this power only for those tasks and to
run the program elsewise with a normal user's power.
If a particular disk image file is intended as copy source, then its
path should be given by option -image_file, so that its size can be used
as decision criterion.
Following are use case descriptions with examples:
* Menu:
* Simplenames:: List plain device names
* Listall:: List all devices with reasoning
* Givendevices:: Evaluate particular given devices
* Plugtest:: Detect intended device by plugging
* Dowrite:: Write image to an advised device
* Unwise:: Show commands for writing to a not advised device
* Reasons:: Alphabetical list of positive and negative reasons

File: xorriso-dd-target.info, Node: Simplenames, Next: Listall, Prev: Overview, Up: Overview
2 List plain device names
*************************
The most simple and most boring use case is a program run without device
names and without options -list_all, -plug_test, -DO_WRITE,
-dummy_force. It prints on standard output (stdout) only the names of
advisable devices without "/dev/" prefix. One name per line and without
any reasoning text.
The possible sudo password prompt, the message line about sudo, and the
empty line after it do not go to stdout.
Example:
$ xorriso-dd-target -with_sudo
Testing sudo to possibly get password prompting done now:
[sudo] password for thomas:
sudo /bin/lsblk seems ok.
sde

File: xorriso-dd-target.info, Node: Listall, Next: Givendevices, Prev: Simplenames, Up: Overview
3 List all devices with reasoning
*********************************
For the more curious user, there is option *-list_all* which prints the
evaluation of each disk-like device that is listed by program lsblk.
Optical drives, floppy disks, RAM block devices, loop devices are
excluded, though.
Each device is shown by one line of the form
name : advice : reasoning : info
*name* is the device name without "/dev/" prefix.
*advice* is either "YES" or "NO". "YES" indicates that the device
appears to be pluggable disk-like, not used as system disk or sincere
data storage, and - if tested - of sufficient or plausible size.
*reasoning* is a blank separated list of words with either suffix '+'
for an inviting device property or '-' for a prohibitive property.
Normally a single '-' reason disqualifies the device from being
advisable. Only if option -look_for_iso is given, a reason "has_XYZ-"
can be overridden by the presence of an ISO 9660 filesystem on the
device.
*info* is composed from VENDOR and MODEL as told by lsblk.
Option *-list_long* causes with each line an additional listing of the
information provided by lsblk which led to the shown reasons.
Example:
$ xorriso-dd-target -with_sudo -list_all
...
sda : NO : not_usb- has_vfat+ has_ext4- : ATA Samsung SSD 850
sdb : NO : not_usb- has_swap- has_ext4- : ATA WDC WD20EFRX-68A
sdc : YES : usb+ has_iso9660+ has_vfat+ : Intenso Ultra Line
sdd : NO : usb+ has_iso9660+ has_vfat+ has_ext2- : SanDisk Cruzer

File: xorriso-dd-target.info, Node: Givendevices, Next: Plugtest, Prev: Listall, Up: Overview
4 Evaluate particular given devices
***********************************
If *device names* are given instead of option -list_all, then only these
devices are inspected. Their result gets listed without the ": info"
part, unless option *-with_vendor_model* is given.
Device names must not begin by '-' and must be single words composed of
the characters [A-za-z0-9_/-]. They should not contain '/'. E.g.
'sdc' is valid, '/dev/sdc' is not valid.
If one of the given device names gets not advised, the exit value is 1.
It makes few sense to give device names which are not listed by
-list_all.
Examples:
$ xorriso-dd-target -with_sudo sdc
...
sdc : YES : usb+ has_iso9660+ has_vfat+
$ xorriso-dd-target -with_sudo -with_vendor_model sdc
...
sdc : YES : usb+ has_iso9660+ has_vfat+ : Intenso Ultra Line
$ xorriso-dd-target sdc
sdc : NO : usb+ no_fs_while_not_su-

File: xorriso-dd-target.info, Node: Plugtest, Next: Dowrite, Prev: Givendevices, Up: Overview
5 Detect intended device by plugging
************************************
Option *-plug_test* triggers an interactive method to unambiguously
determine the intended target device candidate. It consists of 2 or 3
steps.
*Step 1* is to have the intended storage device *unplugged* and to
confirm this by pressing the Enter key at the program's prompt. The
program will then assess the list of not wanted devices.
*Step 2* is to *plug in* the intended storage device and to confirm this
by pressing the Enter key a second time. The program will wait up to 10
seconds for a disk-like storage device which is not in the list of not
wanted devices. The user may wait with key pressing until the device
blinking looks like it is ready.
Only if a single new device is found, the program will go on as if a
single device name was given. Option -list_all and any device names
given as arguments will be ignored.
*Step 3* happens only if options -DO_WRITE or -dummy_force are given.
The program asks for a final input of the word 'yes' before real or
simulated writing begins.
Example:
$ xorriso-dd-target -with_sudo -plug_test
...
Caused by option -plug_test: Attempt to find the desired device by
watching it appear after being plugged in.
Step 1:
Please make sure that the desired target device is plugged _out_ now.
If it is currently plugged in, make sure to unmount all its filesystems
and then unplug it.
Press the Enter key when ready.
Found and noted as _not_ desired: sda sdb sdc
Step 2:
Please plug in the desired target device and then press the Enter key.
Waiting up to 10 seconds for a new device to be listed ... found:
sdd
Now waiting 5 seconds to let it settle .........
Found and noted as desired device: sdd
sdd : NO : usb+ has_iso9660+ has_vfat+ has_ext2- : SanDisk Cruzer

File: xorriso-dd-target.info, Node: Dowrite, Next: Unwise, Prev: Plugtest, Up: Overview
6 Write image to an advised device
**********************************
Only if option *-DO_WRITE* is given and -list_all is not, and if exactly
one advisable device is listed, it really gets overwritten by the file
content of the given -image_file. In this case the exit value is zero
if writing succeeded, non-zero else.
Option *-dummy* prevents this kind of real action and rather shows the
planned umount and dd commands on stdout.
Example:
$ xorriso-dd-target -with_sudo -plug_test -DO_WRITE \
-image_file debian-live-10.0.0-amd64-xfce.iso
... sudo messages and above plug test steps 1 and 2 ...
sde : YES : usb+ has_iso9660+ has_vfat+
Step 3:
Last chance to abort. Enter the word 'yes' to start REAL WRITING.
yes
Looking for mount points of sde:
/dev/sde1 on /mnt/iso type iso9660 (ro,relatime)
/dev/sde2 on /mnt/fat type vfat (rw,...,errors=remount-ro)
Unmounted: /dev/sde1
Unmounted: /dev/sde2
Performing:
sudo /bin/dd if=/dev/zero of=/dev/'sde' bs=512 seek='245759999'
count=1 status=none
sudo /bin/dd if='debian-live-10.0.0-amd64-xfce.iso' of=/dev/'sde'
bs=1M status=progress oflag=dsync ; sync
... dd messages ...
The first dd run shall erase a possible GPT backup header. It is
performed only if the local program "expr" can deal with the byte size
of the device.

File: xorriso-dd-target.info, Node: Unwise, Next: Reasons, Prev: Dowrite, Up: Overview
7 Show commands for writing to a not advised device
***************************************************
There should be no way to convince xorriso-dd-target of writing to a
target device which it does not deem advisable. Please report any set
of arguments that can be misused for that.
The outmost complicity to potentially unwise actions is offered by
option *-dummy_force*. If given together with a single device name or
with option -plug_test it will act like -dummy -DO_WRITE with this
device, even if it looks not advisable. I.e. it will show the shell
commands which the program does not dare to perform.
Example:
$ xorriso-dd-target -with_sudo -list_long -dummy_force sdd \
-image_file debian-live-10.0.0-amd64-xfce.iso
...
sdd : NO : usb+ has_iso9660+ has_vfat+ has_ext2-
NAME SIZE FSTYPE TRAN LABEL
sdd 3.8G iso9660 usb d-live 9.5.0 xf i386
|-sdd1 1.9G iso9660 d-live 9.5.0 xf i386
|-sdd2 320K vfat
'-sdd3 512M ext2
Overriding any advice because of -dummy_force
Looking for mount points of sdd:
/dev/sdd1 on /mnt/iso type iso9660 (ro,relatime)
/dev/sdd2 on /mnt/fat type vfat (rw,...,errors=remount-ro)
/dev/sdd3 on /mnt/ext type ext2 (rw,relatime)
AGAINST THE ADVICE BY THIS PROGRAM, a daring user could do:
sudo /bin/umount /dev/sdd1
sudo /bin/umount /dev/sdd2
sudo /bin/umount /dev/sdd3
sudo /bin/dd if=/dev/zero of=/dev/'sdd' bs=512 seek='7864318'
count=1 status=none
sudo /bin/dd if='debian-live-10.0.0-amd64-xfce.iso' of=/dev/sdd
bs=1M status=progress oflag=dsync ; sync
BE SMART. BE CAUTIOUS. BEWARE.

File: xorriso-dd-target.info, Node: Reasons, Next: Options, Prev: Unwise, Up: Overview
8 Alphabetical list of positive and negative reasons
****************************************************
As stated with use case "List all devices", *reasons* are words with
either suffix '+' for an inviting device property or '-' for a
prohibitive property.
Normally a single '-' reason disqualifies the device from being
advisable.
8.1 Reasons
===========
*has_XYZ-*
A filesystem of type XYZ is detected on base device or partition and is
spoiling the impression of a device with disposable content.
*has_iso9660+*
An ISO 9660 filesystem is detected.
*has_vfat+*
A FAT (MS-DOS-like) filesystem is detected.
*look_for_iso++*
Option -look_for_iso is given and an ISO 9660 filesystem is detected.
This reason overrides any "has_XYZ-" reason.
*looks_like_cd_drive-*
A given device name looks like the name of an optical drive: sr[0-9]*.
Use program *xorrecord* for this kind of devices.
*looks_like_disk_partition-*
A given device name looks like the name of a partition. Expected are
names of base devices, like "sde", not of their partitions, like "sde1".
*looks_like_floppy-*
A given device name looks like the name of a floppy disk drive:
fd[0-9]*.
*looks_like_loopdev-*
A given device name looks like the name of a loop device: loop[0-9]*.
*looks_like_ramdev-*
A given device name looks like the name of a RAM block device:
zram[0-9]*.
*lsblk_no_size-*
A size test is given by -max_size, -min_size, or -image_file but the
size of the device cannot be inquired by lsblk. This is supposed to
happen only with given inappropriate device names.
*mmcblk+*
The device name looks like a directly connected memory card.
*name_with_slash-*
A given device name contains '/' characters.
*no_bus_info-*
The device is not a memory card and lsblk reports nothing about the way
how it is connected to the computer.
*no_fs_while_not_su-*
No filesystem is reported by lsblk and the program does not believe to
have run it with superuser powers. There is the risk that lsblk
silently failed to detect existing filesystems.
*no_iso9660-*
Option -look_for_iso is given but no ISO 9660 filesystem is detected.
*not_usb-*
The device is not a memory card and lsblk reports that it is connected
by something other than USB.
*size_too_large-*
Option -max_size is given with a size smaller than the size of the
device.
*size_too_small-*
Option -min_size or -image_file is given with size or file size larger
than the size of the device.
*usb+*
The device is reported by lsblk to be connected via USB.

File: xorriso-dd-target.info, Node: Options, Next: Examples, Prev: Overview, Up: Top
9 Options
*********
-plug_test
Find the target device by asking the user to press the Enter key
when the desired target is _not_ plugged in, to then plug it in,
and to press Enter again.
This overrides device names and option -list_all. The found device
is then shown with advice, vendor, and model.
Option -DO_WRITE is obeyed if given. In this case, the word 'yes'
has to be entered to let unmounting and writing begin.
-list_all
Print list of all found devices with advice, vendor and model. One
per line. Ignore any device names. Ignore -DO_WRITE.
-list_long
After each result line, which shows reasons, add an additional
listing of the information provided by lsblk which led to the
reasons and add an empty line.
-with_vendor_model
Print vendor and model with each submitted device name.
-max_size n[M|G|T]
Set the upper byte size limit for advisable devices. Plain numbers
get rounded down to full millions. As suffix are recognized: M =
million, G = billion, T = trillion.
Be generous to avoid problems with GB < GiB.
-min_size n[M|G|T]
Set the lower byte size limit for advisable devices. After
processing like with -max_size, one million gets added to the size
limit.
-look_for_iso
Demand presence of an ISO 9660 filesystem. If so, then any further
filesystem type is acceptable on that device.
If this option is missing, only ISO 9660 and VFAT filesystems are
accepted.
-with_sudo
Run 'lsblk -o FSTYPE' by sudo. If no filesystems are detected on a
device while the program has no superuser power, then the device is
not advised. Option -with_sudo avoids this refusal without the
need to run the whole program as superuser.
If -DO_WRITE -with_sudo is given, then the programs umount and dd
will be run by sudo, too.
-trust_lsblk_udev
Suppress the reason no_fs_while_not_su- if lsblk is linked with
libudev.so. In this case it is likely that lsblk can retrieve
FSTYPE even if run by a non-priviledged user.
This option is intended for use by frontend programs which are
certain that they do not encounter a udev-using version of lsblk
which nevertheless fails to detect existing filesystems. Human
users should better acquire superuser powers if reason
no_fs_while_not_su- is reported.
-image_file PATH
Set the path of the image file which shall be written to a device.
Its size will be set as -min_size.
-DO_WRITE
Write the given -image_file to the one advisable device that is
found. If more than one such device is found, then they get listed
but no writing happens.
In this case, to get a real write run, consider unplugging unneeded
devices, or using option -plug_test, or a re-run with one of the
advised device names as additional argument.
-no_pacifier
Do not use dd options to print progress messages and to perform
synchronized output. These options are used by default if program
dd offers progress messages.
-dummy
Report the -DO_WRITE actions but do not perform them.
-dummy_force
If a single device name is given, do a run of -dummy -DO_WRITE even
against the advice of this program. This probably shows you ways
to shoot your own foot.
-version
Print the program name, version text, and timestamp to stdout and
then end the program.
-help
Print the help text to stdout and then end the program.

File: xorriso-dd-target.info, Node: Examples, Next: Files, Prev: Options, Up: Top
10 Examples
***********
Examples are given in the above description of use cases.

File: xorriso-dd-target.info, Node: Files, Next: Seealso, Prev: Examples, Up: Top
11 Files
********
For now, no files are defined for configuration.

File: xorriso-dd-target.info, Node: Seealso, Next: Bugreport, Prev: Files, Up: Top
12 See also
***********
lsblk(8), sudo(8), umount(8), dd(1), xorrecord(1)

File: xorriso-dd-target.info, Node: Bugreport, Next: Legal, Prev: Seealso, Up: Top
13 Reporting bugs
*****************
To report bugs, request help, or suggest enhancements for
'xorriso-dd-target', please send electronic mail to the public list
<bug-xorriso@gnu.org>. If more privacy is desired, mail to
<scdbackup@gmx.net>.
Please describe what you expect the program to do, the program
arguments which you used, the messages of 'xorriso-dd-target', and the
undesirable outcome of your program run.
Expect to get asked more questions before solutions can be proposed.

File: xorriso-dd-target.info, Node: Legal, Next: CommandIdx, Prev: Bugreport, Up: Top
14 Author, Copyright, Credits
*****************************
14.1 Author
===========
Thomas Schmitt <scdbackup@gmx.net>
for libburnia-project.org
14.2 Copyright
==============
Copyright (c) 2019 - 2023 Thomas Schmitt
Permission is granted to distribute this text freely. It shall only be
modified in sync with the technical properties of xorriso-dd-target. If
you make use of the license to derive modified versions of
xorriso-dd-target then you are entitled to modify this text under that
same license.
14.3 Credits
============
'xorriso-dd-target' is developed in cooperation with Nio Wiklund alias
sudodus.

File: xorriso-dd-target.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top
15 Alphabetic Options List
**************************
[index]
* Menu:
* -DO_WRITE write image file to device: Options. (line 57)
* -dummy report but do not perform: Options. (line 68)
* -dummy_force show raw copy commands: Options. (line 70)
* -help print help text to stdout: Options. (line 77)
* -image_file set path of disk image file: Options. (line 54)
* -list_all print list of disk devices: Options. (line 15)
* -list_long print extra device info: Options. (line 18)
* -look_for_iso demand presence of ISO 9660: Options. (line 33)
* -max_size set size limit for device: Options. (line 24)
* -min_size set size limit for device: Options. (line 29)
* -no_pacifier do not show dd progress: Options. (line 64)
* -plug_test detect target device plugging: Options. (line 7)
* -trust_lsblk_udev suppress no_fs_while_not_su-: Options. (line 45)
* -version print version text to stdout: Options. (line 74)
* -with_sudo run lsblk, umount, dd by sudo: Options. (line 38)
* -with_vendor_model add drive info to advice: Options. (line 22)

File: xorriso-dd-target.info, Node: ConceptIdx, Next: Top, Prev: CommandIdx, Up: Top
16 Alphabetic List of Concepts and Objects
******************************************
[index]
* Menu:
* Bugs, reporting: Bugreport. (line 6)
* dd progress, do not show, -no_pacifier: Options. (line 64)
* Device info, print extra, -list_long: Options. (line 18)
* Device size, set limit, -max_size: Options. (line 24)
* Device size, set limit, -min_size: Options. (line 29)
* Disk devices, print list, -list_all: Options. (line 15)
* disk image file, set path, -image_file: Options. (line 54)
* disk image file, write to device, -DO_WRITE: Options. (line 57)
* Drive info, add to advice, -with_vendor_model: Options. (line 22)
* help text, print to stdout, -help: Options. (line 77)
* ISO 9660, demand presence on target, -look_for_iso: Options. (line 33)
* lsblk, umount, dd, run by sudo, -with_sudo: Options. (line 38)
* only report, do not perform, -dummy: Options. (line 68)
* Problems, reporting: Bugreport. (line 6)
* raw copy commands, show, -dummy_force: Options. (line 70)
* Reasons, list of: Reasons. (line 6)
* suppress no_fs_while_not_su-, -trust_lsblk_udev: Options. (line 45)
* Target device, detect by plugging, -plug_test: Options. (line 7)
* Use case, detect intended device by plugging: Plugtest. (line 6)
* Use case, evaluate particular given devices: Givendevices. (line 6)
* Use case, list advisable device names: Simplenames. (line 6)
* Use case, list all devices with reasoning: Listall. (line 6)
* Use case, show commands for writing to a not advised device: Unwise.
(line 6)
* Use case, write image to an advised device: Dowrite. (line 6)
* version text, print to stdout, -version: Options. (line 74)
* xorriso-dd-target, options: Options. (line 6)

Tag Table:
Node: Top429
Node: Overview996
Node: Simplenames2789
Node: Listall3513
Node: Givendevices5086
Node: Plugtest6050
Node: Dowrite7956
Node: Unwise9337
Node: Reasons10959
Node: Options13540
Node: Examples17148
Node: Files17321
Node: Seealso17479
Node: Bugreport17645
Node: Legal18232
Node: CommandIdx18943
Node: ConceptIdx20282

End Tag Table

View File

@ -1,754 +0,0 @@
\input texinfo @c -*-texinfo-*-
@c %**start of header
@setfilename xorriso-dd-target.info
@settitle GNU xorriso-dd-target 1.5.7
@c %**end of header
@c
@c man-ignore-lines begin
@dircategory Archiving
@direntry
* Xorriso-dd-target: (xorriso-dd-target). Device evaluator and disk image copier for GNU/Linux
@end direntry
@c man-ignore-lines end
@c
@c Notes about embedded man page:
@c This texinfo code contains the necessary info to produce a man page.
@c One can produce it by applying the following rules:
@c The first line gets discarded.
@c Line start "@c man " will become "", the remainder is put out unaltered.
@c Lines "@*" will be converted to ".br"
@c "@c man-ignore-lines N" will discard N following lines.
@c "@c man-ignore-lines begin" discards all following lines
@c up to "@c man-ignore-lines end".
@c Line blocks of "@menu" "@end menu" will be discarded.
@c "@item word words" becomes "\fBword\fR words".
@c @b{...}, @command{...}, @dfn{...}, @emph{...}, @strong{...}
@c get mapped to \fB...\fR .
@c @abbr{...}, @code{...}, @file{...}, @i{...}, @option{...}, @r{...},
@c @ref{...}, @samp{...},@var{...}, get mapped to ... .
@c @ref{...}, @xref{...} get mapped to empty text.
@c @email{...} gets mapped to <...> .
@c Mapped {...} content is subject to the rules except {...} mapping.
@c @minus{} will become "-".
@c @@ , @{, @} will get stripped of their first @.
@c Other lines which begin by "@" will be discarded.
@c In lines not stemming from "@c man", "\" becomes "\\"
@c "-" which are not preceded by an uneven number of "\" will get
@c prepended one "\".
@c
@c
@c man .\" Hey, EMACS: -*- nroff -*-
@c man .\"
@c man .\" IMPORTANT NOTE:
@c man .\"
@c man .\" The original of this file is kept in xorriso/xorriso-dd-target.texi
@c man .\" This here was generated by program xorriso/make_xorriso_1
@c man .\"
@c man .\"
@c man .\" First parameter, NAME, should be all caps
@c man .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
@c man .\" other parameters are allowed: see man(7), man(1)
@c man .TH XORRISO-DD-TARGET 1 "Version 1.5.7, Jun 07, 2023"
@c man .\" Please adjust this date whenever revising the manpage.
@c man .\"
@c man .\" Some roff macros, for reference:
@c man .\" .nh disable hyphenation
@c man .\" .hy enable hyphenation
@c man .\" .ad l left justify
@c man .\" .ad b justify to both left and right margins
@c man .\" .nf disable filling
@c man .\" .fi enable filling
@c man .\" .br insert line break
@c man .\" .sp <n> insert n+1 empty lines
@c man .\" for manpage-specific macros, see man(7)
@c man .nh
@c man-ignore-lines begin
@copying
xorriso-dd-target - Device evaluator and disk image copier for GNU/Linux
Copyright @copyright{} 2023 Thomas Schmitt
@quotation
Permission is granted to distribute this text freely.
@end quotation
@end copying
@c man-ignore-lines end
@titlepage
@title Manual of GNU xorriso companion xorriso-dd-target 1.5.7
@author Thomas Schmitt
@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage
@contents
@ifnottex
@node Top
@top xorriso-dd-target 1.5.7
@c man-ignore-lines 1
@c man .SH NAME
xorriso-dd-target - Device evaluator and disk image copier for GNU/Linux
@end ifnottex
@menu
* Overview:: Overview
* Options:: Options
* Examples:: Examples
* Files:: Files
* Seealso:: See also
* Bugreport:: Reporting bugs
* Legal:: Author, Copyright, Credits
* CommandIdx:: Alphabetic Option List
* ConceptIdx:: Alphabetic List of Concepts and Objects
@end menu
@node Overview, Options, Top, Top
@chapter Overview
@c man .SH SYNOPSIS
@c man .B xorriso-dd-target
@c man [ options ] [ device_names ]
@c man .br
@c man .SH DESCRIPTION
@c man .PP
@command{xorriso-dd-target}
evaluates block devices of the Linux kernel whether they are suitable targets
for a disk image file and optionally copies the image file to one of them.
@*
It is specialized on the device names of the @strong{Linux kernel} and uses the
capabilities of util-linux program @strong{lsblk}.
Therefore it refuses to run on non-Linux kernels.
@*
@sp 1
@c man .PP
The main purpose of xorriso-dd-target is to inspect the device files
of disk-like storage media and to judge whether they look like removable
devices with disposable content.
@*
If a single plausible candidate is detected, then the program is willing to
copy a disk image file onto it. This will overwrite or make inaccessible the
previous partition table and all previous data content of the target device.
@*
@strong{Superuser power} is often needed for filesystem type identification,
for possible unmounting, and for possible image writing.
Option @strong{-with_sudo} offers a way to gain this power only for those
tasks and to run the program elsewise with a normal user's power.
@*
If a particular disk image file is intended as copy source, then
its path should be given by option -image_file, so that its size can be used
as decision criterion.
@sp 1
@c man .PP
Following are use case descriptions with examples:
@c man .br
@c man - List plain device names
@c man .br
@c man - List all devices with reasoning
@c man .br
@c man - Evaluate particular given devices
@c man .br
@c man - Detect intended device by plugging
@c man .br
@c man - Write image to an advised device
@c man .br
@c man - Show commands for writing to a not advised device
@c man .br
@menu
* Simplenames:: List plain device names
* Listall:: List all devices with reasoning
* Givendevices:: Evaluate particular given devices
* Plugtest:: Detect intended device by plugging
* Dowrite:: Write image to an advised device
* Unwise:: Show commands for writing to a not advised device
* Reasons:: Alphabetical list of positive and negative reasons
@end menu
@c man .SS
@node Simplenames, Listall, Overview, Overview
@chapter List plain device names
@c man \fBList plain device names:\fR
@c man .br
@cindex Use case, list advisable device names
The most simple and most boring use case is a program run without device names
and without options -list_all, -plug_test, -DO_WRITE, -dummy_force.
It prints on standard output (stdout) only the names of advisable devices
without "/dev/" prefix. One name per line and without any reasoning text.
@*
The possible sudo password prompt, the message line about sudo, and the
empty line after it do not go to stdout.
@*
Example:
@*
$ xorriso-dd-target -with_sudo
@*
Testing sudo to possibly get password prompting done now:
@*
[sudo] password for thomas:
@*
sudo /bin/lsblk seems ok.
sde
@c man .SS
@node Listall, Givendevices, Simplenames, Overview
@chapter List all devices with reasoning
@c man \fBList all devices with reasoning:\fR
@c man .br
@cindex Use case, list all devices with reasoning
For the more curious user, there is option @strong{-list_all} which prints
the evaluation of each disk-like device that is listed by program lsblk.
Optical drives, floppy disks, RAM block devices, loop devices are excluded,
though.
@*
Each device is shown by one line of the form
@*
name : advice : reasoning : info
@*
@strong{name} is the device name without "/dev/" prefix.
@*
@strong{advice} is either "YES" or "NO". "YES" indicates that the device
appears to be pluggable disk-like, not used as system disk or sincere data
storage, and - if tested - of sufficient or plausible size.
@*
@strong{reasoning} is a blank separated list of words with either suffix '+'
for an inviting device property or '-' for a prohibitive property. Normally
a single '-' reason disqualifies the device from being advisable. Only if
option -look_for_iso is given, a reason "has_XYZ-" can be overridden by
the presence of an ISO 9660 filesystem on the device.
@*
@strong{info} is composed from VENDOR and MODEL as told by lsblk.
@*
Option @strong{-list_long} causes with each line an additional listing of
the information provided by lsblk which led to the shown reasons.
@*
Example:
@*
$ xorriso-dd-target -with_sudo -list_all
@*
...
@*
sda : NO : not_usb- has_vfat+ has_ext4- : ATA Samsung SSD 850
@*
sdb : NO : not_usb- has_swap- has_ext4- : ATA WDC WD20EFRX-68A
@*
sdc : YES : usb+ has_iso9660+ has_vfat+ : Intenso Ultra Line
@*
sdd : NO : usb+ has_iso9660+ has_vfat+ has_ext2- : SanDisk Cruzer
@c man .SS
@node Givendevices, Plugtest, Listall, Overview
@chapter Evaluate particular given devices
@c man \fBEvaluate particular given devices:\fR
@c man .br
@cindex Use case, evaluate particular given devices
If @strong{device names} are given instead of option -list_all, then only
these devices are inspected. Their result gets listed without the ": info"
part, unless option @strong{-with_vendor_model} is given.
@*
Device names must not begin by '-' and must be single words composed of
the characters [A-za-z0-9_/-]. They should not contain '/'. E.g. 'sdc' is
valid, '/dev/sdc' is not valid.
@*
If one of the given device names gets not advised, the exit value is 1.
@*
It makes few sense to give device names which are not listed by -list_all.
@*
Examples:
@*
$ xorriso-dd-target -with_sudo sdc
@*
...
@*
sdc : YES : usb+ has_iso9660+ has_vfat+
@*
$ xorriso-dd-target -with_sudo -with_vendor_model sdc
@*
...
@*
sdc : YES : usb+ has_iso9660+ has_vfat+ : Intenso Ultra Line
@*
$ xorriso-dd-target sdc
@*
sdc : NO : usb+ no_fs_while_not_su-
@c man .SS
@node Plugtest, Dowrite, Givendevices, Overview
@chapter Detect intended device by plugging
@c man \fBDetect intended device by plugging:\fR
@c man .br
@cindex Use case, detect intended device by plugging
Option @strong{-plug_test} triggers an interactive method to unambiguously
determine the intended target device candidate. It consists of 2 or 3 steps.
@*
@strong{Step 1} is to have the intended storage device @strong{unplugged} and
to confirm this by pressing the Enter key at the program's prompt. The program
will then assess the list of not wanted devices.
@*
@strong{Step 2} is to @strong{plug in} the intended storage device and to
confirm this by pressing the Enter key a second time. The program will wait
up to 10 seconds for a disk-like storage device which is not in the list of
not wanted devices.
The user may wait with key pressing until the device blinking looks like it
is ready.
@*
Only if a single new device is found, the program will go on as if a single
device name was given. Option -list_all and any device names given as arguments
will be ignored.
@*
@strong{Step 3} happens only if options -DO_WRITE or -dummy_force are given.
The program asks for a final input of the word 'yes' before real or simulated
writing begins.
@*
Example:
@*
$ xorriso-dd-target -with_sudo -plug_test
@*
...
@*
Caused by option -plug_test: Attempt to find the desired device
by watching it appear after being plugged in.
@*
Step 1:
@*
Please make sure that the desired target device is plugged _out_ now.
@*
If it is currently plugged in, make sure to unmount all its filesystems
@*
and then unplug it.
@*
Press the Enter key when ready.
@*
@*
Found and noted as _not_ desired: sda sdb sdc
@*
Step 2:
@*
Please plug in the desired target device and then press the Enter key.
@*
@*
Waiting up to 10 seconds for a new device to be listed ... found: sdd
@*
Now waiting 5 seconds to let it settle .........
@*
Found and noted as desired device: sdd
@*
@*
sdd : NO : usb+ has_iso9660+ has_vfat+ has_ext2- : SanDisk Cruzer
@c man .SS
@node Dowrite, Unwise, Plugtest, Overview
@chapter Write image to an advised device
@c man \fBWrite image to an advised device:\fR
@c man .br
@cindex Use case, write image to an advised device
Only if option @strong{-DO_WRITE} is given and -list_all is not, and if exactly
one advisable device is listed, it really gets overwritten by the file content
of the given -image_file. In this case the exit value is zero if writing
succeeded, non-zero else.
@*
Option @strong{-dummy} prevents this kind of real action and rather shows the
planned umount and dd commands on stdout.
@*
Example:
@*
$ xorriso-dd-target -with_sudo -plug_test -DO_WRITE \
@*
-image_file debian-live-10.0.0-amd64-xfce.iso
@*
... sudo messages and above plug test steps 1 and 2 ...
@*
@*
sde : YES : usb+ has_iso9660+ has_vfat+
@*
Step 3:
@*
Last chance to abort. Enter the word 'yes' to start REAL WRITING.
@*
yes
@*
Looking for mount points of sde:
@*
/dev/sde1 on /mnt/iso type iso9660 (ro,relatime)
@*
/dev/sde2 on /mnt/fat type vfat (rw,...,errors=remount-ro)
@*
Unmounted: /dev/sde1
@*
Unmounted: /dev/sde2
@*
Performing:
@*
sudo /bin/dd if=/dev/zero of=/dev/'sde' bs=512 seek='245759999'
@*
count=1 status=none
@*
sudo /bin/dd if='debian-live-10.0.0-amd64-xfce.iso' of=/dev/'sde'
@*
bs=1M status=progress oflag=dsync ; sync
@*
... dd messages ...
@*
The first dd run shall erase a possible GPT backup header. It is performed only
if the local program "expr" can deal with the byte size of the device.
@c man .SS
@node Unwise, Reasons, Dowrite, Overview
@chapter Show commands for writing to a not advised device
@c man \fBShow commands for writing to a not advised device:\fR
@c man .br
@cindex Use case, show commands for writing to a not advised device
There should be no way to convince xorriso-dd-target of writing to a target
device which it does not deem advisable. Please report any set of arguments
that can be misused for that.
@*
The outmost complicity to potentially unwise actions is offered by
option @strong{-dummy_force}. If given together with a single device name or
with option -plug_test it will act like -dummy -DO_WRITE with this device,
even if it looks not advisable. I.e. it will show the shell commands which the
program does not dare to perform.
@*
Example:
@*
$ xorriso-dd-target -with_sudo -list_long -dummy_force sdd \
@*
-image_file debian-live-10.0.0-amd64-xfce.iso
@*
...
@*
sdd : NO : usb+ has_iso9660+ has_vfat+ has_ext2-
@*
NAME SIZE FSTYPE TRAN LABEL
@*
sdd 3.8G iso9660 usb d-live 9.5.0 xf i386
@*
|-sdd1 1.9G iso9660 d-live 9.5.0 xf i386
@*
|-sdd2 320K vfat
@*
`-sdd3 512M ext2
@*
@*
Overriding any advice because of -dummy_force
@*
Looking for mount points of sdd:
@*
/dev/sdd1 on /mnt/iso type iso9660 (ro,relatime)
@*
/dev/sdd2 on /mnt/fat type vfat (rw,...,errors=remount-ro)
@*
/dev/sdd3 on /mnt/ext type ext2 (rw,relatime)
@*
AGAINST THE ADVICE BY THIS PROGRAM, a daring user could do:
@*
sudo /bin/umount /dev/sdd1
@*
sudo /bin/umount /dev/sdd2
@*
sudo /bin/umount /dev/sdd3
@*
sudo /bin/dd if=/dev/zero of=/dev/'sdd' bs=512 seek='7864318'
@*
count=1 status=none
@*
sudo /bin/dd if='debian-live-10.0.0-amd64-xfce.iso' of=/dev/sdd
@*
bs=1M status=progress oflag=dsync ; sync
@*
BE SMART. BE CAUTIOUS. BEWARE.
@c man .SS
@node Reasons, Options, Unwise, Overview
@chapter Alphabetical list of positive and negative reasons
@c man \fBAlphabetical List of positive and negative reasons:\fR
@c man .br
@cindex Reasons, list of
As stated with use case "List all devices", @strong{reasons} are words with
either suffix '+' for an inviting device property or '-' for a prohibitive
property.
@*
Normally a single '-' reason disqualifies the device from being advisable.
@c man .br
@c man .PP
@section Reasons
@strong{has_XYZ-}
@*
A filesystem of type XYZ is detected on base device or partition and is
spoiling the impression of a device with disposable content.
@*
@strong{has_iso9660+}
@*
An ISO 9660 filesystem is detected.
@*
@strong{has_vfat+}
@*
A FAT (MS-DOS-like) filesystem is detected.
@*
@strong{look_for_iso++}
@*
Option -look_for_iso is given and an ISO 9660 filesystem is detected.
This reason overrides any "has_XYZ-" reason.
@*
@strong{looks_like_cd_drive-}
@*
A given device name looks like the name of an optical drive: sr[0-9]*.
Use program @strong{xorrecord} for this kind of devices.
@*
@strong{looks_like_disk_partition-}
@*
A given device name looks like the name of a partition. Expected are names
of base devices, like "sde", not of their partitions, like "sde1".
@*
@strong{looks_like_floppy-}
@*
A given device name looks like the name of a floppy disk drive: fd[0-9]*.
@*
@strong{looks_like_loopdev-}
@*
A given device name looks like the name of a loop device: loop[0-9]*.
@*
@strong{looks_like_ramdev-}
@*
A given device name looks like the name of a RAM block device: zram[0-9]*.
@*
@strong{lsblk_no_size-}
@*
A size test is given by -max_size, -min_size, or -image_file but the size of
the device cannot be inquired by lsblk. This is supposed to happen only with
given inappropriate device names.
@*
@strong{mmcblk+}
@*
The device name looks like a directly connected memory card.
@*
@strong{name_with_slash-}
@*
A given device name contains '/' characters.
@*
@strong{no_bus_info-}
@*
The device is not a memory card and lsblk reports nothing about the way how
it is connected to the computer.
@*
@strong{no_fs_while_not_su-}
@*
No filesystem is reported by lsblk and the program does not believe to have
run it with superuser powers. There is the risk that lsblk silently failed
to detect existing filesystems.
@*
@strong{no_iso9660-}
@*
Option -look_for_iso is given but no ISO 9660 filesystem is detected.
@*
@strong{not_usb-}
@*
The device is not a memory card and lsblk reports that it is connected by
something other than USB.
@*
@strong{size_too_large-}
@*
Option -max_size is given with a size smaller than the size of the device.
@*
@strong{size_too_small-}
@*
Option -min_size or -image_file is given with size or file size larger than
the size of the device.
@*
@strong{usb+}
@*
The device is reported by lsblk to be connected via USB.
@*
@c man .SS
@node Options, Examples, Overview, Top
@chapter Options
@cindex xorriso-dd-target, options
@c man .br
@c man .SH OPTIONS
@c man .br
@c man .PP
@c man .TP
@table @asis
@item -plug_test
@kindex -plug_test detect target device plugging
@cindex Target device, detect by plugging, @minus{}plug_test
Find the target device by asking the user to press the Enter key when the
desired target is _not_ plugged in, to then plug it in, and to press Enter
again.
@*
This overrides device names and option -list_all.
The found device is then shown with advice, vendor, and model.
@*
Option -DO_WRITE is obeyed if given.
In this case, the word 'yes' has to be entered to let unmounting and writing
begin.
@c man .TP
@item -list_all
@kindex -list_all print list of disk devices
@cindex Disk devices, print list, -list_all
Print list of all found devices with advice, vendor and model. One per line.
Ignore any device names. Ignore -DO_WRITE.
@c man .TP
@item -list_long
@kindex -list_long print extra device info
@cindex Device info, print extra, -list_long
After each result line, which shows reasons, add an additional listing of
the information provided by lsblk which led to the reasons and add an empty
line.
@c man .TP
@item -with_vendor_model
@kindex -with_vendor_model add drive info to advice
@cindex Drive info, add to advice, -with_vendor_model
Print vendor and model with each submitted device name.
@c man .TP
@item -max_size n[M|G|T]
@kindex -max_size set size limit for device
@cindex Device size, set limit, -max_size
Set the upper byte size limit for advisable devices. Plain numbers get rounded
down to full millions. As suffix are recognized: M = million, G = billion,
T = trillion.
@*
Be generous to avoid problems with GB < GiB.
@c man .TP
@item -min_size n[M|G|T]
@kindex -min_size set size limit for device
@cindex Device size, set limit, -min_size
Set the lower byte size limit for advisable devices. After processing like
with -max_size, one million gets added to the size limit.
@c man .TP
@item -look_for_iso
@kindex -look_for_iso demand presence of ISO 9660
@cindex ISO 9660, demand presence on target, @minus{}look_for_iso
Demand presence of an ISO 9660 filesystem. If so, then any further filesystem
type is acceptable on that device.
@*
If this option is missing, only ISO 9660 and VFAT filesystems are accepted.
@c man .TP
@item -with_sudo
@kindex -with_sudo run lsblk, umount, dd by sudo
@cindex lsblk, umount, dd, run by sudo, -with_sudo
Run 'lsblk -o FSTYPE' by sudo. If no filesystems are detected on a device while
the program has no superuser power, then the device is not advised. Option
-with_sudo avoids this refusal without the need to run the whole
program as superuser.
@*
If -DO_WRITE -with_sudo is given, then the programs umount and dd will be run
by sudo, too.
@c man .TP
@item -trust_lsblk_udev
@kindex -trust_lsblk_udev suppress no_fs_while_not_su-
@cindex suppress no_fs_while_not_su-, -trust_lsblk_udev
Suppress the reason no_fs_while_not_su- if lsblk is linked with libudev.so.
In this case it is likely that lsblk can retrieve FSTYPE even if run
by a non-priviledged user.
@*
This option is intended for use by frontend programs which are certain
that they do not encounter a udev-using version of lsblk which nevertheless
fails to detect existing filesystems. Human users should better acquire
superuser powers if reason no_fs_while_not_su- is reported.
@c man .TP
@item -image_file PATH
@kindex -image_file set path of disk image file
@cindex disk image file, set path, -image_file
Set the path of the image file which shall be written to a device. Its size
will be set as -min_size.
@c man .TP
@item -DO_WRITE
@kindex -DO_WRITE write image file to device
@cindex disk image file, write to device, -DO_WRITE
Write the given -image_file to the one advisable device that is found. If more
than one such device is found, then they get listed but no writing happens.
@*
In this case, to get a real write run, consider unplugging unneeded devices,
or using option -plug_test, or a re-run with one of the advised device names
as additional argument.
@c man .TP
@item -no_pacifier
@kindex -no_pacifier do not show dd progress
@cindex dd progress, do not show, -no_pacifier
Do not use dd options to print progress messages and to perform synchronized
output. These options are used by default if program dd offers progress
messages.
@c man .TP
@item -dummy
@kindex -dummy report but do not perform
@cindex only report, do not perform, -dummy
Report the -DO_WRITE actions but do not perform them.
@c man .TP
@item -dummy_force
@kindex -dummy_force show raw copy commands
@cindex raw copy commands, show, -dummy_force
If a single device name is given, do a run of -dummy -DO_WRITE even against
the advice of this program. This probably shows you ways to shoot your own
foot.
@c man .TP
@item -version
@kindex -version print version text to stdout
@cindex version text, print to stdout, -version
Print the program name, version text, and timestamp to stdout and then end
the program.
@c man .TP
@item -help
@kindex -help print help text to stdout
@cindex help text, print to stdout, -help
Print the help text to stdout and then end the program.
@end table
@node Examples, Files, Options, Top
@chapter Examples
@c man .SH EXAMPLES
Examples are given in the above description of use cases.
@node Files, Seealso, Examples, Top
@chapter Files
@c man .SH FILES
For now, no files are defined for configuration.
@c man .SH SEE ALSO
@c man .BR lsblk(8),
@c man .BR umount(8),
@c man .BR dd(1),
@c man .BR xorrecord(1)
@c man-ignore-lines begin
@node Seealso, Bugreport, Files, Top
@chapter See also
lsblk(8), sudo(8), umount(8), dd(1), xorrecord(1)
@c man-ignore-lines end
@c man .SH BUGS
@node Bugreport, Legal, Seealso, Top
@chapter Reporting bugs
@cindex Bugs, reporting
@cindex Problems, reporting
To report bugs, request help, or suggest enhancements for
@command{xorriso-dd-target},
please send electronic mail to the public list @email{bug-xorriso@@gnu.org}.
If more privacy is desired, mail to @email{scdbackup@@gmx.net}.
@*
@sp 1
Please describe what you expect the program to do, the program arguments
which you used, the messages of @command{xorriso-dd-target}, and the
undesirable outcome of your program run.
@*
@sp 1
Expect to get asked more questions before solutions can be proposed.
@c man .SH AUTHOR
@node Legal, CommandIdx, Bugreport, Top
@chapter Author, Copyright, Credits
@section Author
Thomas Schmitt <scdbackup@@gmx.net>
@*
for libburnia-project.org
@c man .SH COPYRIGHT
@section Copyright
Copyright (c) 2019 - 2023 Thomas Schmitt
@*
Permission is granted to distribute this text freely. It shall only be
modified in sync with the technical properties of xorriso-dd-target.
If you make use of the license to derive modified versions of xorriso-dd-target
then you are entitled to modify this text under that same license.
@c man .SH CREDITS
@section Credits
@command{xorriso-dd-target} is developed in cooperation with Nio Wiklund alias
sudodus.
@c man-ignore-lines begin
@node CommandIdx, ConceptIdx, Legal, Top
@chapter Alphabetic Options List
@printindex ky
@node ConceptIdx, Top, CommandIdx, Top
@chapter Alphabetic List of Concepts and Objects
@printindex cp
@c man-ignore-lines end
@bye

View File

@ -3,14 +3,4 @@ Ben Jansens
Thomas Schmitt
Mario Danic
Vreixo Formoso Lopes
Colin Plumb
Tatu Ylonen
Jim Kingdon
Scott G. Miller
Ulrich Drepper
Richard Atterer
Steve McIntyre
George Danchev
Nio Wiklund alias sudodus
and possibly others who gave their copyright to Free Software Foundation, Inc.

View File

@ -3,22 +3,15 @@ Ben Jansens <xor@orodu.net>
Thomas Schmitt <scdbackup@gmx.net>
Mario Danic <mario.danic@gmail.com>,
Vreixo Formoso <metalpain2002@yahoo.es>
Steve McIntyre <steve@einval.com>
George Danchev <danchev@spnet.net>
GNU xorriso is a compilation of modules from libburnia-project.org :
xorriso Copyright (C) 2007-2011 Thomas Schmitt
libisoburn Copyright (C) 2007-2011 Vreixo Formoso, Thomas Schmitt
libisofs Copyright (C) 2007-2011 Vreixo Formoso, Mario Danic, Thomas Schmitt
GNU xorriso is a compilation of
xorriso Copyright (C) 2007-2010 Thomas Schmitt
libisoburn Copyright (C) 2007-2010 Vreixo Formoso, Thomas Schmitt
libisofs Copyright (C) 2007-2010 Vreixo Formoso, Mario Danic, Thomas Schmitt
libburn Copyright (C) 2002-2006 Derek Foreman, Ben Jansens
2006-2011 Mario Danic, Thomas Schmitt
Further included is :
libjte Copyright (C) 2000-2007 Free Software Foundation, Inc.
2004-2011 Steve McIntyre
2010-2011 George Danchev, Thomas Schmitt
2006-2010 Mario Danic, Thomas Schmitt
from libburnia-project.org with a license derived from GPLv2+.
Originally they all are licensed directly or indirectly as GPLv2+.
GNU xorriso is licensed by the following statement:
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 3

View File

@ -4,7 +4,7 @@
GNU xorriso. By Thomas Schmitt <scdbackup@gmx.net>
Derived from and supported by libburnia-project.org, published via:
http://www.gnu.org/software/xorriso/xorriso_eng.html
http://www.gnu.org/software/xorriso/xorriso-1.5.7.tar.gz
ftp://ftp.gnu.org/gnu/xorriso/xorriso-0.5.2.tar.gz
Provided under GPL version 3 or later. No warranty.
------------------------------------------------------------------------------
@ -20,10 +20,8 @@ A special property of xorriso is that it needs neither an external ISO 9660
formatter program nor an external burn program for CD or DVD but rather
incorporates the libraries of libburnia-project.org .
Currently it is fully supported on GNU/Linux with kernels >= 2.4,
on FreeBSD with ATAPI/CAM support enabled in the kernel, see atapicam(4),
on OpenSolaris (tested with kernel 5.11),
on NetBSD (tested with 6.1.2 and 6.1.3).
Currently it is fully supported on GNU/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 POSIX i/o with disk
file objects, but no direct MMC operation on CD/DVD/BD drives.
@ -33,26 +31,25 @@ By using this software you agree to the disclaimer at the end of this text:
Compilation, First Glimpse, Installation
The most simple way to get xorriso from source code is the GNU xorriso tarball.
The most simple way to get xorriso from source code is the xorriso standalone
tarball.
Prerequisites:
The tarball contains everything that is needed except the following system
components:
libc, libpthread
plus on Solaris: libvolmgt
plus on FreeBSD: libiconv, libcam, IDE and SATA drives need atapicam
Optional at compile time are:
libreadline and the readline-dev headers, or libedit and its header,
make dialog mode more convenient.
zlib and zlib-devel allow zisofs compression.
libreadline and the readline-dev headers make dialog mode more convenient.
on GNU/Linux: libacl and libacl-devel allow getting and setting ACLs.
zlib and zlib-devel allow zisofs compression.
If they were present at compile time, then the optional libraries have to
be present at runtime, too.
Obtain xorriso-1.5.7.tar.gz, take it to a directory of your choice and do:
Obtain xorriso-0.5.2.tar.gz, take it to a directory of your choice and do:
tar xzf xorriso-1.5.7.tar.gz
cd xorriso-1.5.7
tar xzf xorriso-0.5.2.tar.gz
cd xorriso-0.5.2
Within that directory execute:
@ -75,14 +72,15 @@ or you may execute as superuser:
For general concepts, options and usage examples see
info xorriso
info xorrisofs
info xorrecord
or
man 1 xorriso
man 1 xorrisofs
man 1 xorrecord
You may get a first glimpse by e.g.
The documents are part of the tarball as
xorriso/xorriso.info
xorriso/xorriso.1
Original source text of both is
xorriso/xorriso.texi
You may get a first glimpse by
info ./xorriso/xorriso.info
man ./xorriso/xorriso.1
@ -92,27 +90,19 @@ The installation creates several alias links pointing to the xorriso binary:
osirrox starts with -osirrox image-to-disk copying already enabled
By default xorriso will depend on libreadline if the library and its
development header files are present at compile time. If not, then it will
try to depend on libedit and its header file.
Both conditional dependencies can be avoided by running
./configure --prefix=/usr --disable-libreadline
If you want to avoid dependecy on libreadline although the libreadline
development package is installed, then rather build xorriso by:
./configure --prefix=/usr --disable-libreadline
make clean ; make
Never omit the "make clean" command after switching enabling of libreadline.
If you want to explicitly allow only the use of libedit, then do
./configure --prefix=/usr --disable-libreadline --enable-libedit
Never omit the "make clean" command after switching libreadline enabling.
Other deliberate dependency reduction options of ./configure are:
--disable-libacl avoid use of ACL functions like acl_to_text()
--disable-xattr avoid use of xattr functions like listxattr() on Linux
or extattr_list_file() on FreeBSD
--disable-zlib avoid use of zlib functions like compress2()
this also avoids the use of libjte and option -jigdo.
--disable-xattr avoid use of xattr functions like listxattr()
--disable-zlib avoid use of zlib functions like compress2()
xorriso brings own system adapters which allow burning optical media on
GNU/Linux, FreeBSD, Solaris, NetBSD.
Alternatively it can use libcdio-0.83 or later for sending commands to
optical drives:
GNU/Linux and FreeBSD. Alternatively it can use libcdio-0.83 or later for
sending commands to optical drives:
--enable-libcdio
xorriso allows to use external processes as file content filters. This is
@ -135,66 +125,6 @@ and the cdrecord emulation of xorriso can be told to use this peculiar read
mode by:
--enable-track-src-odirect
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"
xorriso under control of a (GUI) frontend process
The dialog mode allows frontend programs to connect via pipes to the standard
input and output of xorriso. Several commands of xorriso help with receiving
and parsing of reply messages.
As a proof of concept, there is the Tcl/Tk script xorriso-tcltk which can
be launched by this shell command:
xorriso-tcltk
Or in the xorriso build directory, without installation of xorriso:
xorriso/xorriso -launch_frontend frontend/xorriso-tcltk --stdio --
In the running GUI, click with the rightmost mouse button on any GUI element
to get its particular help text. The "Help" button at the upper right corner
gives a short introduction and instructions for some common use cases.
See also file frontend/README-tcltk.
See its Tcl code for getting an idea how this gets achieved.
The script is part of the tarball and gets installed by make install. If a
xorriso distro package does not install it, you may get it directly from
https://dev.lovelyhq.com/libburnia/libisoburn/blob/master/frontend/xorriso-tcltk
Further there is the C program frontend/frontend_pipes_xorriso.c which
forks a xorriso process and shows the same communication gestures as
xorriso-tcltk.
In particular it connects to xorriso via two pipes, sends commands, waits
for all replies of a command, picks info out of the xorriso message sieve,
and parses reply message lines into words.
The bash script frontend/sh_on_named_pipes.sh forks a xorriso process
connected to two pipes. It then runs a dialog loop, sends commands to xorriso,
and displays the replies.
The sh script frontend/xorriso_broker.sh is intended to execute xorriso
commands on a permanently running xorriso process.
It gets an id_string by which it looks for named pipes with a running xorriso
process. If no such pipe is found, then it starts a xorriso connected to
newly created pipes.
After this is done, the optionally given xorriso arguments are written into
the stdin pipe from where xorriso will read and execute them. The script will
end but the xorriso process will go on and wait for more commands.
Drives and Disk File Objects
@ -204,52 +134,34 @@ A list of rw-accessible drives can be obtained by
xorriso -devices
CD devices which offer not enough permission are invisible to normal users.
CD devices which offer no rw-permission are invisible to normal users.
The superuser should be able to see any usable drive and then set the
permissions as needed.
On Linux, FreeBSD, and NetBSD, rw-permissions are needed.
On Solaris, the privilege "sys_devices" and r-permission are needed.
The output of xorriso -devices might look like
0 -dev '/dev/sr0' rwrw-- : 'TSSTcorp' 'CDDVDW SH-S203B'
1 -dev '/dev/hda' rwrw-- : 'HL-DT-ST' 'DVD-ROM GDR8162B'
On Linux, full and insecure enabling of both for everybody would look like
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.
On FreeBSD, device permissions are to be set in /etc/devfs.rules.
On Solaris, pfexec privileges may be restricted to "basic,sys_devices".
On NetBSD, rw-permission may be granted by chmod a+rw /dev/rcd?d.
See below "System Dependent Drive Permission Examples".
I strongly discourage to run xorriso 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.
Consider to put all authorized users into group "floppy", to chgrp the
device file to that group and to disallow w-access to others.
A possible source of problems are hald or other automounters.
If you can spot a process "hald-addon-storage" with the address of
your desired drive, then consider to kill it.
A similar process "udisks-daemon: polling ..." can be seen on newer Linuxes.
On Debian GNU/Linux 6.0.2 amd64 there is
/lib/udev/rules.d/80-udisks.rules
where one can remove all CD drives ("sr*") from the list of automountable
devices:
KERNEL=="sd*|hd*|mmcblk*|mspblk*", ENV{UDISKS_PRESENTATION_NOPOLICY}="0"
# KERNEL=="sd*|hd*|sr*|mmcblk*|mspblk*", ENV{UDISKS_PRESENTATION_NOPOLICY}="0"
Copying the recognition criterion from
/etc/udev/rules.d/70-persistent-cd.rules
one can prevent automounting a single drive, too:
SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:11.0-scsi-2:0:0:0", ENV{UDISKS_PRESENTATION_NOPOLICY}:="1"
If you cannot get rid of the automounter, try whether it helps to always load
the drive tray manually before starting a write run of xorriso. Wait until the
drive light is off and the mounted media appears.
Then try to unmount the mounted media before a write run.
If you cannot get rid of the automounter that easily, try whether it helps
to always load the drive tray manually before starting a write run of
xorriso. Wait until the drive light is off.
Better try to unmount an eventually mounted media before a write run.
Besides true optical drives, xorriso can also address disk files as input or
@ -263,31 +175,8 @@ Prefix "mmc:" causes a path to be accepted only if it is a real optical drive
which is accessible by generic SCSI/MMC commands.
xorriso-dd-target
GNU xorriso comes with a script named
xorriso-dd-target/xorriso-dd-target
which uses the util-linux program lsblk to find suitable hard-disk-like
target devices for copying hard-disk bootable ISO images onto them. Such images
are offered by GNU/Linux distributions for installing their system.
xorriso-dd-target gets installed only if ./configure detects to run on a
GNU/Linux system. It refuses to start on non-Linux kernels or if program lsblk
is not found in /usr/sbin, /sbin, /usr/bin, /bin.
For introduction, examples, and details see in the build directory
man xorriso-dd-target/xorriso-dd-target.1
info xorriso-dd-target/xorriso-dd-target.info
Testing
For automated and manual tests of xorriso's functionality see file
releng/README
Result comparison with self produced ISO images
We are quite sure that libisofs produces accurate representations of the disk
files. This opinion is founded on a lot of test burns and checks by a little
test program which compares files from the mounted image with the orignals
@ -323,17 +212,14 @@ Sector maps describe the valid and invalid blocks on a media or a disk copy of
a media. xorriso creates and reads these file with its option -check_media.
The file begins with 32 bytes of cleartext of which the last one is a
newline character. The first 25 say "xorriso sector bitmap v2 " or
"xorriso sector bitmap v3 ". The remaining six characters give the size
of the info text as decimal number.
newline character. The first 25 say "xorriso sector bitmap v2 ", the
remaining six characters give the size of the info text as decimal number.
This number of bytes follows the first 32 and will not be interpreted
by xorriso. They are rather to inform a human reader about the media type
and its track layout.
After the info text there are two signed integers, most significant byte
first. The number of bytes per integer is 4 for "v2" and 8 for "v3".
In both cases, the highest bit of the integers must be 0.
The first integer, N, gives the number of bits in the following bitmap.
The second number, S, gives the number of 2 KiB blocks governed by a single
After the info text there are two 4 byte signed integers, most significant
byte first. The first one, N, gives the number of bits in the following bitmap
and the second number S gives the number of 2 KiB blocks governed by a single
bit in the map. Then come the bits in form of 8-bit bytes.
Data block M is covered by bit B=M/S in the map, bit number B is stored in
byte B/8 as bit B%8. A valid readable data block has its bit set to 1.
@ -346,7 +232,7 @@ any file but rather tell the MD5 of a certain range of data blocks.
The superblock checksum tag is written after the ECMA-119 volume descriptors.
The tree checksum tag is written after the ECMA-119 directory entries.
The session checksum tag is written after all payload including the checksum
array. (Then follows padding.)
array. (Then follows eventual padding.)
The tags are single lines of printable text, padded by 0 bytes. They have
the following format:
@ -362,12 +248,12 @@ Tag_id distinguishes the following tag types
"libisofs_checksum_tag_v1" Session end tag
A relocated superblock may appear at LBA 0 of an image which was produced for
being stored in a disk file or on overwritable media (e.g. DVD+RW, BD-RE).
xorriso records the first session at LBA 32. A follow-up session
being stored in a disk file or on overwriteable media (e.g. DVD+R, BD-RE).
xorriso records the first session at LBA 32. An eventual follow-up session
begins at the next block address which is divisible by 32 and higher than the
address of the previous session's end tag. Normally no session starts after the
address given by relocated superblock parameter session_start=.
Session oriented media like CD-R[W], DVD-R, DVD+R, BD-R will have no relocated
Session oriented media like CD-R[W], DVD+R, BD-R will have no relocated
superblock but rather bear a table-of-content on media level.
A tag is valid if pos= tells its own block address and self= tells its own MD5
@ -380,117 +266,33 @@ The newline character at the end is mandatory.
libisoburn
xorriso is based on libisofs which does ISO 9660 filesystem aspects and on
xorriso is based on libisofs which does ISO 9600 filesystem aspects and on
libburn which does the input and output aspects. Parts of this foundation
are accessed via libisoburn, which is closely related to xorriso.
libisoburn provides several services:
libisoburn provides two services:
- Encapsulation of coordination between libisofs and libburn.
- Emulation of ISO 9660 multi-session on overwritable media
- Emulation of ISO 9660 multi-session on overwriteable media
or random access files.
- Implementation of the xorriso API.
The sourcecode of all three libraries is included in the GNU xorriso tarball.
It is compiled with xorriso and linked statically.
The sourcecode of all three libraries is included in the xorriso standalone
tarball. It is compiled with xorriso and linked statically.
But you may as well get and install releases of libburn and libisofs, in order
to be able to install a release of libisoburn which produces libisoburn.so.1
and a matching dynamically linked xorriso binary.
This binary is very lean but depends on properly installed libraries of
suitable revision.
This binary is leaner but depends on properly installed libraries of suitable
revision.
Dynamic library and compile time header requirements for libisoburn-1.5.6 :
- libburn.so.4 , version libburn-1.5.6 or higher
- libisofs.so.6 , version libisofs-1.5.6 or higher
Dynamic library and compile time header requirements for libisoburn-0.5.2 :
- libburn.so.4 , version libburn-0.7.6 or higher
- libisofs.so.6 , version libisofs-0.6.28 or higher
libisoburn and xorriso will not start with libraries which are older than their
headers seen at compile time. So compile in the oldest possible installation
setup unless you have reason to enforce a newer bug fix level.
GNU xorriso has less runtime dependencies and can be moved more freely.
Standalone xorriso has less runtime dependencies and can be moved more freely.
System Dependent Drive Permission Examples
Accessing the optical drives requires privileges which usually are granted
only to the superuser. GNU/Linux, FreeBSD, Solaris, and NetBSD 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:
xorriso -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 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 GNU/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 xorriso by
pfexec xorriso ...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 xorriso can then be acquired 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/xorriso: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.
----------
On NetBSD:
----------
Allow rw-access to the drives
chgrp floppy /dev/rcd[01]d
chmod g+rw /dev/rcd[01]d
------------------------------------------------------------------------------
This program is free software; you can redistribute it and/or modify
@ -524,26 +326,17 @@ By Mario Danic <mario.danic@gmail.com>, libburn, libisofs
Vreixo Formoso <metalpain2002@yahoo.es>, libisofs, libisoburn
Thomas Schmitt <scdbackup@gmx.net>, libburn, libisofs,
libisoburn, xorriso
Copyright (C) 2006-2024 Mario Danic, Vreixo Formoso, Thomas Schmitt.
Copyright (C) 2006-2010 Mario Danic, Vreixo Formoso, Thomas Schmitt.
libburnia-project.org is inspired by and in libburn still containing parts
of old
Libburn. By Derek Foreman <derek@signalmarketing.com> and
Ben Jansens <xor@orodu.net>
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
GNU xorriso contains libjte out of source package jigit >= 1.17
Copyright (C) 2000-2007 Free Software Foundation, Inc.
2004-2011 Steve McIntyre
2010-2011 George Danchev, Thomas Schmitt
GNU xorriso contains xorriso-dd-target
Copyright (C) 2019-2021 Nio Wiklund alias sudodus, Thomas Schmitt
------------------------------------------------------------------------------
This text itself is
Copyright (c) 2007 - 2024 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2007 - 2010 Thomas Schmitt <scdbackup@gmx.net>
and is freely distributable.
It shall only be modified in sync with the technical properties of xorriso.
If you make use of the license to derive modified versions of xorriso

File diff suppressed because it is too large Load Diff

View File

@ -1,217 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of classes:
- SplitparT which represents byte intervals of data files.
- DirseQ which crawls along a directory's content list.
- ExclusionS which manages the list of excluded file paths and
leaf patterns.
- Xorriso_lsT which provides a generic double-linked list.
- LinkiteM, PermiteM which temporarily record relations and states.
*/
#ifndef Xorriso_pvt_auxobj_includeD
#define Xorriso_pvt_auxobj_includeD yes
struct SplitparT;
int Splitparts_new(struct SplitparT **o, int count, int flag);
int Splitparts_destroy(struct SplitparT **o, int count, int flag);
int Splitparts_set(struct SplitparT *o, int idx,
char *name, int partno, int total_parts,
off_t offset, off_t bytes, off_t total_bytes, int flag);
int Splitparts_get(struct SplitparT *o, int idx, char **name, int *partno,
int *total_parts, off_t *offset, off_t *bytes,
off_t *total_bytes, int flag);
int Splitpart__parse(char *name, int *partno, int *total_parts,
off_t *offset, off_t *bytes, off_t *total_bytes, int flag);
int Splitpart__is_part_path(char *path, int flag);
int Splitpart__compose(char *adr, int partno, int total_parts,
off_t offset, off_t bytes, off_t total_bytes, int flag);
int Splitpart__read_next_num(char *base_pt, char **next_pt, off_t *num,
int flag);
int Splitparts_sort(struct SplitparT *o, int count, int flag);
struct DirseQ;
int Dirseq_new(struct DirseQ **o, char *adr, int flag);
int Dirseq_destroy(struct DirseQ **o, int flag);
int Dirseq_next_adr(struct DirseQ *o, char reply[SfileadrL], int flag);
int Dirseq_rewind(struct DirseQ *o, int flag);
struct Xorriso_lsT {
char *text;
struct Xorriso_lsT *prev,*next;
};
/** Create a new list item with arbitrary byte content.
@param lstring The newly created object or NULL on failure
@param data An array of bytes to be copied into the new object
@param data_len Number of bytes to be copied
@param link Xorriso_lsT object to which the new object shall be linked
@param flag Bitfield for control purposes
bit0= insert before link rather than after it
bit1= do not copy data (e.g. because *data is invalid)
bit2= attach data directly by pointer rather than by copying
@return <=0 error, 1 ok
*/
int Xorriso_lst_new_binary(struct Xorriso_lsT **lstring, char *data,
int data_len, struct Xorriso_lsT *link, int flag);
/** Create a new list item with a 0-terminated text as content.
@param lstring The newly created object or NULL on failure
@param text A 0-terminated array of bytes
@param link Xorriso_lsT object to which the new object shall be linked
@param flag see Xorriso_lst_new_binary
@return <=0 error, 1 ok
*/
int Xorriso_lst_new(struct Xorriso_lsT **lstring, char *text,
struct Xorriso_lsT *link, int flag);
/** Create a new list item at the end of a given list.
@param entry Contains as input a pointer to a pointer to any existing
list item. As output this list item pointer may be
changed to the address of the new list item:
if ((*entry == 0) || (flag & 1))
@param data An array of bytes to be copied into the new object
@param data_len Number of bytes to be copied
@param flag Bitfield for control purposes
bit0= Return new object address in *entry
bit1= do not copy data (e.g. because *data is invalid)
bit2= attach data directly by pointer rather than by copying
@return <=0 error, 1 ok
*/
int Xorriso_lst_append_binary(struct Xorriso_lsT **entry,
char *data, int data_len, int flag);
/** Destroy a single list item and connect its eventual list neighbors.
@param lstring pointer to the pointer to be freed and set to NULL
@param flag unused yet, submit 0
@return 0= *lstring was already NULL, 1= ok
*/
int Xorriso_lst_destroy(struct Xorriso_lsT **lstring, int flag);
struct Xorriso_lsT *Xorriso_lst_get_next(struct Xorriso_lsT *entry, int flag);
struct Xorriso_lsT *Xorriso_lst_get_prev(struct Xorriso_lsT *entry, int flag);
char *Xorriso_lst_get_text(struct Xorriso_lsT *entry, int flag);
int Xorriso_lst_detach_text(struct Xorriso_lsT *entry, int flag);
int Xorriso_lst_get_last(struct Xorriso_lsT *entry, struct Xorriso_lsT **last,
int flag);
int Xorriso_lst_concat(struct Xorriso_lsT *first, struct Xorriso_lsT *second,
int flag);
int Exclusions_new(struct ExclusionS **o, int flag);
int Exclusions_destroy(struct ExclusionS **o, int flag);
int Exclusions_get_descrs(struct ExclusionS *o,
struct Xorriso_lsT **not_paths_descr,
struct Xorriso_lsT **not_leafs_descr, int flag);
/* @param flag bit0= whole subtree is banned with -not_paths
@return 0=no match , 1=not_paths , 2=not_leafs, <0=error
*/
int Exclusions_match(struct ExclusionS *o, char *abs_path, int flag);
int Exclusions_add_not_leafs(struct ExclusionS *o, char *not_leafs_descr,
regex_t *re, int flag);
int Exclusions_add_not_paths(struct ExclusionS *o, int descrc, char **descrs,
int pathc, char **paths, int flag);
struct LinkiteM; /* Trace of hops during symbolic link resolution */
int Linkitem_new(struct LinkiteM **o, char *link_path, dev_t target_dev,
ino_t target_ino, struct LinkiteM *next, int flag);
int Linkitem_destroy(struct LinkiteM **o, int flag);
int Linkitem_reset_stack(struct LinkiteM **o, struct LinkiteM *to, int flag);
int Linkitem_find(struct LinkiteM *stack, dev_t target_dev, ino_t target_ino,
struct LinkiteM **result, int flag);
int Linkitem_get_link_count(struct LinkiteM *item, int flag);
struct PermiteM; /* Stack of temporarily altered access permissions */
int Permstack_push(struct PermiteM **o, char *disk_path, struct stat *stbuf,
int flag);
int Permstack_pop(struct PermiteM **o, struct PermiteM *stopper,
struct XorrisO *xorriso, int flag);
/* Look for stack item with disk_path
@param chattr_flag bit0= when popping: set chattr bit 'i'
bit1= when popping: only set chattr bits
bit2= when popping: set chattr bit 'a'
@return 0= nothing found, 1= *stbuf and *chattr_flags are valid
*/
int Permstack_peek(struct PermiteM **o, struct PermiteM *stopper,
struct XorrisO *xorriso,
char *disk_path, struct stat **stbuf, int *chattr_flags,
int flag);
struct NumbermappeR; /* interval driven number conversion up to 2 exp 60 */
int Numbermapper_new(struct NumbermappeR **o, off_t min, off_t max, int flag);
int Numbermapper_destroy(struct NumbermappeR **o, int flag);
int Numbermapper_add(struct NumbermappeR *o, off_t from_low, off_t from_high,
off_t to_low, off_t to_high, int flag);
int Numbermapper_map(struct NumbermappeR *o, off_t from, off_t *to, int flag);
int Numbermapper_decode(struct NumbermappeR *o, char *text,
off_t *from_low, off_t *from_high,
off_t *to_low, off_t *to_high,
char *errmsg, int flag);
int Numbermapper_get_count(struct NumbermappeR *o, int flag);
int Numbermapper_encode(struct NumbermappeR *o, int idx, char *text, int size,
int flag);
#endif /* ! Xorriso_pvt_auxobj_includeD */

View File

@ -1,828 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2024 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains functions which are needed to read data
from ISO image.
*/
#ifdef HAVE_CONFIG_H
#include "../config.h"
#endif
#include <ctype.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <time.h>
#include <errno.h>
#include <pthread.h>
#ifdef HAVE_STDINT_H
#include <stdint.h>
#else
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#endif
#endif
#ifdef Xorriso_standalonE
#ifdef Xorriso_with_libjtE
#include "../libjte/libjte.h"
#endif
#else
#ifdef Xorriso_with_libjtE
#include <libjte/libjte.h>
#endif
#endif /* ! Xorriso_standalonE */
#include "xorriso.h"
#include "xorriso_private.h"
#include "base_obj.h"
#include "lib_mgt.h"
/* See Xorriso__preset_signal_behavior() */
static int Xorriso_signal_behavioR= 1;
void Xorriso__version(int *major, int *minor, int *micro)
{
*major= Xorriso_header_version_majoR;
*minor= Xorriso_header_version_minoR;
*micro= Xorriso_header_version_micrO;
}
int Xorriso__is_compatible(int major, int minor, int micro, int flag)
{
int own_major, own_minor, own_micro;
Xorriso__version(&own_major, &own_minor, &own_micro);
return(own_major > major ||
(own_major == major && (own_minor > minor ||
(own_minor == minor && own_micro >= micro))));
}
char *Xorriso__get_patch_level_text(int flag)
{
return(Xorriso_program_patch_leveL);
}
/** The list of startup file names */
#define Xorriso_rc_nuM 4
static char Xorriso_sys_rc_nameS[Xorriso_rc_nuM][80]= {
"/etc/default/xorriso",
"/etc/opt/xorriso/rc",
"/etc/xorriso/xorriso.conf",
"placeholder for $HOME/.xorrisorc"
};
int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
{
int i, ret;
struct XorrisO *m;
char *leafname= NULL;
leafname= TSOB_FELD(char, SfileadrL);
if(leafname == NULL)
return(-1);
*xorriso= m= TSOB_FELD(struct XorrisO,1);
if(m==NULL) {
free(leafname);
return(-1);
}
/* Base initialization by actions which must not fail */
m->libs_are_started= 0;
strncpy(m->progname,progname,sizeof(m->progname)-1);
m->progname[sizeof(m->progname)-1]= 0;
if(getcwd(m->initial_wdx,sizeof(m->initial_wdx)-1)==NULL)
m->initial_wdx[0]= 0;
m->no_rc= 0;
m->argument_emulation= 0;
m->genisoimage_completion= 0;
m->current_interpreter= 0;
m->rc_filename_count= Xorriso_rc_nuM;
for(i=0;i<m->rc_filename_count-1;i++)
strcpy(m->rc_filenames[i],Xorriso_sys_rc_nameS[i]);
m->rc_filenames[m->rc_filename_count-1][0]= 0;
m->arrange_args= 0;
m->mkisofsrc_done= 0;
m->wdi[0]= 0;
strcpy(m->wdx, m->initial_wdx);
m->did_something_useful= 0;
m->add_plainly= 0;
m->split_size= 0;
strcpy(m->list_delimiter, "--");
m->ino_behavior= 1 | 2 | 4 | 32; /* off:no_lsl_count */
m->iso_level= 3;
m->iso_level_is_default= 1;
m->do_joliet= 0;
m->do_hfsplus= 0;
m->do_fat= 0;
m->do_rockridge= 1;
m->do_iso1999= 0;
m->ecma119_map= 1;
m->joliet_map= 1;
/* off:read:restore:restore_su_auto:restore_only_known:restore_single */
m->lfa_flags_default= 2 | (11 << 11) | (1 << 16);
if(geteuid() != 0) {
/* do not restore known superuser lfa_flags */
m->lfa_flags_default|= (1 << 13);
}
m->lfa_flags_setting= m->lfa_flags_default;
m->lfa_restore_mask= ~((uint64_t) 0);
strcpy(m->lfa_restore_err_sev, "sorry");
m->do_aaip= 0;
if(m->lfa_flags_setting & 1)
m->do_aaip|= m->lfa_flags_setting & (15 << 11);
m->projid_mapper= NULL;
m->do_md5= 64;
m->no_emul_toc= 0;
m->do_old_empty= 0;
m->scdbackup_tag_name[0]= 0;
m->scdbackup_tag_time[0]= 0;
m->scdbackup_tag_written[0]= 0;
m->scdbackup_tag_listname[0]= 0;
m->relax_compliance= 0;
m->allow_dir_id_ext_dflt= 1;
m->rr_reloc_dir[0]= 0;
m->rr_reloc_flags= 1;
m->untranslated_name_len= 0;
m->do_follow_pattern= 1;
m->do_follow_param= 0;
m->do_follow_links= 0;
m->follow_link_limit= 100;
m->resolve_link_rec_count= 0;
m->resolve_link_rec_limit= 100;
m->do_follow_concat= 0;
m->do_follow_mount= 1;
m->do_global_uid= 0;
m->global_uid= 0;
m->isofs_size= 0;
m->isofs_has_what= 0;
m->tree_loaded= 0;
m->rr_loaded= 0;
strcpy(m->volid, "ISOIMAGE");
m->volid_default= 1;
m->loaded_volid[0]= 0;
m->assert_volid[0]= 0;
m->assert_volid_sev[0]= 0;
m->preparer_id[0]= 0;
m->publisher[0]= 0;
m->application_id[0]= 0;
m->system_id[0]= 0;
m->volset_id[0]= 0;
m->copyright_file[0]= 0;
m->biblio_file[0]= 0;
m->abstract_file[0]= 0;
strcpy(m->application_use, " ");
m->session_logfile[0]= 0;
m->session_lba= -1;
m->session_blocks= 0;
m->do_global_gid= 0;
m->global_gid= 0;
m->do_global_mode= 0;
m->global_dir_mode= 0555;
m->global_file_mode= 0444;
m->do_tao= 0;
m->filters= NULL;
m->filter_list_closed= 0;
m->zlib_level_default= m->zlib_level= 6;
m->zisofs_block_size= m->zisofs_block_size_default= (1 << 15);
m->zisofs_by_magic= 0;
m->zisofs_v2_enabled= 0;
m->zisofs_max_total_blocks= m->zisofs_max_total_blocks_default= 0x2000000;
m->zisofs_max_file_blocks= m->zisofs_max_file_blocks_default= 0x2000000;
m->zisofs_block_size= m->zisofs_block_size_default= (1 << 15);
m->zisofs_v2_block_size= m->zisofs_v2_block_size_default= (1 << 17);
m->zisofs_block_number_target= -1;
m->zisofs_bpt_discard_free_ratio= m->zisofs_bpt_discard_free_ratio_default=
-1.0;
m->zisofs_susp_z2= m->zisofs_susp_z2_default= 0;
m->do_overwrite= 2;
m->do_reassure= 0;
m->drive_blacklist= NULL;
m->drive_greylist= NULL;
m->drive_whitelist= NULL;
m->toc_emulation_flag= 0;
m->image_start_mode= 0;
m->image_start_value[0]= 0;
m->displacement= 0;
m->displacement_sign= 0;
m->read_fs= 0;
m->drives_exclusive= 1;
m->drives_access= 1;
m->linux_scsi_dev_family= 0;
m->early_stdio_test= 0;
m->cache_num_tiles= 0;
m->cache_tile_blocks= 0;
m->cache_default= 1 | 2;
m->do_calm_drive= 1;
m->indev[0]= 0;
m->in_drive_handle= NULL;
m->in_volset_handle= NULL;
m->in_charset= NULL;
m->isofs_st_out= time(0) - 1;
m->indev_is_exclusive= 1;
m->indev_access= 1;
m->indev_off_adr[0]= 0;
m->isofs_st_in= 0;
m->volset_change_pending= 0;
m->commit_attempts= 0;
m->print_size_attempts= 0;
m->write_session_counter= 0;
m->print_size_counter= 0;
m->no_volset_present= 0;
m->in_sector_map= NULL;
m->check_media_default= NULL;
m->check_media_bad_limit= Xorriso_read_quality_invaliD;
m->outdev[0]= 0;
m->out_drive_handle= NULL;
m->out_charset= NULL;
m->dev_fd_1= -1;
m->outdev_is_exclusive= 1;
m->outdev_access= 1;
m->outdev_off_adr[0]= 0;
m->grow_blindly_msc2= -1;
m->ban_stdio_write= 0;
m->do_dummy= 0;
m->do_close= 0;
m->auto_close= 0;
m->write_speed= 0; /* max */
m->read_speed= -2; /* do not set */
m->read_speed_force= 0;
m->read_speed_corr= 250000; /* look back at most 0.25 seconds with _force */
m->fs= 4*512; /* 4 MiB */
m->padding= 300*1024;
m->do_padding_by_libisofs= 0;
m->alignment= 0;
m->do_stream_recording= 0;
m->dvd_obs= 0;
m->do_obs_pad= 0;
m->bdr_obs_exempt= 0;
m->modesty_on_drive= 0;
m->min_buffer_usec= 5000;
m->max_buffer_usec= 25000;
m->buffer_timeout_sec= 120;
m->min_buffer_percent= 90;
m->max_buffer_percent= 95;
m->use_immed_bit= 0;
m->use_immed_bit_default= 0;
m->stdio_sync= 0;
m->stdio_sync_is_default= 1;
m->keep_boot_image= 0;
m->boot_image_cat_path[0]= 0;
m->boot_image_cat_hidden= 0;
m->boot_count= 0;
m->boot_platform_id= 0x00; /* El Torito Boot Catalog Platform ID: 0 = 80x86 */
m->patch_isolinux_image= 0;
m->boot_image_bin_path[0]= 0;
m->boot_image_bin_form[0]= 0;
m->boot_image_emul= 0;
m->boot_emul_default= 1;
m->boot_image_load_size= 4 * 512; /* hearsay out of libisofs/demo/iso.c */
m->boot_img_size_default= 1;
m->boot_img_full_size= 0;
memset(m->boot_id_string, 0, sizeof(m->boot_id_string));
memset(m->boot_selection_crit, 0, sizeof(m->boot_selection_crit));
#ifdef Xorriso_with_isohybriD
m->boot_image_isohybrid= 1;
#else
m->boot_image_isohybrid= 0;
#endif
m->boot_efi_default= 0;
m->system_area_disk_path[0]= 0;
m->system_area_clear_loaded= 0;
m->system_area_options= 0;
m->patch_system_area= 0;
m->partition_offset= 0;
m->partition_secs_per_head= 0;
m->partition_heads_per_cyl= 0;
m->prep_partition[0]= 0;
m->efi_boot_partition[0]= 0;
for(i= 0; i < Xorriso_max_appended_partitionS; i++) {
m->appended_partitions[i]= NULL;
m->appended_part_types[i]= 0;
memset(m->appended_part_type_guids[i], 0, 16);
m->appended_part_gpt_flags[i]= 0;
}
m->appended_as_gpt= 0;
m->appended_as_apm= 0;
m->part_like_isohybrid= 0;
m->iso_mbr_part_type= -1;
memset(m->iso_gpt_type_guid, 0, 16);
m->iso_mbr_part_flag= 0;
memset(m->gpt_guid, 0, 16);
m->gpt_guid_mode= 0;
m->max_ce_entries= 31; /* Linux hates >= RR_MAX_CE_ENTRIES = 32 */
m->max_ce_entries_flag= 2; /* omit non-isofs fattr and ACL if needed */
m->ascii_disc_label[0]= 0;
m->grub2_sparc_core[0]= 0;
memset(m->hfsp_serial_number, 0, 8);
m->hfsp_block_size= 0;
m->apm_block_size= 0;
m->vol_creation_time= 0;
m->vol_modification_time= 0;
m->vol_expiration_time= 0;
m->vol_effective_time= 0;
m->vol_uuid[0]= 0;
m->all_file_dates[0]= 0;
m->do_override_now_time= 0;
m->now_time_override= 0;
#ifdef Xorriso_with_libjtE
m->libjte_handle= NULL;
#endif
m->jigdo_params= NULL;
m->jigdo_values= NULL;
m->libjte_params_given= 0;
m->loaded_boot_bin_lba= 0;
m->loaded_boot_cat_path[0]= 0;
m->allow_graft_points= 0;
m->allow_restore= 0;
m->do_concat_split= 1;
m->do_auto_chmod= 0;
m->do_restore_sort_lba= 0;
m->do_strict_acl= 0;
m->dialog= 0;
m->buffered_dialog= NULL;
m->bsl_interpretation= 0;
m->sh_style_result= 0;
m->search_mode= 0;
m->structured_search= 1;
m->do_iso_rr_pattern= 1;
m->do_disk_pattern= 2;
m->temp_mem_limit= 16*1024*1024;
m->file_size_limit= Xorriso_default_file_size_limiT;
m->file_name_limit= 255;
m->disk_exclusions= NULL;
m->iso_rr_hidings= NULL;
m->joliet_hidings= NULL;
m->hfsplus_hidings= NULL;
m->disk_excl_mode= 1;
m->use_stdin= 0;
m->tolerate_stdin_eof= 0;
m->result_page_length= 0;
m->result_page_width= 80;
m->mark_text[0]= 0;
m->packet_output= 0;
for(i=0; i<4; i++) {
m->logfile[i][0]= 0;
m->logfile_fp[i]= NULL;
}
m->pktlog_fp= NULL;
m->stderr_fp= NULL;
for(i= 0; i < Xorriso_max_outlist_stacK; i++) {
m->result_msglists[i]= NULL;
m->info_msglists[i]= NULL;
m->msglist_flags[i]= 0;
}
m->lib_msg_queue_lock_ini= 0;
m->result_msglists_lock_ini= 0;
m->write_to_channel_lock_ini= 0;
m->msg_watcher_lock_ini= 0;
m->msg_watcher_state= 0;
m->msgw_result_handler= NULL;
m->msgw_result_handle= NULL;
m->msgw_info_handler= NULL;
m->msgw_info_handle= NULL;
m->msgw_stack_handle= -1;
m->msgw_msg_pending= 0;
m->msgw_fetch_lock_ini= 0;
m->msg_sieve= NULL;
m->msg_sieve_disabled= 0;
m->msglist_stackfill= 0;
m->status_history_max= Xorriso_status_history_maX;
m->scsi_log= 0;
strcpy(m->report_about_text, "UPDATE");
Xorriso__text_to_sev(m->report_about_text, &m->report_about_severity, 0);
m->library_msg_direct_print= 0;
strcpy(m->abort_on_text,"FAILURE");
Xorriso__text_to_sev(m->abort_on_text, &m->abort_on_severity, 0);
m->abort_on_is_default= 1;
m->problem_status= 0;
m->problem_status_lock_ini= 0;
m->problem_status_text[0]= 0;
m->errfile_log[0]= 0;
m->errfile_mode= 0;
m->errfile_fp= NULL;
m->img_read_error_mode= 1; /* abort faulty image reading with FAILURE */
m->extract_error_mode= 1; /* keep extracted files after read error */
strcpy(m->return_with_text, "SORRY");
Xorriso__text_to_sev(m->return_with_text, &m->return_with_severity, 0);
m->return_with_value= 32;
m->eternal_problem_status= 0;
m->eternal_problem_status_text[0]= 0;
m->re= NULL;
/* >>> ??? how to initialize m->match[0] ? */
m->re_constants= NULL;
m->re_count= 0;
m->re_fill= 0;
m->reg_expr[0]= 0;
m->run_state= 0;
m->is_dialog= 0;
m->bar_is_fresh= 0;
m->pending_option[0]= 0;
m->request_to_abort= 0;
m->request_not_to_ask= 0;
m->idle_time= 0.0;
m->re_failed_at= -1;
m->prepended_wd= 0;
m->insert_count= 0;
m->insert_bytes= 0;
m->error_count= 0;
m->launch_frontend_banned= 0;
m->pacifier_style= 0;
m->pacifier_interval= 1.0;
m->pacifier_count= 0;
m->pacifier_prev_count= 0;
m->pacifier_total= 0;
m->pacifier_byte_count= 0;
m->pacifier_fifo= NULL;
m->start_time= 0.0;
m->last_update_time= 0.0;
m->find_compare_result= 1;
m->find_check_md5_result= 0;
m->last_abort_file_time= 0.0;
m->node_counter= 0;
m->node_array_size= 0;
m->node_array= NULL;
m->node_disk_prefixes= NULL;
m->node_img_prefixes= NULL;
m->hln_count= 0;
m->hln_array= NULL;
m->hln_targets= NULL;
m->hln_change_pending= 0;
m->di_do_widen= NULL;
m->di_disk_paths= NULL;
m->di_iso_paths= NULL;
m->node_targets_availmem= 0;
m->di_count= 0;
m->di_array= NULL;
m->perm_stack= NULL;
m->update_flags= 0;
m->show_hfs_cmd_flag= 0;
m->show_hfs_cmd_count= 0;
m->show_hfs_cmds= NULL;
m->sparse_min_gap= 0;
m->result_line[0]= 0;
m->result_line_counter= 0;
m->result_page_counter= 0;
m->result_open_line_len= 0;
m->info_text[0]= 0;
m->toc_info_type= 1;
m->toc_time_form= 1;
/* Here begin actions which might fail */
ret= Sfile_leafname(progname, leafname, 0);
if(ret<=0)
goto failure;
if(strcmp(leafname, "osirrox")==0) {
m->allow_restore= 1;
m->drives_exclusive= 0;
m->drives_access= 0;
} else if(strcmp(leafname, "xorrisofs")==0 || strcmp(leafname, "genisofs")==0 ||
strcmp(leafname, "mkisofs")==0 || strcmp(leafname, "genisoimage")==0) {
m->argument_emulation= 1;
m->pacifier_style= 1;
Xorriso_protect_stdout(*xorriso, 0);
} else if(strcmp(leafname, "xorrecord")==0 || strcmp(leafname, "wodim")==0 ||
strcmp(leafname, "cdrecord")==0 || strcmp(leafname, "cdrskin")==0) {
m->argument_emulation= 2;
m->pacifier_style= 2;
}
ret= Exclusions_new(&(m->disk_exclusions), 0);
if(ret<=0)
goto failure;
ret= Exclusions_new(&(m->iso_rr_hidings), 0);
if(ret<=0)
goto failure;
ret= Exclusions_new(&(m->joliet_hidings), 0);
if(ret<=0)
goto failure;
ret= Exclusions_new(&(m->hfsplus_hidings), 0);
if(ret<=0)
goto failure;
Xorriso_relax_compliance(m, "default", 0);
ret= Xorriso_lst_new(&(m->drive_greylist), "/dev", m->drive_greylist, 1);
if(ret <= 0)
goto failure;
Xorriso_preparer_string(m, m->preparer_id, 1); /* avoids library calls */
ret= pthread_mutex_init(&(m->lib_msg_queue_lock), NULL);
if(ret != 0)
goto failure;
m->lib_msg_queue_lock_ini= 1;
ret= pthread_mutex_init(&(m->result_msglists_lock), NULL);
if(ret != 0)
goto failure;
m->result_msglists_lock_ini= 1;
ret= pthread_mutex_init(&(m->write_to_channel_lock), NULL);
if(ret != 0)
goto failure;
m->result_msglists_lock_ini= 1;
ret= pthread_mutex_init(&(m->problem_status_lock), NULL);
if(ret != 0)
goto failure;
m->problem_status_lock_ini= 1;
ret= pthread_mutex_init(&(m->msg_watcher_lock), NULL);
if(ret != 0)
goto failure;
m->msg_watcher_lock_ini= 1;
ret= pthread_mutex_init(&(m->msgw_fetch_lock), NULL);
if(ret != 0)
goto failure;
m->msgw_fetch_lock_ini= 1;
if(leafname != NULL)
free(leafname);
return(1);
failure:;
Xorriso_destroy(xorriso, 0);
if(leafname != NULL)
free(leafname);
return(-1);
}
int Xorriso_destroy_re(struct XorrisO *m, int flag)
{
int i;
if(m->re!=NULL) {
for(i=0;i<m->re_fill;i++) {
if(m->re_constants!=NULL)
if(m->re_constants[i]!=NULL)
continue; /* ,->re[i] was never subject to regcomp() */
regfree(&(m->re[i]));
}
free((char *) m->re);
m->re= NULL;
}
if(m->re_constants!=NULL) {
for(i=0;i<m->re_fill;i++)
if(m->re_constants[i]!=NULL)
free(m->re_constants[i]);
free((char *) m->re_constants);
m->re_constants= NULL;
}
m->re_count= 0;
m->re_fill= 0;
return(1);
}
/* @param flag bit0= global shutdown of libraries */
int Xorriso_destroy(struct XorrisO **xorriso, int flag)
{
struct XorrisO *m;
int i;
m= *xorriso;
if(m==NULL)
return(0);
/* Give up drives and image to unref all connected xorriso objects */
Xorriso_give_up_drive(m, 3);
if(m->in_charset!=NULL)
free(m->in_charset);
if(m->out_charset!=NULL)
free(m->out_charset);
Checkmediajob_destroy(&(m->check_media_default), 0);
Sectorbitmap_destroy(&(m->in_sector_map), 0);
Xorriso_destroy_re(m,0);
Exclusions_destroy(&(m->disk_exclusions), 0);
Exclusions_destroy(&(m->iso_rr_hidings), 0);
Exclusions_destroy(&(m->joliet_hidings), 0);
Exclusions_destroy(&(m->hfsplus_hidings), 0);
Xorriso_destroy_all_extf(m, 0);
Xorriso_lst_destroy_all(&(m->drive_blacklist), 0);
Xorriso_lst_destroy_all(&(m->drive_greylist), 0);
Xorriso_lst_destroy_all(&(m->drive_whitelist), 0);
Xorriso_destroy_node_array(m, 0);
Xorriso_destroy_hln_array(m, 0);
Xorriso_destroy_di_array(m, 0);
#ifdef Xorriso_with_libjtE
if(m->libjte_handle)
libjte_destroy(&(m->libjte_handle));
#endif
Xorriso_lst_destroy_all(&(m->jigdo_params), 0);
Xorriso_lst_destroy_all(&(m->jigdo_values), 0);
for(i= 0; i < Xorriso_max_appended_partitionS; i++)
if(m->appended_partitions[i] != NULL)
free(m->appended_partitions[i]);
Xorriso_detach_libraries(m, flag&1);
if(m->lib_msg_queue_lock_ini)
pthread_mutex_destroy(&(m->lib_msg_queue_lock));
if(m->result_msglists_lock_ini)
pthread_mutex_destroy(&(m->result_msglists_lock));
if(m->write_to_channel_lock_ini)
pthread_mutex_destroy(&(m->write_to_channel_lock));
if(m->problem_status_lock_ini)
pthread_mutex_destroy(&(m->problem_status_lock));
if(m->msg_watcher_lock_ini)
pthread_mutex_destroy(&(m->msg_watcher_lock));
if(m->msgw_fetch_lock_ini)
pthread_mutex_destroy(&(m->msgw_fetch_lock));
Xorriso_sieve_dispose(m, 0);
free((char *) m);
*xorriso= NULL;
return(1);
}
int Xorriso_destroy_node_array(struct XorrisO *xorriso, int flag)
{
int i;
if(xorriso->node_array != NULL) {
for(i= 0; i < xorriso->node_counter; i++)
iso_node_unref((IsoNode *) xorriso->node_array[i]);
free(xorriso->node_array);
}
xorriso->node_array= NULL;
xorriso->node_counter= xorriso->node_array_size= 0;
Xorriso_lst_destroy_all(&(xorriso->node_disk_prefixes), 0);
Xorriso_lst_destroy_all(&(xorriso->node_img_prefixes), 0);
return(1);
}
/* @param flag bit0= do not destroy hln_array but only hln_targets
*/
int Xorriso_destroy_hln_array(struct XorrisO *xorriso, int flag)
{
int i;
if(xorriso->hln_array != NULL && !(flag & 1)) {
for(i= 0; i < xorriso->hln_count; i++)
iso_node_unref((IsoNode *) xorriso->hln_array[i]);
free(xorriso->hln_array);
xorriso->hln_array= NULL;
xorriso->hln_count= 0;
}
if(xorriso->hln_targets != NULL) {
for(i= 0; i < xorriso->hln_count; i++)
if(xorriso->hln_targets[i] != NULL)
free(xorriso->hln_targets[i]);
free(xorriso->hln_targets);
xorriso->hln_targets= NULL;
}
xorriso->node_targets_availmem= 0;
return(1);
}
int Xorriso_destroy_di_array(struct XorrisO *xorriso, int flag)
{
int i;
if(xorriso->di_array != NULL) {
for(i= 0; i < xorriso->di_count; i++)
if(xorriso->di_array[i] != NULL)
iso_node_unref((IsoNode *) xorriso->di_array[i]);
free(xorriso->di_array);
xorriso->di_array= NULL;
}
if(xorriso->di_do_widen != NULL) {
free(xorriso->di_do_widen);
xorriso->di_do_widen= NULL;
}
Xorriso_lst_destroy_all(&(xorriso->di_disk_paths), 0);
Xorriso_lst_destroy_all(&(xorriso->di_iso_paths), 0);
xorriso->di_count= 0;
#ifdef NIX
/* <<< */
fprintf(stderr, "xorriso_DEBUG: get_di_count= %lu\n",
Xorriso_get_di_counteR);
#endif /* NIX */
return(1);
}
int Xorriso_new_node_array(struct XorrisO *xorriso, off_t mem_limit,
int addon_nodes, int flag)
{
int i;
if(xorriso->node_counter <= 0)
return(1);
xorriso->node_array= calloc(xorriso->node_counter + addon_nodes,
sizeof(IsoNode *));
if(xorriso->node_array == NULL) {
Xorriso_no_malloc_memory(xorriso, NULL, 0);
return(-1);
}
for(i= 0; i < xorriso->node_counter + addon_nodes; i++)
xorriso->node_array[i]= NULL;
xorriso->node_array_size= xorriso->node_counter + addon_nodes;
xorriso->node_counter= 0;
return(1);
}
/* @param flag bit0= do not allocate hln_array but only hln_targets
*/
int Xorriso_new_hln_array(struct XorrisO *xorriso, off_t mem_limit, int flag)
{
int i;
Xorriso_destroy_hln_array(xorriso, flag & 1);
if(xorriso->hln_count <= 0)
return(1);
if(!(flag & 1)) {
xorriso->hln_array= calloc(xorriso->hln_count, sizeof(char *));
if(xorriso->hln_array == NULL) {
Xorriso_no_malloc_memory(xorriso, NULL, 0);
return(-1);
}
for(i= 0; i < xorriso->hln_count; i++)
xorriso->hln_array[i]= NULL;
}
xorriso->hln_targets= calloc(xorriso->hln_count, sizeof(char *));
if(xorriso->hln_targets == NULL) {
if(!(flag & 1)) {
free(xorriso->hln_array);
xorriso->hln_array= NULL;
}
Xorriso_no_malloc_memory(xorriso, NULL, 0);
return(-1);
}
for(i= 0; i < xorriso->hln_count; i++)
xorriso->hln_targets[i]= NULL;
xorriso->node_targets_availmem= mem_limit
- xorriso->hln_count * sizeof(void *)
- xorriso->hln_count * sizeof(char *);
if(xorriso->node_targets_availmem < 0)
xorriso->node_targets_availmem= 0;
return(1);
}
int Xorriso__preset_signal_behavior(int behavior, int flag)
{
if(behavior < 0 || behavior > 3)
return(0);
Xorriso_signal_behavioR= behavior;
return(1);
}
int Xorriso__get_signal_behavior(int flag)
{
return(Xorriso_signal_behavioR);
}

View File

@ -1,31 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of functions which perform the
fundamental operations of the XorrisO object.
*/
#ifndef Xorriso_pvt_base_obj_includeD
#define Xorriso_pvt_base_obj_includeD yes
#ifdef NIX
/* <<< */
unsigned long Xorriso_get_di_counteR= 0;
#endif /* NIX */
struct XorrisO;
int Xorriso_destroy_re(struct XorrisO *m, int flag);
int Xorriso__get_signal_behavior(int flag);
#endif /* ! Xorriso_pvt_base_obj_includeD */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,185 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2024 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of classes SpotlistiteM, SpotlisT,
SectorbitmaP, CheckmediajoB which represent media checks and their outcome.
*/
#ifndef Xorriso_pvt_check_includeD
#define Xorriso_pvt_check_includeD yes
/* For ssize_t */
#include <unistd.h>
#include <sys/types.h>
struct SpotlisT; /* List of intervals with different read qualities */
struct CheckmediajoB; /* Parameters for Xorriso_check_media() */
int Xorriso_check_media_setup_job(struct XorrisO *xorriso,
struct CheckmediajoB *job,
char **argv, int old_idx, int end_idx, int flag);
int Xorriso_sectormap_to_spotlist(struct XorrisO *xorriso,
struct CheckmediajoB *job,
struct SpotlisT **spotlist,
int flag);
/* @param flag bit0= mark untested areas as valid
*/
int Xorriso_spotlist_to_sectormap(struct XorrisO *xorriso,
struct SpotlisT *spotlist,
off_t read_chunk,
struct SectorbitmaP **map,
int flag);
/* Opens the -check_media data copy in for reading and writing
*/
int Xorriso_open_job_data_to(struct XorrisO *xorriso,
struct CheckmediajoB *job, int flag);
/* @param report Buffer of at least 10*SfileadrL
@param flag bit0= only report non-default settings
@return <=0 error , 1 ok , 2 with bit0: every option is on default setting
*/
int Xorriso_check_media_list_job(struct XorrisO *xorriso,
struct CheckmediajoB *job,
char *report, int flag);
int Xorriso_update_in_sector_map(struct XorrisO *xorriso,
struct SpotlisT *spotlist, off_t read_chunk,
struct CheckmediajoB *job, int flag);
/* Distiniction between valid and invalid sectors */
struct SectorbitmaP {
off_t sectors;
off_t sector_size;
unsigned char *map;
ssize_t map_size;
};
int Spotlist_new(struct SpotlisT **o, int flag);
int Spotlist_destroy(struct SpotlisT **o, int flag);
int Spotlist_add_item(struct SpotlisT *o, off_t start_lba, off_t blocks,
int quality, int flag);
off_t Spotlist_count(struct SpotlisT *o, int flag);
off_t Spotlist_block_count(struct SpotlisT *o, int flag);
off_t Spotlist_sector_size(struct SpotlisT *o, off_t read_chunk, int flag);
int Spotlist_get_item(struct SpotlisT *o, off_t idx,
off_t *start_lba, off_t *blocks, int *quality, int flag);
char *Spotlist__quality_name(int quality, char name[80], int bad_limit,
int flag);
#define Xorriso_read_quality_gooD 0x7fffffff
#define Xorriso_read_quality_md5_matcH 0x70000000
#define Xorriso_read_quality_sloW 0x60000000
#define Xorriso_read_quality_partiaL 0x50000000
#define Xorriso_read_quality_valiD 0x40000000
#define Xorriso_read_quality_untesteD 0x3fffffff
#define Xorriso_read_quality_md5_mismatcH 0x38000000
#define Xorriso_read_quality_invaliD 0x30000000
#define Xorriso_read_quality_tao_enD 0x20000000
#define Xorriso_read_quality_off_tracK 0x10000000
#define Xorriso_read_quality_unreadablE 0x00000000
struct CheckmediajoB {
int use_dev; /* 0= use indev , 1= use outdev , 2= use sector map*/
off_t min_lba; /* if >=0 : begin checking at this address */
off_t max_lba; /* if >=0 : read up to this address, else use mode */
int min_block_size; /* granularity desired by user
*/
int async_chunks; /* >= 2 : run MD5 thread, use given number of chunks
else : synchronous
*/
int mode; /* 0= track by track
1= single sweep over libisoburn medium capacity
2= single sweep over libburn medium capacity
*/
time_t start_time;
int time_limit; /* Number of seconds after which to abort */
int item_limit; /* Maximum number of medium check list items as result */
char abort_file_path[SfileadrL];
char data_to_path[SfileadrL];
int data_to_fd;
off_t data_to_offset; /* usually 0 with image copy, negative with file copy */
off_t data_to_limit; /* used with file copy */
int data_to_skip; /* number of bytes to skip on writing. < 2048 */
int patch_lba0;
off_t patch_lba0_msc1;
char sector_map_path[SfileadrL];
struct SectorbitmaP *sector_map;
int map_with_volid; /* 0=add quick toc to map file,
1=read ISO heads for toc
*/
int retry; /* -1= only try full read_chunk, 1=retry with 2k blocks
0= retry with CD, full chunk else
*/
int report_mode; /* 0= print MCL items
1= print damaged files
*/
char event_severity[20]; /* If not "ALL": trigger event of given severity
at the end of a check job if bad blocks were
discovered.
*/
double slow_threshold_seq; /* Time limit in seconds for the decision whether
a read operation is considered slow. This does
not apply to thr first read of an interval.
*/
};
int Checkmediajob_new(struct CheckmediajoB **o, int flag);
int Checkmediajob_destroy(struct CheckmediajoB **o, int flag);
int Checkmediajob_copy(struct CheckmediajoB *from, struct CheckmediajoB *to,
int flag);
int Sectorbitmap_new(struct SectorbitmaP **o, off_t sectors, off_t sector_size,
int flag);
int Sectorbitmap_destroy(struct SectorbitmaP **o, int flag);
int Sectorbitmap_from_file(struct SectorbitmaP **o, char *path, char *msg,
int *os_errno, int flag);
int Sectorbitmap_to_file(struct SectorbitmaP *o, char *path, char *info,
char *msg, int *os_errno, int flag);
int Sectorbitmap_set(struct SectorbitmaP *o, off_t sector, int flag);
int Sectorbitmap_set_range(struct SectorbitmaP *o,
off_t start_sector, off_t sectors, int flag);
int Sectorbitmap_is_set(struct SectorbitmaP *o, off_t sector, int flag);
int Sectorbitmap_bytes_are_set(struct SectorbitmaP *o,
off_t start_byte, off_t end_byte, int flag);
int Sectorbitmap_get_layout(struct SectorbitmaP *o,
off_t *sectors, off_t *sector_size, int flag);
int Sectorbitmap_copy(struct SectorbitmaP *from, struct SectorbitmaP *to,
int flag);
int Sectorbitmap_clone(struct SectorbitmaP *from, struct SectorbitmaP **clone,
int flag);
#endif /* ! Xorriso_pvt_check_includeD */

File diff suppressed because it is too large Load Diff

View File

@ -1,45 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of class DirseQ which
crawls along a directory's content list.
*/
#ifndef Xorriso_pvt_cmp_includeD
#define Xorriso_pvt_cmp_includeD yes
int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
char *iso_adr, char *adr_common_tail,
int *result, int flag);
int Xorriso_pfx_disk_path(struct XorrisO *xorriso, char *iso_path,
char *iso_prefix, char *disk_prefix,
char disk_path[SfileadrL], int flag);
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
Set to NULL if calling this function from outside ISO world
@param node Opaque handle to be forwarded to actions in ISO image
Set to NULL if calling this function from outside ISO world
@param flag bit0= update rather than compare
*/
int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter, void *node,
char *iso_path, char *iso_prefix, char *disk_prefix,
int flag);
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
Set to NULL if calling this function from outside ISO world
@param @node Opaque handle to be forwarded to actions in ISO image
Set to NULL if calling this function from outside ISO world
*/
int Xorriso_update_interpreter(struct XorrisO *xorriso,
void *boss_iter, void *node,
int compare_result, char *disk_path,
char *iso_rr_path, int flag);
#endif /* ! Xorriso_pvt_cmp_includeD */

View File

@ -1,8 +1,7 @@
#!/bin/sh
# compile_xorriso.sh
# Copyright 2005 - 2015 Thomas Schmitt, scdbackup@gmx.net
# GPL version 2 or later
# Copyright 2005 - 2010 Thomas Schmitt, scdbackup@gmx.net, GPL version 2
#
# Not intended for general use in production installations !
# Rather use: ./bootstrap ; ./configure ; make
@ -19,19 +18,15 @@ isoburn=./libisoburn-develop/libisoburn
xorr=./libisoburn-develop/xorriso
debug_opts="-O2"
def_opts="-DXorriso_allow_external_filterS -DXorriso_allow_launch_frontenD"
def_opts="-DXorriso_allow_external_filterS"
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
do_strip=0
static_opts=
warn_opts="-Wall -Wextra -Wno-unused-parameter -Wno-char-subscripts"
# warn_opts="-Wall -Wsign-compare"
warn_opts="-Wall"
nglibisofs=1
def_have="-DHAVE_STDINT_H"
def_libreadline="-DXorriso_with_readlinE"
def_libjte="-DXorriso_with_libjtE -DLibisofs_with_libjtE"
link_libreadline="-lreadline"
link_libcdio=
link_libjte="-ljte"
for i in "$@"
do
@ -55,10 +50,6 @@ do
elif test "$i" = "-use_libcdio"
then
link_libcdio="-lcdio"
elif test "$i" = "-no_libjte"
then
def_libjte=""
link_libjte=""
elif test "$i" = "-help" -o "$i" = "--help" -o "$i" = "-h"
then
echo \
@ -67,7 +58,6 @@ do
echo " -dvd_obs_64k 64 KB default size for DVD/BD writing."
echo " -no_libreadline do not compile for and link with libreadline."
echo " -use_libcdio link with -lcdio because libburn uses it."
echo " -no_libjte do not compile for and link with libjte."
echo " -do_diet produce capability reduced lean version."
echo " -do_strip apply program strip to compiled programs."
echo " -g produce debuggable programm."
@ -93,10 +83,6 @@ libisofs="$libisofs $isofs"fsource.o
libisofs="$libisofs $isofs"image.o
libisofs="$libisofs $isofs"iso1999.o
libisofs="$libisofs $isofs"joliet.o
libisofs="$libisofs $isofs"hfsplus.o
libisofs="$libisofs $isofs"hfsplus_decompose.o
libisofs="$libisofs $isofs"hfsplus_classes.o
libisofs="$libisofs $isofs"hfsplus_case.o
libisofs="$libisofs $isofs"libiso_msgs.o
libisofs="$libisofs $isofs"messages.o
libisofs="$libisofs $isofs"node.o
@ -122,7 +108,7 @@ date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >"$xorr"/xorriso_bu
echo "Build timestamp : $(sed -e 's/#define Xorriso_build_timestamP "//' -e 's/"$//' "$xorr"/xorriso_buildstamp.h)"
echo "compiling program $xorr/xorriso.c $static_opts $debug_opts $def_opts $link_libcdio"
cc -I. -DXorriso_with_maiN $def_have $def_libreadline $def_libjte \
cc -I. -DXorriso_with_maiN $def_libreadline \
$warn_opts \
$static_opts \
$debug_opts \
@ -131,38 +117,9 @@ cc -I. -DXorriso_with_maiN $def_have $def_libreadline $def_libjte \
\
-o "$xorr"/xorriso \
\
"$xorr"/xorriso_main.c \
"$xorr"/sfile.c \
"$xorr"/aux_objects.c \
"$xorr"/findjob.c \
"$xorr"/check_media.c \
"$xorr"/misc_funct.c \
"$xorr"/text_io.c \
"$xorr"/match.c \
"$xorr"/emulators.c \
"$xorr"/disk_ops.c \
"$xorr"/cmp_update.c \
"$xorr"/parse_exec.c \
"$xorr"/opts_a_c.c \
"$xorr"/opts_d_h.c \
"$xorr"/opts_i_o.c \
"$xorr"/opts_p_z.c \
"$xorr"/xorriso.c \
\
"$xorr"/base_obj.c \
"$xorr"/lib_mgt.c \
"$xorr"/sort_cmp.c \
"$xorr"/drive_mgt.c \
"$xorr"/iso_img.c \
"$xorr"/iso_tree.c \
"$xorr"/iso_manip.c \
"$xorr"/write_run.c \
"$xorr"/read_run.c \
"$xorr"/filters.c \
\
"$isoburn"/isoburn.c \
"$isoburn"/burn_wrap.c \
"$isoburn"/data_source.c \
"$isoburn"/isofs_wrap.c \
"$xorr"/xorrisoburn.c \
\
"$burn"/async.o \
"$burn"/debug.o \
@ -179,7 +136,6 @@ cc -I. -DXorriso_with_maiN $def_have $def_libreadline $def_libjte \
"$burn"/libdax_audioxtr.o \
"$burn"/libdax_msgs.o \
"$burn"/cleanup.o \
"$burn"/cdtext.o \
\
"$burn"/mmc.o \
"$burn"/sbc.o \
@ -192,11 +148,15 @@ cc -I. -DXorriso_with_maiN $def_have $def_libreadline $def_libjte \
"$burn"/crc.o \
"$burn"/ecma130ab.o \
\
"$isoburn"/isoburn.o \
"$isoburn"/burn_wrap.o \
"$isoburn"/data_source.o \
"$isoburn"/isofs_wrap.o \
\
$libisofs \
\
$link_libreadline \
$link_libcdio \
$link_libjte \
\
-lpthread \
-lacl \
@ -220,12 +180,4 @@ then
strip "$xorr"/xorriso
fi
if test -x $xorr/unite_html_b_line
then
dummy=dummy
else
echo "compiling helper program $xorr/unite_html_b_line"
( cd $xorr && cc -g -Wall -o unite_html_b_line unite_html_b_line.c )
fi
echo 'done.'

View File

@ -1,10 +1,11 @@
# configure.ac stems from xorriso/configure_ac.txt and leads to ./configure
# Copyright (c) 2007 - 2025 Thomas Schmitt <scdbackup@gmx.net>
# Copyright (c) 2007 - 2010 Thomas Schmitt <scdbackup@gmx.net>
# Provided under GPL version 2 or later.
AC_INIT([xorriso], [1.5.7], [http://libburnia-project.org])
AC_INIT([xorriso], [0.5.2], [http://libburnia-project.org])
AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h])
AC_CANONICAL_HOST
AC_CANONICAL_TARGET
@ -12,25 +13,17 @@ AC_CANONICAL_TARGET
LIBBURNIA_SET_FLAGS
AM_INIT_AUTOMAKE([subdir-objects])
AC_CONFIG_MACRO_DIR([./])
dnl Let autoheader produce config.h.in and let configure produce config.h
dnl This saves about 500 characters of compile message per source file.
AC_CONFIG_HEADER(config.h)
AH_TEMPLATE([Xorriso_standalonE], [Define to prepare sources for statically linked xorriso])
AC_DEFINE([Xorriso_standalonE], [])
BURN_MAJOR_VERSION=1
BURN_MINOR_VERSION=5
BURN_MICRO_VERSION=7
BURN_MAJOR_VERSION=0
BURN_MINOR_VERSION=7
BURN_MICRO_VERSION=9
AC_SUBST(BURN_MAJOR_VERSION)
AC_SUBST(BURN_MINOR_VERSION)
AC_SUBST(BURN_MICRO_VERSION)
LIBISOFS_MAJOR_VERSION=1
LIBISOFS_MINOR_VERSION=5
LIBISOFS_MICRO_VERSION=7
LIBISOFS_MAJOR_VERSION=0
LIBISOFS_MINOR_VERSION=6
LIBISOFS_MICRO_VERSION=29
AC_SUBST(LIBISOFS_MAJOR_VERSION)
AC_SUBST(LIBISOFS_MINOR_VERSION)
AC_SUBST(LIBISOFS_MICRO_VERSION)
@ -42,8 +35,7 @@ dnl #define isoburn_header_version_*
AC_PREFIX_DEFAULT([/usr/local])
test "$prefix" = "NONE" && prefix=$ac_default_prefix
dnl ts B90405 : Disabled on advise of Ross Burton
dnl AM_MAINTAINER_MODE
AM_MAINTAINER_MODE
AM_PROG_CC_C_O
AC_C_CONST
@ -58,36 +50,19 @@ if test ! $ac_cv_func_fseeko; then
AC_ERROR([Libburn requires largefile support.])
fi
AH_TEMPLATE([ICONV_CONST], [Whether to apply const qualifier to iconv inbuf])
if test x$XORRISO_OLD_ICONV_CONFIGURE = x
then
dnl ts B00410 : To detect the need for -liconv and const argument of iconv()
LIBBURNIA_CHECK_ICONV
dnl ts B00411 : To abort configuration if iconv() still cannot be compiled
LIBBURNIA_ASSERT_ICONV
else
dnl Outdated: produces double -liconv and warnings about parameter mismatch
dnl If iconv(3) is in an extra libiconv, then it gets added to variable LIBS.
dnl If not, then no -liconv will be added.
AC_CHECK_LIB(iconv, iconv, , )
dnl GNU iconv has no function iconv() but libiconv() and a macro iconv()
AC_CHECK_LIB(iconv, libiconv, , )
fi
AC_PROG_LIBTOOL
AC_SUBST(LIBTOOL_DEPS)
dnl LIBTOOL="$LIBTOOL --silent"
LIBTOOL="$LIBTOOL --silent"
AC_PROG_INSTALL
dnl GNU libtool checks stdint.h inttypes.h stdlib.h by default/unconditionally, dnl but slibtool does not. So accept the ugly double check and -DHAVE_*_H
dnl arguments with GNU libtool.
dnl select.h seems to be ubiquitous, but was not used in libisoburn before 2025
AC_CHECK_HEADERS(stdint.h inttypes.h stdlib.h sys/select.h)
AC_CHECK_HEADERS()
AC_CHECK_MEMBER([struct tm.tm_gmtoff],
[AC_DEFINE(HAVE_TM_GMTOFF, 1,
@ -101,16 +76,6 @@ AC_CHECK_DECL([timegm],
,
[#include <time.h>])
dnl Whether timezone is an integer variable
AH_TEMPLATE([Libburnia_timezonE], [Either timezone or 0])
LIBBURNIA_TRY_TIMEZONE
if test x$LIBBURNIA_TIMEZONE = xtimezone
then
AC_DEFINE([Libburnia_timezonE], [timezone])
else
AC_DEFINE([Libburnia_timezonE], [0])
fi
dnl Check if non standard eaccess() function is available
AC_CHECK_DECL([eaccess],
[AC_DEFINE(HAVE_EACCESS, 1, [Define this if eaccess function is available])],
@ -125,33 +90,15 @@ AC_SUBST(ARCH)
AC_SUBST(LIBBURNIA_PKGCONFDIR)
AC_SUBST(LIBBURN_ARCH_LIBS)
dnl ts A90303
dnl Check the preconditions for using statvfs() in sg-dummy
dnl (sg-linux and sg-freebsd use statvfs() unconditionally)
AH_TEMPLATE([Libburn_os_has_statvfS], [Define to use statvfs() with libburn stdio])
STATVFS_DEF=-DLibburn_os_has_statvfS
AC_CHECK_HEADER(sys/statvfs.h, X=, STATVFS_DEF=)
AC_CHECK_FUNC([statvfs], X=, STATVFS_DEF=)
if test x$STATVFS_DEF = x-DLibburn_os_has_statvfS
then
AC_DEFINE([Libburn_os_has_statvfS], [])
fi
CFLAGS="$CFLAGS $STATVFS_DEF"
dnl xorriso-dd-target is addicted to the Linux kernel and util-linux lsblk
if uname -s | grep '^Linux' >/dev/null
then
XORRISO_DD_TARGET=xorriso-dd-target/xorriso-dd-target
XORRISO_DD_TARGET_MAN=xorriso-dd-target/xorriso-dd-target.1
XORRISO_DD_TARGET_TEXI=xorriso-dd-target/xorriso-dd-target.texi
echo "enabled installation of xorriso-dd-target/xorriso-dd-target"
else
XORRISO_DD_TARGET=
XORRISO_DD_TARGET_MAN=
XORRISO_DD_TARGET_TEXI=
echo "disabled installation of xorriso-dd-target/xorriso-dd-target"
fi
AC_SUBST(XORRISO_DD_TARGET)
AC_SUBST(XORRISO_DD_TARGET_MAN)
AC_SUBST(XORRISO_DD_TARGET_TEXI)
dnl Add compiler-specific flags
@ -161,15 +108,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 -Wno-char-subscripts -Wno-strict-aliasing $CFLAGS"
CFLAGS="$CFLAGS -g -pedantic -Wall"
fi
CFLAGS="-DDEBUG $CFLAGS"
CFLAGS="$CFLAGS -DDEBUG"
fi
@ -179,7 +126,6 @@ dnl
LIBBURNIA_SET_PKGCONFIG
AH_TEMPLATE([Xorriso_with_readlinE], [Define to use libreadline])
AC_ARG_ENABLE(libreadline,
[ --enable-libreadline Enable use of libreadline by xorriso, default=yes],
, enable_libreadline=yes)
@ -187,214 +133,45 @@ if test x$enable_libreadline = xyes; then
dnl Check whether there is readline-devel and readline-runtime.
dnl If not, erase this macro which would enable use of readline(),add_history()
READLINE_DEF="-DXorriso_with_readlinE"
if test x$XORRISO_OLD_READLINE_CONFIGURE = x
then
dnl ts B00411 : To disable readline if not all needed functions are present
LIBBURNIA_ASSERT_READLINE
else
dnl The empty yes case obviously causes -lreadline to be linked
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
dnl The X= in the yes case prevents that -lreadline gets linked twice
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
fi
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
else
READLINE_DEF=
echo "disabled libreadline"
fi
if test x$READLINE_DEF = x; then
AH_TEMPLATE([Xorriso_with_editlinE],
[Define to use libedit if not libreadline])
if test x$enable_libreadline = xyes; then
libedit_deflt=yes
else
libedit_deflt=no
fi
AC_ARG_ENABLE(libedit,
[ --enable-libedit Enable use of libedit by xorriso if not libreadline, default= setting of --enable-libreadline],
, enable_libedit=$libedit_deflt)
if test x$enable_libedit = xyes; then
READLINE_DEF="-DXorriso_with_editlinE"
LIBBURNIA_ASSERT_EDITLINE
else
READLINE_DEF=
echo "disabled libedit"
fi
fi
if test x$READLINE_DEF = x-DXorriso_with_readlinE
then
AC_DEFINE([Xorriso_with_readlinE], [])
elif test x$READLINE_DEF = x-DXorriso_with_editlinE
then
AC_DEFINE([Xorriso_with_editlinE], [])
fi
AC_SUBST(READLINE_DEF)
AH_TEMPLATE([Libisofs_with_aaip_acL], [Define to use ACL capabilities])
AC_ARG_ENABLE(libacl,
[ --enable-libacl Enable use of ACL functions by libisofs, default=yes],
[ --enable-libacl Enable use of libacl by libisofs, default=yes],
, enable_libacl=yes)
LIBACL_DEF=
has_acl_h_but_no_func=0
if test x$LIBBURNIA_SUPP_ACL = xlibacl
then
if test x$enable_libacl = xyes; then
if test x$enable_libacl = xyes; then
dnl Check whether there is libacl-devel and libacl-runtime.
dnl If not, erase this macro which would enable use of acl_to_text and others
LIBACL_DEF="-DLibisofs_with_aaip_acL"
LIBACL_DEF="-DLibisofs_with_aaip_acL"
dnl The empty yes case obviously causes -lacl to be linked
AC_CHECK_HEADER(sys/acl.h, AC_CHECK_LIB(acl, acl_to_text, , has_acl_h_but_no_libacl=1 ), LIBACL_DEF= )
if test "$has_acl_h_but_no_libacl" = 1
then
AC_CHECK_LIB(c, acl_to_text, X= , LIBACL_DEF= )
fi
fi
fi
if test x$LIBACL_DEF = x-DLibisofs_with_aaip_acL
then
AC_DEFINE([Libisofs_with_aaip_acL], [])
if test x$has_acl_h_but_no_libacl = x1
then
echo "enabled local processing of ACL"
else
echo "enabled libacl, local processing of ACL"
fi
AC_CHECK_HEADER(sys/acl.h, AC_CHECK_LIB(acl, acl_to_text, , LIBACL_DEF= ), LIBACL_DEF= )
else
echo "disabled local processing of ACL"
LIBACL_DEF=
fi
AC_SUBST(LIBACL_DEF)
AH_TEMPLATE([Libisofs_with_aaip_xattR],
[Define to use Linux xattr capabilities])
AH_TEMPLATE([Libisofs_with_sys_xattR],
[Define to include Linux sys/xattr.h instead of attr/xattr.h])
AH_TEMPLATE([Libisofs_with_freebsd_extattR],
[Define to use FreeBSD extattr capabilities])
AC_ARG_ENABLE(xattr,
[ --enable-xattr Enable use of extended file attributes by libisofs, default=yes],
, enable_xattr=yes)
AC_ARG_ENABLE(xattr-h-pref-attr,
[ --enable-xattr-h-pref-attr Prefer include file attr/xattr.h over sys/xattr.h, default=no],
, enable_xattr_h_pref_attr=no)
XATTR_DEF=
if test x"$LIBBURNIA_SUPP_FATTR" = xxattr
then
if test "x$enable_xattr" = xyes; then
dnl Check whether there is the header for Linux xattr.
[ --enable-xattr Enable use of xattr by libisofs, default=yes],
, enable_xattr=yes)
if test x$enable_xattr = xyes; then
dnl Check whether there is the header for GNU/Linux xattr.
dnl If not, erase this macro which would enable use of listxattr and others
XATTR_A_DEF=
XATTR_S_DEF=
if test x"$enable_xattr_h_pref_attr" = xyes
then
echo "prefering include file attr/xattr.h over sys/attr.h"
XATTR_A_DEF=1
AC_CHECK_HEADER(attr/xattr.h, AC_CHECK_LIB(c, listxattr, X= ,
XATTR_A_DEF= ), XATTR_A_DEF= )
if test x"$XATTR_A_DEF" = x1
then
XATTR_DEF="-DLibisofs_with_aaip_xattR"
else
XATTR_S_DEF=1
AC_CHECK_HEADER(sys/xattr.h, AC_CHECK_LIB(c, listxattr, X= ,
XATTR_S_DEF= ), XATTR_S_DEF= )
if test x"$XATTR_S_DEF" = x1
then
XATTR_DEF="-DLibisofs_with_aaip_xattR"
AC_DEFINE([Libisofs_with_sys_xattR], [])
fi
fi
else
XATTR_S_DEF=1
AC_CHECK_HEADER(sys/xattr.h, AC_CHECK_LIB(c, listxattr, X= ,
XATTR_S_DEF= ), XATTR_S_DEF= )
if test x"$XATTR_S_DEF" = x1
then
XATTR_DEF="-DLibisofs_with_aaip_xattR"
AC_DEFINE([Libisofs_with_sys_xattR], [])
else
XATTR_A_DEF=1
AC_CHECK_HEADER(attr/xattr.h, AC_CHECK_LIB(c, listxattr, X= ,
XATTR_A_DEF= ), XATTR_A_DEF= )
if test x"$XATTR_A_DEF" = x1
then
XATTR_DEF="-DLibisofs_with_aaip_xattR"
fi
fi
fi
if test x"$XATTR_S_DEF" = x1
then
echo "decided to include file sys/attr.h"
elif test x"$XATTR_A_DEF" = x1
then
echo "decided to include file attr/xattr.h"
fi
fi
elif test x"$LIBBURNIA_SUPP_FATTR" = xextattr
then
if test "x$enable_xattr" = xyes; then
XATTR_DEF="-DLibisofs_with_freebsd_extattR"
AC_CHECK_HEADER(sys/extattr.h, AC_CHECK_LIB(c, extattr_list_file, X=,
XATTR_DEF= ), XATTR_DEF= )
fi
fi
if test x$XATTR_DEF = x-DLibisofs_with_aaip_xattR
then
AC_DEFINE([Libisofs_with_aaip_xattR], [])
echo "enabled xattr, local processing of extended file attributes Linux style"
elif test x$XATTR_DEF = x-DLibisofs_with_freebsd_extattR
then
AC_DEFINE([Libisofs_with_freebsd_extattR], [])
echo "enabled extattr, local processing of extended file attributes FreeBSD style"
XATTR_DEF="-DLibisofs_with_aaip_xattR"
AC_CHECK_HEADER(attr/xattr.h, AC_CHECK_LIB(c, listxattr, X= , XATTR_DEF= ), XATTR_DEF= )
else
echo "disabled local processing of extended file attributes"
XATTR_DEF=
fi
AC_SUBST(XATTR_DEF)
dnl ts C40722
AH_TEMPLATE([Libisofs_with_aaip_lfa_flagS],
[Define to use Linux chattr capabilities])
LFA_DEF=
AC_ARG_ENABLE(lfa-flags,
[ --enable-lfa-flags Enable processing of Linux chattr(1) flags, default=yes],
, enable_lfa_flags=yes)
if test x"$enable_lfa_flags" = xyes; then
AC_CHECK_HEADER(linux/fs.h, LFA_DEF="-DLibisofs_with_aaip_lfa_flagS",
LFA_DEF=)
fi
if test x"$LFA_DEF" = x-DLibisofs_with_aaip_lfa_flagS
then
AC_DEFINE([Libisofs_with_aaip_lfa_flagS], [])
echo "enabled Linux chattr(1) flags"
else
echo "disabled Linux chattr(1) flags"
fi
dnl ts C41009
AH_TEMPLATE([Libisofs_with_aaip_projiD],
[Define to use XFS-style project id capabilities])
PROJID_DEF=
AC_ARG_ENABLE(projid,
[ --enable-projid Enable processing of XFS-style project id, default=yes],
, enable_projid=yes)
if test x"$enable_projid" = xyes; then
AC_CHECK_HEADER(linux/fs.h, PROJID_DEF="-DLibisofs_with_aaip_projiD",
PROJID_DEF=)
fi
if test x"$PROJID_DEF" = x; then
echo "disabled XFS-style project id"
else
AC_DEFINE([Libisofs_with_aaip_projiD], [])
echo "enabled XFS-style project id"
fi
AH_TEMPLATE([Libisofs_with_zliB], [Define to use compression via zlib])
AH_TEMPLATE([LIBJTE_WITH_ZLIB], [Allow libjte to use zlib])
AC_ARG_ENABLE(zlib,
[ --enable-zlib Enable use of zlib by libisofs, default=yes],
, enable_zlib=yes)
@ -404,115 +181,17 @@ dnl If not, erase this macro which would enable use of compress2() and others.
dnl Linking fails on SuSE 9.0 because zlib has compress2() but lacks
dnl compressBound(). So compressBound is the more modern thing to test.
dnl The empty parameter after "compressBound" causes -lz.
ZLIB_DEF=yes
ZLIB_DEF="-DLibisofs_with_zliB"
AC_CHECK_HEADER(zlib.h, AC_CHECK_LIB(z, compressBound, , ZLIB_DEF= ), ZLIB_DEF= )
else
echo "disabled use of zlib"
ZLIB_DEF=
fi
if test x$ZLIB_DEF = xyes
then
AC_DEFINE([Libisofs_with_zliB], [])
AC_DEFINE([LIBJTE_WITH_ZLIB], [])
fi
# There are Linuxes with no public generic SCSI interface
LIBBURNIA_CHECK_LINUX_SCSI
# libjte source is included in GNU xorriso. Enable it if zlib is enabled.
AH_TEMPLATE([Xorriso_with_libjtE],
[Define to use Jigdo Template Extraction via libjte])
AH_TEMPLATE([Libisofs_with_libjtE],
[Define to use Jigdo Template Extraction via libjte])
if test x$ZLIB_DEF = xyes
then
AC_DEFINE([Xorriso_with_libjtE], [])
AC_DEFINE([Libisofs_with_libjtE], [])
LIBJTE_DEF=yes
echo "enabled built-in libjte"
else
LIBJTE_DEF=
echo "disabled libjte because zlib not enabled or not available"
fi
AC_SUBST(ZLIB_DEF)
dnl ts C50224
AH_TEMPLATE([Libisofs_dir_rec_size_checK], [Define to enable detailed check of directory size prediction])
AC_ARG_ENABLE(dir-rec-size-check,
[ --enable-dir-rec-size-check Detailed check of directory size prediction, default=no],
, dir_rec_size_check=no)
if test x$enable_dir_rec_size_check = xyes; then
DIR_REC_SIZE_CHECK="-DLibisofs_dir_rec_size_checK"
echo "enabled detailed check of directory size prediction"
else
DIR_REC_SIZE_CHECK=
echo "disabled detailed check of directory size prediction"
fi
if test x$DIR_REC_SIZE_CHECK = x-DLibisofs_dir_rec_size_checK
then
AC_DEFINE([Libisofs_dir_rec_size_checK], [])
fi
AH_TEMPLATE([THREADED_CHECKSUMS],
[Define to use multi-threading in built-in libjte])
AC_ARG_ENABLE(jtethreads,
[ --enable-jtethreads Enable multi-threading in libjte, default=yes],
, enable_jtethreads=yes)
if test x$LIBJTE_DEF = xyes
then
if test "x$enable_jtethreads" = xyes; then
mem_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS $THREAD_LIBS"
AC_MSG_CHECKING([for pthread_cancel()])
AC_TRY_LINK([#include <pthread.h>],
[pthread_cancel((pthread_t) NULL);],
[],
[enable_jtethreads=no])
AC_MSG_RESULT([$enable_jtethreads])
LDFLAGS="$mem_LDFLAGS"
fi
if test "x$enable_jtethreads" = xyes; then
AC_DEFINE([THREADED_CHECKSUMS], [])
echo "enabled multi-threading in libjte"
else
echo "disabled multi-threading in libjte"
fi
fi
AH_TEMPLATE([LIBJTE_WITH_LIBBZ2],
[Define to use libbz2 by built-in libjte])
AC_ARG_ENABLE(libbz2,
[ --enable-libbz2 Enable use of libbz2 by libjte, default=yes],
, enable_libbz2=yes)
if test "x$enable_libbz2" = xyes -a x$LIBJTE_DEF = xyes ; then
dnl Check whether there is the header for libbz2.
BZIP2_DEF=yes
AC_CHECK_HEADER(bzlib.h, AC_CHECK_LIB(bz2, BZ2_bzCompressInit, , BZIP2_DEF= ), BZIP2_DEF= )
else
BZIP2_DEF=
fi
if test x$BZIP2_DEF = xyes
then
AC_DEFINE([LIBJTE_WITH_LIBBZ2], [])
BZIP2_DEF="-DLIBJTE_WITH_LIBBZ2"
fi
case $host_os in
cygwin*|mingw*)
default_libcdio=yes
;;
*)
default_libcdio=no
;;
esac
AH_TEMPLATE([Libburn_use_libcdiO], [Define to use libcdio as system adapter])
AC_ARG_ENABLE(libcdio,
[ --enable-libcdio Enable use of libcdio as system adapter, default=no (except on MSWindows)],
, enable_libcdio=$default_libcdio)
[ --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
@ -529,23 +208,14 @@ then
echo "WARNING: could not enable use of libcdio as system adapter"
fi
else
if echo " $CFLAGS $LDFLAGS " | grep ' -static ' >/dev/null
then
echo "WARNING : found option -static in CFLAGS or LDFLAGS"
echo "WARNING : libcdio API conflicts with inner symbols of xorriso"
echo "WARNING : use of libcdio as system adapter disabled"
LIBCDIO_DEF=
else
echo "enabled use of libcdio as system adapter"
fi
fi
if test x$LIBCDIO_DEF = x-DLibburn_use_libcdiO
then
AC_DEFINE([Libburn_use_libcdiO], [])
echo "enabled EXPERIMENTAL use of libcdio as system adapter"
LIBCDIO_REQUIRED=0.83
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
fi
AC_SUBST(LIBCDIO_DEF)
AH_TEMPLATE([Xorriso_allow_external_filterS], [Define to allow xorriso to start external filter processes])
AC_ARG_ENABLE(external-filters,
[ --enable-external-filters Enable use of external filter programs by xorriso, default=yes],
, enable_external_filters=yes)
@ -556,13 +226,8 @@ else
EXTF_DEF=
echo "disabled xorriso external filter programs"
fi
if test x$EXTF_DEF = x-DXorriso_allow_external_filterS
then
AC_DEFINE([Xorriso_allow_external_filterS], [])
fi
AC_SUBST(EXTF_DEF)
AH_TEMPLATE([Xorriso_allow_extf_suiD], [Define to allow external filters to xorriso when running under setuid])
AC_ARG_ENABLE(external-filters-setuid,
[ --enable-external-filters-setuid Enable xorriso external filter programs under setuid, default=no],
, enable_external_filters_setuid=no)
@ -573,62 +238,20 @@ else
EXTF_SUID_DEF=
echo "disabled xorriso external filter programs under setuid"
fi
if test x$EXTF_SUID_DEF = x-DXorriso_allow_extf_suiD
then
AC_DEFINE([Xorriso_allow_extf_suiD], [])
fi
AC_SUBST(EXTF_SUID_DEF)
AH_TEMPLATE([Xorriso_allow_launch_frontenD], [Define to allow xorriso command -launch_frontend])
AC_ARG_ENABLE(launch-frontend,
[ --enable-launch-frontend Enable start of piped frontend program by xorriso, default=yes],
, enable_launch_frontend=yes)
if test x"$enable_launch_frontend" = xyes; then
LFRONT_DEF="-DXorriso_allow_launch_frontenD"
echo "enabled xorriso command -launch_frontend"
else
LFRONT_DEF=
echo "disabled xorriso command -launch_frontend"
fi
if test x$LFRONT_DEF = x-DXorriso_allow_launch_frontenD
then
AC_DEFINE([Xorriso_allow_launch_frontenD], [])
fi
AH_TEMPLATE([Xorriso_allow_extf_suiD], [Define to allow xorriso command -launch_frontend when running under setuid])
AC_ARG_ENABLE(launch-frontend-setuid,
[ --enable-launch-frontend-setuid Enable start of piped frontend program under setuid, default=no],
, enable_launch_frontend_setuid=no)
if test x$enable_launch_frontend_setuid = xyes; then
LFRONT_SUID_DEF="-DXorriso_allow_extf_suiD"
echo "enabled xorriso command -launch_frontend under setuid"
else
LFRONT_SUID_DEF=
echo "disabled xorriso command -launch_frontend under setuid"
fi
if test x$LFRONT_SUID_DEF = x-DXorriso_allow_extf_suiD
then
AC_DEFINE([Xorriso_allow_extf_suiD], [])
fi
AH_TEMPLATE([Xorriso_dvd_obs_default_64K], [Define to make 64 KB default size for DVD writing])
AC_ARG_ENABLE(dvd-obs-64k,
[ --enable-dvd-obs-64k 64 KB default size for DVD writing, default=no],
[ --enable-dvd-obs-64k 64 KB default size for DVD/BD writing, default=no],
, enable_dvd_obs=no)
if test x$enable_dvd_obs_64k = xyes; then
XORRISO_DVD_OBS_64K="-DXorriso_dvd_obs_default_64K"
echo "enabled xorriso write size default 64 KB on DVD"
echo "enabled xorriso write size default 64 KB on DVD and BD"
else
XORRISO_DVD_OBS_64K=
echo "disabled xorriso write size default 64 KB on DVD"
fi
if test x$XORRISO_DVD_OBS_64K = x-DXorriso_dvd_obs_default_64K
then
AC_DEFINE([Xorriso_dvd_obs_default_64K], [])
echo "disabled xorriso write size default 64 KB on DVD and BD"
fi
AC_SUBST(XORRISO_DVD_OBS_64K)
AH_TEMPLATE([Libburn_read_o_direcT], [Define to use O_DIRECT with -as cdrskin])
AC_ARG_ENABLE(track-src-odirect,
[ --enable-track-src-odirect Enable use of O_DIRECT with -as cdrskin, default=no],
, enable_track_src_odirect=no)
@ -639,48 +262,12 @@ else
LIBBURN_O_DIRECT_DEF=
echo "disabled use of O_DIRECT with input of -as cdrskin"
fi
if test x$LIBBURN_O_DIRECT_DEF = x-DLibburn_read_o_direcT
then
AC_DEFINE([Libburn_read_o_direcT], [])
fi
# Check for system dependent mandatory libraries (LIBBURN_ARCH_LIBS)
LIBBURNIA_CHECK_ARCH_LIBS(mandatory)
# ------- Visible mark in configure : Start of library check
# 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 libburn and libisofs , default=no],
, enable_pkg_check_modules=no)
if test x$enable_pkg_check_modules = xyes; then
dnl If PKG_CHECK_MODULES is to be used after this if-block,
dnl then it might be necessary to perform PKG_PROG_PKG_CONFIG before the block.
if test x$LIBCDIO_DEF = x; then
dummy=dummy
else
LIBCDIO_REQUIRED=0.83
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
fi
else
if test x$LIBCDIO_DEF = x; then
dummy=dummy
else
echo "checking for LIBCDIO... skipped, no --enable-pkg-check-modules"
fi
fi
# ------- Visible mark in configure : End of library check
AC_SUBST(LIBBURN_O_DIRECT_DEF)
AC_CONFIG_FILES([
Makefile
version.h
])
AC_OUTPUT
# xorriso.pc
# xorriso.pc

View File

@ -1,14 +1,117 @@
#!/bin/sh
#
# convert_man_to_html.sh - ts B11024
# convert_man_to_html.sh - ts A80118
#
# Generates a HTML version of man pages xorriso.1 , xorrisofs.1 , xorrecord.1
# Generates a HTML version of man page xorriso.1
#
# To be executed in the libisoburn toplevel directory (eg. ./libisoburn-1.1.8)
# To be executed in the libisoburn toplevel directory (eg. ./libisoburn-0.1.0)
#
xorriso/man_xorriso_to_html.sh
xorriso/man_xorrisofs_to_html.sh
xorriso/man_xorrecord_to_html.sh
# set -x
man_dir=$(pwd)"/xorriso"
export MANPATH="$man_dir"
manpage="xorriso"
raw_html=$(pwd)/"xorriso/raw_man_1_xorriso.html"
htmlpage=$(pwd)/"xorriso/man_1_xorriso.html"
if test -r "$man_dir"/"$manpage".1
then
dummy=dummy
else
echo "Cannot find readable man page source $1" >&2
exit 1
fi
if test -e "$man_dir"/man1
then
dummy=dummy
else
ln -s . "$man_dir"/man1
fi
if test "$1" = "-work_as_filter"
then
# set -x
sed \
-e 's/<meta name="generator" content="groff -Thtml, see www.gnu.org">/<meta name="generator" content="groff -Thtml, via man -H, via xorriso\/convert_man_to_html.sh">/' \
-e 's/<meta name="Content-Style" content="text\/css">/<meta name="Content-Style" content="text\/css"><META NAME="description" CONTENT="man page of xorriso"><META NAME="keywords" CONTENT="man xorriso, manual, xorriso, CD, CD-RW, CD-R, burning, cdrecord, compatible"><META NAME="robots" CONTENT="follow">/' \
-e 's/<title>XORRISO<\/title>/<title>man 1 xorriso<\/title>/' \
-e 's/<h1 align=center>XORRISO<\/h1>/<h1 align=center>man 1 xorriso<\/h1>/' \
-e 's/<body>/<body BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>/' \
-e 's/<b>Overview of features:<\/b>/\&nbsp;<BR><b>Overview of features:<\/b>/' \
-e 's/<b>General information paragraphs:<\/b>/\&nbsp;<BR><b>General information paragraphs:<\/b>/' \
-e 's/have a look at section EXAMPLES/have a look at section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \
-e 's/<b>Session model:<\/b>/\&nbsp;<BR><b>Session model:<\/b>/' \
-e 's/<b>Media types and states:<\/b>/\&nbsp;<BR><b>Media types and states:<\/b>/' \
-e 's/<b>Creating, Growing, Modifying, Blind/\&nbsp;<BR><b>Creating, Growing, Modifying, Blind/' \
-e 's/<b>Libburn drives:<\/b>/\&nbsp;<BR><b>Libburn drives:<\/b>/' \
-e 's/^-dev /\&nbsp;\&nbsp;-dev /' \
-e 's/^-devices /\&nbsp;\&nbsp;-devices /' \
-e 's/<b>Rock Ridge, POSIX, X\/Open, El Torito, ACL,/\&nbsp;<BR><b>Rock Ridge, POSIX, X\/Open, El Torito, ACL,/' \
-e 's/<b>Command processing:<\/b>/\&nbsp;<BR><b>Command processing:<\/b>/' \
-e 's/<b>Dialog, Readline, Result pager:<\/b>/\&nbsp;<BR><b>Dialog, Readline, Result pager:<\/b>/' \
-e 's/<b>Aquiring source and target drive:<\/b>/\&nbsp;<BR><b>Aquiring source and target drive:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>Influencing the behavior of image/\&nbsp;<BR><b>Influencing the behavior of image/' \
-e 's/<b>Inserting files into ISO image:<\/b>/\&nbsp;<BR><b>Inserting files into ISO image:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>File manipulations:<\/b>/\&nbsp;<BR><b>File manipulations:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>Tree traversal command -find:<\/b>/\&nbsp;<BR><b>Tree traversal command -find:<\/b><BR>\&nbsp;<BR>/' \
-e 's/^<p><b>&minus;iso_rr_pattern/<p>\&nbsp;<BR><b>\&minus;iso_rr_pattern/' \
-e 's/EXAMPLES):<br>/<A HREF="#EXAMPLES">EXAMPLES<\/A>):<br>/' \
-e 's/<b>Filters for data file content:<\/b>/\&nbsp;<BR><b>Filters for data file content:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>Writing the result, drive control:<\/b>/\&nbsp;<BR><b>Writing the result, drive control:<\/b><BR>\&nbsp;<BR>/' \
-e 's/^-find \/ /\&nbsp;\&nbsp;-find \/ /' \
-e 's/<b>Settings for file insertion:<\/b>/\&nbsp;<BR><b>Settings for file insertion:<\/b><BR>\&nbsp;<BR>/' \
-e 's/^$<\/b> ln -s/\&nbsp;\&nbsp;$<\/b> ln -s/' \
-e 's/<b>Settings for result writing:<\/b>/\&nbsp;<BR><b>Settings for result writing:<\/b><BR>\&nbsp;<BR>/' \
-e 's/^706k = 706kB/\&nbsp;\&nbsp;706k = 706kB/' \
-e 's/^5540k = 5540kB/\&nbsp;\&nbsp;5540k = 5540kB/' \
-e 's/<b>Character sets:<\/b>/\&nbsp;<BR><b>Character sets:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>Exception processing:<\/b>/\&nbsp;<BR><b>Exception processing:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>El Torito bootable ISO images:<\/b>/\&nbsp;<BR><b>El Torito bootable ISO images:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>Dialog mode control:<\/b>/\&nbsp;<BR><b>Dialog mode control:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>Drive and media related inquiry actions:<\/b>/\&nbsp;<BR><b>Drive and media related inquiry actions:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>Navigation in ISO image/\&nbsp;<BR><b>Navigation in ISO image/' \
-e 's/^filesystem:<\/b>/filesystem:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>Evaluation of readability and recovery:<\/b>/\&nbsp;<BR><b>Evaluation of readability and recovery:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>osirrox ISO-to-disk restore options:<\/b>/\&nbsp;<BR><b>osirrox ISO-to-disk restore options:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>Command compatibility emulations:<\/b>/\&nbsp;<BR><b>Command compatibility emulations:<\/b><BR>\&nbsp;<BR>/' \
-e 's/^<p><b>&minus;as</<p>\&nbsp;<BR><b>\&minus;as</' \
-e 's/<b>Scripting, dialog and/\&nbsp;<BR><b>Scripting, dialog and/' \
-e 's/^features:<\/b>/features:<\/b><BR>\&nbsp;<BR>/' \
-e 's/<b>Support for frontend/\&nbsp;<BR><b>Support for frontend/' \
-e 's/^listening at stdout:<\/b>/listening at stdout:<\/b><BR>\&nbsp;<BR>/' \
-e 's/xorriso -outdev \/dev\/sr2 \\ -blank fast \\ -pathspecs on/xorriso -outdev \/dev\/sr2 -blank fast -pathspecs on/' \
-e 's/\\ -add \\ \/sounds=\/home\/me\/sounds \\ \/pictures \\ -- \\ -rm_r \\/ -add \/sounds=\/home\/me\/sounds \/pictures -- -rm_r /' \
-e 's/\/sounds\/indecent \\ \&rsquo;\/pictures\/\*private\*\&rsquo; \\/\/sounds\/indecent \&rsquo;\/pictures\/*private*\&rsquo; /' \
-e 's/\/pictures\/confidential \\ -- \\ -add \\/\/pictures\/confidential -- -add/' \
-e 's/xorriso -dev \/dev\/sr2 \\ -rm_r \/sounds -- \\ -mv \\/xorriso -dev \/dev\/sr2 -rm_r \/sounds -- -mv /' \
-e 's/\/pictures\/confidential \\ \/pictures\/restricted \\ -- \\ -chmod/\/pictures\/confidential \/pictures\/restricted -- -chmod/' \
-e 's/go-rwx \/pictures\/restricted -- \\ -pathsspecs on \\ -add \\/go-rwx \/pictures\/restricted -- -pathsspecs on -add /' \
-e 's/\/sounds=\/home\/me\/prepared_for_dvd\/sounds_dummy /\/sounds=\/home\/me\/prepared_for_dvd\/sounds_dummy/' \
-e 's/\/movies=\/home\/me\/prepared_for_dvd\/movies \\ -- \\ -commit/\/movies=\/home\/me\/prepared_for_dvd\/movies -- -commit/' \
-e 's/xorriso -indev \/dev\/sr2 \\ -rm_r \/sounds -- \\/xorriso -indev \/dev\/sr2 -rm_r \/sounds -- /' \
-e 's/-outdev \/dev\/sr0 -blank fast \\ -commit -eject all/-outdev \/dev\/sr0 -blank fast -commit -eject all/' \
-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/<\/body>/<BR><HR><FONT SIZE=-1><CENTER>(HTML generated from '"$manpage"'.1 on '"$(date)"' by '$(basename "$0")' )<\/CENTER><\/FONT><\/body>/' \
<"$2" >"$htmlpage"
set +x
chmod u+rw,go+r,go-w "$htmlpage"
echo "Emerged file:"
ls -lL "$htmlpage"
else
export BROWSER='cp "%s" '"$raw_html"
man -H "$manpage"
"$0" -work_as_filter "$raw_html"
rm "$raw_html"
rm "$man_dir"/man1
fi

File diff suppressed because it is too large Load Diff

View File

@ -1,134 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2024 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of class DirseQ which
crawls along a directory's content list.
*/
#ifndef Xorriso_pvt_diskop_includeD
#define Xorriso_pvt_diskop_includeD yes
/* @param flag bit0= simple readlink(): no normalization, no multi-hop
*/
int Xorriso_resolve_link(struct XorrisO *xorriso,
char *link_path, char result_path[SfileadrL], int flag);
int Xorriso_convert_gidstring(struct XorrisO *xorriso, char *gid_string,
gid_t *gid, int flag);
int Xorriso_convert_modstring(struct XorrisO *xorriso, char *cmd, char *mode,
mode_t *mode_and, mode_t *mode_or, int flag);
int Xorriso_convert_uidstring(struct XorrisO *xorriso, char *uid_string,
uid_t *uid, int flag);
/* @param flag bit0= for Xorriso_msgs_submit: use pager
*/
int Xorriso_hop_link(struct XorrisO *xorriso, char *link_path,
struct LinkiteM **link_stack, struct stat *stbuf, int flag);
int Xorriso__mode_to_perms(mode_t st_mode, char perms[11], int flag);
int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag);
/* @param flag bit0= long format
bit1= do not print count of nodes
bit2= du format
bit3= print directories as themselves (ls -d)
*/
int Xorriso_lsx_filev(struct XorrisO *xorriso, char *wd,
int filec, char **filev, off_t boss_mem, int flag);
/* @param flag bit0= do not only sum up sizes but also print subdirs
bit1= this is a recursion
bit2= do not report result by Xorriso_result()
@return <=0 error , 1 ok , 2 could not open directory
*/
int Xorriso_show_dux_subs(struct XorrisO *xorriso,
char *abs_path, char *rel_path, off_t *size,
off_t boss_mem,
struct LinkiteM *link_stack,
int flag);
/*
@param flag >>> bit0= remove whole sub tree: rm -r
bit1= remove empty directory: rmdir
bit2= recursion: do not reassure in mode 2 "tree"
bit3= this is for overwriting and not for plain removal
bit4= count deleted files in xorriso->pacifier_count
bit5= with bit0 only remove directory content, not the directory
@return <=0 = error
1 = removed leaf file object
2 = removed directory or tree
3 = did not remove on user revocation
*/
int Xorriso_rmx(struct XorrisO *xorriso, off_t boss_mem, char *path, int flag);
int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job,
char *abs_dir_parm, char *dir_path,
struct stat *dir_stbuf, int depth,
struct LinkiteM *link_stack, int flag);
/* @param flag bit0= no hardlink reconstruction
bit1= do not set xorriso->node_*_prefixes
bit5= -extract_single: eventually do not insert directory tree
*/
int Xorriso_restore_sorted(struct XorrisO *xorriso, int count,
char **src_array, char **tgt_array,
int *problem_count, int flag);
/* @param flag bit0= path is a directory
bit2= recursion: do not reassure in mode 2 "tree"
bit3= this is for overwriting and not for plain removal
*/
int Xorriso_reassure_restore(struct XorrisO *xorriso, char *path, int flag);
/* @param flag bit7= return 4 if restore fails from denied permission
do not issue error message
@return <=0 failure , 1 success ,
4 with bit7: permission to create file was denied
*/
int Xorriso_make_tmp_path(struct XorrisO *xorriso, char *orig_path,
char *tmp_path, int *fd, int flag);
/* @param flag bit0= change regardless of xorriso->do_auto_chmod
bit1= desired is only rx
*/
int Xorriso_auto_chmod(struct XorrisO *xorriso, char *disk_path, int flag);
int Xorriso_make_accessible(struct XorrisO *xorriso, char *disk_path,int flag);
/* @param flag bit0= prefer to find a match after *img_prefixes
(but deliver img_prefixes if no other can be found)
*/
int Xorriso_make_restore_path(struct XorrisO *xorriso,
struct Xorriso_lsT **img_prefixes, struct Xorriso_lsT **disk_prefixes,
char img_path[SfileadrL], char disk_path[SfileadrL], int flag);
int Xorriso_restore_make_hl(struct XorrisO *xorriso,
char *old_path, char *new_path, int flag);
int Xorriso_afile_fopen(struct XorrisO *xorriso,
char *filename, char *mode, FILE **ret_fp, int flag);
int Xorriso_make_mount_cmd(struct XorrisO *xorriso, char *cmd,
off_t lba, int track, int session, char *volid,
char *devadr, char result[SfileadrL], int flag);
int Xorriso_append_scdbackup_record(struct XorrisO *xorriso, int flag);
int Xorriso_concat(struct XorrisO *xorriso, char *mode, char *target,
int progc, char **progv,
int filec, char **filev, int flag);
int Xorriso_determine_capacity(struct XorrisO *xorriso, char *path,
off_t *capacity, char **reason, int flag);
#endif /* ! Xorriso_pvt_diskop_includeD */

File diff suppressed because it is too large Load Diff

View File

@ -1,42 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of functions which operate on drives
and media.
*/
#ifndef Xorriso_pvt_drive_mgt_includeD
#define Xorriso_pvt_drive_mgt_includeD yes
int Xorriso_may_burn(struct XorrisO *xorriso, int flag);
int Xorriso_toc_line(struct XorrisO *xorriso, int flag);
int Xorriso_media_product(struct XorrisO *xorriso, int flag);
int Xorriso_check_md5_range(struct XorrisO *xorriso, off_t start_lba,
off_t end_lba, char md5[16], int flag);
int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
struct CheckmediajoB *job,
off_t from_lba, off_t block_count, off_t read_chunk,
off_t md5_start, int flag);
int Xorriso_get_drive_handles(struct XorrisO *xorriso,
struct burn_drive_info **dinfo,
struct burn_drive **drive,
char *attempt, int flag);
int Xorriso_check_for_abort(struct XorrisO *xorriso,
char *abort_file_path,
double post_read_time,
double *last_abort_file_time, int flag);
#endif /* ! Xorriso_pvt_drive_mgt_includeD */

File diff suppressed because it is too large Load Diff

View File

@ -1,37 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of emulators for mkisofs and cdrecord.
*/
#ifndef Xorriso_pvt_emul_includeD
#define Xorriso_pvt_emul_includeD yes
/* micro version of cdrskin */
int Xorriso_cdrskin(struct XorrisO *xorriso, char *whom, int argc, char **argv,
int flag);
int Xorriso_cdrskin_help(struct XorrisO *xorriso, int flag);
int Xorriso_cdrskin_uses_stdout(struct XorrisO *xorriso, int argc, char **argv,
int flag);
int Xorriso_as_cdrskin(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag);
/* micro emulation of mkisofs */
int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
int argc, char **argv, int flag);
int Xorriso_genisofs_help(struct XorrisO *xorriso, int flag);
int Xorriso_as_genisofs(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag);
#endif /* ! Xorriso_pvt_emul_includeD */

View File

@ -1,823 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2020 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains functions which operate on data filter objects.
*/
#ifdef HAVE_CONFIG_H
#include "../config.h"
#endif
#include <ctype.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <time.h>
#include <errno.h>
#include "lib_mgt.h"
#include "iso_tree.h"
#include "iso_img.h"
/*
#include "xorriso.h"
#include "xorriso_private.h"
#include "xorrisoburn.h"
#include "iso_manip.h"
#include "sort_cmp.h"
*/
struct Xorriso_extF {
int flag; /* unused yet */
IsoExternalFilterCommand *cmd;
};
int Xorriso_extf_destroy(struct XorrisO *xorriso, struct Xorriso_extF **filter,
int flag);
/* @param flag see struct Xorriso_extF.flag */
int Xorriso_extf_new(struct XorrisO *xorriso, struct Xorriso_extF **filter,
char *path, int argc, char **argv, int behavior,
char *suffix, char *name, int flag)
{
int i;
struct Xorriso_extF *o= NULL;
IsoExternalFilterCommand *cmd;
*filter= o= calloc(sizeof(struct Xorriso_extF), 1);
if(o == NULL)
goto failure;
o->flag= flag;
o->cmd= NULL;
o->cmd= cmd= calloc(sizeof(IsoExternalFilterCommand), 1);
if(cmd == NULL)
goto failure;
cmd->version= 0;
cmd->refcount= 0;
cmd->name= NULL;
cmd->path= NULL;
cmd->argv= NULL;
cmd->argc= argc + 1;
cmd->behavior= behavior;
cmd->suffix= NULL;
cmd->suffix= strdup(suffix);
if(cmd->suffix == NULL)
goto failure;
cmd->path= strdup(path);
if(cmd->path == NULL)
goto failure;
cmd->argv= calloc(sizeof(char *), argc + 2);
if(cmd->argv == NULL)
goto failure;
for(i= 0; i < argc + 2; i++)
cmd->argv[i]= NULL;
cmd->argv[0]= strdup(path);
if(cmd->argv[0] == NULL)
goto failure;
for(i= 0; i < argc; i++) {
cmd->argv[i + 1]= strdup(argv[i]);
if(cmd->argv[i] == NULL)
goto failure;
}
cmd->name= strdup(name);
if(cmd->name == NULL)
goto failure;
return(1);
failure:;
Xorriso_extf_destroy(xorriso, filter, 0);
return(-1);
}
int Xorriso_extf_destroy(struct XorrisO *xorriso, struct Xorriso_extF **filter,
int flag)
{
int i;
IsoExternalFilterCommand *cmd;
if(*filter == NULL)
return(0);
cmd= (*filter)->cmd;
if(cmd != NULL) {
if(cmd->refcount > 0)
return(0);
if(cmd->path != NULL)
free(cmd->path);
if(cmd->suffix != NULL)
free(cmd->suffix);
if(cmd->argv != NULL) {
for(i= 0; i < cmd->argc; i++)
if(cmd->argv[i] != NULL)
free(cmd->argv[i]);
free((char *) cmd->argv);
}
if(cmd->name != NULL)
free(cmd->name);
free((char *) cmd);
}
free((char *) *filter);
*filter= NULL;
return(1);
}
int Xorriso_lookup_extf(struct XorrisO *xorriso, char *name,
struct Xorriso_lsT **found_lst, int flag)
{
struct Xorriso_extF *filter;
struct Xorriso_lsT *lst;
for(lst= xorriso->filters; lst != NULL; lst= Xorriso_lst_get_next(lst, 0)) {
filter= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
if(strcmp(filter->cmd->name, name) == 0) {
*found_lst= lst;
return(1);
}
}
return(0);
}
int Xorriso_destroy_all_extf(struct XorrisO *xorriso, int flag)
{
struct Xorriso_extF *filter;
struct Xorriso_lsT *lst, *next_lst;
for(lst= xorriso->filters; lst != NULL; lst= next_lst) {
filter= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
Xorriso_lst_detach_text(lst, 0);
next_lst= Xorriso_lst_get_next(lst, 0);
Xorriso_lst_destroy(&lst, 0);
Xorriso_extf_destroy(xorriso, &filter, 0);
}
xorriso->filters= NULL;
return(1);
}
/*
@param flag bit0= return 2 if renaming is not possible by libisofs
(always: if demanded strip suffix is missing
or if suffix makes name length > 255)
bit1= strip suffix rather than appending it
*/
int Xorriso_rename_suffix(struct XorrisO *xorriso, IsoNode *node, char *suffix,
char *show_path, char new_name[], int flag)
{
int ret, lo= 0, ls= 0, strip_suffix;
char *old_name= NULL, *show_name;
IsoImage *volume;
strip_suffix= !!(flag & 2);
ret= Xorriso_get_volume(xorriso, &volume, 0);
if(ret <= 0)
goto ex;
old_name= strdup((char *) iso_node_get_name(node));
show_name= old_name;
if(show_path != NULL)
if(show_path[0] != 0)
show_name= show_path;
lo= strlen(old_name);
ls= strlen(suffix);
if(strip_suffix) {
if(lo <= ls) {
/* refuse gracefully */
ret= 2; goto ex;
}
if(strcmp(old_name + lo - ls, suffix) != 0) {
ret= 2; goto ex;
}
if(lo >= SfileadrL)
goto cannot_remove_suffix;
strcpy(new_name, old_name);
new_name[lo - ls]= 0;
ret = iso_image_set_node_name(volume, node, new_name, 1);
if (ret < 0) {
Xorriso_process_msg_queues(xorriso,0);
if (!(flag & 1))
Xorriso_report_iso_error(xorriso, "", ret,
"Error when renaming ISO node", 0, "FAILURE", 1);
cannot_remove_suffix:;
strcpy(xorriso->info_text, "-set_filter: Cannot remove suffix from ");
Text_shellsafe(show_name, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
(flag & 1) ? "WARNING" : "FAILURE", 0);
ret= 2 * (flag & 1); goto ex;
}
} else {
/* check whether suffix already present */
if(lo >= ls)
if(strcmp(old_name + lo - ls, suffix) == 0) {
/* refuse gracefully */
ret= 2; goto ex;
}
if(lo + ls > 255) {
cannot_append_suffix:;
strcpy(xorriso->info_text, "-set_filter: Cannot append suffix to ");
Text_shellsafe(show_name, xorriso->info_text, 1);
strcat(xorriso->info_text, ". Left unfiltered.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
(flag & 1) ? "WARNING" : "FAILURE", 0);
ret= 2 * (flag & 1); goto ex;
}
sprintf(new_name, "%s%s", old_name, suffix);
ret = iso_image_set_node_name(volume, node, new_name, 1);
if (ret < 0) {
Xorriso_process_msg_queues(xorriso,0);
if (!(flag & 1))
Xorriso_report_iso_error(xorriso, "", ret,
"Error when renaming ISO node", 0, "FAILURE", 1);
goto cannot_append_suffix;
}
}
ret= 1;
ex:;
if(old_name != NULL)
free(old_name);
Xorriso_process_msg_queues(xorriso,0);
return(ret);
}
/*
@param flag bit0= return 2 if renaming is not possible
bit1= print pacifier messages
*/
int Xorriso_set_filter(struct XorrisO *xorriso, void *in_node,
char *path, char *filter_name, int flag)
{
int ret, strip_suffix= 0, strip_filter= 0, filter_ret= 0;
int explicit_suffix= 0, internal_filter= 0;
IsoNode *node;
IsoFile *file;
struct Xorriso_lsT *found_lst;
struct Xorriso_extF *found_filter;
IsoExternalFilterCommand *cmd = NULL;
char *old_name= NULL, *new_name= NULL, *suffix= "";
IsoStream *stream;
IsoImage *volume;
Xorriso_alloc_meM(new_name, char, SfileadrL);
new_name[0]= 0;
node= (IsoNode *) in_node;
if(node == NULL) {
ret= Xorriso_get_node_by_path(xorriso, path, NULL, &node, 0);
if(ret <= 0)
goto ex;
}
if(!LIBISO_ISREG(node)) {
strcpy(xorriso->info_text, "-set_filter: Not a regular data file node ");
Text_shellsafe(path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
ret= 0; goto ex;
}
file= (IsoFile *) node;
if(strncmp(filter_name, "--remove-all-filters", 20) == 0) {
strip_filter= 1;
strip_suffix= 1;
if(strlen(filter_name) > 21) {
strip_suffix= (filter_name[20] != '+');
suffix= filter_name + 21;
explicit_suffix= 1;
}
} else if(strcmp(filter_name, "--zisofs") == 0) {
internal_filter= 1;
} else if(strcmp(filter_name, "--zisofs-decode") == 0) {
internal_filter= 2;
} else if(strcmp(filter_name, "--gzip") == 0) {
internal_filter= 3;
suffix= ".gz";
strip_suffix= 0;
explicit_suffix= 1;
} else if(strcmp(filter_name, "--gunzip") == 0 ||
strcmp(filter_name, "--gzip-decode") == 0) {
internal_filter= 4;
suffix= ".gz";
strip_suffix= 1;
explicit_suffix= 1;
} else {
ret= Xorriso_lookup_extf(xorriso, filter_name, &found_lst, 0);
if(ret < 0)
goto ex;
if(ret == 0) {
strcpy(xorriso->info_text, "-set_filter: Not a registered filter name ");
Text_shellsafe(filter_name, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
found_filter= (struct Xorriso_extF *) Xorriso_lst_get_text(found_lst, 0);
cmd= found_filter->cmd;
suffix= cmd->suffix;
strip_suffix= cmd->behavior & 8;
}
if(suffix[0]) {
/* >>> would need full iso_rr_path of node for showing */;
old_name= strdup((char *) iso_node_get_name(node));
ret= Xorriso_rename_suffix(xorriso, node, suffix, path, new_name,
(flag & 1) | (strip_suffix ? 2 : 0));
if(ret <= 0 || ret == 2)
goto ex;
}
if(strip_filter) {
while(1) {
if(!explicit_suffix) {
stream= iso_file_get_stream(file);
if(strncmp(stream->class->type, "gzip", 4) == 0) {
suffix= ".gz";
strip_suffix= 1;
} else if(strncmp(stream->class->type, "pizg", 4) == 0) {
suffix= ".gz";
strip_suffix= 0;
} else {
ret= iso_stream_get_external_filter(stream, &cmd, 0);
if(ret > 0) {
suffix= cmd->suffix;
strip_suffix= !(cmd->behavior & 8);
}
}
if(suffix[0]) {
/* >>> would need the current renaming state of path */;
ret= Xorriso_rename_suffix(xorriso, node, suffix, NULL, new_name,
(flag & 1) | (strip_suffix << 1));
if(ret <= 0 || ret == 2)
goto ex;
}
}
ret= iso_file_remove_filter(file, 0);
if(ret != 1)
break;
}
filter_ret= 1;
} else if (internal_filter == 1 || internal_filter == 2) {
filter_ret = iso_file_add_zisofs_filter(file, 1 | (internal_filter & 2));
if(filter_ret == (int) ISO_ZISOFS_TOO_MANY_PTR) {
/* Remove all buffered currently unused block pointers and try again */
ret= Xorriso_get_volume(xorriso, &volume, 0);
if(ret < 0)
goto ex;
if(ret > 0) {
Xorriso_msgs_submit(xorriso, 0,
"Overflow of zisofs block pointers happened.",
0, "WARNING", 0);
Xorriso_msgs_submit(xorriso, 0,
"zisofs falling back to mode which needs 3 input read runs.",
0, "WARNING", 0);
ret = iso_image_zisofs_discard_bpt(volume, 0);
if(ret <= 0)
goto ex;
filter_ret = iso_file_add_zisofs_filter(file,
1 | (internal_filter & 2));
}
}
if(filter_ret < 0) {
Xorriso_process_msg_queues(xorriso,0);
if(!(internal_filter == 2 && filter_ret == (int) ISO_ZISOFS_WRONG_INPUT))
Xorriso_report_iso_error(xorriso, "", filter_ret,
"Error when setting filter to ISO node", 0, "FAILURE", 1);
}
} else if (internal_filter == 3 || internal_filter == 4) {
filter_ret = iso_file_add_gzip_filter(file,
1 | ((internal_filter == 4) << 1));
if(filter_ret < 0) {
Xorriso_process_msg_queues(xorriso,0);
Xorriso_report_iso_error(xorriso, "", filter_ret,
"Error when setting filter to ISO node", 0, "FAILURE", 1);
}
} else {
#ifndef Xorriso_allow_extf_suiD
/* This is a final safety precaution before iso_file_add_external_filter()
performs fork() and executes the alleged filter program.
*/
if(getuid() != geteuid()) {
sprintf(xorriso->info_text,
"-set_filter: UID and EUID differ. Will not run external programs.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
ret= 0; goto ex;
}
#endif /* ! Xorriso_allow_extf_suiD */
filter_ret = iso_file_add_external_filter(file, cmd, 0);
if(filter_ret < 0) {
Xorriso_process_msg_queues(xorriso,0);
Xorriso_report_iso_error(xorriso, "", filter_ret,
"Error when setting filter to ISO node", 0, "FAILURE", 1);
}
}
if(filter_ret != 1 && new_name[0] && old_name != NULL) {
ret= Xorriso_get_volume(xorriso, &volume, 0);
if(ret<=0)
goto ex;
ret = iso_image_set_node_name(volume, node, old_name, 1);
if (ret < 0) {
Xorriso_process_msg_queues(xorriso,0);
if (!(flag & 1))
Xorriso_report_iso_error(xorriso, "", ret,
"Error when renaming ISO node", 0, "FAILURE", 1);
}
}
if(flag & 2) {
xorriso->pacifier_count++;
Xorriso_pacifier_callback(xorriso, "file filters processed",
xorriso->pacifier_count, xorriso->pacifier_total, "", 0);
}
if(filter_ret < 0) {
ret= 0; goto ex;
}
ret= filter_ret;
ex:;
if(old_name != NULL)
free(old_name);
Xorriso_free_meM(new_name);
Xorriso_process_msg_queues(xorriso,0);
return(ret);
}
int Xorriso_external_filter_banned(struct XorrisO *xorriso, char *purpose,
int flag)
{
int is_banned= 0;
#ifndef Xorriso_allow_external_filterS
/* To be controlled by: configure --enable-external-filters */
sprintf(xorriso->info_text, "%s : Banned at compile time.", purpose);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
sprintf(xorriso->info_text,
"This may be changed at compile time by ./configure option --enable-external-filters");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "HINT", 0);
is_banned= 1;
#endif /* ! Xorriso_allow_external_filterS */
#ifndef Xorriso_allow_extf_suiD
/* To be controlled by: configure --enable-external-filters-setuid */
if(getuid() != geteuid()) {
sprintf(xorriso->info_text,
"-set_filter: UID and EUID differ. Will not run external programs.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
sprintf(xorriso->info_text,
"This may be changed at compile time by ./configure option --enable-external-filters-setuid");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "HINT", 0);
is_banned= 1;
}
#endif /* ! Xorriso_allow_extf_suiD */
if(xorriso->filter_list_closed) {
sprintf(xorriso->info_text,
"%s : Banned by previous command -close_filter_list", purpose);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
is_banned= 1;
}
return(is_banned);
}
/* @param flag bit0= delete filter with the given name
*/
int Xorriso_external_filter(struct XorrisO *xorriso,
char *name, char *options, char *path,
int argc, char **argv, int flag)
{
int ret, delete= 0, behavior= 0, extf_flag= 0, is_banned= 0;
char *what, *what_next, *suffix= "";
struct Xorriso_lsT *lst;
struct Xorriso_extF *found_filter, *new_filter= NULL;
is_banned= Xorriso_external_filter_banned( xorriso,
flag & 1 ? "-unregister_filter" : "-external_filter", 0);
if(is_banned)
return(0);
if((!(flag & 1)) && path[0] != '/') {
sprintf(xorriso->info_text,
"-external_filter : Given command path does not begin by '/' : ");
Text_shellsafe(path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
delete= flag & 1;
ret= Xorriso_lookup_extf(xorriso, name, &lst, 0);
if(ret < 0)
return(ret);
if(ret > 0) {
if(delete) {
found_filter= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
if(found_filter->cmd->refcount > 0) {
sprintf(xorriso->info_text,
"-external_filter: Cannot remove filter because it is in use by %.f nodes : ",
(double) found_filter->cmd->refcount);
Text_shellsafe(name, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
Xorriso_lst_detach_text(lst, 0);
if(xorriso->filters == lst)
xorriso->filters= Xorriso_lst_get_next(lst, 0);
Xorriso_lst_destroy(&lst, 0);
Xorriso_extf_destroy(xorriso, &found_filter, 0);
ret= 1; goto ex;
}
strcpy(xorriso->info_text,
"-external_filter: filter with given name already existing: ");
Text_shellsafe(name, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
if(delete) {
strcpy(xorriso->info_text,
"-external_filter: filter with given name does not exist: ");
Text_shellsafe(name, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
for(what= options; what!=NULL; what= what_next) {
what_next= strchr(what, ':');
if(what_next!=NULL) {
*what_next= 0;
what_next++;
}
if(strncmp(what, "default", 7) == 0) {
suffix= "";
behavior= 0;
} else if(strncmp(what, "suffix=", 7) == 0) {
suffix= what + 7;
} else if(strcmp(what, "remove_suffix") == 0) {
behavior|= 8;
} else if(strcmp(what, "if_nonempty") == 0) {
behavior|= 1;
} else if(strcmp(what, "if_reduction") == 0) {
behavior|= 2;
} else if(strcmp(what, "if_block_reduction") == 0) {
behavior|= 4;
} else if(strncmp(what, "used=", 5) == 0) {
; /* this is informational output from -status */
} else if(what[0]) {
strcpy(xorriso->info_text,
"-external_filter: unknown option ");
Text_shellsafe(what, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
}
ret= Xorriso_extf_new(xorriso, &new_filter, path, argc, argv, behavior,
suffix, name, extf_flag);
if(ret <= 0) {
could_not_create:;
strcpy(xorriso->info_text,
"-external_filter: Could not create filter object");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
goto ex;
}
ret= Xorriso_lst_append_binary(&(xorriso->filters), (char *) new_filter,0, 4);
if(ret <= 0)
goto could_not_create;
ret= 1;
ex:;
if(ret <= 0) {
if(new_filter != NULL)
Xorriso_extf_destroy(xorriso, &new_filter, 0);
}
return(ret);
}
int Xorriso_status_extf(struct XorrisO *xorriso, char *filter, FILE *fp,
int flag)
/*
bit1= do only report to fp
*/
{
int i, maxl= 4 * SfileadrL;
struct Xorriso_extF *extf;
struct Xorriso_lsT *lst;
char *line;
line= xorriso->result_line;
for(lst= xorriso->filters; lst != NULL; lst= Xorriso_lst_get_next(lst, 0)) {
extf= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
strcpy(xorriso->result_line, "-external_filter ");
Text_shellsafe(extf->cmd->name, line, 1);
if((int) strlen(line) > maxl)
continue;
strcat(line, " ");
if(extf->cmd->suffix[0]) {
strcat(line, "suffix=");
Text_shellsafe(extf->cmd->suffix, line, 1);
if((int) strlen(line) > maxl)
continue;
strcat(line, ":");
}
if(extf->cmd->behavior & 8)
strcat(line, "remove_suffix:");
if(extf->cmd->behavior & 1)
strcat(line, "if_nonempty:");
if(extf->cmd->behavior & 2)
strcat(line, "if_reduction:");
if(extf->cmd->behavior & 4)
strcat(line, "if_block_reduction:");
sprintf(line + strlen(line), "used=%.f ", (double) extf->cmd->refcount);
if((int) strlen(line) > maxl)
continue;
Text_shellsafe(extf->cmd->path, line, 1);
if((int) strlen(line) > maxl)
continue;
for(i= 1; i < extf->cmd->argc; i++) {
strcat(line, " ");
Text_shellsafe(extf->cmd->argv[i], line, 1);
if((int) strlen(line) > maxl)
break;
}
if(i < extf->cmd->argc)
continue;
strcat(line, " --\n");
Xorriso_status_result(xorriso, filter, fp, flag&2);
}
if(xorriso->filter_list_closed) {
strcpy(line, "-close_filter_list\n");
Xorriso_status_result(xorriso, filter, fp, flag&2);
}
return(1);
}
/* @param flag bit0= iso_zisofs_set_params
bit1= iso_zisofs_ctrl_susp_z2
*/
int Xorriso_set_zisofs_params(struct XorrisO *xorriso, int flag)
{
int ret, i;
struct iso_zisofs_ctrl ctrl;
if(flag & 2) {
iso_zisofs_ctrl_susp_z2(!!xorriso->zisofs_susp_z2);
}
if(!(flag & 1))
return(1);
memset(&ctrl, 0, sizeof(ctrl));
ctrl.version= 1;
ret= iso_zisofs_get_params(&ctrl, 0);
if(ret < 0) {
Xorriso_report_iso_error(xorriso, "", ret,
"Error when inquiring zisofs parameters before setting some",
0, "FAILURE", 1);
return(0);
}
ctrl.compression_level= xorriso->zlib_level;
if(xorriso->zisofs_block_size == (1 << 16))
ctrl.block_size_log2= 16;
else if(xorriso->zisofs_block_size == (1 << 17))
ctrl.block_size_log2= 17;
else
ctrl.block_size_log2= 15;
ctrl.v2_enabled= xorriso->zisofs_v2_enabled;
ctrl.max_total_blocks= xorriso->zisofs_max_total_blocks;
ctrl.max_file_blocks= xorriso->zisofs_max_file_blocks;
ctrl.v2_block_size_log2= 17;
for(i= 15; i <= 20; i++)
if(xorriso->zisofs_v2_block_size == (1 << i))
ctrl.v2_block_size_log2= i;
ctrl.block_number_target= xorriso->zisofs_block_number_target;
ctrl.bpt_discard_free_ratio= xorriso->zisofs_bpt_discard_free_ratio;
ret= iso_zisofs_set_params(&ctrl, 0);
Xorriso_process_msg_queues(xorriso,0);
if(ret < 0) {
Xorriso_report_iso_error(xorriso, "", ret,
"Error when setting zisofs parameters", 0, "FAILURE", 1);
return(0);
}
return(1);
}
uint64_t Xorriso_zisofs_current_blocks(struct XorrisO *xorriso, int flag)
{
int ret;
struct iso_zisofs_ctrl ctrl;
memset(&ctrl, 0, sizeof(ctrl));
ctrl.version= 1;
ret = iso_zisofs_get_params(&ctrl, 0);
if(ret != 1)
return(0);
return(ctrl.current_total_blocks);
}
int Xorriso_status_zisofs(struct XorrisO *xorriso, char *filter, FILE *fp,
int flag)
/*
bit0= only report non-default settings
bit1= only report to fp
*/
{
off_t ziso_count= 0, osiz_count= 0;
off_t gzip_count= 0, gunzip_count= 0;
uint64_t used_blocks;
int always= 0;
iso_zisofs_get_refcounts(&ziso_count, &osiz_count, 0);
iso_gzip_get_refcounts(&gzip_count, &gunzip_count, 0);
if(!(flag & 1)) {
always= 1;
} else if(filter != NULL) {
if(filter[0] != 0)
always= 1;
}
if(always || !(
xorriso->zlib_level == xorriso->zlib_level_default &&
xorriso->zisofs_block_size == xorriso->zisofs_block_size_default &&
xorriso->zisofs_by_magic == 0)) {
sprintf(xorriso->result_line,
"-zisofs level=%d:block_size=%dk:by_magic=%s\n",
xorriso->zlib_level, xorriso->zisofs_block_size / 1024,
xorriso->zisofs_by_magic == 1 ? "on" :
xorriso->zisofs_by_magic == 2 ? "v2" : "off");
Xorriso_status_result(xorriso, filter, fp, flag & 2);
}
if(always || !(
xorriso->zisofs_v2_enabled == 0 &&
xorriso->zisofs_v2_block_size == xorriso->zisofs_v2_block_size_default
&& xorriso->zisofs_block_number_target == -1)){
sprintf(xorriso->result_line,
"-zisofs version_2=%s:block_size_v2=%dk:susp_z2=%s:bpt_target=%.f\n",
xorriso->zisofs_v2_enabled ? xorriso->zisofs_v2_enabled == 1 ?
"as_needed" : "on" : "off",
xorriso->zisofs_v2_block_size / 1024,
xorriso->zisofs_susp_z2 ? "on" : "off",
(double) xorriso->zisofs_block_number_target);
Xorriso_status_result(xorriso, filter, fp, flag & 2);
}
used_blocks= Xorriso_zisofs_current_blocks(xorriso, 0);
if(always || !(
xorriso->zisofs_max_total_blocks ==
xorriso->zisofs_max_total_blocks_default &&
xorriso->zisofs_max_file_blocks ==
xorriso->zisofs_max_file_blocks_default &&
xorriso->zisofs_bpt_discard_free_ratio ==
xorriso->zisofs_bpt_discard_free_ratio_default)) {
sprintf(xorriso->result_line,
"-zisofs max_bpt=%.f:max_bpt_f=%.f:bpt_free_ratio=%.3f\n",
(double) xorriso->zisofs_max_total_blocks * 8.0,
(double) xorriso->zisofs_max_file_blocks * 8.0,
xorriso->zisofs_bpt_discard_free_ratio);
Xorriso_status_result(xorriso, filter, fp, flag & 2);
}
if(always || !(used_blocks == 0)) {
sprintf(xorriso->result_line,
"-zisofs bpt_used=%.f:bpt_ratio_used=%.3f\n",
(double) used_blocks * 8.0,
((double) used_blocks) / (double) xorriso->zisofs_max_total_blocks);
Xorriso_status_result(xorriso, filter, fp, flag & 2);
}
if(always || !(
ziso_count == 0 && osiz_count == 0 &&
gzip_count == 0 && gunzip_count == 0)) {
sprintf(xorriso->result_line,
"-zisofs ziso_used=%.f:osiz_used=%.f:gzip_used=%.f:gunzip_used=%.f\n",
(double) ziso_count, (double) osiz_count,
(double) gzip_count, (double) gunzip_count);
Xorriso_status_result(xorriso, filter, fp, flag & 2);
}
return(1);
}

View File

@ -1,31 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of functions which operate on
data filter objects.
*/
#ifndef Xorriso_pvt_filters_includeD
#define Xorriso_pvt_filters_includeD yes
int Xorriso_extf_new(struct XorrisO *xorriso, struct Xorriso_extF **filter,
char *path, int argc, char **argv, int behavior,
char *suffix, char *name, int flag);
int Xorriso_extf_destroy(struct XorrisO *xorriso, struct Xorriso_extF **filter,
int flag);
int Xorriso_lookup_extf(struct XorrisO *xorriso, char *name,
struct Xorriso_lsT **found_lst, int flag);
int Xorriso_rename_suffix(struct XorrisO *xorriso, IsoNode *node, char *suffix,
char *show_path, char new_name[], int flag);
#endif /* ! Xorriso_pvt_filters_includeD */

File diff suppressed because it is too large Load Diff

View File

@ -1,490 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2024 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of classes FindjoB, ExprnodE, ExprtesT
which perform tree searches in libisofs or in POSIX filesystem.
*/
#ifndef Xorriso_pvt_findjob_includeD
#define Xorriso_pvt_findjob_includeD yes
#define Xorriso_findjob_on_expR yes
#ifdef Xorriso_findjob_on_expR
/*
A single Testnode.
*/
struct ExprtesT {
struct FindjoB *boss;
int invert; /* 0=normal 1=invert result */
/*
0= -false (with invert : -true)
1= -name char *arg1 (regex_t in *arg2)
2= -type char *arg1
3= -damaged
4= -lba_range off_t *arg1 off_t *arg2
5= -has_acl
6= -has_xattr
7= -has_aaip
8= -has_filter
9= -wanted_node IsoNode *arg1 (for internal use, arg1 not allocated)
10= -pending_data
11= -decision char *arg1 ("yes", "no")
12= -prune
13= -wholename char *arg1 (regex_t in *arg2)
14= -has_any_xattr
15= -has_md5
16= -disk_name char *arg1 (regex_t in *arg2)
17= -hidden int *arg1 (bit0=iso_rr, bit1=joliet)
18= -has_hfs_crtp char *creator char *type
19= -has_hfs_bless int bless_index
20= -disk_path char *arg1
21= -bad_outname int namespace
22= -use_pattern char *arg1 ("on" [or "ls"], "off")
23= -or_use_pattern char *arg1 ("on" [or "ls"], "off")
24= -name_limit_blocker int *arg1
25= -maxdepth int *arg1
26= -mindepth int *arg1
27= -size off_t *arg1 int *arg2 (0=test for equal, -1=smaller, 1=larger,
-2=smaller_or_equal , 2=larger_or_equal)
28= -has_lfa_flags uint64_t *arg1 (Linux file attribute flag bits)
29= -has_some_lfa_flags_of uint64_t *arg1
30= -has_projid uint64_t *arg1
*/
int test_type;
void *arg1;
void *arg2;
};
/*
A computational node.
A tree of these nodes forms the expression.
Sequences of AND/OR operations form branches, brackets spawn new branches,
NOT inverts node's test resp. subtree result.
*/
struct ExprnodE {
struct ExprnodE *up;
char origin[8];
/* Operators */
int invert; /* 0=normal 1=invert own result (subtree or test, but not op) */
int assoc; /*
0= left : compute own value, combine with left value,
compute right value, combine with current value
1= right: compute own value, compute right value,
combine own and right, combine with left value
*/
int use_shortcuts; /* 0= evaluate all tests of -and and -or,
1= evaluate only until the combined result is known
*/
struct ExprnodE *left;
int left_op; /* 0=OR , 1=AND */
struct ExprnodE *right;
int right_op; /* see left_op */
/* Brackets : a pointer to the first node in a subchain */
struct ExprnodE *sub;
int is_if_then_else;
struct ExprnodE *true_branch;
struct ExprnodE *false_branch;
/* elementary test : if sub!=NULL , test is ignored */
struct ExprtesT *test;
/* Result */
int own_value;
int composed_value;
};
struct FindjoB {
char *start_path;
struct ExprnodE *test_tree;
struct ExprnodE *cursor;
int invert; /* 0=normal 1=set invert-property for next new test node */
int use_shortcuts;
/* 0= echo
1= rm (also rmdir)
2= rm_r
>>> 3= mv target
4= chown user
5= chgrp group
6= chmod mode_and mode_or
7= alter_date type date
8= lsdl
9= chown_r user
10= chgrp_r group
11= chmod_r mode_and mode_or
12= alter_date_r type date
13= find
14= compare disk_equivalent_of_start_path
15= in_iso iso_rr_equivalent_of_start_path
16= not_in_iso iso_rr_equiv
17= update disk_equiv
18= add_missing iso_rr_equiv
19= empty_iso_dir iso_rr_equiv
20= is_full_in_iso iso_rr_equiv
21= report_damage
22= report_lba
23= internal: memorize path of last matching node in found_path
24= getfacl
25= setfacl access_acl default_acl
26= getfattr
27= setfattr name value
28= set_filter name
29= show_stream
30= internal: count by xorriso->node_counter
31= internal: register in xorriso->node_array
32= internal: widen_hardlinks disk_equiv: update nodes marked in di_do_widen
33= get_any_xattr
34= get_md5
35= check_md5
36= make_md5
37= mkisofs_r
38= sort_weight number
39= hide on|iso_rr|joliet|off
40= estimate_size
41= update_merge disk_equiv
42= rm_merge
43= clear_merge
44= list_extattr
45= set_hfs_crtp creator type
46= get_hfs_crtp
47= set_hfs_bless blessing
48= get_hfs_bless
49= internal: update creator, type, and blessings from persistent isofs.*
50= print_outname namespace
51= report_sections
52= show_stream_id
53= internal: show_hfs_cmd , controlled by xorriso->show_hfs_cmd*
54= internal: truncate_names
55= internal: unique_trunc_test length
test for not uniquely truncatable names,
result delivered in XorrisO.find_unique_trunc_result
56= like 54 but tolerating existing truncated names
57= like 55 but tolerating existing truncated names
58= internal: last_data_file_block
59= set_to_mtime
60= lsattrd
61= chattr mode
62= internal: like 27 "setfattr name value" but with permission for all
name spaces including "isofs."
63= get_projid
64= set_projid projid
65= get_projid_minmax
*/
int action;
int prune;
int use_pattern;
/* action specific parameters */
char *target;
char *text_2;
uid_t user;
gid_t group;
mode_t mode_and, mode_or;
int type; /* see Xorriso_set_time flag,
also used as weight and truncate_length */
time_t date;
char *found_path;
off_t estim_upper_size;
off_t estim_lower_size;
struct FindjoB *subjob;
uint32_t last_data_file_block;
uint64_t lfa_flags;
off_t projid_low;
off_t projid_high;
/* Errors */
char errmsg[4096];
int errn; /*
>0 = UNIX errno
-1 = close_bracket: no bracket open
-2 = binary operator or closing bracket expected
-3 = unexpected binary operator or closing bracket
-4 = unsupported command
-5 = -then -elseif -else -endif without -if or at wrong place
*/
/* Counts the test matches */
unsigned long match_count;
/* Current depth of tree walking. Relative to start path. */
int depth;
};
int Exprnode_destroy(struct ExprnodE **fnode, int flag);
int Exprnode_tree_value(struct XorrisO *xorriso, struct ExprnodE *fnode,
int left_value, void *node, char *name, char *path,
struct stat *boss_stbuf, struct stat *stbuf, int flag);
int Findjob_new(struct FindjoB **o, char *start_path, int flag);
int Findjob_destroy(struct FindjoB **o, int flag);
int Findjob_set_start_path(struct FindjoB *o, char *start_path, int flag);
int Findjob_get_start_path(struct FindjoB *o, char **start_path, int flag);
int Findjob_set_commit_filter_2(struct FindjoB *o, int flag);
int Findjob_set_num_filter(struct FindjoB *o, int test_type,
int num1, int num2, int flag);
int Findjob_set_size_filter(struct FindjoB *o, int test_type,
off_t num1, int num2, int flag);
int Findjob_set_off_t_filter(struct FindjoB *o, int test_type,
off_t num1, off_t num2, int flag);
int Findjob_set_lba_range(struct FindjoB *o, off_t start_lba, off_t count,
int flag);
int Findjob_set_wanted_node(struct FindjoB *o, void *wanted_node, int flag);
/* @param value -1= only undamaged files, 1= only damaged files
*/
int Findjob_set_damage_filter(struct FindjoB *o, int value, int flag);
int Findjob_set_test_hidden(struct FindjoB *o, int mode, int flag);
int Findjob_set_crtp_filter(struct FindjoB *o, char *creator, char *hfs_type,
int flag);
int Findjob_set_bless_filter(struct XorrisO *xorriso, struct FindjoB *o,
char *blessing, int flag);
int Findjob_set_arg1(struct FindjoB *o, int test_type, char *arg1, int flag);
int Findjob_set_uint64_filter(struct FindjoB *o, int test_type, uint64_t value,
int flag);
int Findjob_open_bracket(struct FindjoB *job, int flag);
int Findjob_close_bracket(struct FindjoB *job, int flag);
int Findjob_not(struct FindjoB *job, int flag);
int Findjob_and(struct FindjoB *job, int flag);
int Findjob_or(struct FindjoB *job, int flag);
int Findjob_if(struct FindjoB *job, int flag);
int Findjob_then(struct FindjoB *job, int flag);
int Findjob_else(struct FindjoB *job, int flag);
int Findjob_elseif(struct FindjoB *job, int flag);
int Findjob_endif(struct FindjoB *job, int flag);
int Findjob_test_2(struct XorrisO *xorriso, struct FindjoB *o,
void *node, char *name, char *path,
struct stat *boss_stbuf, struct stat *stbuf, int flag);
int Findjob_set_action_found_path(struct FindjoB *o, int flag);
int Findjob_set_action_chattr(struct FindjoB *o, int action,
uint64_t lfa_flags, int operator, int flag);
/* @param flag bit0= recursive
*/
int Findjob_set_action_target(struct FindjoB *o, int action, char *target,
int flag);
/* @param flag bit0= recursive
*/
int Findjob_set_action_ad(struct FindjoB *o, int type, time_t date, int flag);
/* @param flag bit0= recursive
*/
int Findjob_set_action_chgrp(struct FindjoB *o, gid_t group, int flag);
/* @param flag bit0= recursive
*/
int Findjob_set_action_chmod(struct FindjoB *o,
mode_t mode_and, mode_t mode_or, int flag);
/* @param flag bit0= recursive
*/
int Findjob_set_action_chown(struct FindjoB *o, uid_t user,int flag);
/* @param flag bit0= -wholename rather than -name
*/
int Findjob_set_name_expr(struct FindjoB *o, char *name_expr, int flag);
int Findjob_set_file_type(struct FindjoB *o, char file_type, int flag);
/* @param value -1= files without ACL, 1= only files with ACL
*/
int Findjob_set_acl_filter(struct FindjoB *o, int value, int flag);
/* @param value -1= files without xattr, 1= only files with xattr
@param flag bit0=-has_any_xattr rather than -has_xattr
*/
int Findjob_set_xattr_filter(struct FindjoB *o, int value, int flag);
/* @param value -1= files without aaip, 1= only files with aaip
*/
int Findjob_set_aaip_filter(struct FindjoB *o, int value, int flag);
/* @param value -1= files without filter, 1= files with filter
*/
int Findjob_set_filter_filter(struct FindjoB *o, int value, int flag);
/* @param value -1= only without property, 1= only with property
@param flag bit0= pseudo-test:
if no operator is open, do nothing and return 2
*/
int Findjob_set_prop_filter(struct FindjoB *o, int test_type, int value,
int flag);
/* @param value -1= true, 1= false
@param flag bit0= pseudo-test:
if no operator is open, do nothing and return 2
*/
int Findjob_set_false(struct FindjoB *o, int value, int flag);
int Findjob_set_prune(struct FindjoB *o, int flag);
int Findjob_set_action_subjob(struct FindjoB *o, int action,
struct FindjoB *subjob, int flag);
int Findjob_set_action_text_2(struct FindjoB *o, int action, char *target,
char* text_2, int flag);
int Findjob_set_action_type(struct FindjoB *o, int action, int type, int flag);
int Findjob_get_action(struct FindjoB *o, int flag);
int Findjob_get_action_parms(struct FindjoB *o, char **target, char **text_2,
uid_t *user, gid_t *group,
mode_t *mode_and, mode_t *mode_or,
int *type, time_t *date, struct FindjoB **subjob,
uint64_t *lfa_flags, int flag);
int Findjob_set_found_path(struct FindjoB *o, char *path, int flag);
int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
int Findjob_get_last_data_file_block(struct FindjoB *o, uint32_t *lba,
int flag);
#else /* Xorriso_findjob_on_expR */
struct FindjoB;
int Findjob_new(struct FindjoB **o, char *start_path, int flag);
int Findjob_destroy(struct FindjoB **job, int flag);
/* @return 0=no match , 1=match , <0 = error
*/
int Findjob_test(struct FindjoB *job, char *name,
struct stat *boss_stbuf, struct stat *stbuf,
int depth, int flag);
/* @return <0 error, >=0 see xorriso.c struct FindjoB.action
*/
int Findjob_get_action(struct FindjoB *o, int flag);
/* @return <0 error, >=0 see xorriso.c struct FindjoB.action
*/
int Findjob_get_action_parms(struct FindjoB *o, char **target, char **text_2,
uid_t *user, gid_t *group,
mode_t *mode_and, mode_t *mode_or,
int *type, time_t *date, struct FindjoB **subjob,
int flag);
/* @param flag bit0= recursive
*/
int Findjob_set_action_target(struct FindjoB *o, int action, char *target,
int flag);
/* @param flag bit0= recursive
*/
int Findjob_set_action_chgrp(struct FindjoB *o, gid_t group, int flag);
/* @param flag bit0= recursive
*/
int Findjob_set_action_chmod(struct FindjoB *o,
mode_t mode_and, mode_t mode_or, int flag);
/* @param flag bit0= recursive
*/
int Findjob_set_action_ad(struct FindjoB *o, int type, time_t date, int flag);
int Findjob_set_start_path(struct FindjoB *o, char *start_path, int flag);
int Findjob_set_action_found_path(struct FindjoB *o, int flag);
int Findjob_get_start_path(struct FindjoB *o, char **start_path, int flag);
int Findjob_set_lba_range(struct FindjoB *o, int start_lba, int count,
int flag);
int Findjob_get_lba_damage_filter(struct FindjoB *o, int *start_lba,
int *end_lba, int *damage_filter, int flag);
int Findjob_get_commit_filter(struct FindjoB *o, int *commit_filter, int flag);
int Findjob_get_acl_filter(struct FindjoB *o, int *acl_filter, int flag);
int Findjob_get_xattr_filter(struct FindjoB *o, int *xattr_filter, int flag);
int Findjob_get_aaip_filter(struct FindjoB *o, int *aaip_filter, int flag);
int Findjob_get_filter_filter(struct FindjoB *o, int *value, int flag);
int Findjob_set_wanted_node(struct FindjoB *o, void *wanted_node, int flag);
int Findjob_get_wanted_node(struct FindjoB *o, void **wanted_node, int flag);
int Findjob_set_found_path(struct FindjoB *o, char *path, int flag);
int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
int Findjob_get_last_data_file_block(struct FindjoB *o, uint32_t *lba,
int flag);
#endif /* ! Xorriso_findjob_on_expR */
#endif /* ! Xorriso_pvt_findjob_includeD */

File diff suppressed because it is too large Load Diff

View File

@ -1,44 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2024 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of functions which operate on ISO images
and their global properties.
*/
#ifndef Xorriso_pvt_iso_img_includeD
#define Xorriso_pvt_iso_img_includeD yes
int Xorriso_update_volid(struct XorrisO *xorriso, int flag);
int Xorriso_record_boot_info(struct XorrisO *xorriso, int flag);
int Xorriso_assert_volid(struct XorrisO *xorriso, off_t msc1, int flag);
int Xorriso_is_isohybrid(struct XorrisO *xorriso, IsoFile *bootimg_node,
int flag);
int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path,
char *bin_path, int platform_id,
int patch_isolinux, int emul, off_t load_size,
unsigned char *id_string,
unsigned char *selection_crit, char *form,
char *filter, FILE *fp, int flag);
int Xorriso__append_boot_params(char *line, ElToritoBootImage *bootimg,
int flag);
int Xorriso_get_volume(struct XorrisO *xorriso, IsoImage **volume,
int flag);
int Xorriso_record_cmd_line(struct XorrisO *xorriso, char *buf,
char **cmds, int *cmd_count, int flag);
#endif /* ! Xorriso_pvt_iso_img_includeD */

File diff suppressed because it is too large Load Diff

View File

@ -1,79 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2024 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of functions which manipulate the
libisofs tree model.
*/
#ifndef Xorriso_pvt_iso_manip_includeD
#define Xorriso_pvt_iso_manip_includeD yes
int Xorriso_transfer_properties(struct XorrisO *xorriso, struct stat *stbuf,
char *disk_path, IsoNode *node, int flag);
int Xorriso_graft_split(struct XorrisO *xorriso, IsoImage *volume,
IsoDir *dir, char *disk_path, char *img_name,
char *nominal_source, char *nominal_target,
off_t size, IsoNode **node, int flag);
int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
IsoDir *dir, char *disk_path, char *img_name,
char *nominal_source, char *nominal_target,
off_t offset, off_t cut_size,
IsoNode **node, int flag);
int Xorriso_add_tree(struct XorrisO *xorriso, IsoDir *dir,
char *img_dir_path, char *disk_dir_path,
struct LinkiteM *link_stack, int flag);
int Xorriso_copy_implicit_properties(struct XorrisO *xorriso, IsoDir *dir,
char *full_img_path, char *img_path, char *full_disk_path, int flag);
int Xorriso_mkisofs_lower_r(struct XorrisO *xorriso, IsoNode *node, int flag);
int Xorriso_widen_hardlink(struct XorrisO *xorriso, void * boss_iter,
IsoNode *node,
char *abs_path, char *iso_prefix, char *disk_prefix,
int flag);
int Xorriso_cannot_create_iter(struct XorrisO *xorriso, int iso_error,
int flag);
int Xorriso_findi_iter(struct XorrisO *xorriso, IsoDir *dir_node, off_t *mem,
IsoDirIter **iter,
IsoNode ***node_array, int *node_count, int *node_idx,
IsoNode **iterated_node, int flag);
int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
IsoDirIter *boss_iter, off_t boss_mem,
char *abs_path, char *show_path,
IsoNode *node, int depth, int flag);
int Xorriso_findi_headline(struct XorrisO *xorriso, struct FindjoB *job,
int flag);
int Xorriso_findi_sorted(struct XorrisO *xorriso, struct FindjoB *job,
off_t boss_mem, int filec, char **filev, int flag);
int Xorriso_all_node_array(struct XorrisO *xorriso, int addon_nodes, int flag);
int Xorriso__mark_update_xinfo(void *data, int flag);
int Xorriso__mark_update_cloner(void *old_data, void **new_data, int flag);
int Xorriso_get_blessing(struct XorrisO *xorriso, IsoNode *node,
int *bless_idx, char bless_code[17], int flag);
int Xorriso_truncate_uniquely(struct XorrisO *xorriso, int length,
IsoNode *node, char *abs_path, char *show_path,
int flag);
#endif /* ! Xorriso_pvt_iso_manip_includeD */

File diff suppressed because it is too large Load Diff

View File

@ -1,98 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2024 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of functions which access nodes of the
libisofs tree model.
*/
#ifndef Xorriso_pvt_iso_tree_includeD
#define Xorriso_pvt_iso_tree_includeD yes
#define LIBISO_ISDIR(node) (iso_node_get_type(node) == LIBISO_DIR)
#define LIBISO_ISREG(node) (iso_node_get_type(node) == LIBISO_FILE)
#define LIBISO_ISLNK(node) (iso_node_get_type(node) == LIBISO_SYMLINK)
#define LIBISO_ISCHR(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
S_ISCHR(iso_node_get_mode(node)))
#define LIBISO_ISBLK(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
S_ISBLK(iso_node_get_mode(node)))
#define LIBISO_ISFIFO(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
S_ISFIFO(iso_node_get_mode(node)))
#define LIBISO_ISSOCK(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
S_ISSOCK(iso_node_get_mode(node)))
#define LIBISO_ISBOOT(node) (iso_node_get_type(node) == LIBISO_BOOT)
int Xorriso_node_from_path(struct XorrisO *xorriso, IsoImage *volume,
char *path, IsoNode **node, int flag);
int Xorriso_get_node_by_path(struct XorrisO *xorriso,
char *in_path, char *eff_path,
IsoNode **node, int flag);
int Xorriso_dir_from_path(struct XorrisO *xorriso, char *purpose,
char *path, IsoDir **dir_node, int flag);
int Xorriso_node_get_dev(struct XorrisO *xorriso, IsoNode *node,
char *path, dev_t *dev, int flag);
int Xorriso_fake_stbuf(struct XorrisO *xorriso, char *path, struct stat *stbuf,
IsoNode **node, int flag);
int Xorriso_node_is_valid(struct XorrisO *xorriso, IsoNode *in_node, int flag);
int Xorriso_path_from_node(struct XorrisO *xorriso, IsoNode *in_node,
char path[SfileadrL], int flag);
int Xorriso_path_from_lba(struct XorrisO *xorriso, IsoNode *node, off_t lba,
char path[SfileadrL], int flag);
int Xorriso_get_attr_value(struct XorrisO *xorriso, void *in_node, char *path,
char *name, size_t *value_length, char **value, int flag);
int Xorriso_stream_type(struct XorrisO *xorriso, IsoNode *node,
IsoStream *stream, char type_text[], int flag);
int Xorriso_show_du_subs(struct XorrisO *xorriso, IsoDir *dir_node,
char *abs_path, char *rel_path, off_t *size,
off_t boss_mem, int flag);
int Xorriso_sorted_dir_i(struct XorrisO *xorriso, IsoDir *dir_node,
int *filec, char ***filev, off_t boss_mem, int flag);
int Xorriso_obtain_pattern_files_i(
struct XorrisO *xorriso, char *wd, IsoDir *dir,
int *filec, char **filev, int count_limit, off_t *mem,
int *dive_count, int flag);
int Xorriso__get_file_size(IsoNode *node, off_t *size, int flag);
int Xorriso__start_end_lbas(IsoNode *node, int *lba_count,
off_t **start_lbas, off_t **end_lbas,
off_t **section_sizes, off_t *size, int flag);
int Xorriso__file_start_lba(IsoNode *node, off_t *lba, int flag);
int Xorriso_file_eval_damage(struct XorrisO *xorriso, IsoNode *node,
off_t *damage_start, off_t *damage_end,
int flag);
int Xorriso_report_lba(struct XorrisO *xorriso, char *show_path,
IsoNode *node, uint32_t *last_block, int flag);
int Xorriso_report_damage(struct XorrisO *xorriso, char *show_path,
IsoNode *node, int flag);
int Xorriso_getfname(struct XorrisO *xorriso, char *path, int flag);
int Xorriso_retrieve_disk_path(struct XorrisO *xorriso, IsoNode *node,
char disk_path[SfileadrL], int flag);
#endif /* ! Xorriso_pvt_iso_tree_includeD */

File diff suppressed because it is too large Load Diff

View File

@ -1,73 +0,0 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This file contains declarations of functions which manage the relation
between xorriso and the libraries: libburn, libisofs, and libisoburn.
*/
#ifndef Xorriso_pvt_x_includeD
#define Xorriso_pvt_x_includeD yes
#ifndef Xorriso_standalonE
/* The library which does the ISO 9660 / RockRidge manipulations */
#include <libisofs/libisofs.h>
/* The library which does MMC optical drive operations */
#include <libburn/libburn.h>
/* The library which enhances overwritable media with ISO 9660 multi-session
capabilities via the method invented by Andy Polyakov for growisofs */
#include <libisoburn/libisoburn.h>
/* The official xorriso options API. "No shortcuts" */
#include "xorriso.h"
/* The inner description of XorrisO */
#include "xorriso_private.h"
/* The inner isofs- and burn-library interface */
#include "xorrisoburn.h"
#else /* ! Xorriso_standalonE */
#include "../libisofs/libisofs.h"
#include "../libburn/libburn.h"
#include "../libisoburn/libisoburn.h"
#include "xorriso.h"
#include "xorriso_private.h"
#include "xorrisoburn.h"
#endif /* Xorriso_standalonE */
int Xorriso_abort(struct XorrisO *xorriso, int flag);
/* @param flag bit0= suppress messages below UPDATE
bit1= suppress messages below FAILURE
*/
int Xorriso_set_image_severities(struct XorrisO *xorriso, int flag);
int Xorriso__sev_to_text(int severity, char **severity_name,
int flag);
/* @param flag bit0= report libisofs error text
bit1= victim is disk_path
bit2= do not inquire libisofs, report msg_text and min_severity
*/
int Xorriso_report_iso_error(struct XorrisO *xorriso, char *victim,
int iso_error_code, char msg_text[], int os_errno,
char min_severity[], int flag);
int Xorriso_process_msg_queues(struct XorrisO *xorriso, int flag);
#endif /* ! Xorriso_pvt_x_includeD */

View File

@ -1,21 +1,10 @@
#!/bin/sh
#
# Produce man page xorriso/xorriso.1 and info file xorriso/xorriso.info
# from base file xorriso/xorriso.texi.
# Same for xorriso/xorrisofs.texi and xorriso/xorrecord.texi.
# from base file xorris/xorriso.texi.
( cd xorriso ; makeinfo --no-split ./xorriso.texi )
( cd xorriso ; makeinfo --no-split ./xorrisofs.texi )
( cd xorriso ; makeinfo --no-split ./xorrecord.texi )
( cd xorriso ; makeinfo --no-split ./xorriso-tcltk.texi )
( cd xorriso-dd-target ; makeinfo --no-split ./xorriso-dd-target.texi )
( cd test ; makeinfo --no-split ./merge_debian_isos.texi )
( cd xorriso ; makeinfo ./xorriso.texi )
xorriso/make_xorriso_1 -auto
xorriso/make_xorriso_1 -auto -xorrisofs
xorriso/make_xorriso_1 -auto -xorrecord
xorriso/make_xorriso_1 -auto -xorriso-tcltk
xorriso/make_xorriso_1 -auto -xorriso-dd-target
xorriso/make_xorriso_1 -auto -merge_debian_isos

View File

@ -3,24 +3,15 @@
( cd xorriso ; cc -g -Wall -o make_xorriso_1 make_xorriso_1.c )
*/
/*
Specialized converter from xorriso/xorriso.texi to xorriso/xorriso.1,
or from xorriso/xorrisofs.texi to xorriso/xorrisofs.1,
or from xorriso/xorrecord.texi to xorriso/xorrecord.1.
or from xorriso/xorriso-tcltk.texi to xorriso/xorriso-tcltk.1.
or from xorriso/xorriso-dd-target.texi to xorriso/xorriso-dd-target.1.
of from test/merge_debian_iso.texi to test/merge_debian_iso.1
Specialized converter from xorriso/xorriso.texi to xorriso/xorriso.1.
The conversion rules are described at the beginning of xorriso/xorriso.texi
Copyright 2010 - 2022 Thomas Schmitt, <scdbackup@gmx.net>
Copyright 2010 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
#ifdef HAVE_CONFIG_H
#include "../config.h"
#endif
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
@ -42,10 +33,6 @@ struct Mx1 {
};
int Mx1_substitute(struct Mx1 *m, char line_in[256], char line_out[256],
int raw, int upto, int flag);
int Mx1_init(struct Mx1 *m, char *prog, int flag)
{
@ -86,213 +73,64 @@ int Mx1__get_word(char *line, char word[256], char **remainder, int flag)
}
int Mx1_is_wrap(struct Mx1 *m, char wraps[][20], char *start, char **found,
int flag)
{
int i;
for(i= 0; wraps[i][0] != 0; i++)
if(strncmp(start, wraps[i], strlen(wraps[i])) == 0)
break;
if(wraps[i][0] != 0) {
if(found != NULL)
*found= wraps[i];
return(1);
}
return(0);
}
int Mx1_is_bold_wrap(struct Mx1 *m, char *start, char **found, int flag)
{
int ret;
static char bold_wraps[][20]= {
"@b{", "@dfn{", "@emph{", "@strong{", "@command{",
"" };
ret= Mx1_is_wrap(m, bold_wraps, start, found, 0);
return(ret);
}
int Mx1_is_normal_wrap(struct Mx1 *m, char *start, char **found, int flag)
{
int ret;
static char normal_wraps[][20]= {
"@var{", "@code{", "@i{", "@abbr{", "@file{", "@option{", "@samp{", "@r{",
"" };
ret= Mx1_is_wrap(m, normal_wraps, start, found, 0);
return(ret);
}
int Mx1_is_ignored_wrap(struct Mx1 *m, char *start, char **found, int flag)
{
int ret;
static char ignored_wraps[][20]= {
"@ref{", "@xref{",
"" };
ret= Mx1_is_wrap(m, ignored_wraps, start, found, 0);
return(ret);
}
int Mx1_is_any_wrap(struct Mx1 *m, char *start, char **found, int flag)
{
int ret;
ret= Mx1_is_bold_wrap(m, start, found, 0);
if(ret > 0)
return(1);
ret= Mx1_is_normal_wrap(m, start, found, 0);
if(ret > 0)
return(2);
ret= Mx1_is_ignored_wrap(m, start, found, 0);
if(ret > 0)
return(3);
return(0);
}
/* @param flag bit0= recursion
bit1= drop content of brackets
*/
int Mx1_rewrap(struct Mx1 *m, char **read_pt, char **write_pt,
char *write_base, char *envelope,
char *front, char *back, int flag)
{
char *rpt, *wpt, *ept, content[256], msg[256];
int l, ret;
rpt= *read_pt;
wpt= *write_pt;
ept= strchr(rpt, '}');
if(ept == NULL) {
sprintf(msg, "No closing bracket found for '%s'", envelope);
Mx1_report_error(m, msg, 0);
return(-1);
}
/* Mapped {...} content is subject to the rules except {...} mapping. */
l= ept - rpt;
if(flag & 2)
l= 0;
if(l > 0) {
ret= Mx1_substitute(m, rpt, content, 0, l, 1);
if(ret <= 0)
return(ret);
l= strlen(content);
}
if((wpt - write_base) + l + strlen(front) + strlen(back) > 255) {
Mx1_report_error(m, "Line length overflow while text substitution", 0);
return(-1);
}
strcpy(wpt, front);
wpt+= strlen(front);
if(l > 0)
memcpy(wpt, content, l);
wpt+= l;
strcpy(wpt, back);
wpt+= strlen(back);
(*read_pt)+= ept - rpt;
(*write_pt)= wpt;
return(1);
}
/* @param flag bit0= recursion
*/
int Mx1_substitute(struct Mx1 *m, char line_in[256], char line_out[256],
int raw, int upto, int flag)
int raw, int flag)
{
char *rpt, *wpt, *found;
int ret, typ= 0;
char *rpt, *wpt, *ept;
int l;
wpt= line_out;
for(rpt= line_in; rpt - line_in < upto && *rpt != 0; rpt++) {
for(rpt= line_in; *rpt != 0; rpt++) {
if(rpt - line_in < raw) {
*(wpt++)= *rpt;
continue;
}
if(*rpt == '@') {
typ= 0;
if(!(flag & 1))
typ= Mx1_is_any_wrap(m, rpt, &found, 0);
if(typ == 1) {
/* @b{...}, @command{...}, @dfn{...}, @emph{...}, @strong{...}
get mapped to \fB...\fR .
*/
rpt+= strlen(found);
ret= Mx1_rewrap(m, &rpt, &wpt, line_out,
found , "\\fB", "\\fR", flag & 1);
if(ret <= 0)
return(ret);
} else if(typ == 2) {
/* @abbr{...}, @code{...}, @file{...}, @i{...}, @option{...}, @r{...},
@ref{...}, @samp{...},@var{...}, get mapped to ... .
*/
rpt+= strlen(found);
ret= Mx1_rewrap(m, &rpt, &wpt, line_out, found, "", "", flag & 1);
if(ret <= 0)
return(ret);
} else if(typ == 3) {
/* @ref{...}, @xref{...} get mapped to empty text.
*/
rpt+= strlen(found);
ret= Mx1_rewrap(m, &rpt, &wpt, line_out, found , "", "",
(flag & 1) | 2);
if(ret <= 0)
return(ret);
} else if(strncmp(rpt, "@email{", 7) == 0 && !(flag & 1)) {
/* @email{...} gets mapped to <...> . */
rpt+= 7;
ret= Mx1_rewrap(m, &rpt, &wpt, line_out, "@email{", "<", ">", 0);
if(ret <= 0)
return(ret);
if(strncmp(rpt, "@strong{", 8) == 0) {
/* @strong{-...} gets mapped to \fB\-...\fR . */;
/* @strong{... } gets mapped to \fB...\fR . */
ept= strchr(rpt, '}');
if(ept == NULL) {
Mx1_report_error(m, "No closing bracket found for '@strong{'", 0);
return(-1);
}
l= ept - rpt - 8;
if((wpt - line_out) + l + 6 + (rpt[8] == '-') > 255)
goto overflow;
strcpy(wpt, "\\fB");
wpt+= 3;
if(rpt[8] == '-')
*(wpt++)= '\\';
strncpy(wpt, rpt + 8, l);
wpt+= l;
strcpy(wpt, "\\fR");
wpt+= 3;
rpt+= ept - rpt;
} else if(strncmp(rpt, "@minus{}", 8) == 0) {
/* @minus{} will become "-". */
if((wpt - line_out) + 1 > 255)
goto overflow;
*(wpt++)= '-';
rpt+= 7;
} else if(strncmp(rpt, "@@", 2) == 0 ||
strncmp(rpt, "@{", 2) == 0 ||
strncmp(rpt, "@}", 2) == 0) {
/* @@ , @{, @} will get stripped of their first @. */
if((wpt - line_out) + 1 > 255)
goto overflow;
*(wpt++)= *(rpt + 1);
rpt++;
} else {
if((wpt - line_out) + 1 > 255)
goto overflow;
*(wpt++)= *(rpt);
}
}
} else if(*rpt == '\\') {
/* "\" becomes "\\" */
if((wpt - line_out) + 2 > 255)
goto overflow;
*(wpt++)= '\\';
*(wpt++)= '\\';
} else if((wpt - line_out) + 1 > 255) {
overflow:;
Mx1_report_error(m, "Line length overflow while text substitution", 0);
return(-1);
} else
*(wpt++)= *rpt;
}
*wpt= 0;
return(1);
@ -304,8 +142,8 @@ overflow:;
*/
int Mx1_convert(struct Mx1 *m, char line_in[256], char line_out[256], int flag)
{
int l, num, keep= 0, ret, raw, i, backslash_count;
char word[256], buf[256], *remainder, *wpt;
int l, num, keep= 0, ret, raw;
char word[256], buf[256], *remainder;
m->count_in++;
l= strlen(line_in);
@ -381,50 +219,35 @@ int Mx1_convert(struct Mx1 *m, char line_in[256], char line_out[256], int flag)
strcpy(buf, "\\fB");
if(word[0] == '-') {
if(l >= 255) {
length_overflow:;
Mx1_report_error(m, "Line length overflow while converting @item", 0);
return(-1);
}
strcat(buf, "\\");
}
/* Substitute option text */
raw= strlen(buf);
strcat(buf, word);
ret= Mx1_substitute(m, buf, line_out, raw, strlen(buf), 0);
if(ret <= 0)
return(-1);
if(strlen(line_out) + 3 + strlen(remainder) > 255)
goto length_overflow;
strcpy(buf, line_out);
strcat(buf, "\\fR");
raw= strlen(buf);
strcat(buf, remainder);
/* Substitute arguments text */
ret= Mx1_substitute(m, buf, line_out, raw, strlen(buf), 0);
ret= Mx1_substitute(m, buf, line_out, raw, 0);
if(ret <= 0)
return(-1);
m->count_out++;
return(1);
}
/* @strong{-...} gets mapped to \fB\-...\fR . */
/* @strong{... } gets mapped to \fB...\fR . */
/* @command{... } gets mapped to \fB...\fR . */
/* @minus{} will become "-". */
/* Mapped {...} content is subject to the rules except {...} mapping. */
/* @@ , @{, @} will get stripped of their first @. */
/* "\" becomes "\\" */
if(line_in[0] != '@' ||
Mx1_is_any_wrap(m, line_in, NULL, 0) > 0 ||
strncmp(line_in, "@strong{", 8) == 0 ||
strncmp(line_in, "@minus{}", 8) == 0 ||
strncmp(line_in, "@@", 2) == 0 ||
strncmp(line_in, "@{", 2) == 0 ||
strncmp(line_in, "@}", 2) == 0 ) {
strncmp(line_in, "@}", 2) == 0) {
keep= 1;
ret= Mx1_substitute(m, line_in, line_out, 0, strlen(line_in), 0);
ret= Mx1_substitute(m, line_in, line_out, 0, 0);
if(ret <= 0)
return(-1);
}
@ -435,26 +258,6 @@ length_overflow:;
return(0);
strcpy(line_out, line_in);
}
/* "-" which are not preceded by an uneven number of "\" will get
prepended one "\".
*/
l= strlen(line_out);
backslash_count= 0;
wpt= buf;
for(i= 0; i < l; i++) {
if(line_out[i] == '\\')
backslash_count++;
else if(line_out[i] == '-') {
if(backslash_count % 2 == 0)
*(wpt++)= '\\';
backslash_count= 0;
} else
backslash_count= 0;
*(wpt++)= line_out[i];
}
*wpt= 0;
strcpy(line_out, buf);
m->count_out++;
return(1);
}
@ -464,8 +267,8 @@ int main(int argc, char **argv)
{
int ret, l, as_filter= 0, i;
char line_in[256], line_out[256], *got;
static char name_in[1024]= {"xorriso/xorriso.texi"};
static char name_out[1024]= {"xorriso/xorriso.1"};
static char name_in[]= {"xorriso/xorriso.texi"};
static char name_out[]= {"xorriso/xorriso.1"};
struct Mx1 m;
FILE *fp_in= stdin, *fp_out= stdout;
@ -473,36 +276,17 @@ int main(int argc, char **argv)
if(argc < 2) {
usage:;
fprintf(stderr, "usage: %s -auto|-filter [-xorrisofs]\n", argv[0]);
fprintf(stderr, " -auto xorriso/xorriso.texi -> xorriso/xorriso.1\n");
fprintf(stderr, " -filter stdin -> stdout\n");
fprintf(stderr, " -xorrisofs process xorriso/xorrisofs.texi\n");
fprintf(stderr, " -xorrecord process xorriso/xorrecord.texi\n");
fprintf(stderr, " -xorriso-tcltk process xorriso/-xorriso-tcltk.texi\n");
fprintf(stderr, " -xorriso-dd-target process xorriso/-xorriso-dd-target.texi\n");
fprintf(stderr, "usage: %s -auto|-filter\n", argv[0]);
fprintf(stderr, " -auto xorriso/xorriso.texi -> xorriso/xorriso.1\n");
fprintf(stderr, " -filter stdin -> stdout\n");
exit(2);
}
for(i= 1; i < argc; i++) {
if(strcmp(argv[i], "-filter") == 0) {
if(strcmp(argv[i], "-filter") == 0)
as_filter= 1;
} else if(strcmp(argv[i], "-auto") == 0) {
else if(strcmp(argv[i], "-auto") == 0)
as_filter= 0;
} else if(strcmp(argv[i], "-xorrisofs") == 0) {
strcpy(name_in, "xorriso/xorrisofs.texi");
strcpy(name_out, "xorriso/xorrisofs.1");
} else if(strcmp(argv[i], "-xorrecord") == 0) {
strcpy(name_in, "xorriso/xorrecord.texi");
strcpy(name_out, "xorriso/xorrecord.1");
} else if(strcmp(argv[i], "-xorriso-tcltk") == 0) {
strcpy(name_in, "xorriso/xorriso-tcltk.texi");
strcpy(name_out, "xorriso/xorriso-tcltk.1");
} else if(strcmp(argv[i], "-xorriso-dd-target") == 0) {
strcpy(name_in, "xorriso-dd-target/xorriso-dd-target.texi");
strcpy(name_out, "xorriso-dd-target/xorriso-dd-target.1");
} else if(strcmp(argv[i], "-merge_debian_isos") == 0) {
strcpy(name_in, "test/merge_debian_isos.texi");
strcpy(name_out, "test/merge_debian_isos.1");
} else {
else {
fprintf(stderr, "%s : unknown option %s\n", argv[0], argv[i]);
goto usage;
}

View File

@ -1,34 +1,26 @@
#!/bin/sh
# make_xorriso_standalone.sh
# Copyright 2008 - 2024 Thomas Schmitt, scdbackup@gmx.net, GPLv2+
# Copyright 2008 - 2010 Thomas Schmitt, scdbackup@gmx.net, GPLv2+
#
# Not intended for general use in production installations !
#
# This is a development tool which expects a special setup of directories.
# It is to be executed in a common parent of the directories
# nglibisofs-develop libburn-develop libisoburn-develop
# where tarballs or repository copies have been installed of
# libisofs libburn libisoburn
# obtained by following instructions on http://libburnia-project.org.
#
# It creates a new directory tree
# xorriso-standalone
# for building GNU xorriso.
# The ./bootstrap script gets applied and a source tarball is made.
#
# This development tool is to be executed in a common parent of the directories
# nglibisofs-develop jte-develop libburn-develop libisoburn-develop
# where tarballs have been unpacked or repository copies have been cloned of
# libisofs jte libburn libisoburn
# according to instructions on http://libburnia-project.org.
# automake and libtool have to be installed on the system.
# The ./bootstrap script gets applied and a source tarball
# is made.
#
# Further it is necessary to build a little binary for HTML man page production
# (cd libisoburn-develop/xorriso && \
# cc -g -Wall -o unite_html_b_line unite_html_b_line.c )
#
# Then run
#
# ./libisoburn-develop/xorriso/make_xorriso_standalone.sh
#
# From the emerging xorriso-standalone tarball can be build a binary
# xorriso/xorriso
# which at runtime does not depend on installed libburnia libraries.
# From that tree can be build a binary xorriso/xorriso which at runtime
# does not depend on installed libburnia libraries.
# Execute in xorriso-standalone :
#
# ./configure && make
@ -48,7 +40,7 @@ create_gnu_xorriso="yes"
current_dir=$(pwd)
lone_dir="$current_dir"/"xorriso-standalone"
xorriso_rev=1.5.7
xorriso_rev=0.5.2
# For unstable uploads and patch level 0 of stable releases:
xorriso_pl=""
# For higher patch levels of stable releases:
@ -86,16 +78,6 @@ copy_files() {
fi
}
copy_tree() {
if cp -a "$@"
then
dummy=dummy
else
echo "Failed to : cp -a " "$@" >&2
exit 1
fi
}
if test -e "$lone_dir"
then
echo "Already existing : $lone_dir" >&2
@ -114,25 +96,32 @@ copy_files \
CONTRIBUTORS \
COPYRIGHT \
COPYING \
ChangeLog \
INSTALL \
NEWS \
acinclude.m4 \
aclocal.m4 \
bootstrap \
compile \
config.guess \
config.status \
config.sub \
depcomp \
install-sh \
libtool \
ltmain.sh \
missing \
mkinstalldirs \
version.h.in \
\
"$lone_dir"
# Formerly copied but actually generated or copied by ./bootstrap:
# aclocal.m4 ltmain.sh
# compile config.guess config.sub depcomp install-sh missing
copy_files xorriso/xorriso_bootstrap.txt "$lone_dir"/bootstrap
copy_files xorriso/configure_ac.txt "$lone_dir"/configure.ac
copy_files xorriso/xorriso_makefile_am.txt "$lone_dir"/Makefile.am
# copy_files xorriso/xorriso_pc_in.txt "$lone_dir"/xorriso.pc.in
# echo "See end of xorriso/changelog.txt" >"$lone_dir"/TODO
# libisoburn
@ -140,159 +129,48 @@ create_dir "$lone_dir"/libisoburn
copy_files \
libisoburn/*.[ch] \
"$lone_dir"/libisoburn
copy_files COPYRIGHT "$lone_dir"/libisoburn
touch \
xorriso/man_1_xorriso.html \
xorriso/man_1_xorrisofs.html \
xorriso/man_1_xorrecord.html
xorriso/convert_man_to_html.sh
create_dir "$lone_dir"/xorriso
copy_files \
xorriso/xorriso.h \
xorriso/xorrisoburn.[ch] \
xorriso/xorriso.[ch] \
xorriso/xorriso_private.h \
xorriso/sfile.h \
xorriso/sfile.c \
xorriso/aux_objects.h \
xorriso/aux_objects.c \
xorriso/findjob.h \
xorriso/findjob.c \
xorriso/check_media.h \
xorriso/check_media.c \
xorriso/misc_funct.h \
xorriso/misc_funct.c \
xorriso/text_io.h \
xorriso/text_io.c \
xorriso/match.h \
xorriso/match.c \
xorriso/emulators.h \
xorriso/emulators.c \
xorriso/disk_ops.h \
xorriso/disk_ops.c \
xorriso/cmp_update.h \
xorriso/cmp_update.c \
xorriso/parse_exec.h \
xorriso/parse_exec.c \
xorriso/opts_a_c.c \
xorriso/opts_d_h.c \
xorriso/opts_i_o.c \
xorriso/opts_p_z.c \
\
xorriso/xorrisoburn.h \
xorriso/base_obj.h \
xorriso/base_obj.c \
xorriso/lib_mgt.h \
xorriso/lib_mgt.c \
xorriso/sort_cmp.h \
xorriso/sort_cmp.c \
xorriso/drive_mgt.h \
xorriso/drive_mgt.c \
xorriso/iso_img.h \
xorriso/iso_img.c \
xorriso/iso_tree.h \
xorriso/iso_tree.c \
xorriso/iso_manip.h \
xorriso/iso_manip.c \
xorriso/write_run.h \
xorriso/write_run.c \
xorriso/read_run.h \
xorriso/read_run.c \
xorriso/filters.h \
xorriso/filters.c \
\
xorriso/xorriso_main.c \
xorriso/xorriso_timestamp.h \
\
xorriso/changelog.txt \
xorriso/xorriso_eng.html \
xorriso/make_docs.sh \
xorriso/make_xorriso_standalone.sh \
xorriso/unite_html_b_line.c \
xorriso/convert_man_to_html.sh \
xorriso/man_xorriso_to_html.sh \
xorriso/man_xorrisofs_to_html.sh \
xorriso/man_xorrecord_to_html.sh \
xorriso/xorriso.texi \
xorriso/xorriso.info \
xorriso/xorrisofs.texi \
xorriso/xorrisofs.info \
xorriso/xorrecord.texi \
xorriso/xorrecord.info \
xorriso/xorriso-tcltk.texi \
xorriso/xorriso-tcltk.info \
xorriso/make_xorriso_1.c \
xorriso/xorriso.1 \
xorriso/xorrisofs.1 \
xorriso/xorrecord.1 \
xorriso/xorriso-tcltk.1 \
xorriso/man_1_xorriso.html \
xorriso/man_1_xorrisofs.html \
xorriso/man_1_xorrecord.html \
"$lone_dir"/xorriso
copy_files COPYRIGHT "$lone_dir"/xorriso
copy_files xorriso/xorriso_buildstamp_none.h \
"$lone_dir"/xorriso/xorriso_buildstamp.h
copy_files xorriso/xorriso_buildstamp_none.h \
"$lone_dir"/xorriso/xorriso_buildstamp_none.h
create_dir "$lone_dir"/doc
copy_files doc/partition_offset.wiki \
doc/startup_file.txt \
doc/qemu_xorriso.wiki \
"$lone_dir"/doc
create_dir "$lone_dir"/test
copy_files \
test/compare_file.c \
test/merge_debian_isos \
test/merge_debian_isos.texi \
test/merge_debian_isos.info \
test/merge_debian_isos.1 \
"$lone_dir"/test
create_dir "$lone_dir"/frontend
copy_files \
frontend/frontend_pipes_xorriso.c \
frontend/README-tcltk \
frontend/xorriso-tcltk \
frontend/sh_on_named_pipes.sh \
frontend/xorriso_broker.sh \
frontend/grub-mkrescue-sed.sh \
"$lone_dir"/frontend
create_dir "$lone_dir"/xorriso-dd-target
copy_files \
xorriso-dd-target/xorriso-dd-target \
xorriso-dd-target/xorriso-dd-target.texi \
xorriso-dd-target/xorriso-dd-target.info \
xorriso-dd-target/xorriso-dd-target.1 \
"$lone_dir"/xorriso-dd-target
# releng
copy_tree releng "$lone_dir"/releng
rm "$lone_dir"/releng/auto_cxx
rm -r "$lone_dir"/releng/releng_generated_data
create_dir "$lone_dir"/releng/releng_generated_data
"$lone_dir"/test/compare_file.c
# nglibisofs
create_dir "$lone_dir"/libisofs
create_dir "$lone_dir"/libisofs/filters
create_dir "$lone_dir"/doc
goto_dir "$current_dir"/nglibisofs-develop
copy_files libisofs/*.[ch] "$lone_dir"/libisofs
copy_files libisofs/filters/*.[ch] "$lone_dir"/libisofs/filters
copy_files doc/susp_aaip*.txt "$lone_dir"/doc
copy_files doc/zisofs_format.txt "$lone_dir"/doc
copy_files doc/zisofs2_format.txt "$lone_dir"/doc
copy_files doc/checksums.txt "$lone_dir"/doc
copy_files doc/boot_sectors.txt "$lone_dir"/doc
copy_files COPYRIGHT "$lone_dir"/libisofs
test -e CONTRIBUTORS && cat CONTRIBUTORS >>"$lone_dir"/CONTRIBUTORS
@ -300,17 +178,35 @@ test -e CONTRIBUTORS && cat CONTRIBUTORS >>"$lone_dir"/CONTRIBUTORS
cat version.h.in >> "$lone_dir"/version.h.in
# libjte
# <<< obsoleted patchings
if test 1 = 0
then
# Change GNU macro name to POSIX name
sed -e 's/FNM_FILE_NAME/FNM_PATHNAME/g' \
<libisofs/tree.c >"$lone_dir"/libisofs/tree.c
# Filter out the semi-illegal TODO comments
( cd "$lone_dir"/libisofs && grep '^[[:space:]]*//' *.[ch] | less )
echo "Is it ok delete all shown //-lines ?"
read yesno
if test "$yesno" = "y" -o "$yesno" = "1"
then
for i in "$lone_dir"/libisofs/*.[ch]
do
# first copy attributes
cp "$i" "$lone_dir"/libisofs/tmpfile
# now filter away // lines
grep -v '^[[:space:]]*//' <"$i" >"$lone_dir"/libisofs/tmpfile && \
mv "$lone_dir"/libisofs/tmpfile "$i"
done
fi
echo "Remaining // lines:"
( cd "$lone_dir"/libisofs && grep '//' *.[ch] )
fi
create_dir "$lone_dir"/libjte
goto_dir "$current_dir"/jte-develop
copy_files *.[ch] "$lone_dir"/libjte
copy_files COPYRIGHT "$lone_dir"/libjte
#
# Now using libisoburn/releng/jigdo-gen-md5-list because in jigit it is
# restricted to Linux and FreeBSD.
goto_dir "$current_dir"/libisoburn-develop/releng
copy_files jigdo-gen-md5-list jigdo-gen-md5-list.1 "$lone_dir"/libjte
# libburn
@ -338,10 +234,10 @@ then
copy_files xorriso/COPYING_gnu_xorriso "$lone_dir"/COPYING
copy_files xorriso/AUTHORS_gnu_xorriso "$lone_dir"/AUTHORS
# patch xorriso/xorriso.h to be GNU xorriso
# patch xorriso/xorriso.c to be GNU xorriso
sed -e's/define Xorriso_libburnia_xorrisO/define Xorriso_GNU_xorrisO/' \
-e's/This may be changed to Xorriso_GNU_xorrisO in order to c/C/' \
<xorriso/xorriso.h >"$lone_dir"/xorriso/xorriso.h
<xorriso/xorriso.c >"$lone_dir"/xorriso/xorriso.c
else

Some files were not shown because too many files have changed in this diff Show More