Compare commits
92 Commits
release-0.
...
release-0.
Author | SHA1 | Date | |
---|---|---|---|
14171bdd3a | |||
d37eba5344 | |||
3b616dae38 | |||
a2758b27e6 | |||
d5c4af7378 | |||
90f37b8183 | |||
1d4f26f325 | |||
08e442a2ab | |||
017dcb39f2 | |||
95121e2f9f | |||
ba11413a6f | |||
e1888df5ab | |||
dceef03633 | |||
443c5d41db | |||
e60171986b | |||
fe45249e9e | |||
b01f017a6d | |||
73bc3ae512 | |||
b6427d3b2b | |||
438024d11b | |||
1d6fdf51dc | |||
281462802f | |||
2b2a86ea2e | |||
c0963596e5 | |||
9be5b241e2 | |||
fcde936670 | |||
73c6bc49c6 | |||
5ed507da83 | |||
ae626b9570 | |||
3528493b92 | |||
9cf460a3b1 | |||
84132ec7bf | |||
eb23260459 | |||
4978424328 | |||
e4cf93665a | |||
3d9367d52a | |||
03b030c56d | |||
a3fe82100b | |||
02d7a690eb | |||
ace0d1ab2e | |||
59d143c1f0 | |||
da2c0520cc | |||
517f520570 | |||
98d2b4c996 | |||
481d425580 | |||
99e988d652 | |||
38a7b4a5b1 | |||
9dc894584d | |||
1a7ab679cd | |||
016baf9984 | |||
b089f2e978 | |||
c3d5ab7bc7 | |||
f13167335a | |||
f0f378c38f | |||
907b44c556 | |||
00011036dd | |||
55497d3931 | |||
c47f206fe3 | |||
386ce0e60a | |||
9fe4172f0d | |||
61f2cdd02b | |||
f87c63da41 | |||
afebbe187d | |||
3951df25be | |||
4b0f175a89 | |||
633a8ada9e | |||
ce723a8c39 | |||
83ace3b486 | |||
23d3c43022 | |||
00470cbfea | |||
4c1abdf2bd | |||
f7842518fb | |||
d756551385 | |||
ced02f5903 | |||
819e3218f6 | |||
c874a159e2 | |||
a68e108333 | |||
da23a8166c | |||
cbb376a137 | |||
3852621bc0 | |||
0ff4cb34ed | |||
d863451771 | |||
78308eea24 | |||
0ab2b8260c | |||
a30bd36a81 | |||
3814396b08 | |||
f88d8a76b0 | |||
6bc1395e15 | |||
6bf538ff40 | |||
c992687200 | |||
9cfa55345e | |||
d9a11a3b8d |
@ -1,12 +1,12 @@
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>,
|
||||
Mario Danic <mario.danic@gmail.com>,
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2007-2008 Vreixo Formoso, Mario Danic, Thomas Schmitt
|
||||
Copyright (C) 2007-2010 Vreixo Formoso, 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 as
|
||||
published by the Free Software Foundation.
|
||||
it under the terms of the GNU General Public License version 2 or later
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
195
ChangeLog
195
ChangeLog
@ -1 +1,196 @@
|
||||
libisofs-0.6.34.tar.gz Tue Jun 29 2010
|
||||
===============================================================================
|
||||
* New API call iso_image_set_boot_catalog_hidden()
|
||||
* New API call iso_node_get_hidden()
|
||||
* New IsoHideNodeFlag bit LIBISO_HIDE_BUT_WRITE
|
||||
* New error code ISO_BOOT_NO_CATALOG
|
||||
* Opportunity to reduce compile line length by including "config.h"
|
||||
|
||||
libisofs-0.6.32.tar.gz Mon May 03 2010
|
||||
===============================================================================
|
||||
* New API call iso_image_set_boot_catalog_weight()
|
||||
* New API call iso_image_add_boot_image()
|
||||
* New API calls el_torito_set_boot_platform_id(), el_torito_set_id_string(),
|
||||
el_torito_set_selection_crit()
|
||||
* New API calls iso_image_get_all_boot_imgs(), el_torito_get_boot_platform_id(),
|
||||
el_torito_get_load_seg(), el_torito_get_load_size(), el_torito_get_bootable(),
|
||||
el_torito_get_id_string(), el_torito_get_selection_crit(),
|
||||
el_torito_get_isolinux_options(), el_torito_get_boot_media_type()
|
||||
* New API call el_torito_seems_boot_info_table()
|
||||
|
||||
libisofs-0.6.30.tar.gz Sat Apr 17 2010
|
||||
===============================================================================
|
||||
* New API call iso_write_opts_set_system_area() acts like mkisofs option -G.
|
||||
* New API call iso_write_opts_set_pvd_times().
|
||||
* Now able to produce a bootable System Area from an ISOLINUX mbr/isohdp
|
||||
[fp]x*.bin file and an ISOLINUX El Torito bootable image (isolinux.bin).
|
||||
* Now able to produce the same Joliet names as mkisofs.
|
||||
* New API calls iso_read_opts_load_system_area() and
|
||||
iso_image_get_system_area() for multi-session handling of MBRs.
|
||||
|
||||
libisofs-0.6.28.tar.gz Wed Feb 10 2010
|
||||
===============================================================================
|
||||
* Bug fix: Random checksum index could sneak in via boot catalog node
|
||||
and cause a SIGSEGV.
|
||||
* Improved compilability out of the box on FreeBSD.
|
||||
|
||||
libisofs-0.6.26.tar.gz Wed Jan 20 2010
|
||||
===============================================================================
|
||||
* Bug fix: Invalid old checksum tags were preserved with
|
||||
iso_write_opts_set_overwrite_buf(), if the new session produced no checksums.
|
||||
* The checksum buffer for the emerging image gets now marked as invalid if
|
||||
image generation is canceled.
|
||||
* More graceful reaction on filesystems where ACL are not enabled but
|
||||
nevertheless requested by the application.
|
||||
* Adaptions to problems reported by Debian buildd.
|
||||
|
||||
libisofs-0.6.24.tar.gz Thu Oct 08 2009
|
||||
===============================================================================
|
||||
* Bug fix: Short Rock Ridge names got stripped of trailing blanks when loaded
|
||||
and written again to a follow-up session. Long names could lose inner blanks.
|
||||
* Bug fix: Avoided to return NULL or single blanks as content of id strings by
|
||||
API calls iso_image_get_volset_id() ... iso_image_get_biblio_file_id().
|
||||
* New API call iso_write_opts_set_scdbackup_tag().
|
||||
|
||||
libisofs-0.6.22.tar.gz Tue Aug 25 2009
|
||||
===============================================================================
|
||||
* New API call iso_write_opts_set_record_md5() for writing MD5 sums.
|
||||
* New API call iso_read_opts_set_no_md5() for importing MD5 sums.
|
||||
* New API calls iso_image_get_session_md5() and iso_file_get_md5().
|
||||
* New API calls iso_md5_start(), iso_md5_compute(), iso_md5_clone(),
|
||||
iso_md5_end(), iso_md5_match() for own MD5 computations.
|
||||
* New API call iso_util_decode_md5_tag() to recognize and parse checksum tags.
|
||||
* New API call iso_file_make_md5() to equip old file nodes with MD5.
|
||||
* Improvements with ./configure and its help text.
|
||||
|
||||
libisofs-0.6.20.tar.gz Sun May 30 2009
|
||||
===============================================================================
|
||||
* Optional automatic detection and recording of hard link
|
||||
relations between files.
|
||||
* Support for restoring hard link relations by the app.
|
||||
|
||||
libisofs-0.6.18.tar.gz Fri Apr 17 2009
|
||||
===============================================================================
|
||||
* Opportunity to set the input charset automatically from an eventual xattr
|
||||
"isofs.cs" of the image root node.
|
||||
* New general filter API to inquire and remove filters.
|
||||
* Specialized APIs for installing filters which are based on external processes
|
||||
or based on zlib.
|
||||
* New API call to inquire the original source path of a data file in an
|
||||
emerging image.
|
||||
|
||||
libisofs-0.6.16.tar.gz Wed Mar 11
|
||||
===============================================================================
|
||||
* Bug fix: The ".." directory record pointed to the same data block as the "."
|
||||
entry.
|
||||
* Bug fix: The use of iso_write_opts_set_rrip_version_1_10() caused a wrong
|
||||
size announcement in the CE entry which points to the ER signature
|
||||
of the image root.
|
||||
* New API call iso_write_opts_get_data_start() inquires the start address of
|
||||
the data section of an emerging ISO image.
|
||||
* ISO image generation does not absolutely depend on the availability of
|
||||
character set "WCHAR_T" with iconv_open(3) any more.
|
||||
|
||||
libisofs-0.6.14.tar.gz Sat Feb 28 2009
|
||||
===============================================================================
|
||||
* New API calls iso_image_set_ignore_aclea(), iso_read_opts_set_no_aaip()
|
||||
control import of ACL and xattr.
|
||||
* New API calls iso_write_opts_set_aaip(), iso_write_opts_set_aaip_susp_1_10()
|
||||
control output of ACL and xattr into generated ISO image.
|
||||
* New API call iso_file_source_get_aa_string(), new function member
|
||||
get_aa_string() in IsoFileSource_Iface allow to access opaquely encoded ACL
|
||||
and xattr. New function handle aaip_xinfo_func attaches aa_strings to
|
||||
IsoNode objects.
|
||||
* New API calls iso_node_get_acl_text(), iso_node_set_acl_text(),
|
||||
iso_node_get_perms_wo_acl() allow inquiry and manipulation of ACLs in
|
||||
IsoNode objects.
|
||||
* New API calls iso_node_get_attrs(), iso_node_set_attrs() allow inquiry and
|
||||
manipulation of xattr in IsoNode objects.
|
||||
|
||||
libisofs-0.6.12.tar.gz Wed Nov 26 2008
|
||||
===============================================================================
|
||||
* New API calls iso_set_local_charset() and iso_get_local_charset()
|
||||
* New API calls iso_write_opts_set_rrip_version_1_10() and
|
||||
iso_write_opts_set_dir_rec_mtime()
|
||||
* New API call el_torito_set_isolinux_options() allows to patch ISOLINUX boot
|
||||
images and to generate a isohybrid MBR on the fly. Such an MBR makes the ISO
|
||||
image bootable from disk-like hardware, e.g. from USB stick. The ISOLINUX
|
||||
boot image has to be of syslinux 3.72 or later to allow MBR generation.
|
||||
* Old API call el_torito_patch_isolinux_image() is deprecated now.
|
||||
|
||||
libisofs-0.6.10.pl01.tar.gz Wed Nov 19 2008
|
||||
===============================================================================
|
||||
* Bug fix: If images generated by mkisofs were loaded then files of size 0
|
||||
could share their size information with files that contain data. Ticket #144.
|
||||
* Bug fix: ISOLINUX boot images were patched suitable for El Torito but not for
|
||||
an eventual MBR added by SYSLINUX script isohybrid.
|
||||
|
||||
libisofs 0.6.10 Mon Oct 6 2008:
|
||||
===============================================================================
|
||||
* Bug fix: Patching of existing ISOLINUX boot images led to a SIGSEGV.
|
||||
* Bug fix: Adding a new ISOLINUX boot image or patching of an existing one
|
||||
caused a read operation although writing had already begun.
|
||||
|
||||
libisofs-0.6.8.tar.gz Thu Sep 18 2008
|
||||
===============================================================================
|
||||
* Support for very large data files in the ISO 9660 image
|
||||
(Level 3, multi-extent)
|
||||
* Bug fix: it was assumed that isolinux images were always a multiple of 4
|
||||
bytes
|
||||
* New API call iso_image_update_sizes() to refresh recorded file sizes
|
||||
immediately before image generation begins
|
||||
|
||||
libisofs-0.6.6.tar.gz Sun Jun 1 2008
|
||||
===============================================================================
|
||||
* Bug fix: major,minor numbers of device files were not read properly from
|
||||
existing images
|
||||
* Bug fix: iso_tree_path_to_node() returned 1 if a directory path component was
|
||||
a non-directory file
|
||||
* New API call iso_special_get_dev() retrieves major, minor numbers of device
|
||||
files
|
||||
|
||||
libisofs-0.6.4.tar.gz Sun Apr 27 2008
|
||||
===============================================================================
|
||||
* Extended information: iso_node_add_xinfo()
|
||||
* New node iteration: iso_dir_find_children()
|
||||
* Custom image file content via iso_tree_add_new_file()
|
||||
* Missing feature added to map a disk file to an arbitrary image file path via
|
||||
iso_tree_add_new_node()
|
||||
* Obtain image path of a node object via iso_tree_get_node_path()
|
||||
* Various bugfixes
|
||||
|
||||
libisofs-0.6.2.1.tar.gz Thu Feb 14 2008
|
||||
===============================================================================
|
||||
* FIX: missing buffer.h preventing build from succeeding
|
||||
|
||||
Libisofs 0.6.2
|
||||
===============================================================================
|
||||
* Initial release of new generation libisofs
|
||||
* Completely new API
|
||||
* Long term commitment to ABI libisofs.so.6
|
||||
|
||||
libisofs-0.2.8.tar.gz Tue Jul 31 2007
|
||||
===============================================================================
|
||||
* Support for hidden files
|
||||
* Eltorito support
|
||||
* Charset support
|
||||
* Support for inode caching
|
||||
* Ordering files on image
|
||||
* Unit tests
|
||||
* A lot of other features and bugfixes
|
||||
* Note: ABI has been broken.
|
||||
|
||||
libisofs-0.2.5.tar.gz Tue Jul 31 2007
|
||||
===============================================================================
|
||||
* Bugfix release. Fixed the ECMA-related problem with iso tree generation.
|
||||
There is newer release 0.2.8 with a lot of new features.
|
||||
|
||||
libisofs-0.2.4.tar.gz Jan 03 2007
|
||||
===============================================================================
|
||||
* Bugfix release. Fixes lots of problems people have encountered, including but
|
||||
not limited to broken docs generation.
|
||||
|
||||
libisofs-0.2.3.tar.gz Sat Dec 02 2006
|
||||
===============================================================================
|
||||
* Bugfix release, with some improvements for freebsd support.
|
||||
* Requires libburn to compile.
|
@ -42,7 +42,6 @@ libisofs_libisofs_la_SOURCES = \
|
||||
libisofs/stream.c \
|
||||
libisofs/filter.h \
|
||||
libisofs/filter.c \
|
||||
libisofs/filters/xor_encrypt.c \
|
||||
libisofs/filters/external.c \
|
||||
libisofs/filters/zisofs.c \
|
||||
libisofs/filters/gzip.c \
|
||||
@ -81,6 +80,7 @@ libisofs_libisofs_la_LIBADD= \
|
||||
libinclude_HEADERS = \
|
||||
libisofs/libisofs.h
|
||||
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
## Build demo applications
|
||||
@ -261,6 +261,8 @@ EXTRA_DIST = \
|
||||
doc/susp_aaip_2_0.txt \
|
||||
doc/susp_aaip_isofs_names.txt \
|
||||
doc/zisofs_format.txt \
|
||||
doc/checksums.txt \
|
||||
libisofs/libisofs.ver \
|
||||
libisofs/aaip-os-dummy.c \
|
||||
libisofs/aaip-os-linux.c \
|
||||
libisofs/aaip-os-freebsd.c
|
||||
|
373
README
373
README
@ -4,93 +4,9 @@
|
||||
|
||||
Released under GPL (see COPYING file for details).
|
||||
|
||||
Copyright (C) 2008 Vreixo Formoso, Mario Danic, Thomas Schmitt
|
||||
Copyright (C) 2008 - 2010 Vreixo Formoso, Mario Danic, Thomas Schmitt
|
||||
|
||||
libisofs is part of the libburnia project (libburnia-project.org)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
libisofs is a library to create an ISO-9660 filesystem, and supports extensions
|
||||
like RockRidge or Joliet. It is also a full featured ISO-9660 editor, allowing
|
||||
you to modify an ISO image or multisession disc, including file addition and
|
||||
removal, change of file names and attributes, etc
|
||||
|
||||
Features:
|
||||
---------
|
||||
|
||||
- Image creation
|
||||
- Creates ISO-9660 images from local files.
|
||||
- Support for RockRidge and Joliet extensions.
|
||||
- Support for ISO-9660:1999 (version 2)
|
||||
- Support for El-Torito bootable images.
|
||||
- Full featured edition of file names and attributes on the image.
|
||||
- Several options to relax ISO-9660 constraints.
|
||||
- Special options for images intended for distribution (suitable default
|
||||
modes for files, hiding of real timestamps...)
|
||||
- Multisession
|
||||
- Support for growing an existing image
|
||||
- Full-featured edition of the image files, including: addition of new
|
||||
files, removing of existent files, moving files, renaming files,
|
||||
change file attributes (permissions, timestamps...)
|
||||
- Support for "emulated multisession" or image growing, suitable for non
|
||||
multisession media such as DVD+RW
|
||||
- Image modification
|
||||
- It can create a completely new image from files on another image.
|
||||
- Full-featured edition of image contents
|
||||
- Others
|
||||
- Handling of different input and output charset
|
||||
- Good integration with libburn for image burning.
|
||||
- Reliable, good handling of different kind of errors.
|
||||
|
||||
Requirements:
|
||||
-------------
|
||||
|
||||
- libburn 0.4.2 headers must be installed at compile time. It is not required
|
||||
at runtime.
|
||||
|
||||
Know bugs:
|
||||
----------
|
||||
|
||||
Multisession and image growing can lead to undesired results in several cases:
|
||||
|
||||
a) Images with unsupported features, such as:
|
||||
- UDF.
|
||||
- HSF/HFS+ or other Mac extensions.
|
||||
- El-Torito with multiple entries.
|
||||
- ECMA-119 with extended attributes, multiple extends per file.
|
||||
- Non El-Torito boot info.
|
||||
- zisofs compressed images.
|
||||
- ...
|
||||
In all these cases, the resulting new image (or new session) could lack some
|
||||
features of the original image.
|
||||
In some cases libisofs will issue warning messages, or even refuse to grow
|
||||
or modify the image. Others remain undetected. Images created with libisofs
|
||||
do not have this problems.
|
||||
|
||||
b) Bootable El-Torito images may have several problems, that result in a new
|
||||
image that is not bootable, or that boots from an outdated session. In many
|
||||
cases it is recommended to add boot info again in the new session.
|
||||
|
||||
- isolinux images won't be bootable after a modify. This is because
|
||||
isolinux images need to have hardcoded the root dir lba. libisofs cannot
|
||||
know whether an image is an isolinux image or not, so the user is
|
||||
responsible to tell libisofs that it must patch the image, with the
|
||||
el_torito_patch_isolinux_image() function. This problem could also exists
|
||||
on other boot images.
|
||||
- Most boot images are highly dependent of the image contents, so if the
|
||||
user moves or removes some files on image it is possible they won't boot
|
||||
anymore.
|
||||
- There is no safer way to modify hidden boot images, as the size of the
|
||||
boot image can't be figured out.
|
||||
|
||||
c) Generated images could have different ECMA-119 low level names, due to
|
||||
different way to mangle names, to new files added that force old files to
|
||||
be renamed, to different relaxed contraints... This only affect the
|
||||
ISO-9660 info, not the RR names, so it shouldn't be a problem in most
|
||||
cases. If your app. relies on low level ISO-9660 names, you will need to
|
||||
ensure all node names are valid ISO names (maybe together with some
|
||||
relaxed contraints), otherwise libisofs might arbitrarily change the names.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Download, Build and Installation
|
||||
@ -98,7 +14,7 @@ c) Generated images could have different ECMA-119 low level names, due to
|
||||
libisofs code is mantained in a Bazaar repository at Launchpad
|
||||
(https://launchpad.net/libisofs/). You can download it with:
|
||||
|
||||
$ bzr branch lp:libisofs
|
||||
$ bzr branch lp:libisofs/for-libisoburn
|
||||
|
||||
Our build system is based on autotools. For preparing the build you will need
|
||||
autotools of at least version 1.7. If you have download the code from the
|
||||
@ -109,7 +25,8 @@ repository, first of all you need to execute
|
||||
on toplevel dir to execute autotools.
|
||||
|
||||
Alternatively you may unpack a release tarball for which you do not need
|
||||
autotools installed.
|
||||
autotools installed. For the most recent release of libisofs see:
|
||||
http://libburnia-project.org/wiki/Releases
|
||||
|
||||
To build libisofs it should be sufficient to go into its toplevel directory
|
||||
and execute
|
||||
@ -125,176 +42,119 @@ See INSTALL file for further details.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Overview of libburnia-project.org
|
||||
libisofs is a library to create an ISO-9660 filesystem, supports extensions
|
||||
like RockRidge or Joliet, and introduces an own extension AAIP.
|
||||
It is a full featured ISO-9660 editor which composes and changes the directory
|
||||
tree of an ISO image. This tree and its newly imported data file contents get
|
||||
then written as independent single-session image or as add-on session for the
|
||||
image from where the tree was originally loaded.
|
||||
|
||||
libburnia-project.org is an open-source software project for reading, mastering
|
||||
and writing optical discs.
|
||||
For now this means only CD media and all single layer DVD media except DVD+R.
|
||||
Features:
|
||||
---------
|
||||
|
||||
The project comprises of several more or less interdependent parts which
|
||||
together strive to be a usable foundation for application development.
|
||||
These are libraries, language bindings, and middleware binaries which emulate
|
||||
classical (and valuable) Linux tools.
|
||||
- Image creation
|
||||
- Creates ISO-9660 images from local files.
|
||||
- Support for RockRidge and Joliet extensions.
|
||||
- Support for ISO-9660:1999 (version 2).
|
||||
- Support for El-Torito bootable images. Tested are: PC-BIOS and EFI.
|
||||
- Support for multi-extent data files up to 400 GB (level 3).
|
||||
- Full-featured edition of the image files, including: addition of new
|
||||
files, removing of existent files, moving files, renaming files,
|
||||
change file attributes (permissions, timestamps...)
|
||||
- Optional recording per file of non-ISO 9660 features:
|
||||
ACL, xattr, content MD5, hard link relations.
|
||||
They do not hamper image readability by operating systems but can be
|
||||
retrieved only via libisofs.
|
||||
- Optional zisofs compression, gzip compression, external filter
|
||||
processes.
|
||||
- Several options to relax ISO-9660 constraints.
|
||||
- Special options for images intended for distribution (suitable
|
||||
default modes for files, hiding of real timestamps...).
|
||||
- Image reading
|
||||
- Image tree and data heap can be verified by stream reading and
|
||||
eventually recorded MD5 tags.
|
||||
- Directory tree and file attributes of ISO 9660 session get loaded
|
||||
into memory for editing or for extraction into local filesystem.
|
||||
- File content can be read by applications.
|
||||
- Automatic zisofs decompression.
|
||||
- Optional application of gzip decompression or external filter
|
||||
processes.
|
||||
- Eventually recorded MD5 of data file can be obtained, MD5 of data
|
||||
stream can be computed and compared.
|
||||
- Helper functions for restoring ACL and/or xattr to the local
|
||||
filesystem.
|
||||
- Multisession
|
||||
- Support for growing an existing image on multi-session media.
|
||||
- Support for "emulated multisession" on overwriteable media such as
|
||||
DVD+RW, USB sticks, regular files.
|
||||
- Support for blindly prepared add-on sessions (mkisofs style -M -C)
|
||||
suitable for pipes which lead to an external burn program.
|
||||
- Image modification
|
||||
- Creates a completely new image from files out of another image and
|
||||
eventual editing operations. Suitable for any target medium.
|
||||
- Others
|
||||
- Handling of different input and output charset.
|
||||
- Good integration with libburn for image burning.
|
||||
- Reliable, good handling of different kind of errors.
|
||||
|
||||
Our scope is currently Linux 2.4 and 2.6 only. For ports to other systems
|
||||
we would need : login on a development machine resp. a live OS on CD or DVD,
|
||||
advise from a system person about the equivalent of Linux sg or FreeBSD CAM,
|
||||
volunteers for testing of realistic use cases.
|
||||
Requirements:
|
||||
-------------
|
||||
|
||||
We have a workable code base for burning CD and most single layer DVD.
|
||||
The burn API is quite comprehensively documented and can be used to build a
|
||||
presentable application.
|
||||
We have a functional binary which emulates parts of cdrecord in order to
|
||||
prove that usability, and in order to allow you to explore libburnia's scope
|
||||
by help of existing cdrecord frontends.
|
||||
- iconv() functions for character set conversion must be available.
|
||||
Either implicitely as in Linux or by a separate library like libiconv
|
||||
on FreeBSD.
|
||||
|
||||
The project components (list subject to growth, hopefully):
|
||||
Know bugs:
|
||||
----------
|
||||
|
||||
- libburn is the library by which preformatted data get onto optical media.
|
||||
It uses either /dev/sgN (e.g. on kernel 2.4 with ide-scsi) or
|
||||
/dev/hdX (e.g. on kernel 2.6).
|
||||
libburn is the foundation of our cdrecord emulation. Its code is
|
||||
independent of cdrecord. Its DVD capabilities are learned from
|
||||
studying the code of dvd+rw-tools and MMC-5 specs. No code but only
|
||||
the pure SCSI knowledge has been taken from dvd+rw-tools, though.
|
||||
Multisession and image growing can lead to undesired results in several cases:
|
||||
|
||||
- libisofs is the library to pack up hard disk files and directories into a
|
||||
ISO 9660 disk image. This may then be brought to media via libburn.
|
||||
libisofs is to be the foundation of our upcoming mkisofs emulation.
|
||||
a) Images with unsupported features, such as:
|
||||
- UDF.
|
||||
- HSF/HFS+ or other Mac extensions.
|
||||
- ECMA-119 Extended attributes.
|
||||
- Non El-Torito boot info.
|
||||
- ...
|
||||
In all these cases, the resulting new image (or new session) could lack some
|
||||
features of the original image. Nevertheless, the ECMA-119 System Area with
|
||||
an eventual Master Boot Record gets preserved by default.
|
||||
In some cases libisofs will issue warning messages, or even refuse to grow
|
||||
or modify the image. Others remain undetected. Images created with libisofs
|
||||
do not have this problems.
|
||||
|
||||
- cdrskin is a limited cdrecord compatibility wrapper for libburn.
|
||||
Cdrecord is a powerful GPL'ed burn program included in Joerg
|
||||
Schilling's cdrtools. cdrskin strives to be a second source for
|
||||
the services traditionally provided by cdrecord. Additionally it
|
||||
provides libburn's DVD capabilities, where only -sao is compatible
|
||||
with cdrecord.
|
||||
cdrskin does not contain any bytes copied from cdrecord's sources.
|
||||
Many bytes have been copied from the message output of cdrecord
|
||||
runs, though.
|
||||
See cdrskin/README and man cdrskin/cdrskin.1 for more.
|
||||
b) Bootable El-Torito images may have several problems, that result in a new
|
||||
image that is not bootable, or that boots from an outdated session. In many
|
||||
cases it is recommended to add boot info again in the new session.
|
||||
|
||||
- test is a collection of application gestures and examples given by the
|
||||
authors of the library features. The main API example for libburn
|
||||
is test/libburner.c .
|
||||
Explore these examples if you look for inspiration.
|
||||
- isolinux images won't be bootable after a modify. This is because
|
||||
isolinux images need to have hardcoded the root dir lba in their boot
|
||||
information table.
|
||||
libisofs makes an educated guess at load time whether a boot image
|
||||
contains such a table. Its outcome can be inquired by call
|
||||
el_torito_seems_boot_info_table().
|
||||
If one knows to have isolinux or GRUB El-Torito-bootable images, or if
|
||||
a boot information table seems to exist, it is advised to apply the
|
||||
el_torito_patch_isolinux_image() function.
|
||||
Most boot images are highly dependent of the image contents, so if the
|
||||
user moves or removes some files on image it is possible they won't boot
|
||||
anymore.
|
||||
- There is no safe way to modify hidden boot images, as the size of the
|
||||
boot image can't be figured out.
|
||||
|
||||
We plan to be a responsive upstream. Bear with us. We are still practicing.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Project history as far as known to me:
|
||||
|
||||
- Founded in 2002 as it seems. See mailing list archives
|
||||
http://lists.freedesktop.org/archives/libburn/
|
||||
The site of this founder team is reachable and offers download of a
|
||||
(somewhat outdated) tarball and from CVS :
|
||||
http://icculus.org/burn/
|
||||
Copyright holders and most probably founders:
|
||||
Derek Foreman and Ben Jansens.
|
||||
|
||||
- I came to using libburn in 2005. Founded the cdrskin project and submitted
|
||||
necessary patches which were accepted or implemented better. Except one
|
||||
remaining patch which prevented cdrskin from using vanilla libburn from CVS.
|
||||
The cdrskin project site is reachable and offers download of the heavily
|
||||
patched (elsewise outdated) tarball under the name cdrskin-0.1.2 :
|
||||
http://scdbackup.sourceforge.net/cdrskin_eng.html
|
||||
It has meanwhile moved to use vanilla libburn.pykix.org , though.
|
||||
Version 0.1.4 constitutes the first release of this kind.
|
||||
|
||||
- In July 2006 our team mate Mario Danic announced a revival of libburn
|
||||
which by about nearly everybody else was perceived as unfriendly fork.
|
||||
Derek Foreman four days later posted a message which expressed his
|
||||
discontent.
|
||||
The situation first caused me to publically regret it and then - after i
|
||||
got the opportunity to move in with cdrskin - gave me true reason to
|
||||
personally apologize to Derek Foreman, Ben Jansens and the contibutors at
|
||||
icculus.org/burn. Posted to both projects:
|
||||
http://lists.freedesktop.org/archives/libburn/2006-August/000446.html
|
||||
http://mailman-mail1.webfaction.com/pipermail/libburn-hackers/2006-August/000024.html
|
||||
|
||||
- Mid August 2006 project cdrskin established a branch office in
|
||||
libburn.pykix.org so that all maintainers of our tools have one single place
|
||||
to get the current (at least slightely) usable coordinated versions of
|
||||
everything.
|
||||
Project cdrskin will live forth independendly for a while but it is committed
|
||||
to stay in sync with libburn.pykix.org (or some successor, if ever).
|
||||
cdrskin is also committed to support icculus.org/burn if the pending fork
|
||||
is made reality by content changes in that project. It will cease to maintain
|
||||
a patched version of icculus.org/burn though. Precondition for a new
|
||||
release of cdrskin on base of icculus.org/burn would be the pending
|
||||
"whitelist patch" therefore.
|
||||
I would rather prefer if both projects find consense and merge, or at least
|
||||
cooperate. I have not given up hope totally, yet.
|
||||
I, personally, will honor any approach.
|
||||
|
||||
- 2nd September 2006 the decision is made to strive for a consolidation of
|
||||
copyright and a commitment to GPL in a reasonable and open minded way.
|
||||
This is to avoid long term problems with code of unknown origin and
|
||||
with finding consense among the not so clearly defined group of copyright
|
||||
claimers and -holders.
|
||||
libisofs is already claimed sole copyright Mario Danic.
|
||||
cdrskin and libburner are already claimed sole copyright Thomas Schmitt.
|
||||
Rewrites of other components will follow and concluded by claiming full
|
||||
copyright within the group of libburn.pykix.org-copyright holders.
|
||||
|
||||
- 16th September 2006 feature freeze for release of libburn-0.2.2 .
|
||||
|
||||
- 20th September 2006 release of libburn-0.2.2 .
|
||||
|
||||
- 26th October 2006 feature freeze for cdrskin-0.2.4 based on libburn-0.2.3 .
|
||||
This version of cdrskin is much more cdrecord compatible in repect
|
||||
to drive addressing and audio features.
|
||||
|
||||
- 30th October 2006 release of cdrskin-0.2.4 .
|
||||
|
||||
- 13th November 2006 splitting releases of libburn+cdrskin from libisofs.
|
||||
|
||||
- 24th November 2006 release of libburn-0.2.6 and cdrskin-0.2.6 . cdrskin has
|
||||
become suitable for unaware frontends as long as they perform only the core
|
||||
of cdrecord use cases (including open-ended input streams, audio, and
|
||||
multi-session).
|
||||
|
||||
- 28th November 2006 the umbrella project which encloses both, libisofs and
|
||||
libburn, is now called libburnia. For the origin of this name, see
|
||||
http://en.wikipedia.org/wiki/Liburnians .
|
||||
|
||||
- 16th January 2007 release of libburn-0.3.0 and cdrskin-0.3.0 . Now the scope
|
||||
is widened to a first class of DVD media: overwriteable single layer types
|
||||
DVD-RAM, DVD+RW, DVD-RW. This is not a cdrecord emulation but rather inspired
|
||||
by dvd+rw-tools' "poor man" writing facility for this class of media.
|
||||
Taking a bow towards Andy Polyakov.
|
||||
|
||||
- 11th February 2007 version 0.3.2 covers sequential DVD-RW and DVD-R with
|
||||
multi-session and with DAO.
|
||||
|
||||
- 12th March 2007 version 0.3.4 supports DVD+R and thus covers all single layer
|
||||
DVD media. Code for double layer DVD+/-R is implemented but awaits a tester
|
||||
yet.
|
||||
|
||||
- 23th April 2007 version 0.3.6 follows the unanimous opinion of Linux kernel
|
||||
people that one should not use /dev/sg on kernel 2.6.
|
||||
|
||||
- 31st July 2007 version 0.3.8 marks the first anniversary of libburn revival.
|
||||
We look back on improved stability, a substantially extended list of media
|
||||
and write modes, and better protection against typical user mishaps.
|
||||
|
||||
- 24th October 2007 version 0.4.0 is the foundation of new library libisoburn
|
||||
and an upcomming integrated application for manipulating and writing
|
||||
ISO 9660 + Rock Ridge images. cdrskin-0.4.0 got capabilities like growisofs
|
||||
by these enhancements: growing of overwriteable media and disk files.
|
||||
Taking again a bow towards Andy Polyakov.
|
||||
|
||||
- 26th Januar 2008 version 0.4.2 rectifies the version numbering so that we
|
||||
reliably release libburn.so.4 as should have been done since libburn-0.3.2.
|
||||
cdrskin now is by default linked dynamically and does a runtime check
|
||||
to ensure not to be started with a libburn which is older than itself.
|
||||
c) Generated images could have different ECMA-119 low level names, due to
|
||||
different way to mangle names, to new files added that force old files to
|
||||
be renamed, to different relaxed contraints... This only affect the
|
||||
ISO-9660 info, not the RR names, so it shouldn't be a problem in most
|
||||
cases. If your app. relies on low level ISO-9660 names, you will need to
|
||||
ensure all node names are valid ISO names (maybe together with some
|
||||
relaxed contraints), otherwise libisofs might arbitrarily change the names.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation. To be exact: version 2 of that License.
|
||||
it under the terms of the GNU General Public License version 2 or later
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
@ -309,19 +169,19 @@ Project history as far as known to me:
|
||||
Clarification in my name and in the name of Mario Danic, upcoming copyright
|
||||
holders on toplevel of libburnia. To be fully in effect after the remaining
|
||||
other copyrighted code has been replaced by ours and by copyright-free
|
||||
contributions of our friends:
|
||||
contributions of our friends.
|
||||
|
||||
Note:
|
||||
In the particular case of libisofs there is no foreign copyright involved.
|
||||
As of 2010 foreign copyright is only in component libburn.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
We, the copyright holders, agree on the interpretation that
|
||||
dynamical linking of our libraries constitutes "use of" and
|
||||
not "derivation from" our work in the sense of GPL, provided
|
||||
those libraries are compiled from our unaltered code.
|
||||
|
||||
Thus you may link our libraries dynamically with applications
|
||||
which are not under GPL. You may distribute our libraries and
|
||||
application tools in binary form, if you fulfill the usual
|
||||
condition of GPL to offer a copy of the source code -altered
|
||||
or unaltered- under GPL.
|
||||
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
|
||||
the condition of offering the library source code used, whether
|
||||
altered or unaltered, under the GPLv2+, along with the application.
|
||||
Nevertheless, the safest legal position is not to link libburn with
|
||||
non-GPL compatible programs.
|
||||
|
||||
We ask you politely to use our work in open source spirit
|
||||
and with the due reference to the entire open source community.
|
||||
@ -335,7 +195,10 @@ It is the open source idea of responsible freedom which will be
|
||||
decisive and you will have to prove that you exhausted all own
|
||||
means to qualify for GPL.
|
||||
|
||||
For now we are firmly committed to maintain one single license: GPL.
|
||||
We are firmly committed to allow GPLv2+ now and with future releases.
|
||||
|
||||
signed: Mario Danic, Thomas Schmitt
|
||||
Signed: Mario Danic, Thomas Schmitt
|
||||
Agreement joined later by: Vreixo Formoso
|
||||
|
||||
Public contact: <libburn-hackers@pykix.org>
|
||||
|
||||
|
80
acinclude.m4
80
acinclude.m4
@ -1,3 +1,14 @@
|
||||
AC_DEFUN([LIBBURNIA_SET_FLAGS],
|
||||
[
|
||||
case $target_os in
|
||||
freebsd*)
|
||||
LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
||||
CPPFLAGS="$CPPFLAGS -I/usr/local/include"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
|
||||
AC_DEFUN([TARGET_SHIZZLE],
|
||||
[
|
||||
ARCH=""
|
||||
@ -39,8 +50,9 @@ dnl From Bruno Haible.
|
||||
dnl
|
||||
AC_DEFUN([LIBBURNIA_CHECK_ICONV],
|
||||
[
|
||||
|
||||
dnl Check whether it is allowed to link with -liconv
|
||||
AC_MSG_CHECKING([for separate -liconv ])
|
||||
AC_MSG_CHECKING([for iconv() in separate -liconv ])
|
||||
libburnia_liconv="no"
|
||||
libburnia_save_LIBS="$LIBS"
|
||||
LIBS="$LIBS -liconv"
|
||||
@ -54,6 +66,13 @@ 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([
|
||||
@ -68,6 +87,65 @@ size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, si
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_ASSERT_ICONV is by Thomas Schmitt, libburnia project
|
||||
dnl
|
||||
AC_DEFUN([LIBBURNIA_ASSERT_ICONV],
|
||||
[
|
||||
if test x$LIBISOFS_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 " LIBISOFS_ASSUME_ICONV=yes" >&2
|
||||
echo >&2
|
||||
(exit 1); exit 1;
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl LIBISOFS_ASSERT_VERS_LIBS is by Thomas Schmitt, libburnia project
|
||||
dnl It tests whether -Wl,--version-script=... works with the compiler
|
||||
AC_DEFUN([LIBISOFS_ASSERT_VERS_LIBS],
|
||||
[
|
||||
libburnia_save_LDFLAGS="$LDFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,--version-script=libisofs/libisofs.ver"
|
||||
AC_TRY_LINK([#include <stdio.h>], [printf("Hello\n");],
|
||||
[vers_libs_test="yes"], [vers_libs_test="no"])
|
||||
if test x$vers_libs_test = xno
|
||||
then
|
||||
LDFLAGS="$libburnia_save_LDFLAGS"
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_SET_PKGCONFIG determines the install directory for the *.pc file.
|
||||
dnl Important: Must be performed _after_ TARGET_SHIZZLE
|
||||
dnl
|
||||
|
50
configure.ac
50
configure.ac
@ -1,17 +1,13 @@
|
||||
AC_INIT([libisofs], [0.6.22], [http://libburnia-project.org])
|
||||
AC_INIT([libisofs], [0.6.36], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
dnl AC_CONFIG_HEADER([config.h])
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
AC_CANONICAL_TARGET
|
||||
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
LIBBURNIA_SET_FLAGS
|
||||
|
||||
dnl A61101 This breaks Linux build (makes 32 bit off_t)
|
||||
dnl http://sourceware.org/autobook/autobook/autobook_96.html says
|
||||
dnl one must include some config.h and this was a pitfall.
|
||||
dnl So why dig the pit at all ?
|
||||
dnl AM_CONFIG_HEADER(config.h)
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
|
||||
dnl
|
||||
dnl if MAJOR or MINOR version changes, be sure to change AC_INIT above to match
|
||||
@ -37,14 +33,14 @@ dnl iso_lib_version(). It returns the major, minor and micro revision of the
|
||||
dnl library. This means LIBISOFS_*_VERSION kept its second job which does not
|
||||
dnl comply to the usual ways of configure.ac . I.e. now *officially* this is
|
||||
dnl the source code release version as announced to the public. It has no
|
||||
dnl conection to SONAME or libtool version numbering.
|
||||
dnl connection to SONAME or libtool version numbering.
|
||||
dnl It rather feeds the API function iso_lib_version().
|
||||
dnl
|
||||
dnl If LIBISOFS_*_VERSION changes, be sure to change AC_INIT above to match.
|
||||
dnl
|
||||
LIBISOFS_MAJOR_VERSION=0
|
||||
LIBISOFS_MINOR_VERSION=6
|
||||
LIBISOFS_MICRO_VERSION=22
|
||||
LIBISOFS_MICRO_VERSION=36
|
||||
LIBISOFS_VERSION=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION.$LIBISOFS_MICRO_VERSION
|
||||
|
||||
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
||||
@ -54,11 +50,11 @@ AC_SUBST(LIBISOFS_VERSION)
|
||||
|
||||
dnl Libtool versioning
|
||||
LT_RELEASE=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION
|
||||
# 2009.08.25 development jump has not yet happened
|
||||
# SONAME = 24 - 18 = 6 . Library name = libisofs.6.18.0
|
||||
LT_CURRENT=24
|
||||
# 2010.09.15 development jump has not yet happened
|
||||
# SONAME = 38 - 32 = 6 . Library name = libisofs.6.32.0
|
||||
LT_CURRENT=38
|
||||
LT_AGE=32
|
||||
LT_REVISION=0
|
||||
LT_AGE=18
|
||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||
|
||||
AC_SUBST(LT_RELEASE)
|
||||
@ -89,6 +85,9 @@ 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.
|
||||
LIBBURNIA_CHECK_ICONV
|
||||
|
||||
dnl To abort configuration if iconv() still cannot be compiled
|
||||
LIBBURNIA_ASSERT_ICONV
|
||||
|
||||
|
||||
AC_PROG_LIBTOOL
|
||||
AC_SUBST(LIBTOOL_DEPS)
|
||||
@ -196,14 +195,35 @@ AC_ARG_ENABLE(zlib,
|
||||
if test "x$enable_zlib" = xyes; then
|
||||
dnl Check whether there is the header for zlib.
|
||||
dnl If not, erase this macro which would enable use of compress2() and others.
|
||||
dnl The empty parameter after "compress2" causes -lz.
|
||||
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="-DLibisofs_with_zliB"
|
||||
AC_CHECK_HEADER(zlib.h, AC_CHECK_LIB(z, compress2, , ZLIB_DEF= ), ZLIB_DEF= )
|
||||
AC_CHECK_HEADER(zlib.h, AC_CHECK_LIB(z, compressBound, , ZLIB_DEF= ), ZLIB_DEF= )
|
||||
else
|
||||
ZLIB_DEF=
|
||||
fi
|
||||
AC_SUBST(ZLIB_DEF)
|
||||
|
||||
# Library versioning normally serves a complex purpose.
|
||||
# Since libisofs 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
|
||||
LIBISOFS_ASSERT_VERS_LIBS
|
||||
if test x$vers_libs_test = xno
|
||||
then
|
||||
echo "disabled strict symbol encapsulation (test failed)"
|
||||
else
|
||||
echo "enabled strict symbol encapsulation"
|
||||
fi
|
||||
else
|
||||
echo "disabled strict symbol encapsulation"
|
||||
fi
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#include "libisofs.h"
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#include "libisofs.h"
|
||||
|
133
demo/demo.c
133
demo/demo.c
@ -3,9 +3,9 @@
|
||||
* Copyright (c) 2007 - 2009 Vreixo Formoso, Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
*
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
static char helptext[][80] = {
|
||||
@ -52,18 +52,10 @@ static char helptext[][80] = {
|
||||
#include <limits.h>
|
||||
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX Libisofs_default_path_maX
|
||||
#endif
|
||||
|
||||
#define LIBISOFS_WITHOUT_LIBBURN yes
|
||||
#include "libisofs.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <err.h>
|
||||
|
||||
/* ------------------------- from demo/tree.c ----------------------- */
|
||||
|
||||
@ -93,7 +85,9 @@ tree_print_dir(IsoDir *dir, int level)
|
||||
int i;
|
||||
IsoDirIter *iter;
|
||||
IsoNode *node;
|
||||
char *sp = alloca(level * 2 + 1);
|
||||
char *sp;
|
||||
|
||||
sp = calloc(1, level * 2 + 1);
|
||||
|
||||
for (i = 0; i < level * 2; i += 2) {
|
||||
sp[i] = '|';
|
||||
@ -127,6 +121,7 @@ tree_print_dir(IsoDir *dir, int level)
|
||||
}
|
||||
}
|
||||
iso_dir_iter_free(iter);
|
||||
free(sp);
|
||||
}
|
||||
|
||||
int gesture_tree(int argc, char **argv)
|
||||
@ -265,7 +260,7 @@ int gesture_iso(int argc, char **argv)
|
||||
IsoImage *image;
|
||||
struct burn_source *burn_src;
|
||||
unsigned char buf[2048];
|
||||
FILE *fd;
|
||||
FILE *fp = NULL;
|
||||
IsoWriteOpts *opts;
|
||||
char *volid = "VOLID";
|
||||
char *boot_img = NULL;
|
||||
@ -276,7 +271,7 @@ int gesture_iso(int argc, char **argv)
|
||||
case 'h':
|
||||
iso_usage(argv);
|
||||
iso_help();
|
||||
exit(0);
|
||||
goto ex;
|
||||
break;
|
||||
case 'J':
|
||||
j = 1;
|
||||
@ -298,7 +293,7 @@ int gesture_iso(int argc, char **argv)
|
||||
break;
|
||||
case '?':
|
||||
iso_usage(argv);
|
||||
exit(1);
|
||||
goto ex;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -306,30 +301,31 @@ int gesture_iso(int argc, char **argv)
|
||||
if (argc < 2) {
|
||||
printf ("Please pass directory from which to build ISO\n");
|
||||
iso_usage(argv);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
if (argc < 3) {
|
||||
printf ("Please supply output file\n");
|
||||
iso_usage(argv);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
fd = fopen(argv[optind+1], "w");
|
||||
if (!fd) {
|
||||
fp = fopen(argv[optind+1], "w");
|
||||
if (fp == NULL) {
|
||||
err(1, "error opening output file");
|
||||
goto ex;
|
||||
}
|
||||
|
||||
result = iso_init();
|
||||
if (result < 0) {
|
||||
printf ("Can't initialize libisofs\n");
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
iso_set_msgs_severities("NEVER", "ALL", "");
|
||||
|
||||
result = iso_image_new(volid, &image);
|
||||
if (result < 0) {
|
||||
printf ("Error creating image\n");
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
iso_tree_set_follow_symlinks(image, 0);
|
||||
iso_tree_set_ignore_hidden(image, 0);
|
||||
@ -341,7 +337,7 @@ int gesture_iso(int argc, char **argv)
|
||||
argv[optind]);
|
||||
if (result < 0) {
|
||||
printf ("Error adding directory %d\n", result);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
if (boot_img) {
|
||||
@ -351,7 +347,7 @@ int gesture_iso(int argc, char **argv)
|
||||
"/isolinux/boot.cat", &bootimg);
|
||||
if (result < 0) {
|
||||
printf ("Error adding boot image %d\n", result);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
el_torito_set_load_size(bootimg, 4);
|
||||
el_torito_patch_isolinux_image(bootimg);
|
||||
@ -360,7 +356,7 @@ int gesture_iso(int argc, char **argv)
|
||||
result = iso_write_opts_new(&opts, 0);
|
||||
if (result < 0) {
|
||||
printf ("Cant create write opts, error %d\n", result);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
iso_write_opts_set_iso_level(opts, level);
|
||||
iso_write_opts_set_rockridge(opts, rr);
|
||||
@ -370,21 +366,25 @@ int gesture_iso(int argc, char **argv)
|
||||
result = iso_image_create_burn_source(image, opts, &burn_src);
|
||||
if (result < 0) {
|
||||
printf ("Cant create image, error %d\n", result);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
iso_write_opts_free(opts);
|
||||
|
||||
while (burn_src->read_xt(burn_src, buf, 2048) == 2048) {
|
||||
fwrite(buf, 1, 2048, fd);
|
||||
fwrite(buf, 1, 2048, fp);
|
||||
}
|
||||
fclose(fd);
|
||||
fclose(fp);
|
||||
burn_src->free_data(burn_src);
|
||||
free(burn_src);
|
||||
|
||||
iso_image_unref(image);
|
||||
iso_finish();
|
||||
return 0;
|
||||
ex:;
|
||||
if (fp != NULL)
|
||||
fclose(fp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@ -431,7 +431,9 @@ iso_read_print_dir(IsoFileSource *dir, int level)
|
||||
int ret, i;
|
||||
IsoFileSource *file;
|
||||
struct stat info;
|
||||
char *sp = alloca(level * 2 + 1);
|
||||
char *sp;
|
||||
|
||||
sp = calloc(1, level * 2 + 1);
|
||||
|
||||
for (i = 0; i < level * 2; i += 2) {
|
||||
sp[i] = '|';
|
||||
@ -461,6 +463,7 @@ iso_read_print_dir(IsoFileSource *dir, int level)
|
||||
if (ret < 0) {
|
||||
printf ("Can't print dir\n");
|
||||
}
|
||||
free(sp);
|
||||
}
|
||||
|
||||
int gesture_iso_read(int argc, char **argv)
|
||||
@ -625,18 +628,19 @@ int gesture_iso_modify(int argc, char **argv)
|
||||
IsoDataSource *src;
|
||||
struct burn_source *burn_src;
|
||||
unsigned char buf[2048];
|
||||
FILE *fd;
|
||||
FILE *fp = NULL;
|
||||
IsoWriteOpts *opts;
|
||||
IsoReadOpts *ropts;
|
||||
|
||||
if (argc < 4) {
|
||||
iso_modify_usage(argv);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
fd = fopen(argv[3], "w");
|
||||
if (!fd) {
|
||||
fp = fopen(argv[3], "w");
|
||||
if (fp == NULL) {
|
||||
err(1, "error opening output file");
|
||||
goto ex;
|
||||
}
|
||||
|
||||
iso_init();
|
||||
@ -646,14 +650,14 @@ int gesture_iso_modify(int argc, char **argv)
|
||||
result = iso_data_source_new_from_file(argv[1], &src);
|
||||
if (result < 0) {
|
||||
printf ("Error creating data source\n");
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
/* create the image context */
|
||||
result = iso_image_new("volume_id", &image);
|
||||
if (result < 0) {
|
||||
printf ("Error creating image\n");
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
iso_tree_set_follow_symlinks(image, 0);
|
||||
iso_tree_set_ignore_hidden(image, 0);
|
||||
@ -662,49 +666,53 @@ int gesture_iso_modify(int argc, char **argv)
|
||||
result = iso_read_opts_new(&ropts, 0);
|
||||
if (result < 0) {
|
||||
fprintf(stderr, "Error creating read options\n");
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
result = iso_image_import(image, src, ropts, NULL);
|
||||
iso_read_opts_free(ropts);
|
||||
iso_data_source_unref(src);
|
||||
if (result < 0) {
|
||||
printf ("Error importing previous session %d\n", result);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
/* add new dir */
|
||||
result = iso_tree_add_dir_rec(image, iso_image_get_root(image), argv[2]);
|
||||
if (result < 0) {
|
||||
printf ("Error adding directory %d\n", result);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
/* generate a new image with both previous and added contents */
|
||||
result = iso_write_opts_new(&opts, 1);
|
||||
if (result < 0) {
|
||||
printf("Cant create write opts, error %d\n", result);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
/* for isolinux: iso_write_opts_set_allow_full_ascii(opts, 1); */
|
||||
|
||||
result = iso_image_create_burn_source(image, opts, &burn_src);
|
||||
if (result < 0) {
|
||||
printf ("Cant create image, error %d\n", result);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
iso_write_opts_free(opts);
|
||||
|
||||
while (burn_src->read_xt(burn_src, buf, 2048) == 2048) {
|
||||
fwrite(buf, 1, 2048, fd);
|
||||
fwrite(buf, 1, 2048, fp);
|
||||
}
|
||||
fclose(fd);
|
||||
fclose(fp);
|
||||
burn_src->free_data(burn_src);
|
||||
free(burn_src);
|
||||
|
||||
iso_image_unref(image);
|
||||
iso_finish();
|
||||
return 0;
|
||||
return 0;
|
||||
ex:
|
||||
if (fp != NULL)
|
||||
fclose(fp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@ -723,25 +731,26 @@ int gesture_iso_ms(int argc, char **argv)
|
||||
IsoDataSource *src;
|
||||
struct burn_source *burn_src;
|
||||
unsigned char buf[2048];
|
||||
FILE *fd;
|
||||
FILE *fp = NULL;
|
||||
IsoWriteOpts *opts;
|
||||
IsoReadOpts *ropts;
|
||||
uint32_t ms_block;
|
||||
|
||||
if (argc < 6) {
|
||||
iso_ms_usage(argv);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
if (strcmp(argv[3], argv[5]) == 0) {
|
||||
fprintf(stderr,
|
||||
"image_file and output_file must not be the same file.\n");
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
fd = fopen(argv[5], "w");
|
||||
if (!fd) {
|
||||
fp = fopen(argv[5], "w");
|
||||
if (!fp) {
|
||||
err(1, "error opening output file");
|
||||
goto ex;
|
||||
}
|
||||
|
||||
iso_init();
|
||||
@ -751,14 +760,14 @@ int gesture_iso_ms(int argc, char **argv)
|
||||
result = iso_data_source_new_from_file(argv[3], &src);
|
||||
if (result < 0) {
|
||||
printf ("Error creating data source\n");
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
/* create the image context */
|
||||
result = iso_image_new("volume_id", &image);
|
||||
if (result < 0) {
|
||||
printf ("Error creating image\n");
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
iso_tree_set_follow_symlinks(image, 0);
|
||||
iso_tree_set_ignore_hidden(image, 0);
|
||||
@ -767,7 +776,7 @@ int gesture_iso_ms(int argc, char **argv)
|
||||
result = iso_read_opts_new(&ropts, 0);
|
||||
if (result < 0) {
|
||||
fprintf(stderr, "Error creating read options\n");
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
iso_read_opts_set_start_block(ropts, atoi(argv[1]));
|
||||
result = iso_image_import(image, src, ropts, NULL);
|
||||
@ -775,21 +784,21 @@ int gesture_iso_ms(int argc, char **argv)
|
||||
iso_data_source_unref(src);
|
||||
if (result < 0) {
|
||||
printf ("Error importing previous session %d\n", result);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
/* add new dir */
|
||||
result = iso_tree_add_dir_rec(image, iso_image_get_root(image), argv[4]);
|
||||
if (result < 0) {
|
||||
printf ("Error adding directory %d\n", result);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
/* generate a multisession image with new contents */
|
||||
result = iso_write_opts_new(&opts, 1);
|
||||
if (result < 0) {
|
||||
printf("Cant create write opts, error %d\n", result);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
/* round up to 32kb aligment = 16 block */
|
||||
@ -800,20 +809,24 @@ int gesture_iso_ms(int argc, char **argv)
|
||||
result = iso_image_create_burn_source(image, opts, &burn_src);
|
||||
if (result < 0) {
|
||||
printf ("Cant create image, error %d\n", result);
|
||||
return 1;
|
||||
goto ex;
|
||||
}
|
||||
iso_write_opts_free(opts);
|
||||
|
||||
while (burn_src->read_xt(burn_src, buf, 2048) == 2048) {
|
||||
fwrite(buf, 1, 2048, fd);
|
||||
fwrite(buf, 1, 2048, fp);
|
||||
}
|
||||
fclose(fd);
|
||||
fclose(fp);
|
||||
burn_src->free_data(burn_src);
|
||||
free(burn_src);
|
||||
|
||||
iso_image_unref(image);
|
||||
iso_finish();
|
||||
return 0;
|
||||
return 0;
|
||||
ex:;
|
||||
if (fp != NULL)
|
||||
fclose(fp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -10,6 +10,12 @@
|
||||
|
||||
#include "libisofs.h"
|
||||
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX Libisofs_default_path_maX
|
||||
#endif
|
||||
|
||||
|
||||
static void
|
||||
print_permissions(mode_t mode)
|
||||
{
|
||||
|
11
demo/lsl.c
11
demo/lsl.c
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#include "libisofs.h"
|
||||
@ -13,6 +14,12 @@
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX Libisofs_default_path_maX
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Little test program to test filesystem implementations.
|
||||
*
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
by Thomas Schmitt - mailto:scdbackup@gmx.net
|
||||
Libburnia project - mailto:libburn-hackers@pykix.org
|
||||
16 Aug 2009
|
||||
26 Aug 2009
|
||||
|
||||
|
||||
MD5 is a 128 bit message digest with a very low probability to be the same for
|
||||
@ -59,7 +59,7 @@ Entry number N + 1 holds the MD5 checksum of entries 0 to N.
|
||||
|
||||
Because the inquiry of AAIP attributes demands loading of the image tree,
|
||||
there are also checksum tags which can be detected on the fly when reading
|
||||
and checksumming the session from the start point as learned from a media
|
||||
and checksumming the session from its start point as learned from a media
|
||||
table-of-content.
|
||||
|
||||
The superblock checksum tag is written after the ECMA-119 volume descriptors.
|
||||
@ -67,8 +67,8 @@ 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 eventual padding.)
|
||||
|
||||
The tags are a single lines of printable text, padded by 0 bytes. They have
|
||||
the following format:
|
||||
The tags are single lines of printable text at the very beginning of a block
|
||||
of 2048 bytes. They have the following format:
|
||||
|
||||
Tag_id pos=# range_start=# range_size=# [session_start|next=#] md5=# self=#\n
|
||||
|
||||
@ -79,16 +79,15 @@ Tag_id distinguishes the following tag types
|
||||
"libisofs_checksum_tag_v1" Session tag
|
||||
|
||||
A relocated superblock may appear at LBA 0 of an image which was produced for
|
||||
being stored in a disk file or on overwriteable media (e.g. DVD+R, BD-RE).
|
||||
being stored in a disk file or on overwriteable media (e.g. DVD+RW, BD-RE).
|
||||
Typically there is a first session recorded with a superblock at LBA 32 and
|
||||
the next session may follow shortly after its session tag. (There may be a gap
|
||||
of padding, often 150 blocks, and aligning to the next address that is
|
||||
divisible by 32.) Normally no session starts after the address given by
|
||||
parameter session_start=.
|
||||
the next session may follow shortly after its session tag. (Typically at the
|
||||
next block address which is divisible by 32.) Normally no session starts after
|
||||
the address given by parameter session_start=.
|
||||
|
||||
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 (to be inquired
|
||||
by MMC commands(.
|
||||
by MMC commands).
|
||||
|
||||
|
||||
Example:
|
||||
@ -162,9 +161,14 @@ checksums as strings of 32 hex digits.
|
||||
The MD5 checksum of the tag itself up to and including the last hex digit of
|
||||
parameter "md5=".
|
||||
|
||||
The newline character at the end is mandatory. For now all bytes of the
|
||||
block after that newline shall be zero. There may arise future extensions.
|
||||
The newline character at the end is mandatory. After that newline there may
|
||||
follow more lines. Their meaning is not necessarily described in this document.
|
||||
|
||||
One such line type is the scdbackup checksum tag, an ancestor of libisofs tags
|
||||
which is suitable only for single session images which begin at LBA 0. It bears
|
||||
a checksum record which by its MD5 covers all bytes from LBA 0 up to the
|
||||
newline character preceding the scdbackup tag. See scdbackup/README appendix
|
||||
VERIFY for details.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
@ -183,11 +187,11 @@ whether its MD5 matches the MD5 of the data blocks which were read before.
|
||||
|
||||
With tag type 2:
|
||||
|
||||
Keep the original MD5 context of the data blocks and clone
|
||||
one for obtaining the MD5 bytes.
|
||||
If the MD5s match, then compute the checksum block into the kept MD5 context
|
||||
and go on with reading and computing for the tree checksum tag. This will be
|
||||
found at block address next_tag, verified and parsed by:
|
||||
Keep the original MD5 context of the data blocks and clone one for obtaining
|
||||
the MD5 bytes.
|
||||
If the MD5s match, then compute the checksum block and all folowing ones into
|
||||
the kept MD5 context and go on with reading and computing for the tree checksum
|
||||
tag. This will be found at block address next_tag, verified and parsed by:
|
||||
iso_util_decode_md5_tag(block, &tag_type, &pos,
|
||||
&range_start, &range_size, &next_tag, md5, 3);
|
||||
|
||||
@ -200,14 +204,12 @@ With tag type 4:
|
||||
End the MD5 context and start a new context for the session which you will
|
||||
read next.
|
||||
|
||||
You may look for the first session by starting to read at LBA 32, or you may
|
||||
look for the last session by starting to read at the address given by parameter
|
||||
session_start=. The former is suitable for a check of the whole image, the
|
||||
latter is the shortest way to ensure that the tree of the last session is
|
||||
not corrupted.
|
||||
Then look for the actual session by starting to read at the address given by
|
||||
parameter session_start= which is returned by iso_util_decode_md5_tag() as
|
||||
next_tag. Go on by looking for tag type 2 and follow above prescription.
|
||||
|
||||
|
||||
Checking a Whole Session
|
||||
Checking the Data Part of the Session
|
||||
|
||||
In order to check the trustworthyness of a whole session, continue reading
|
||||
and checksumming after the tree was verified.
|
||||
@ -224,6 +226,20 @@ bytes in parameter md5 match the MD5 computed from the data blocks which were
|
||||
read before the tag block.
|
||||
|
||||
|
||||
Checking All Sessions
|
||||
|
||||
If the media is sequentially recordable, obtain a table of content and check
|
||||
the first track of each session as prescribed above in Checking Before Image
|
||||
Tree Loading and in Checking the Data Part of the Session.
|
||||
|
||||
With disk files or overwriteable media, look for a relocated superblock tag
|
||||
but do not hop to address next_tag (given by session_start=). Instead look at
|
||||
LBA 32 for the first session and check it as prescribed above.
|
||||
After reaching its end, round up the read address to the next multiple of 32
|
||||
and check whether it is smaller than session_start= from the super block.
|
||||
If so, expect another session to start there.
|
||||
|
||||
|
||||
Checking Single Files in a Loaded Image
|
||||
|
||||
An image may consist of many sessions wherein many data blocks may not belong
|
||||
@ -264,3 +280,41 @@ to iso_image_import() when reading the image. If this source is associated
|
||||
to a libburn drive, then libburn function burn_read_data() can read directly
|
||||
from it.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
scdbackup Checksum Tags
|
||||
|
||||
The session checksum tag does not occupy its whole block. So there is room to
|
||||
store a scdbackup stream checksum tag, which is an ancestor format of the tags
|
||||
described here. This feature allows scdbackup to omit its own checksum filter
|
||||
if using xorriso as ISO 9660 formatter program.
|
||||
Such a tag makes only sense if the session begins at LBA 0.
|
||||
|
||||
See scdbackup-*/README, appendix VERIFY for a specification.
|
||||
|
||||
Example of a scdbackup checksum tag:
|
||||
scdbackup_checksum_tag_v0.1 2456606865 61 2_2 B00109.143415 2456606865 485bbef110870c45754d7adcc844a72c c2355d5ea3c94d792ff5893dfe0d6d7b
|
||||
|
||||
The tag is located at byte position 2456606865, contains 61 bytes of scdbackup
|
||||
checksum record (the next four words):
|
||||
Name of the backup volume is "2_2".
|
||||
Written in year B0 = 2010 (A9 = 2009, B1 = 2011), January (01), 9th (09),
|
||||
14:34:15 local time.
|
||||
The size of the volume is 2456606865 bytes, which have a MD5 sum of
|
||||
485bbef110870c45754d7adcc844a72c.
|
||||
The checksum of "2_2 B00109.143415 2456606865 485bbef110870c45754d7adcc844a72c"
|
||||
is c2355d5ea3c94d792ff5893dfe0d6d7b.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
This text is under
|
||||
Copyright (c) 2009 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
It shall only be modified in sync with libisofs and other software which
|
||||
makes use of libisofs checksums. Please mail change requests to mailing list
|
||||
<libburn-hackers@pykix.org> or to the copyright holder in private.
|
||||
Only if you cannot reach the copyright holder for at least one month it is
|
||||
permissible to modify this text under the same license as the affected
|
||||
copy of libisofs.
|
||||
If you do so, you commit yourself to taking reasonable effort to stay in
|
||||
sync with the other interested users of this text.
|
||||
|
||||
|
@ -154,13 +154,6 @@ 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.
|
||||
|
@ -443,3 +443,14 @@ Program mkisofs emits entry XA
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
This text is under
|
||||
Copyright (c) 2009 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
It shall only be modified in sync with libisofs and other software which
|
||||
makes use of AAIP. Please mail change requests to mailing list
|
||||
<libburn-hackers@pykix.org> or to the copyright holder in private.
|
||||
Only if you cannot reach the copyright holder for at least one month it is
|
||||
permissible to modify this text under the same license as the affected
|
||||
copy of libisofs.
|
||||
If you do so, you commit yourself to taking reasonable effort to stay in
|
||||
sync with the other interested users of this text.
|
||||
|
||||
|
@ -149,3 +149,14 @@ Registered:
|
||||
-------------------------------------------------------------------------------
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
This text is under
|
||||
Copyright (c) 2009 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
It shall only be modified in sync with libisofs and other software which
|
||||
makes use of AAIP. Please mail change requests to mailing list
|
||||
<libburn-hackers@pykix.org> or to the copyright holder in private.
|
||||
Only if you cannot reach the copyright holder for at least one month it is
|
||||
permissible to modify this text under the same license as the affected
|
||||
copy of libisofs.
|
||||
If you do so, you commit yourself to taking reasonable effort to stay in
|
||||
sync with the other interested users of this text.
|
||||
|
||||
|
@ -141,3 +141,14 @@ SUSP 1.12
|
||||
RRIP 1.12
|
||||
ftp://ftp.ymi.com/pub/rockridge/rrip112.ps
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
This text is under
|
||||
Copyright (c) 2009 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
It shall reflect the effective technical specifications as implemented in
|
||||
zisofs-tools and the Linux kernel. So please contact mailing list
|
||||
<libburn-hackers@pykix.org> or to the copyright holder in private, if you
|
||||
want to make changes.
|
||||
Only if you cannot reach the copyright holder for at least one month it is
|
||||
permissible to modify and distribute this text under the license "BSD revised".
|
||||
|
||||
|
@ -11,10 +11,14 @@
|
||||
|
||||
To be included by aaip_0_2.c
|
||||
|
||||
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2
|
||||
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2+
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
aaip-os-freebsd.c
|
||||
Arbitrary Attribute Interchange Protocol , system adapter for getting and
|
||||
setting of ACLs and ixattr.
|
||||
setting of ACLs and xattr.
|
||||
|
||||
To be included by aaip_0_2.c
|
||||
|
||||
@ -11,6 +11,10 @@
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
@ -18,6 +22,7 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifndef Libisofs_with_aaip_acL
|
||||
/* It seems ACL is fixely integrated in FreeBSD libc. There is no libacl. */
|
||||
@ -37,13 +42,14 @@
|
||||
finally has to be freed by a call to this function
|
||||
with bit15 of flag.
|
||||
@param flag Bitfield for control purposes
|
||||
bit0= obtain default ACL rather than access ACL
|
||||
(bit0= obtain default ACL rather than access ACL)
|
||||
bit4= set *text = NULL and return 2
|
||||
if the ACL matches st_mode permissions.
|
||||
bit5= in case of symbolic link: inquire link target
|
||||
bit15= free text and return 1
|
||||
@return > 0 ok
|
||||
0 ACL support not enabled at compile time
|
||||
or filesystem does not support ACL
|
||||
-1 failure of system ACL service (see errno)
|
||||
-2 attempt to inquire ACL of a symbolic
|
||||
link without bit4 or bit5
|
||||
@ -88,8 +94,18 @@ int aaip_get_acl_text(char *path, char **text, int flag)
|
||||
|
||||
acl= acl_get_file(path, ACL_TYPE_ACCESS);
|
||||
|
||||
if(acl == NULL)
|
||||
if(acl == NULL) {
|
||||
if(errno == EOPNOTSUPP) {
|
||||
/* filesystem does not support ACL */
|
||||
if(flag & 16)
|
||||
return(2);
|
||||
|
||||
/* >>> ??? fake ACL from POSIX permissions ? */;
|
||||
|
||||
return(0);
|
||||
}
|
||||
return(-1);
|
||||
}
|
||||
*text= acl_to_text(acl, NULL);
|
||||
acl_free(acl);
|
||||
|
||||
@ -181,10 +197,8 @@ int aaip_get_attr_list(char *path, size_t *num_attrs, char ***names,
|
||||
|
||||
if(flag & 1) { /* Obtain ACL */
|
||||
/* access-ACL */
|
||||
ret= aaip_get_acl_text(path, &acl_text, flag & (16 | 32));
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if(ret == 2)
|
||||
aaip_get_acl_text(path, &acl_text, flag & (16 | 32));
|
||||
if(acl_text == NULL)
|
||||
{ret= 1; goto ex;} /* empty ACL / only st_mode info was found in ACL */
|
||||
ret= aaip_encode_acl(acl_text, (mode_t) 0, &a_acl_len, &a_acl, flag & 2);
|
||||
if(ret <= 0)
|
||||
|
@ -7,10 +7,14 @@
|
||||
|
||||
To be included by aaip_0_2.c
|
||||
|
||||
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2
|
||||
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2+
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
@ -18,6 +22,8 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
#ifdef Libisofs_with_aaip_acL
|
||||
#include <sys/acl.h>
|
||||
@ -46,6 +52,7 @@
|
||||
2 only st_mode permissions exist and bit 4 is set
|
||||
or empty ACL and bit0 is set
|
||||
0 ACL support not enabled at compile time
|
||||
or filesystem does not support ACL
|
||||
-1 failure of system ACL service (see errno)
|
||||
-2 attempt to inquire ACL of a symbolic link without
|
||||
bit4 or bit5 resp. with no suitable link target
|
||||
@ -79,8 +86,18 @@ int aaip_get_acl_text(char *path, char **text, int flag)
|
||||
}
|
||||
|
||||
acl= acl_get_file(path, (flag & 1) ? ACL_TYPE_DEFAULT : ACL_TYPE_ACCESS);
|
||||
if(acl == NULL)
|
||||
if(acl == NULL) {
|
||||
if(errno == ENOTSUP) {
|
||||
/* filesystem does not support ACL */
|
||||
if(flag & 16)
|
||||
return(2);
|
||||
|
||||
/* >>> ??? fake ACL from POSIX permissions ? */;
|
||||
|
||||
return(0);
|
||||
}
|
||||
return(-1);
|
||||
}
|
||||
*text= acl_to_text(acl, NULL);
|
||||
acl_free(acl);
|
||||
|
||||
|
@ -7,10 +7,14 @@
|
||||
See test/aaip_0_2.h
|
||||
http://libburnia-project.org/wiki/AAIP
|
||||
|
||||
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2
|
||||
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2+
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
@ -567,7 +571,7 @@ ex:;
|
||||
}
|
||||
|
||||
|
||||
/* Linux man 5 acl says:
|
||||
/* GNU/Linux man 5 acl says:
|
||||
The permissions defined by ACLs are a superset of the permissions speci-
|
||||
fied by the file permission bits. The permissions defined for the file
|
||||
owner correspond to the permissions of the ACL_USER_OBJ entry. The per-
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
test/aaip_0_2.h - Public declarations
|
||||
|
||||
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2
|
||||
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2+
|
||||
|
||||
*/
|
||||
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -16,6 +17,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
Use the copy of the struct burn_source definition in libisofs.h
|
||||
*/
|
||||
@ -288,7 +293,51 @@ unsigned int iso_ring_buffer_get_times_empty(IsoRingBuffer *buf)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
/** Internal via buffer.h
|
||||
*
|
||||
* Get the status of a ring buffer.
|
||||
*
|
||||
* @param buf
|
||||
* The ring buffer object to inquire
|
||||
* @param size
|
||||
* Will be filled with the total size of the buffer, in bytes
|
||||
* @param free_bytes
|
||||
* Will be filled with the bytes currently available in buffer
|
||||
* @return
|
||||
* < 0 error, > 0 state:
|
||||
* 1="active" : input and consumption are active
|
||||
* 2="ending" : input has ended without error
|
||||
* 3="failing" : input had error and ended,
|
||||
* 5="abandoned" : consumption has ended prematurely
|
||||
* 6="ended" : consumption has ended without input error
|
||||
* 7="aborted" : consumption has ended after input error
|
||||
*/
|
||||
int iso_ring_buffer_get_buf_status(IsoRingBuffer *buf, size_t *size,
|
||||
size_t *free_bytes)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (buf == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
|
||||
/* get mutex */
|
||||
pthread_mutex_lock(&buf->mutex);
|
||||
if (size) {
|
||||
*size = buf->cap;
|
||||
}
|
||||
if (free_bytes) {
|
||||
*free_bytes = buf->cap - buf->size;
|
||||
}
|
||||
|
||||
ret = (buf->rend ? 4 : 0) + (buf->wend + 1);
|
||||
|
||||
pthread_mutex_unlock(&buf->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** API via libisofs.h
|
||||
*
|
||||
* Get the status of the buffer used by a burn_source.
|
||||
*
|
||||
* @param b
|
||||
@ -316,18 +365,7 @@ int iso_ring_buffer_get_status(struct burn_source *b, size_t *size,
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
buf = ((Ecma119Image*)(b->data))->buffer;
|
||||
|
||||
/* get mutex */
|
||||
pthread_mutex_lock(&buf->mutex);
|
||||
if (size) {
|
||||
*size = buf->cap;
|
||||
}
|
||||
if (free_bytes) {
|
||||
*free_bytes = buf->cap - buf->size;
|
||||
}
|
||||
|
||||
ret = (buf->rend ? 4 : 0) + (buf->wend + 1);
|
||||
|
||||
pthread_mutex_unlock(&buf->mutex);
|
||||
ret = iso_ring_buffer_get_buf_status(buf, size, free_bytes);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifndef LIBISO_BUFFER_H_
|
||||
@ -62,6 +63,28 @@ int iso_ring_buffer_write(IsoRingBuffer *buf, uint8_t *data, size_t count);
|
||||
*/
|
||||
int iso_ring_buffer_read(IsoRingBuffer *buf, uint8_t *dest, size_t count);
|
||||
|
||||
/** Backend of API call iso_ring_buffer_get_status()
|
||||
*
|
||||
* Get the status of a ring buffer.
|
||||
*
|
||||
* @param buf
|
||||
* The ring buffer object to inquire
|
||||
* @param size
|
||||
* Will be filled with the total size of the buffer, in bytes
|
||||
* @param free_bytes
|
||||
* Will be filled with the bytes currently available in buffer
|
||||
* @return
|
||||
* < 0 error, > 0 state:
|
||||
* 1="active" : input and consumption are active
|
||||
* 2="ending" : input has ended without error
|
||||
* 3="failing" : input had error and ended,
|
||||
* 5="abandoned" : consumption has ended prematurely
|
||||
* 6="ended" : consumption has ended without input error
|
||||
* 7="aborted" : consumption has ended after input error
|
||||
*/
|
||||
int iso_ring_buffer_get_buf_status(IsoRingBuffer *buf, size_t *size,
|
||||
size_t *free_bytes);
|
||||
|
||||
/**
|
||||
* Close the buffer (to be called by the writer).
|
||||
* You have to explicity close the buffer when you don't have more data to
|
||||
|
@ -3,10 +3,15 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
/* libisofs.h defines aaip_xinfo_func */
|
||||
#include "libisofs.h"
|
||||
|
||||
@ -19,6 +24,11 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX Libisofs_default_path_maX
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@ -94,7 +104,7 @@ int default_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
||||
IsoNode *new;
|
||||
IsoFilesystem *fs;
|
||||
char *name;
|
||||
unsigned char *aa_string;
|
||||
unsigned char *aa_string = NULL;
|
||||
char *a_text = NULL, *d_text = NULL;
|
||||
|
||||
if (builder == NULL || src == NULL || node == NULL) {
|
||||
@ -211,6 +221,9 @@ int default_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
||||
}
|
||||
iso_aa_get_acl_text(aa_string, info.st_mode, &a_text, &d_text,
|
||||
1 << 15); /* free ACL texts */
|
||||
if(aa_string != NULL)
|
||||
free(aa_string);
|
||||
aa_string = NULL;
|
||||
}
|
||||
|
||||
/* Obtain ownership of eventual AAIP string */
|
||||
@ -221,6 +234,8 @@ int default_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
||||
ret = iso_node_add_xinfo(new, aaip_xinfo_func, aa_string);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
} else if(aa_string != NULL) {
|
||||
free(aa_string);
|
||||
}
|
||||
|
||||
*node = new;
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifndef LIBISO_BUILDER_H_
|
||||
|
@ -2,10 +2,15 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "util.h"
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -3,8 +3,9 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifndef LIBISO_ECMA119_H_
|
||||
@ -56,8 +57,10 @@ struct iso_write_opts {
|
||||
/**
|
||||
* Omit the version number (";1") at the end of the ISO-9660 identifiers.
|
||||
* Version numbers are usually not used.
|
||||
* bit0= ECMA-119 and Joliet (for historical reasons)
|
||||
* bit1= Joliet
|
||||
*/
|
||||
unsigned int omit_version_numbers :1;
|
||||
unsigned int omit_version_numbers :2;
|
||||
|
||||
/**
|
||||
* Allow ISO-9660 directory hierarchy to be deeper than 8 levels.
|
||||
@ -81,8 +84,10 @@ struct iso_write_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= ECMA-119
|
||||
* bit1= Joliet
|
||||
*/
|
||||
unsigned int no_force_dots :1;
|
||||
unsigned int no_force_dots :2;
|
||||
|
||||
/**
|
||||
* Allow lowercase characters in ISO-9660 filenames. By default, only
|
||||
@ -147,8 +152,6 @@ struct iso_write_opts {
|
||||
*/
|
||||
unsigned int dir_rec_mtime :1;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
/**
|
||||
* Compute MD5 checksum for the whole session and record it as index 0 of
|
||||
* the checksum blocks after the data area of the session. The layout and
|
||||
@ -169,8 +172,6 @@ struct iso_write_opts {
|
||||
*/
|
||||
unsigned int md5_file_checksums :2;
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
/** If files should be sorted based on their weight. */
|
||||
unsigned int sort_files :1;
|
||||
|
||||
@ -281,6 +282,48 @@ struct iso_write_opts {
|
||||
*/
|
||||
uint32_t data_start_lba;
|
||||
|
||||
/**
|
||||
* If not empty: A text holding parameters "name" and "timestamp" for
|
||||
* a scdbackup stream checksum tag. See scdbackup/README appendix VERIFY.
|
||||
* It makes sense only for single session images which start at LBA 0.
|
||||
* Such a tag may be part of a libisofs checksum tag block after the
|
||||
* session tag line. It then covers the whole session up to its own start
|
||||
* position.
|
||||
*/
|
||||
char scdbackup_tag_parm[100];
|
||||
|
||||
/* If not NULL: A pointer to an application provided array with
|
||||
at least 512 characters. The effectively written scdbackup tag
|
||||
will be copied to this memory location.
|
||||
*/
|
||||
char *scdbackup_tag_written;
|
||||
|
||||
/*
|
||||
* See ecma119_image : System Area related information
|
||||
*/
|
||||
char *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_creation_time and vol_modification_time
|
||||
* by unconverted string with timezone 0
|
||||
*/
|
||||
char vol_uuid[17];
|
||||
|
||||
/* The number of unclaimed 2K blocks before start of partition 1 as of
|
||||
the MBR in system area.
|
||||
Must be 0 or >= 16. (Actually >= number of voldescr + checksum tag)
|
||||
*/
|
||||
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;
|
||||
|
||||
};
|
||||
|
||||
typedef struct ecma119_image Ecma119Image;
|
||||
@ -311,11 +354,11 @@ struct ecma119_image
|
||||
unsigned int always_gmt :1;
|
||||
|
||||
/* relaxed constraints */
|
||||
unsigned int omit_version_numbers :1;
|
||||
unsigned int omit_version_numbers :2;
|
||||
unsigned int allow_deep_paths :1;
|
||||
unsigned int allow_longer_paths :1;
|
||||
unsigned int max_37_char_filenames :1;
|
||||
unsigned int no_force_dots :1;
|
||||
unsigned int no_force_dots :2;
|
||||
unsigned int allow_lowercase :1;
|
||||
unsigned int allow_full_ascii :1;
|
||||
|
||||
@ -336,13 +379,9 @@ struct ecma119_image
|
||||
/* Store in ECMA-119 timestamp mtime of source */
|
||||
unsigned int dir_rec_mtime :1;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
unsigned int md5_session_checksum :1;
|
||||
unsigned int md5_file_checksums :2;
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
/*
|
||||
* Mode replace. If one of these flags is set, the correspodent values are
|
||||
* replaced with values below.
|
||||
@ -375,8 +414,9 @@ struct ecma119_image
|
||||
off_t total_size;
|
||||
uint32_t vol_space_size;
|
||||
|
||||
/* Bytes already written, just for progress notification */
|
||||
/* Bytes already written to image output */
|
||||
off_t bytes_written;
|
||||
/* just for progress notification */
|
||||
int percent_written;
|
||||
|
||||
/*
|
||||
@ -417,7 +457,28 @@ struct ecma119_image
|
||||
*/
|
||||
struct el_torito_boot_catalog *catalog;
|
||||
IsoFileSrc *cat; /**< location of the boot catalog in the new image */
|
||||
IsoFileSrc *bootimg; /**< location of the boot image in the new image */
|
||||
|
||||
int num_bootsrc;
|
||||
IsoFileSrc **bootsrc; /* location of the boot images in the new image */
|
||||
|
||||
/*
|
||||
* System Area related information
|
||||
*/
|
||||
/* 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.
|
||||
* bit1= apply isohybrid MBR patching to the system area.
|
||||
* This works only with system_area_data plus ISOLINUX boot image
|
||||
* and only if not bit0 is set.
|
||||
*/
|
||||
int system_area_options;
|
||||
|
||||
/*
|
||||
* Number of pad blocks that we need to write. Padding blocks are blocks
|
||||
@ -440,8 +501,6 @@ struct ecma119_image
|
||||
/* tree of files sources */
|
||||
IsoRBTree *files;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
unsigned int checksum_idx_counter;
|
||||
void *checksum_ctx;
|
||||
off_t checksum_counter;
|
||||
@ -464,7 +523,8 @@ struct ecma119_image
|
||||
is submitted with ecma119_image_new() ?
|
||||
*/
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
char scdbackup_tag_parm[100];
|
||||
char *scdbackup_tag_written;
|
||||
|
||||
/* Buffer for communication between burn_source and writer thread */
|
||||
IsoRingBuffer *buffer;
|
||||
@ -472,6 +532,41 @@ struct ecma119_image
|
||||
/* writer thread descriptor */
|
||||
pthread_t wthread;
|
||||
pthread_attr_t th_attr;
|
||||
|
||||
/* 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_creation_time and vol_modification_time
|
||||
* by unconverted string with timezone 0
|
||||
*/
|
||||
char vol_uuid[17];
|
||||
|
||||
/* The number of unclaimed 2K blocks before
|
||||
start of partition 1 as of the MBR in system area. */
|
||||
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;
|
||||
|
||||
/* The currently applicable LBA offset. To be subtracted from any LBA
|
||||
* that is mentioned in volume descriptors, trees, path tables,
|
||||
* Either 0 or .partition_offset
|
||||
*/
|
||||
uint32_t eff_partition_offset;
|
||||
|
||||
/* The second ECMA-119 directory tree and path tables */
|
||||
Ecma119Node *partition_root;
|
||||
uint32_t partition_l_table_pos;
|
||||
uint32_t partition_m_table_pos;
|
||||
|
||||
/* The second Joliet directory tree and path tables */
|
||||
JolietNode *j_part_root;
|
||||
uint32_t j_part_l_path_table_pos;
|
||||
uint32_t j_part_m_path_table_pos;
|
||||
|
||||
};
|
||||
|
||||
#define BP(a,b) [(b) - (a) + 1]
|
||||
|
@ -3,10 +3,15 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "ecma119_tree.h"
|
||||
#include "ecma119.h"
|
||||
#include "node.h"
|
||||
@ -63,18 +68,18 @@ int get_iso_name(Ecma119Image *img, IsoNode *iso, char **name)
|
||||
} else {
|
||||
if (img->max_37_char_filenames) {
|
||||
isoname = iso_r_fileid(ascii_name, 36, relaxed,
|
||||
img->no_force_dots ? 0 : 1);
|
||||
(img->no_force_dots & 1) ? 0 : 1);
|
||||
} else if (img->iso_level == 1) {
|
||||
if (relaxed) {
|
||||
isoname = iso_r_fileid(ascii_name, 11, relaxed,
|
||||
img->no_force_dots ? 0 : 1);
|
||||
(img->no_force_dots & 1) ? 0 : 1);
|
||||
} else {
|
||||
isoname = iso_1_fileid(ascii_name);
|
||||
}
|
||||
} else {
|
||||
if (relaxed) {
|
||||
isoname = iso_r_fileid(ascii_name, 30, relaxed,
|
||||
img->no_force_dots ? 0 : 1);
|
||||
(img->no_force_dots & 1) ? 0 : 1);
|
||||
} else {
|
||||
isoname = iso_2_fileid(ascii_name);
|
||||
}
|
||||
@ -145,15 +150,11 @@ int create_dir(Ecma119Image *img, IsoDir *iso, Ecma119Node **node)
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new ECMA-119 node representing a regular file from a iso file
|
||||
* node.
|
||||
*/
|
||||
|
||||
static
|
||||
int create_file(Ecma119Image *img, IsoFile *iso, Ecma119Node **node)
|
||||
int create_file_src(Ecma119Image *img, IsoFile *iso, IsoFileSrc **src)
|
||||
{
|
||||
int ret;
|
||||
IsoFileSrc *src;
|
||||
off_t size;
|
||||
|
||||
size = iso_stream_get_size(iso->stream);
|
||||
@ -165,8 +166,25 @@ int create_file(Ecma119Image *img, IsoFile *iso, Ecma119Node **node)
|
||||
free(ipath);
|
||||
return ret;
|
||||
}
|
||||
ret = iso_file_src_create(img, iso, src);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = iso_file_src_create(img, iso, &src);
|
||||
|
||||
/**
|
||||
* Create a new ECMA-119 node representing a regular file from a iso file
|
||||
* node.
|
||||
*/
|
||||
static
|
||||
int create_file(Ecma119Image *img, IsoFile *iso, Ecma119Node **node)
|
||||
{
|
||||
int ret;
|
||||
IsoFileSrc *src;
|
||||
|
||||
ret = create_file_src(img, iso, &src);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@ -266,58 +284,78 @@ void ecma119_node_free(Ecma119Node *node)
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param flag
|
||||
* bit0= iso is in a hidden directory. Thus hide it.
|
||||
* @return
|
||||
* 1 success, 0 node ignored, < 0 error
|
||||
*
|
||||
*/
|
||||
static
|
||||
int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
||||
int depth, int pathlen)
|
||||
int depth, int pathlen, int flag)
|
||||
{
|
||||
int ret;
|
||||
Ecma119Node *node;
|
||||
int ret, hidden;
|
||||
Ecma119Node *node = NULL;
|
||||
int max_path;
|
||||
char *iso_name= NULL;
|
||||
char *iso_name= NULL, *ipath = NULL;
|
||||
IsoFileSrc *src = NULL;
|
||||
|
||||
if (image == NULL || iso == NULL || tree == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
*tree = NULL;
|
||||
|
||||
hidden = flag & 1;
|
||||
if (iso->hidden & LIBISO_HIDE_ON_RR) {
|
||||
/* file will be ignored */
|
||||
return 0;
|
||||
hidden = 1;
|
||||
if (!((iso->hidden & LIBISO_HIDE_BUT_WRITE) ||
|
||||
iso->type == LIBISO_BOOT)) {
|
||||
return 0; /* file will be ignored */
|
||||
}
|
||||
}
|
||||
ret = get_iso_name(image, iso, &iso_name);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
max_path = pathlen + 1 + (iso_name ? strlen(iso_name) : 0);
|
||||
if (!image->rockridge) {
|
||||
if ((iso->type == LIBISO_DIR && depth > 8) && !image->allow_deep_paths) {
|
||||
char *ipath = iso_tree_get_node_path(iso);
|
||||
return iso_msg_submit(image->image->id, ISO_FILE_IMGPATH_WRONG, 0,
|
||||
"File \"%s\" can't be added, because directory depth "
|
||||
"is greater than 8.", ipath);
|
||||
free(iso_name);
|
||||
free(ipath);
|
||||
return ret;
|
||||
} else if (max_path > 255 && !image->allow_longer_paths) {
|
||||
char *ipath = iso_tree_get_node_path(iso);
|
||||
ret = iso_msg_submit(image->image->id, ISO_FILE_IMGPATH_WRONG, 0,
|
||||
"File \"%s\" can't be added, because path length "
|
||||
"is greater than 255 characters", ipath);
|
||||
free(iso_name);
|
||||
free(ipath);
|
||||
return ret;
|
||||
|
||||
if (hidden) {
|
||||
max_path= pathlen;
|
||||
} else {
|
||||
ret = get_iso_name(image, iso, &iso_name);
|
||||
if (ret < 0) {
|
||||
iso_name = NULL; /* invalid, do not free */
|
||||
goto ex;
|
||||
}
|
||||
max_path = pathlen + 1 + (iso_name ? strlen(iso_name) : 0);
|
||||
if (!image->rockridge) {
|
||||
if ((iso->type == LIBISO_DIR && depth > 8) &&
|
||||
!image->allow_deep_paths) {
|
||||
ipath = iso_tree_get_node_path(iso);
|
||||
ret = iso_msg_submit(image->image->id, ISO_FILE_IMGPATH_WRONG,
|
||||
0, "File \"%s\" can't be added, "
|
||||
"because directory depth "
|
||||
"is greater than 8.", ipath);
|
||||
goto ex;
|
||||
} else if (max_path > 255 && !image->allow_longer_paths) {
|
||||
ipath = iso_tree_get_node_path(iso);
|
||||
ret = iso_msg_submit(image->image->id, ISO_FILE_IMGPATH_WRONG,
|
||||
0, "File \"%s\" can't be added, "
|
||||
"because path length "
|
||||
"is greater than 255 characters", ipath);
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch (iso->type) {
|
||||
case LIBISO_FILE:
|
||||
ret = create_file(image, (IsoFile*)iso, &node);
|
||||
if (hidden) {
|
||||
ret = create_file_src(image, (IsoFile *) iso, &src);
|
||||
} else {
|
||||
ret = create_file(image, (IsoFile*)iso, &node);
|
||||
}
|
||||
break;
|
||||
case LIBISO_SYMLINK:
|
||||
if (hidden) {
|
||||
ret = 0; /* Hidden means non-existing */
|
||||
goto ex;
|
||||
}
|
||||
if (image->rockridge) {
|
||||
ret = create_symlink(image, (IsoSymlink*)iso, &node);
|
||||
} else {
|
||||
@ -330,6 +368,10 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
||||
}
|
||||
break;
|
||||
case LIBISO_SPECIAL:
|
||||
if (hidden) {
|
||||
ret = 0; /* Hidden means non-existing */
|
||||
goto ex;
|
||||
}
|
||||
if (image->rockridge) {
|
||||
ret = create_special(image, (IsoSpecial*)iso, &node);
|
||||
} else {
|
||||
@ -343,7 +385,11 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
||||
break;
|
||||
case LIBISO_BOOT:
|
||||
if (image->eltorito) {
|
||||
ret = create_boot_cat(image, (IsoBoot*)iso, &node);
|
||||
if (hidden) {
|
||||
ret = el_torito_catalog_file_src_create(image, &src);
|
||||
} else {
|
||||
ret = create_boot_cat(image, (IsoBoot*)iso, &node);
|
||||
}
|
||||
} else {
|
||||
/* log and ignore */
|
||||
ret = iso_msg_submit(image->image->id, ISO_FILE_IGNORED, 0,
|
||||
@ -354,21 +400,27 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
||||
{
|
||||
IsoNode *pos;
|
||||
IsoDir *dir = (IsoDir*)iso;
|
||||
ret = create_dir(image, dir, &node);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
|
||||
if (!hidden) {
|
||||
ret = create_dir(image, dir, &node);
|
||||
if (ret < 0) {
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
ret = ISO_SUCCESS;
|
||||
pos = dir->children;
|
||||
while (pos) {
|
||||
int cret;
|
||||
Ecma119Node *child;
|
||||
cret = create_tree(image, pos, &child, depth + 1, max_path);
|
||||
cret = create_tree(image, pos, &child, depth + 1, max_path,
|
||||
!!hidden);
|
||||
if (cret < 0) {
|
||||
/* error */
|
||||
ecma119_node_free(node);
|
||||
if (!hidden)
|
||||
ecma119_node_free(node);
|
||||
ret = cret;
|
||||
break;
|
||||
} else if (cret == ISO_SUCCESS) {
|
||||
} else if (cret == ISO_SUCCESS && !hidden) {
|
||||
/* add child to this node */
|
||||
int nchildren = node->info.dir->nchildren++;
|
||||
node->info.dir->children[nchildren] = child;
|
||||
@ -380,15 +432,30 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
||||
break;
|
||||
default:
|
||||
/* should never happen */
|
||||
return ISO_ASSERT_FAILURE;
|
||||
ret = ISO_ASSERT_FAILURE;
|
||||
goto ex;
|
||||
}
|
||||
if (ret <= 0) {
|
||||
free(iso_name);
|
||||
return ret;
|
||||
goto ex;
|
||||
}
|
||||
node->iso_name = iso_name;
|
||||
*tree = node;
|
||||
return ISO_SUCCESS;
|
||||
if (!hidden) {
|
||||
node->iso_name = iso_name;
|
||||
iso_name = NULL; /* now owned by node, do not free */
|
||||
*tree = node;
|
||||
node = NULL; /* now owned by caller, do not free */
|
||||
}
|
||||
ret = ISO_SUCCESS;
|
||||
ex:
|
||||
if (iso_name != NULL)
|
||||
free(iso_name);
|
||||
if (ipath != NULL)
|
||||
free(ipath);
|
||||
if (node != NULL)
|
||||
ecma119_node_free(node);
|
||||
if (hidden && ret == ISO_SUCCESS)
|
||||
ret = 0;
|
||||
/* The sources of hidden files are now owned by the rb-tree */
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -647,6 +714,7 @@ static
|
||||
int mangle_tree(Ecma119Image *img, int recurse)
|
||||
{
|
||||
int max_file, max_dir;
|
||||
Ecma119Node *root;
|
||||
|
||||
if (img->max_37_char_filenames) {
|
||||
max_file = max_dir = 37;
|
||||
@ -656,10 +724,15 @@ int mangle_tree(Ecma119Image *img, int recurse)
|
||||
} else {
|
||||
max_file = max_dir = 31;
|
||||
}
|
||||
if (recurse) {
|
||||
return mangle_dir(img, img->root, max_file, max_dir);
|
||||
if (img->eff_partition_offset > 0) {
|
||||
root = img->partition_root;
|
||||
} else {
|
||||
return mangle_single_dir(img, img->root, max_file, max_dir);
|
||||
root = img->root;
|
||||
}
|
||||
if (recurse) {
|
||||
return mangle_dir(img, root, max_file, max_dir);
|
||||
} else {
|
||||
return mangle_single_dir(img, root, max_file, max_dir);
|
||||
}
|
||||
}
|
||||
|
||||
@ -777,11 +850,17 @@ int reorder_tree(Ecma119Image *img, Ecma119Node *dir, int level, int pathlen)
|
||||
{
|
||||
int ret;
|
||||
size_t max_path;
|
||||
Ecma119Node *root;
|
||||
|
||||
max_path = pathlen + 1 + max_child_name_len(dir);
|
||||
|
||||
if (level > 8 || max_path > 255) {
|
||||
ret = reparent(dir, img->root);
|
||||
if (img->eff_partition_offset > 0) {
|
||||
root = img->partition_root;
|
||||
} else {
|
||||
root = img->root;
|
||||
}
|
||||
ret = reparent(dir, root);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@ -980,7 +1059,7 @@ int ecma119_tree_create(Ecma119Image *img)
|
||||
int ret;
|
||||
Ecma119Node *root;
|
||||
|
||||
ret = create_tree(img, (IsoNode*)img->image->root, &root, 1, 0);
|
||||
ret = create_tree(img, (IsoNode*)img->image->root, &root, 1, 0, 0);
|
||||
if (ret <= 0) {
|
||||
if (ret == 0) {
|
||||
/* unexpected error, root ignored!! This can't happen */
|
||||
@ -988,10 +1067,14 @@ int ecma119_tree_create(Ecma119Image *img)
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
img->root = root;
|
||||
if (img->eff_partition_offset > 0) {
|
||||
img->partition_root = root;
|
||||
} else {
|
||||
img->root = root;
|
||||
}
|
||||
|
||||
iso_msg_debug(img->image->id, "Matching hardlinks...");
|
||||
ret = match_hardlinks(img, img->root, 0);
|
||||
ret = match_hardlinks(img, root, 0);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@ -1008,7 +1091,7 @@ int ecma119_tree_create(Ecma119Image *img)
|
||||
if (img->rockridge && !img->allow_deep_paths) {
|
||||
|
||||
/* reorder the tree, acording to RRIP, 4.1.5 */
|
||||
ret = reorder_tree(img, img->root, 1, 0);
|
||||
ret = reorder_tree(img, root, 1, 0);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifndef LIBISO_ECMA119_TREE_H_
|
||||
|
@ -1,11 +1,17 @@
|
||||
/*
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
* Copyright (c) 2010 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "eltorito.h"
|
||||
#include "stream.h"
|
||||
#include "fsource.h"
|
||||
@ -16,9 +22,10 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/**
|
||||
* This table should be written with accuracy values at offset
|
||||
* This table should be written with the actual values at offset
|
||||
* 8 of boot image, when used ISOLINUX boot loader
|
||||
*/
|
||||
struct boot_info_table {
|
||||
@ -54,6 +61,19 @@ struct hard_disc_mbr {
|
||||
uint8_t sign2;
|
||||
};
|
||||
|
||||
/* API */
|
||||
int el_torito_set_boot_platform_id(ElToritoBootImage *bootimg, uint8_t id)
|
||||
{
|
||||
bootimg->platform_id = id;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int el_torito_get_boot_platform_id(ElToritoBootImage *bootimg)
|
||||
{
|
||||
return bootimg->platform_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the load segment for the initial boot image. This is only for
|
||||
* no emulation boot images, and is a NOP for other image types.
|
||||
@ -65,6 +85,14 @@ void el_torito_set_load_seg(ElToritoBootImage *bootimg, short segment)
|
||||
bootimg->load_seg = segment;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int el_torito_get_load_seg(ElToritoBootImage *bootimg)
|
||||
{
|
||||
if (bootimg->load_seg < 0)
|
||||
return 0xffff - bootimg->load_seg;
|
||||
return bootimg->load_seg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the number of sectors (512b) to be load at load segment during
|
||||
* the initial boot procedure. This is only for no emulation boot images,
|
||||
@ -77,6 +105,14 @@ void el_torito_set_load_size(ElToritoBootImage *bootimg, short sectors)
|
||||
bootimg->load_size = sectors;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int el_torito_get_load_size(ElToritoBootImage *bootimg)
|
||||
{
|
||||
if (bootimg->load_size < 0)
|
||||
return 0xffff - bootimg->load_size;
|
||||
return bootimg->load_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks the specified boot image as not bootable
|
||||
*/
|
||||
@ -85,8 +121,50 @@ void el_torito_set_no_bootable(ElToritoBootImage *bootimg)
|
||||
bootimg->bootable = 0;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int el_torito_get_bootable(ElToritoBootImage *bootimg)
|
||||
{
|
||||
return !!bootimg->bootable;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int el_torito_set_id_string(ElToritoBootImage *bootimg, uint8_t id_string[28])
|
||||
{
|
||||
memcpy(bootimg->id_string, id_string, 28);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int el_torito_get_id_string(ElToritoBootImage *bootimg, uint8_t id_string[28])
|
||||
{
|
||||
|
||||
memcpy(id_string, bootimg->id_string, 28);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int el_torito_set_selection_crit(ElToritoBootImage *bootimg, uint8_t crit[20])
|
||||
{
|
||||
memcpy(bootimg->selection_crit, crit, 20);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int el_torito_get_selection_crit(ElToritoBootImage *bootimg, uint8_t crit[20])
|
||||
{
|
||||
|
||||
memcpy(crit, bootimg->selection_crit, 20);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int el_torito_seems_boot_info_table(ElToritoBootImage *bootimg, int flag)
|
||||
{
|
||||
return bootimg->seems_boot_info_table;
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies that this image needs to be patched. This involves the writting
|
||||
* Specifies that this image needs to be patched. This involves the writing
|
||||
* of a 56 bytes boot information table at offset 8 of the boot image file.
|
||||
* The original boot image file won't be modified.
|
||||
* This is needed for isolinux boot images.
|
||||
@ -105,7 +183,7 @@ void el_torito_patch_isolinux_image(ElToritoBootImage *bootimg)
|
||||
* bitmask style flag. The following values are defined:
|
||||
*
|
||||
* bit 0 -> 1 to path the image, 0 to not
|
||||
* Patching the image involves the writting of a 56 bytes
|
||||
* Patching the image involves the writing of a 56 bytes
|
||||
* boot information table at offset 8 of the boot image file.
|
||||
* The original boot image file won't be modified. This is needed
|
||||
* to allow isolinux images to be bootable.
|
||||
@ -123,31 +201,36 @@ int el_torito_set_isolinux_options(ElToritoBootImage *bootimg, int options, int
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
/* TODO getter for boot image properties should be exposed
|
||||
* useful when reading discs */
|
||||
int el_torito_get_boot_media_type(const ElToritoBootImage *bootimg)
|
||||
/* API */
|
||||
int el_torito_get_isolinux_options(ElToritoBootImage *bootimg, int flag)
|
||||
{
|
||||
return bootimg->isolinux_options & 0x03;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int el_torito_get_boot_media_type(ElToritoBootImage *bootimg,
|
||||
enum eltorito_boot_media_type *media_type)
|
||||
{
|
||||
if (bootimg) {
|
||||
switch (bootimg->type) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
return ELTORITO_FLOPPY_EMUL;
|
||||
break;
|
||||
*media_type = ELTORITO_FLOPPY_EMUL;
|
||||
return 1;
|
||||
case 4:
|
||||
return ELTORITO_HARD_DISC_EMUL;
|
||||
break;
|
||||
*media_type = ELTORITO_HARD_DISC_EMUL;
|
||||
return 1;
|
||||
case 0:
|
||||
return ELTORITO_NO_EMUL;
|
||||
break;
|
||||
*media_type = ELTORITO_NO_EMUL;
|
||||
return 1;
|
||||
default:
|
||||
/* should never happen */
|
||||
return ISO_ASSERT_FAILURE;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
return ISO_WRONG_ARG_VALUE;
|
||||
}
|
||||
return ISO_WRONG_ARG_VALUE;
|
||||
}
|
||||
|
||||
static
|
||||
@ -332,10 +415,15 @@ int create_image(IsoImage *image, const char *image_path,
|
||||
boot->image = (IsoFile*)imgfile;
|
||||
iso_node_ref(imgfile); /* get our ref */
|
||||
boot->bootable = 1;
|
||||
boot->seems_boot_info_table = 0;
|
||||
boot->isolinux_options = 0;
|
||||
boot->type = boot_media_type;
|
||||
boot->load_size = load_sectors;
|
||||
boot->partition_type = partition_type;
|
||||
|
||||
boot->load_seg = 0;
|
||||
boot->load_size = load_sectors;
|
||||
boot->platform_id = 0; /* 80x86 */
|
||||
memset(boot->id_string, 0, sizeof(boot->id_string));
|
||||
memset(boot->selection_crit, 0, sizeof(boot->selection_crit));
|
||||
if (bootimg) {
|
||||
*bootimg = boot;
|
||||
}
|
||||
@ -348,7 +436,7 @@ int iso_image_set_boot_image(IsoImage *image, const char *image_path,
|
||||
const char *catalog_path,
|
||||
ElToritoBootImage **boot)
|
||||
{
|
||||
int ret;
|
||||
int ret, i;
|
||||
struct el_torito_boot_catalog *catalog;
|
||||
ElToritoBootImage *boot_image= NULL;
|
||||
IsoBoot *cat_node= NULL;
|
||||
@ -407,13 +495,17 @@ int iso_image_set_boot_image(IsoImage *image, const char *image_path,
|
||||
}
|
||||
|
||||
/* creates the catalog with the given image */
|
||||
catalog = malloc(sizeof(struct el_torito_boot_catalog));
|
||||
catalog = calloc(1, sizeof(struct el_torito_boot_catalog));
|
||||
if (catalog == NULL) {
|
||||
ret = ISO_OUT_OF_MEM;
|
||||
goto boot_image_cleanup;
|
||||
}
|
||||
catalog->image = boot_image;
|
||||
catalog->num_bootimages = 1;
|
||||
catalog->bootimages[0] = boot_image;
|
||||
for (i = 1; i < Libisofs_max_boot_imageS; i++)
|
||||
catalog->bootimages[i] = NULL;
|
||||
catalog->node = cat_node;
|
||||
catalog->sort_weight = 1000; /* slightly high */
|
||||
iso_node_ref((IsoNode*)cat_node);
|
||||
image->bootcat = catalog;
|
||||
|
||||
@ -436,7 +528,7 @@ boot_image_cleanup:;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get El-Torito boot image of an ISO image, if any.
|
||||
* Get the boot catalog and the El-Torito default boot image of an ISO image.
|
||||
*
|
||||
* This can be useful, for example, to check if a volume read from a previous
|
||||
* session or an existing image is bootable. It can also be useful to get
|
||||
@ -480,10 +572,10 @@ int iso_image_get_boot_image(IsoImage *image, ElToritoBootImage **boot,
|
||||
|
||||
/* ok, image is bootable */
|
||||
if (boot) {
|
||||
*boot = image->bootcat->image;
|
||||
*boot = image->bootcat->bootimages[0];
|
||||
}
|
||||
if (imgnode) {
|
||||
*imgnode = image->bootcat->image->image;
|
||||
*imgnode = image->bootcat->bootimages[0]->image;
|
||||
}
|
||||
if (catnode) {
|
||||
*catnode = image->bootcat->node;
|
||||
@ -491,6 +583,40 @@ int iso_image_get_boot_image(IsoImage *image, ElToritoBootImage **boot,
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
int iso_image_get_all_boot_imgs(IsoImage *image, int *num_boots,
|
||||
ElToritoBootImage ***boots, IsoFile ***bootnodes, int flag)
|
||||
{
|
||||
int i;
|
||||
struct el_torito_boot_catalog *cat;
|
||||
|
||||
if (image == NULL)
|
||||
return ISO_NULL_POINTER;
|
||||
if (image->bootcat == NULL)
|
||||
return 0;
|
||||
cat = image->bootcat;
|
||||
*num_boots = cat->num_bootimages;
|
||||
*boots = NULL;
|
||||
*bootnodes = NULL;
|
||||
if (*num_boots <= 0)
|
||||
return 0;
|
||||
*boots = calloc(*num_boots, sizeof(ElToritoBootImage *));
|
||||
*bootnodes = calloc(*num_boots, sizeof(IsoFile *));
|
||||
if(*boots == NULL || *bootnodes == NULL) {
|
||||
if (*boots != NULL)
|
||||
free(*boots);
|
||||
if (*bootnodes != NULL)
|
||||
free(*bootnodes);
|
||||
*boots = NULL;
|
||||
*bootnodes = NULL;
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
for (i = 0; i < *num_boots; i++) {
|
||||
(*boots)[i] = cat->bootimages[i];
|
||||
(*bootnodes)[i] = image->bootcat->bootimages[i]->image;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the El-Torito bootable image.
|
||||
*
|
||||
@ -505,28 +631,82 @@ void iso_image_remove_boot_image(IsoImage *image)
|
||||
return;
|
||||
|
||||
/*
|
||||
* remove catalog node from its parent
|
||||
* (the reference will be disposed next)
|
||||
* remove catalog node from its parent and dispose it
|
||||
* (another reference is with the catalog)
|
||||
*/
|
||||
iso_node_take((IsoNode*)image->bootcat->node);
|
||||
if (iso_node_get_parent((IsoNode*) image->bootcat->node) != NULL) {
|
||||
iso_node_take((IsoNode*) image->bootcat->node);
|
||||
iso_node_unref((IsoNode*) image->bootcat->node);
|
||||
}
|
||||
|
||||
/* free boot catalog and image, including references to nodes */
|
||||
el_torito_boot_catalog_free(image->bootcat);
|
||||
image->bootcat = NULL;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int iso_image_add_boot_image(IsoImage *image, const char *image_path,
|
||||
enum eltorito_boot_media_type type, int flag,
|
||||
ElToritoBootImage **boot)
|
||||
{
|
||||
int ret;
|
||||
struct el_torito_boot_catalog *catalog = image->bootcat;
|
||||
ElToritoBootImage *boot_img;
|
||||
|
||||
if(catalog == NULL)
|
||||
return ISO_BOOT_NO_CATALOG;
|
||||
if (catalog->num_bootimages >= Libisofs_max_boot_imageS)
|
||||
return ISO_BOOT_IMAGE_OVERFLOW;
|
||||
ret = create_image(image, image_path, type, &boot_img);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
catalog->bootimages[catalog->num_bootimages] = boot_img;
|
||||
catalog->num_bootimages++;
|
||||
if (boot != NULL)
|
||||
*boot = boot_img;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int iso_image_set_boot_catalog_weight(IsoImage *image, int sort_weight)
|
||||
{
|
||||
if (image->bootcat == NULL)
|
||||
return 0;
|
||||
image->bootcat->sort_weight = sort_weight;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int iso_image_set_boot_catalog_hidden(IsoImage *image, int hide_attrs)
|
||||
{
|
||||
if (image->bootcat == NULL)
|
||||
return 0;
|
||||
if (image->bootcat->node == NULL)
|
||||
return 0;
|
||||
iso_node_set_hidden((IsoNode *) image->bootcat->node, hide_attrs);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void el_torito_boot_catalog_free(struct el_torito_boot_catalog *cat)
|
||||
{
|
||||
struct el_torito_boot_image *image;
|
||||
int i;
|
||||
|
||||
if (cat == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
image = cat->image;
|
||||
iso_node_unref((IsoNode*)image->image);
|
||||
free(image);
|
||||
iso_node_unref((IsoNode*)cat->node);
|
||||
for (i = 0; i < Libisofs_max_boot_imageS; i++) {
|
||||
image = cat->bootimages[i];
|
||||
if (image == NULL)
|
||||
continue;
|
||||
if ((IsoNode*)image->image != NULL)
|
||||
iso_node_unref((IsoNode*)image->image);
|
||||
free(image);
|
||||
}
|
||||
if ((IsoNode*)cat->node != NULL)
|
||||
iso_node_unref((IsoNode*)cat->node);
|
||||
free(cat);
|
||||
}
|
||||
|
||||
@ -537,11 +717,12 @@ struct catalog_stream
|
||||
{
|
||||
Ecma119Image *target;
|
||||
uint8_t buffer[BLOCK_SIZE];
|
||||
int offset; /* -1 if stream is not openned */
|
||||
int offset; /* -1 if stream is not opened */
|
||||
};
|
||||
|
||||
static void
|
||||
write_validation_entry(uint8_t *buf)
|
||||
write_validation_entry(uint8_t *buf, uint8_t platform_id,
|
||||
uint8_t id_string[24])
|
||||
{
|
||||
size_t i;
|
||||
int checksum;
|
||||
@ -549,10 +730,10 @@ write_validation_entry(uint8_t *buf)
|
||||
struct el_torito_validation_entry *ve =
|
||||
(struct el_torito_validation_entry*)buf;
|
||||
ve->header_id[0] = 1;
|
||||
ve->platform_id[0] = 0; /* 0: 80x86, 1: PowerPC, 2: Mac */
|
||||
ve->platform_id[0] = platform_id;
|
||||
memcpy(ve->id_string, id_string, sizeof(ve->id_string));
|
||||
ve->key_byte1[0] = 0x55;
|
||||
ve->key_byte2[0] = 0xAA;
|
||||
|
||||
/* calculate the checksum, to ensure sum of all words is 0 */
|
||||
checksum = 0;
|
||||
for (i = 0; i < sizeof(struct el_torito_validation_entry); i += 2) {
|
||||
@ -561,35 +742,64 @@ write_validation_entry(uint8_t *buf)
|
||||
iso_lsb(ve->checksum, checksum, 2);
|
||||
}
|
||||
|
||||
static void
|
||||
write_section_header(uint8_t *buf, Ecma119Image *t, int idx, int num_entries)
|
||||
{
|
||||
int pi;
|
||||
char *id_string;
|
||||
|
||||
struct el_torito_section_header *e =
|
||||
(struct el_torito_section_header *) buf;
|
||||
|
||||
/* 0x90 = more section headers follow , 0x91 = final section */
|
||||
e->header_indicator[0] = 0x90 + (idx == t->catalog->num_bootimages - 1);
|
||||
pi= e->platform_id[0] = t->catalog->bootimages[idx]->platform_id;
|
||||
e->num_entries[0] = num_entries & 0xff;
|
||||
e->num_entries[1] = (num_entries >> 8) & 0xff;;
|
||||
id_string = (char *) e->id_string;
|
||||
memcpy(id_string, t->catalog->bootimages[idx]->id_string,
|
||||
sizeof(e->id_string));
|
||||
}
|
||||
|
||||
/**
|
||||
* Write one section entry.
|
||||
* Currently this is used only for default image (the only supported just now)
|
||||
* Usable for the Default Entry
|
||||
* and for Section Entries with Selection criteria type == 0
|
||||
*/
|
||||
static void
|
||||
write_section_entry(uint8_t *buf, Ecma119Image *t)
|
||||
write_section_entry(uint8_t *buf, Ecma119Image *t, int idx)
|
||||
{
|
||||
struct el_torito_boot_image *img;
|
||||
struct el_torito_section_entry *se =
|
||||
(struct el_torito_section_entry*)buf;
|
||||
|
||||
img = t->catalog->image;
|
||||
img = t->catalog->bootimages[idx];
|
||||
|
||||
se->boot_indicator[0] = img->bootable ? 0x88 : 0x00;
|
||||
se->boot_media_type[0] = img->type;
|
||||
iso_lsb(se->load_seg, img->load_seg, 2);
|
||||
se->system_type[0] = img->partition_type;
|
||||
iso_lsb(se->sec_count, img->load_size, 2);
|
||||
iso_lsb(se->block, t->bootimg->sections[0].block, 4);
|
||||
iso_lsb(se->block, t->bootsrc[idx]->sections[0].block, 4);
|
||||
se->selec_criteria[0] = img->selection_crit[0];
|
||||
memcpy(se->vendor_sc, img->selection_crit + 1, 19);
|
||||
}
|
||||
|
||||
static
|
||||
int catalog_open(IsoStream *stream)
|
||||
{
|
||||
int i, j, k, num_entries;
|
||||
struct catalog_stream *data;
|
||||
uint8_t *wpt;
|
||||
struct el_torito_boot_catalog *cat;
|
||||
struct el_torito_boot_image **boots;
|
||||
|
||||
if (stream == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
data = stream->data;
|
||||
cat = data->target->catalog;
|
||||
boots = cat->bootimages;
|
||||
|
||||
if (data->offset != -1) {
|
||||
return ISO_FILE_ALREADY_OPENED;
|
||||
@ -598,11 +808,36 @@ int catalog_open(IsoStream *stream)
|
||||
memset(data->buffer, 0, BLOCK_SIZE);
|
||||
|
||||
/* fill the buffer with the catalog contents */
|
||||
write_validation_entry(data->buffer);
|
||||
write_validation_entry(data->buffer,
|
||||
boots[0]->platform_id, boots[0]->id_string);
|
||||
|
||||
/* write default entry */
|
||||
write_section_entry(data->buffer + 32, data->target);
|
||||
/* write default entry = first boot image */
|
||||
write_section_entry(data->buffer + 32, data->target, 0);
|
||||
|
||||
/* IMPORTANT: The maximum number of boot images must fit into BLOCK_SIZE */
|
||||
wpt = data->buffer + 64;
|
||||
for (i = 1; i < cat->num_bootimages; ) {
|
||||
/* Look ahead and put images of same platform_id and id_string
|
||||
into the same section */
|
||||
for (j = i + 1; j < cat->num_bootimages; j++) {
|
||||
if (boots[i]->platform_id != boots[j]->platform_id)
|
||||
break;
|
||||
for (k = 0; k < sizeof(boots[i]->id_string); k++)
|
||||
if (boots[i]->id_string[k] != boots[j]->id_string[k])
|
||||
break;
|
||||
if (k < sizeof(boots[i]->id_string))
|
||||
break;
|
||||
}
|
||||
num_entries = j - i;
|
||||
|
||||
write_section_header(wpt, data->target, i, num_entries);
|
||||
wpt += 32;
|
||||
for (j = 0; j < num_entries; j++) {
|
||||
write_section_entry(wpt, data->target, i);
|
||||
wpt += 32;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
data->offset = 0;
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
@ -702,12 +937,12 @@ int catalog_stream_new(Ecma119Image *target, IsoStream **stream)
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
|
||||
str = malloc(sizeof(IsoStream));
|
||||
str = calloc(1, sizeof(IsoStream));
|
||||
if (str == NULL) {
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
data = malloc(sizeof(struct catalog_stream));
|
||||
if (str == NULL) {
|
||||
data = calloc(1, sizeof(struct catalog_stream));
|
||||
if (data == NULL) {
|
||||
free(str);
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
@ -740,7 +975,7 @@ int el_torito_catalog_file_src_create(Ecma119Image *target, IsoFileSrc **src)
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
file = malloc(sizeof(IsoFileSrc));
|
||||
file = calloc(1, sizeof(IsoFileSrc));
|
||||
if (file == NULL) {
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
@ -753,9 +988,10 @@ int el_torito_catalog_file_src_create(Ecma119Image *target, IsoFileSrc **src)
|
||||
|
||||
/* fill fields */
|
||||
file->prev_img = 0; /* TODO allow copy of old img catalog???? */
|
||||
file->checksum_index = 0;
|
||||
file->nsections = 1;
|
||||
file->sections = calloc(1, sizeof(struct iso_file_section));
|
||||
file->sort_weight = 1000; /* slightly high */
|
||||
file->sort_weight = target->catalog->sort_weight;
|
||||
file->stream = stream;
|
||||
|
||||
ret = iso_file_src_add(target, file, src);
|
||||
@ -771,27 +1007,26 @@ int el_torito_catalog_file_src_create(Ecma119Image *target, IsoFileSrc **src)
|
||||
/******************* EL-TORITO WRITER *******************************/
|
||||
|
||||
/**
|
||||
* Patch an isolinux boot image.
|
||||
* Insert boot info table content into buf.
|
||||
*
|
||||
* @return
|
||||
* 1 on success, 0 error (but continue), < 0 error
|
||||
*/
|
||||
static
|
||||
int patch_boot_image(uint8_t *buf, Ecma119Image *t, size_t imgsize)
|
||||
int make_boot_info_table(uint8_t *buf, uint32_t pvd_lba,
|
||||
uint32_t boot_lba, uint32_t imgsize)
|
||||
{
|
||||
struct boot_info_table *info;
|
||||
uint32_t checksum;
|
||||
size_t offset;
|
||||
uint32_t offset;
|
||||
|
||||
if (imgsize < 64) {
|
||||
return iso_msg_submit(t->image->id, ISO_ISOLINUX_CANT_PATCH, 0,
|
||||
"Isolinux image too small. We won't patch it.");
|
||||
}
|
||||
info = (struct boot_info_table *) (buf + 8);
|
||||
if (imgsize < 64)
|
||||
return ISO_ISOLINUX_CANT_PATCH;
|
||||
|
||||
/* compute checksum, as the the sum of all 32 bit words in boot image
|
||||
* from offset 64 */
|
||||
checksum = 0;
|
||||
offset = (size_t) 64;
|
||||
offset = 64;
|
||||
|
||||
while (offset <= imgsize - 4) {
|
||||
checksum += iso_read_lsb(buf + offset, 4);
|
||||
@ -806,16 +1041,36 @@ int patch_boot_image(uint8_t *buf, Ecma119Image *t, size_t imgsize)
|
||||
checksum += iso_read_lsb(buf + offset, imgsize - offset);
|
||||
}
|
||||
|
||||
/* patch boot info table */
|
||||
info = (struct boot_info_table*)(buf + 8);
|
||||
/*memset(info, 0, sizeof(struct boot_info_table));*/
|
||||
iso_lsb(info->bi_pvd, t->ms_block + 16, 4);
|
||||
iso_lsb(info->bi_file, t->bootimg->sections[0].block, 4);
|
||||
iso_lsb(info->bi_pvd, pvd_lba, 4);
|
||||
iso_lsb(info->bi_file, boot_lba, 4);
|
||||
iso_lsb(info->bi_length, imgsize, 4);
|
||||
iso_lsb(info->bi_csum, checksum, 4);
|
||||
memset(buf + 24, 0, 40);
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Patch an isolinux boot image.
|
||||
*
|
||||
* @return
|
||||
* 1 on success, 0 error (but continue), < 0 error
|
||||
*/
|
||||
static
|
||||
int patch_boot_image(uint8_t *buf, Ecma119Image *t, size_t imgsize, int idx)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (imgsize < 64) {
|
||||
return iso_msg_submit(t->image->id, ISO_ISOLINUX_CANT_PATCH, 0,
|
||||
"Isolinux image too small. We won't patch it.");
|
||||
}
|
||||
ret = make_boot_info_table(buf, t->ms_block + (uint32_t) 16,
|
||||
t->bootsrc[idx]->sections[0].block,
|
||||
(uint32_t) imgsize);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static
|
||||
int eltorito_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
{
|
||||
@ -824,7 +1079,11 @@ int eltorito_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
* this is a good place to do so.
|
||||
*/
|
||||
Ecma119Image *t;
|
||||
int ret;
|
||||
int ret, idx;
|
||||
size_t size;
|
||||
uint8_t *buf;
|
||||
IsoStream *new = NULL;
|
||||
IsoStream *original = NULL;
|
||||
|
||||
if (writer == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
@ -832,19 +1091,23 @@ int eltorito_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
|
||||
t = writer->target;
|
||||
|
||||
if (t->catalog->image->isolinux_options & 0x01) {
|
||||
/* we need to patch the image */
|
||||
size_t size;
|
||||
uint8_t *buf;
|
||||
IsoStream *new = NULL;
|
||||
IsoStream *original = t->bootimg->stream;
|
||||
/* Patch the boot image info tables if indicated */
|
||||
for (idx = 0; idx < t->catalog->num_bootimages; idx++) {
|
||||
if (!(t->catalog->bootimages[idx]->isolinux_options & 0x01))
|
||||
continue;
|
||||
original = t->bootsrc[idx]->stream;
|
||||
size = (size_t) iso_stream_get_size(original);
|
||||
buf = malloc(size);
|
||||
|
||||
/* >>> BOOT ts B00428 :
|
||||
check whether size is not too large for buffering */;
|
||||
|
||||
buf = calloc(1, size);
|
||||
if (buf == NULL) {
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
ret = iso_stream_open(original);
|
||||
if (ret < 0) {
|
||||
free(buf);
|
||||
return ret;
|
||||
}
|
||||
ret = iso_stream_read(original, buf, size);
|
||||
@ -854,7 +1117,7 @@ int eltorito_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
}
|
||||
|
||||
/* ok, patch the read buffer */
|
||||
ret = patch_boot_image(buf, t, size);
|
||||
ret = patch_boot_image(buf, t, size, idx);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@ -865,7 +1128,7 @@ int eltorito_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
t->bootimg->stream = new;
|
||||
t->bootsrc[idx]->stream = new;
|
||||
iso_stream_unref(original);
|
||||
}
|
||||
return ISO_SUCCESS;
|
||||
@ -895,8 +1158,8 @@ int eltorito_writer_write_vol_desc(IsoImageWriter *writer)
|
||||
memcpy(vol.std_identifier, "CD001", 5);
|
||||
vol.vol_desc_version[0] = 1;
|
||||
memcpy(vol.boot_sys_id, "EL TORITO SPECIFICATION", 23);
|
||||
iso_lsb(vol.boot_catalog, t->cat->sections[0].block, 4);
|
||||
|
||||
iso_lsb(vol.boot_catalog,
|
||||
t->cat->sections[0].block - t->eff_partition_offset, 4);
|
||||
return iso_write(t, &vol, sizeof(struct ecma119_boot_rec_vol_desc));
|
||||
}
|
||||
|
||||
@ -916,12 +1179,12 @@ int eltorito_writer_free_data(IsoImageWriter *writer)
|
||||
|
||||
int eltorito_writer_create(Ecma119Image *target)
|
||||
{
|
||||
int ret;
|
||||
int ret, idx;
|
||||
IsoImageWriter *writer;
|
||||
IsoFile *bootimg;
|
||||
IsoFileSrc *src;
|
||||
|
||||
writer = malloc(sizeof(IsoImageWriter));
|
||||
writer = calloc(1, sizeof(IsoImageWriter));
|
||||
if (writer == NULL) {
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
@ -947,16 +1210,19 @@ int eltorito_writer_create(Ecma119Image *target)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
bootimg = target->catalog->image->image;
|
||||
ret = iso_file_src_create(target, bootimg, &src);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
target->bootimg = src;
|
||||
|
||||
/* if we have selected to patch the image, it needs to be copied always */
|
||||
if (target->catalog->image->isolinux_options & 0x01) {
|
||||
src->prev_img = 0;
|
||||
for (idx = 0; idx < target->catalog->num_bootimages; idx++) {
|
||||
bootimg = target->catalog->bootimages[idx]->image;
|
||||
ret = iso_file_src_create(target, bootimg, &src);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
target->bootsrc[idx] = src;
|
||||
|
||||
/* For patching an image, it needs to be copied always */
|
||||
if (target->catalog->bootimages[idx]->isolinux_options & 0x01) {
|
||||
src->prev_img = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* we need the bootable volume descriptor */
|
||||
|
@ -1,9 +1,11 @@
|
||||
/*
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
* Copyright (c) 2010 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
/**
|
||||
@ -26,25 +28,45 @@ struct Iso_Boot
|
||||
IsoNode node;
|
||||
};
|
||||
|
||||
/* Not more than 32 so that all entries fit into 2048 bytes */
|
||||
#define Libisofs_max_boot_imageS 32
|
||||
|
||||
struct el_torito_boot_catalog {
|
||||
IsoBoot *node; /* node of the catalog */
|
||||
struct el_torito_boot_image *image; /* default boot image */
|
||||
|
||||
int num_bootimages;
|
||||
struct el_torito_boot_image *bootimages[Libisofs_max_boot_imageS];
|
||||
/* [0]= default boot image */
|
||||
|
||||
/* Weight value for image sorting */
|
||||
int sort_weight;
|
||||
};
|
||||
|
||||
struct el_torito_boot_image {
|
||||
IsoFile *image;
|
||||
|
||||
unsigned int bootable:1; /**< If the entry is bootable. */
|
||||
/**
|
||||
* Whether the boot image seems to contain a boot_info_table
|
||||
*/
|
||||
unsigned int seems_boot_info_table:1;
|
||||
/**
|
||||
* isolinux options
|
||||
* bit 0 -> whether to patch image
|
||||
* bit 1 -> whether to create isolinux image
|
||||
* bit 1 -> whether to put built-in isolinux 3.72 isohybrid-MBR into image
|
||||
* System Area (deprecated)
|
||||
*/
|
||||
unsigned int isolinux_options:2;
|
||||
unsigned char type; /**< The type of image */
|
||||
unsigned char partition_type; /**< type of partition for HD-emul images */
|
||||
short load_seg; /**< Load segment for the initial boot image. */
|
||||
short load_size; /**< Number of sectors to load. */
|
||||
|
||||
/* Byte 1 of Validation Entry or Section Header Entry:
|
||||
0= 80x86, 1= PowerPC, 2= Mac, 0xef= EFI */
|
||||
uint8_t platform_id;
|
||||
uint8_t id_string[28];
|
||||
uint8_t selection_crit[20];
|
||||
};
|
||||
|
||||
/** El-Torito, 2.1 */
|
||||
@ -74,8 +96,8 @@ struct el_torito_default_entry {
|
||||
struct el_torito_section_header {
|
||||
uint8_t header_indicator BP(1, 1);
|
||||
uint8_t platform_id BP(2, 2);
|
||||
uint8_t number BP(3, 4);
|
||||
uint8_t character BP(5, 32);
|
||||
uint8_t num_entries BP(3, 4);
|
||||
uint8_t id_string BP(5, 32);
|
||||
};
|
||||
|
||||
/** El-Torito, 2.4 */
|
||||
@ -105,4 +127,14 @@ int el_torito_catalog_file_src_create(Ecma119Image *target, IsoFileSrc **src);
|
||||
*/
|
||||
int eltorito_writer_create(Ecma119Image *target);
|
||||
|
||||
/**
|
||||
* Insert boot info table content into buf.
|
||||
*
|
||||
* @return
|
||||
* 1 on success, 0 error (but continue), < 0 error
|
||||
*/
|
||||
int make_boot_info_table(uint8_t *buf, uint32_t pvd_lba,
|
||||
uint32_t boot_lba, uint32_t imgsize);
|
||||
|
||||
|
||||
#endif /* LIBISO_ELTORITO_H */
|
||||
|
@ -2,10 +2,15 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "filesrc.h"
|
||||
#include "node.h"
|
||||
#include "util.h"
|
||||
@ -13,16 +18,18 @@
|
||||
#include "messages.h"
|
||||
#include "image.h"
|
||||
#include "stream.h"
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
#include "md5.h"
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX Libisofs_default_path_maX
|
||||
#endif
|
||||
|
||||
|
||||
int iso_file_src_cmp(const void *n1, const void *n2)
|
||||
{
|
||||
int ret;
|
||||
@ -47,11 +54,8 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
||||
unsigned int fs_id;
|
||||
dev_t dev_id;
|
||||
ino_t ino_id;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
int cret, no_md5= 0;
|
||||
void *xipt = NULL;
|
||||
#endif
|
||||
|
||||
if (img == NULL || file == NULL || src == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
@ -97,9 +101,6 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
||||
/* insert the filesrc in the tree */
|
||||
ret = iso_rbtree_insert(img->files, fsrc, (void**)src);
|
||||
if (ret <= 0) {
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
if (ret == 0 && (*src)->checksum_index > 0) {
|
||||
/* Duplicate file source was mapped to previously registered source
|
||||
*/
|
||||
@ -107,17 +108,12 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
||||
if (cret < 0)
|
||||
ret = cret;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
free(fsrc->sections);
|
||||
free(fsrc);
|
||||
return ret;
|
||||
}
|
||||
iso_stream_ref(fsrc->stream);
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
if ((img->md5_file_checksums & 1) &&
|
||||
file->from_old_session && img->appendable) {
|
||||
ret = iso_node_get_xinfo((IsoNode *) file, checksum_md5_xinfo_func,
|
||||
@ -132,19 +128,17 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
||||
|
||||
if ((img->md5_file_checksums & 1) && !no_md5) {
|
||||
img->checksum_idx_counter++;
|
||||
if (img->checksum_idx_counter < 0x80000000) {
|
||||
if (img->checksum_idx_counter < 0x7fffffff) {
|
||||
fsrc->checksum_index = img->checksum_idx_counter;
|
||||
} else {
|
||||
fsrc->checksum_index= 0;
|
||||
img->checksum_idx_counter= 0x80000000; /* keep from rolling over */
|
||||
img->checksum_idx_counter= 0x7fffffff; /* keep from rolling over */
|
||||
}
|
||||
cret = iso_file_set_isofscx(file, (*src)->checksum_index, 0);
|
||||
if (cret < 0)
|
||||
return cret;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
@ -298,21 +292,16 @@ int filesrc_read(IsoFileSrc *file, char *buf, size_t count)
|
||||
return iso_stream_read_buffer(file->stream, buf, count, &got);
|
||||
}
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
/* @return 1=ok, md5 is valid,
|
||||
0= not ok, go on,
|
||||
<0 fatal error, abort
|
||||
*/
|
||||
|
||||
static
|
||||
int filesrc_make_md5(Ecma119Image *t, IsoFileSrc *file, char md5[16], int flag)
|
||||
{
|
||||
return iso_stream_make_md5(file->stream, md5, 0);
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
static
|
||||
int filesrc_writer_write_data(IsoImageWriter *writer)
|
||||
{
|
||||
@ -325,13 +314,9 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
||||
char buffer[BLOCK_SIZE];
|
||||
off_t file_size;
|
||||
uint32_t nblocks;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
void *ctx= NULL;
|
||||
char md5[16], pre_md5[16];
|
||||
int pre_md5_valid = 0;
|
||||
#endif
|
||||
|
||||
|
||||
if (writer == NULL) {
|
||||
return ISO_ASSERT_FAILURE;
|
||||
@ -347,17 +332,11 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
||||
was_error = 0;
|
||||
file_size = iso_file_src_get_size(file);
|
||||
nblocks = DIV_UP(file_size, BLOCK_SIZE);
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
pre_md5_valid = 0;
|
||||
if (file->checksum_index > 0 && (t->md5_file_checksums & 2)) {
|
||||
/* Obtain an MD5 of content by a first read pass */
|
||||
pre_md5_valid = filesrc_make_md5(t, file, pre_md5, 0);
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
res = filesrc_open(file);
|
||||
iso_stream_get_file_name(file->stream, name);
|
||||
if (res < 0) {
|
||||
@ -401,18 +380,12 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
if (file->checksum_index > 0) {
|
||||
/* initialize file checksum */
|
||||
res = iso_md5_start(&ctx);
|
||||
if (res <= 0)
|
||||
file->checksum_index = 0;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
/* write file contents to image */
|
||||
for (b = 0; b < nblocks; ++b) {
|
||||
int wres;
|
||||
@ -428,9 +401,6 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
||||
ret = wres;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
if (file->checksum_index > 0) {
|
||||
/* Add to file checksum */
|
||||
if (file_size - b * BLOCK_SIZE > BLOCK_SIZE)
|
||||
@ -441,9 +411,6 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
||||
if (res <= 0)
|
||||
file->checksum_index = 0;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
}
|
||||
|
||||
filesrc_close(file);
|
||||
@ -478,9 +445,6 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
||||
ret = res;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
if (file->checksum_index > 0) {
|
||||
/* Add to file checksum */
|
||||
if (file_size - b * BLOCK_SIZE > BLOCK_SIZE)
|
||||
@ -491,15 +455,10 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
||||
if (res <= 0)
|
||||
file->checksum_index = 0;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
if (file->checksum_index > 0) {
|
||||
if (file->checksum_index > 0 &&
|
||||
file->checksum_index <= t->checksum_idx_counter) {
|
||||
/* Obtain checksum and dispose checksum context */
|
||||
res = iso_md5_end(&ctx, md5);
|
||||
if (res <= 0)
|
||||
@ -522,19 +481,12 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
||||
/* Write md5 into checksum buffer at file->checksum_index */
|
||||
memcpy(t->checksum_buffer + 16 * file->checksum_index, md5, 16);
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
}
|
||||
|
||||
ret = ISO_SUCCESS;
|
||||
ex:;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
if (ctx != NULL) /* avoid any memory leak */
|
||||
iso_md5_end(&ctx, md5);
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -550,7 +502,7 @@ int iso_file_src_writer_create(Ecma119Image *target)
|
||||
{
|
||||
IsoImageWriter *writer;
|
||||
|
||||
writer = malloc(sizeof(IsoImageWriter));
|
||||
writer = calloc(1, sizeof(IsoImageWriter));
|
||||
if (writer == NULL) {
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
#ifndef LIBISO_FILESRC_H_
|
||||
#define LIBISO_FILESRC_H_
|
||||
@ -17,14 +18,8 @@
|
||||
struct Iso_File_Src
|
||||
{
|
||||
unsigned int prev_img :1; /**< if the file comes from a previous image */
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
unsigned int checksum_index :31;
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
|
||||
/** File Sections of the file in the image */
|
||||
struct iso_file_section *sections;
|
||||
int nsections;
|
||||
|
@ -3,10 +3,15 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "filter.h"
|
||||
#include "node.h"
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2008 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
#ifndef LIBISO_FILTER_H_
|
||||
#define LIBISO_FILTER_H_
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*
|
||||
* It implements a filter facility which can pipe a IsoStream into an external
|
||||
* process, read its output and forward it as IsoStream output to an IsoFile.
|
||||
@ -12,6 +13,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "../libisofs.h"
|
||||
#include "../filter.h"
|
||||
#include "../fsource.h"
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*
|
||||
* It implements a filter facility which can pipe a IsoStream into gzip
|
||||
* compression resp. uncompression, read its output and forward it as IsoStream
|
||||
@ -16,6 +17,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "../libisofs.h"
|
||||
#include "../filter.h"
|
||||
#include "../fsource.h"
|
||||
|
@ -1,187 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2008 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
*/
|
||||
|
||||
#include "../libisofs.h"
|
||||
#include "../filter.h"
|
||||
#include "../fsource.h"
|
||||
|
||||
/*
|
||||
* A simple Filter implementation for example purposes. It encrypts a file
|
||||
* by XORing each byte by a given key.
|
||||
*/
|
||||
|
||||
static ino_t xor_ino_id = 0;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
IsoStream *orig;
|
||||
uint8_t key;
|
||||
ino_t id;
|
||||
} XorEncryptStreamData;
|
||||
|
||||
static
|
||||
int xor_encrypt_stream_open(IsoStream *stream)
|
||||
{
|
||||
XorEncryptStreamData *data;
|
||||
if (stream == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
data = (XorEncryptStreamData*)stream->data;
|
||||
return iso_stream_open(data->orig);
|
||||
}
|
||||
|
||||
static
|
||||
int xor_encrypt_stream_close(IsoStream *stream)
|
||||
{
|
||||
XorEncryptStreamData *data;
|
||||
if (stream == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
data = stream->data;
|
||||
return iso_stream_close(data->orig);
|
||||
}
|
||||
|
||||
static
|
||||
off_t xor_encrypt_stream_get_size(IsoStream *stream)
|
||||
{
|
||||
XorEncryptStreamData *data;
|
||||
if (stream == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
data = stream->data;
|
||||
return iso_stream_get_size(data->orig);
|
||||
}
|
||||
|
||||
static
|
||||
int xor_encrypt_stream_read(IsoStream *stream, void *buf, size_t count)
|
||||
{
|
||||
int ret, len;
|
||||
XorEncryptStreamData *data;
|
||||
uint8_t *buffer = buf;
|
||||
|
||||
if (stream == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
data = stream->data;
|
||||
ret = iso_stream_read(data->orig, buf, count);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* xor */
|
||||
for (len = 0; len < ret; ++len) {
|
||||
buffer[len] = buffer[len] ^ data->key;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static
|
||||
int xor_encrypt_stream_is_repeatable(IsoStream *stream)
|
||||
{
|
||||
/* the filter can't be created if underlying stream is not repeatable */
|
||||
return 1;
|
||||
}
|
||||
|
||||
static
|
||||
void xor_encrypt_stream_get_id(IsoStream *stream, unsigned int *fs_id,
|
||||
dev_t *dev_id, ino_t *ino_id)
|
||||
{
|
||||
XorEncryptStreamData *data = stream->data;
|
||||
*fs_id = ISO_FILTER_FS_ID;
|
||||
*dev_id = XOR_ENCRYPT_DEV_ID;
|
||||
*ino_id = data->id;
|
||||
}
|
||||
|
||||
static
|
||||
void xor_encrypt_stream_free(IsoStream *stream)
|
||||
{
|
||||
XorEncryptStreamData *data = stream->data;
|
||||
iso_stream_unref(data->orig);
|
||||
free(data);
|
||||
}
|
||||
|
||||
IsoStreamIface xor_encrypt_stream_class = {
|
||||
0,
|
||||
"xorf",
|
||||
xor_encrypt_stream_open,
|
||||
xor_encrypt_stream_close,
|
||||
xor_encrypt_stream_get_size,
|
||||
xor_encrypt_stream_read,
|
||||
xor_encrypt_stream_is_repeatable,
|
||||
xor_encrypt_stream_get_id,
|
||||
xor_encrypt_stream_free
|
||||
};
|
||||
|
||||
|
||||
static
|
||||
void xor_encrypt_filter_free(FilterContext *filter)
|
||||
{
|
||||
free(filter->data);
|
||||
}
|
||||
|
||||
static
|
||||
int xor_encrypt_filter_get_filter(FilterContext *filter, IsoStream *original,
|
||||
IsoStream **filtered)
|
||||
{
|
||||
IsoStream *str;
|
||||
XorEncryptStreamData *data;
|
||||
|
||||
if (filter == NULL || original == NULL || filtered == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
|
||||
str = malloc(sizeof(IsoStream));
|
||||
if (str == NULL) {
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
data = malloc(sizeof(XorEncryptStreamData));
|
||||
if (str == NULL) {
|
||||
free(str);
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
|
||||
/* fill data */
|
||||
data->key = *((uint8_t*)filter->data);
|
||||
data->id = xor_ino_id++;
|
||||
|
||||
/* get reference to the source */
|
||||
data->orig = original;
|
||||
iso_stream_ref(original);
|
||||
|
||||
str->refcount = 1;
|
||||
str->data = data;
|
||||
str->class = &xor_encrypt_stream_class;
|
||||
|
||||
*filtered = str;
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
int create_xor_encrypt_filter(uint8_t key, FilterContext **filter)
|
||||
{
|
||||
FilterContext *f;
|
||||
uint8_t *data;
|
||||
|
||||
f = calloc(1, sizeof(FilterContext));
|
||||
if (f == NULL) {
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
data = malloc(sizeof(uint8_t));
|
||||
if (data == NULL) {
|
||||
free(f);
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
f->refcount = 1;
|
||||
f->version = 0;
|
||||
*data = key;
|
||||
f->data = data;
|
||||
f->free = xor_encrypt_filter_free;
|
||||
f->get_filter = xor_encrypt_filter_get_filter;
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*
|
||||
* It implements a filter facility which can pipe a IsoStream into zisofs
|
||||
* compression resp. uncompression, read its output and forward it as IsoStream
|
||||
@ -13,6 +14,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "../libisofs.h"
|
||||
#include "../filter.h"
|
||||
#include "../fsource.h"
|
||||
@ -825,6 +830,9 @@ int ziso_cmp_ino(IsoStream *s1, IsoStream *s2)
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
|
||||
|
||||
#ifdef Libisofs_with_zliB
|
||||
|
||||
static
|
||||
void ziso_filter_free(FilterContext *filter)
|
||||
{
|
||||
@ -938,6 +946,7 @@ int ziso_create_context(FilterContext **filter, int flag)
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_zliB */
|
||||
|
||||
/*
|
||||
* @param flag bit0= if_block_reduction rather than if_reduction
|
||||
|
@ -2,10 +2,15 @@
|
||||
* Copyright (c) 2008 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "node.h"
|
||||
|
||||
|
@ -1,10 +1,11 @@
|
||||
/*
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
* Copyright (c) 2009 - 2010 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -12,6 +13,10 @@
|
||||
* IsoDataSource to read image data.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "ecma119.h"
|
||||
#include "messages.h"
|
||||
@ -30,6 +35,11 @@
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX Libisofs_default_path_maX
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Options for image reading.
|
||||
* There are four kind of options:
|
||||
@ -96,6 +106,12 @@ struct iso_read_opts
|
||||
*/
|
||||
int auto_input_charset;
|
||||
|
||||
|
||||
/**
|
||||
* Enable or disable loading of the first 32768 bytes of the session and
|
||||
* submission by iso_write_opts_set_system_area(data, 0).
|
||||
*/
|
||||
int load_system_area;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -267,12 +283,20 @@ typedef struct
|
||||
|
||||
/* el-torito information */
|
||||
unsigned int eltorito : 1; /* is el-torito available */
|
||||
unsigned int bootable:1; /**< If the entry is bootable. */
|
||||
unsigned char type; /**< The type of image */
|
||||
unsigned char partition_type; /**< type of partition for HD-emul images */
|
||||
short load_seg; /**< Load segment for the initial boot image. */
|
||||
short load_size; /**< Number of sectors to load. */
|
||||
uint32_t imgblock; /**< Block for El-Torito boot image */
|
||||
int num_bootimgs;
|
||||
unsigned char platform_ids[Libisofs_max_boot_imageS];
|
||||
unsigned char id_strings[Libisofs_max_boot_imageS][28];
|
||||
unsigned char selection_crits[Libisofs_max_boot_imageS][20];
|
||||
unsigned char boot_flags[Libisofs_max_boot_imageS]; /* bit0= bootable */
|
||||
unsigned char media_types[Libisofs_max_boot_imageS];
|
||||
unsigned char partition_types[Libisofs_max_boot_imageS];
|
||||
short load_segs[Libisofs_max_boot_imageS];
|
||||
short load_sizes[Libisofs_max_boot_imageS];
|
||||
/** Block addresses of for El-Torito boot images.
|
||||
Needed to recognize them when the get read from the directory tree.
|
||||
*/
|
||||
uint32_t bootblocks[Libisofs_max_boot_imageS];
|
||||
|
||||
uint32_t catblock; /**< Block for El-Torito catalog */
|
||||
|
||||
/* Whether inode numbers from PX entries shall be discarded */
|
||||
@ -369,9 +393,19 @@ char* ifs_get_path(IsoFileSource *src)
|
||||
if (data->parent == NULL) {
|
||||
return strdup("");
|
||||
} else {
|
||||
char *path = ifs_get_path(data->parent);
|
||||
int pathlen = strlen(path);
|
||||
path = realloc(path, pathlen + strlen(data->name) + 2);
|
||||
char *path, *new_path;
|
||||
int pathlen;
|
||||
|
||||
path = ifs_get_path(data->parent);
|
||||
if (path == NULL)
|
||||
return NULL;
|
||||
pathlen = strlen(path);
|
||||
new_path = realloc(path, pathlen + strlen(data->name) + 2);
|
||||
if (new_path == NULL) {
|
||||
free(path);
|
||||
return NULL;
|
||||
}
|
||||
path= new_path;
|
||||
path[pathlen] = '/';
|
||||
path[pathlen + 1] = '\0';
|
||||
return strcat(path, data->name);
|
||||
@ -2100,19 +2134,15 @@ int read_root_susp_entries(_ImageFsData *data, uint32_t block)
|
||||
}
|
||||
|
||||
static
|
||||
int read_pvm(_ImageFsData *data, uint32_t block)
|
||||
int read_pvd_block(IsoDataSource *src, uint32_t block, uint8_t *buffer,
|
||||
uint32_t *image_size)
|
||||
{
|
||||
int ret;
|
||||
struct ecma119_pri_vol_desc *pvm;
|
||||
struct ecma119_dir_record *rootdr;
|
||||
uint8_t buffer[BLOCK_SIZE];
|
||||
|
||||
/* read PVM */
|
||||
ret = data->src->read_block(data->src, block, buffer);
|
||||
if (ret < 0) {
|
||||
ret = src->read_block(src, block, buffer);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
pvm = (struct ecma119_pri_vol_desc *)buffer;
|
||||
|
||||
/* sanity checks */
|
||||
@ -2122,20 +2152,55 @@ int read_pvm(_ImageFsData *data, uint32_t block)
|
||||
|
||||
return ISO_WRONG_PVD;
|
||||
}
|
||||
if (image_size != NULL)
|
||||
*image_size = iso_read_bb(pvm->vol_space_size, 4, NULL);
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
static
|
||||
int read_pvm(_ImageFsData *data, uint32_t block)
|
||||
{
|
||||
int ret;
|
||||
struct ecma119_pri_vol_desc *pvm;
|
||||
struct ecma119_dir_record *rootdr;
|
||||
uint8_t buffer[BLOCK_SIZE];
|
||||
|
||||
ret = read_pvd_block(data->src, block, buffer, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
/* ok, it is a valid PVD */
|
||||
pvm = (struct ecma119_pri_vol_desc *)buffer;
|
||||
|
||||
/* fill volume attributes */
|
||||
/* TODO take care of input charset */
|
||||
data->volset_id = strcopy((char*)pvm->vol_set_id, 128);
|
||||
data->volume_id = strcopy((char*)pvm->volume_id, 32);
|
||||
data->publisher_id = strcopy((char*)pvm->publisher_id, 128);
|
||||
data->data_preparer_id = strcopy((char*)pvm->data_prep_id, 128);
|
||||
data->system_id = strcopy((char*)pvm->system_id, 32);
|
||||
data->application_id = strcopy((char*)pvm->application_id, 128);
|
||||
data->copyright_file_id = strcopy((char*)pvm->copyright_file_id, 37);
|
||||
data->abstract_file_id = strcopy((char*)pvm->abstract_file_id, 37);
|
||||
data->biblio_file_id = strcopy((char*)pvm->bibliographic_file_id, 37);
|
||||
data->volset_id = iso_util_strcopy_untail((char*)pvm->vol_set_id, 128);
|
||||
data->volume_id = iso_util_strcopy_untail((char*)pvm->volume_id, 32);
|
||||
data->publisher_id =
|
||||
iso_util_strcopy_untail((char*)pvm->publisher_id, 128);
|
||||
data->data_preparer_id =
|
||||
iso_util_strcopy_untail((char*)pvm->data_prep_id, 128);
|
||||
data->system_id = iso_util_strcopy_untail((char*)pvm->system_id, 32);
|
||||
data->application_id =
|
||||
iso_util_strcopy_untail((char*)pvm->application_id, 128);
|
||||
data->copyright_file_id =
|
||||
iso_util_strcopy_untail((char*) pvm->copyright_file_id, 37);
|
||||
data->abstract_file_id =
|
||||
iso_util_strcopy_untail((char*) pvm->abstract_file_id, 37);
|
||||
data->biblio_file_id =
|
||||
iso_util_strcopy_untail((char*) pvm->bibliographic_file_id, 37);
|
||||
if (data->copyright_file_id[0] == '_' && data->copyright_file_id[1] == 0 &&
|
||||
data->abstract_file_id[0] == '_' && data->abstract_file_id[1] == 0 &&
|
||||
data->biblio_file_id[0] == '_' && data->biblio_file_id[1] == 0) {
|
||||
/* This is bug output from libisofs <= 0.6.23 . The texts mean file
|
||||
names and should have been empty to indicate that there are no such
|
||||
files. It is obvious that not all three roles can be fulfilled by
|
||||
one file "_" so that one cannot spoil anything by assuming them
|
||||
empty now.
|
||||
*/
|
||||
data->copyright_file_id[0] = 0;
|
||||
data->abstract_file_id[0] = 0;
|
||||
data->biblio_file_id[0] = 0;
|
||||
}
|
||||
|
||||
data->nblocks = iso_read_bb(pvm->vol_space_size, 4, NULL);
|
||||
|
||||
@ -2160,11 +2225,13 @@ int read_pvm(_ImageFsData *data, uint32_t block)
|
||||
static
|
||||
int read_el_torito_boot_catalog(_ImageFsData *data, uint32_t block)
|
||||
{
|
||||
int ret;
|
||||
int ret, i, rx, last_done, idx;
|
||||
struct el_torito_validation_entry *ve;
|
||||
struct el_torito_default_entry *entry;
|
||||
struct el_torito_section_header *sh;
|
||||
struct el_torito_section_entry *entry; /* also usable as default_entry */
|
||||
unsigned char buffer[BLOCK_SIZE];
|
||||
|
||||
data->num_bootimgs = 0;
|
||||
ret = data->src->read_block(data->src, block, buffer);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
@ -2175,34 +2242,70 @@ int read_el_torito_boot_catalog(_ImageFsData *data, uint32_t block)
|
||||
/* check if it is a valid catalog (TODO: check also the checksum)*/
|
||||
if ( (ve->header_id[0] != 1) || (ve->key_byte1[0] != 0x55)
|
||||
|| (ve->key_byte2[0] != 0xAA) ) {
|
||||
|
||||
return iso_msg_submit(data->msgid, ISO_WRONG_EL_TORITO, 0,
|
||||
iso_msg_submit(data->msgid, ISO_WRONG_EL_TORITO, 0,
|
||||
"Wrong or damaged El-Torito Catalog. El-Torito info "
|
||||
"will be ignored.");
|
||||
return ISO_WRONG_EL_TORITO;
|
||||
}
|
||||
|
||||
/* check for a valid platform */
|
||||
if (ve->platform_id[0] != 0) {
|
||||
return iso_msg_submit(data->msgid, ISO_UNSUPPORTED_EL_TORITO, 0,
|
||||
"Unsupported El-Torito platform. Only 80x86 is "
|
||||
if (ve->platform_id[0] != 0 && ve->platform_id[0] != 0xef) {
|
||||
iso_msg_submit(data->msgid, ISO_UNSUPPORTED_EL_TORITO, 0,
|
||||
"Unsupported El-Torito platform. Only 80x86 and EFI are "
|
||||
"supported. El-Torito info will be ignored.");
|
||||
return ISO_UNSUPPORTED_EL_TORITO;
|
||||
}
|
||||
|
||||
/* ok, once we are here we assume it is a valid catalog */
|
||||
|
||||
/* parse the default entry */
|
||||
entry = (struct el_torito_default_entry *)(buffer + 32);
|
||||
entry = (struct el_torito_section_entry *)(buffer + 32);
|
||||
|
||||
data->eltorito = 1;
|
||||
data->bootable = entry->boot_indicator[0] ? 1 : 0;
|
||||
data->type = entry->boot_media_type[0];
|
||||
data->partition_type = entry->system_type[0];
|
||||
data->load_seg = iso_read_lsb(entry->load_seg, 2);
|
||||
data->load_size = iso_read_lsb(entry->sec_count, 2);
|
||||
data->imgblock = iso_read_lsb(entry->block, 4);
|
||||
|
||||
/* TODO #00018 : check if there are more entries in the boot catalog */
|
||||
/* The Default Entry is declared mandatory */
|
||||
data->num_bootimgs = 1;
|
||||
data->platform_ids[0] = ve->platform_id[0];
|
||||
memcpy(data->id_strings[0], ve->id_string, 24);
|
||||
memset(data->id_strings[0] + 24, 0, 4);
|
||||
data->boot_flags[0] = entry->boot_indicator[0] ? 1 : 0;
|
||||
data->media_types[0] = entry->boot_media_type[0];
|
||||
data->partition_types[0] = entry->system_type[0];
|
||||
data->load_segs[0] = iso_read_lsb(entry->load_seg, 2);
|
||||
data->load_sizes[0] = iso_read_lsb(entry->sec_count, 2);
|
||||
data->bootblocks[0] = iso_read_lsb(entry->block, 4);
|
||||
/* The Default Entry has no selection criterion */
|
||||
memset(data->selection_crits[0], 0, 20);
|
||||
|
||||
/* Read eventual more entries from the boot catalog */
|
||||
last_done = 0;
|
||||
for (rx = 64; (buffer[rx] & 0xfe) == 0x90 && !last_done; rx += 32) {
|
||||
last_done = buffer[rx] & 1;
|
||||
/* Read Section Header */
|
||||
sh = (struct el_torito_section_header *) (buffer + rx);
|
||||
for (i = 0; i < sh->num_entries[0]; i++) {
|
||||
rx += 32;
|
||||
if (data->num_bootimgs >= Libisofs_max_boot_imageS) {
|
||||
ret = iso_msg_submit(data->msgid, ISO_EL_TORITO_WARN, 0,
|
||||
"Too many boot images found. List truncated.");
|
||||
goto after_bootblocks;
|
||||
}
|
||||
/* Read bootblock from section entry */
|
||||
entry = (struct el_torito_section_entry *)(buffer + rx);
|
||||
idx = data->num_bootimgs;
|
||||
data->platform_ids[idx] = sh->platform_id[0];
|
||||
memcpy(data->id_strings[idx], sh->id_string, 28);
|
||||
data->boot_flags[idx] = entry->boot_indicator[0] ? 1 : 0;
|
||||
data->media_types[idx] = entry->boot_media_type[0];
|
||||
data->partition_types[idx] = entry->system_type[0];
|
||||
data->load_segs[idx] = iso_read_lsb(entry->load_seg, 2);
|
||||
data->load_sizes[idx] = iso_read_lsb(entry->sec_count, 2);
|
||||
data->bootblocks[idx] = iso_read_lsb(entry->block, 4);
|
||||
data->selection_crits[idx][0] = entry->selec_criteria[0];
|
||||
memcpy(data->selection_crits[idx] + 1, entry->vendor_sc, 19);
|
||||
data->num_bootimgs++;
|
||||
}
|
||||
}
|
||||
after_bootblocks:;
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
@ -2286,7 +2389,7 @@ ex:
|
||||
int iso_image_filesystem_new(IsoDataSource *src, struct iso_read_opts *opts,
|
||||
int msgid, IsoImageFilesystem **fs)
|
||||
{
|
||||
int ret;
|
||||
int ret, i;
|
||||
uint32_t block;
|
||||
IsoImageFilesystem *ifs;
|
||||
_ImageFsData *data;
|
||||
@ -2325,9 +2428,13 @@ int iso_image_filesystem_new(IsoDataSource *src, struct iso_read_opts *opts,
|
||||
data->md5_load = !opts->nomd5;
|
||||
data->aaip_version = -1;
|
||||
data->make_new_ino = opts->make_new_ino;
|
||||
data->num_bootimgs = 0;
|
||||
for (i = 0; i < Libisofs_max_boot_imageS; i++)
|
||||
data->bootblocks[i] = 0;
|
||||
data->inode_counter = 0;
|
||||
data->px_ino_status = 0;
|
||||
|
||||
|
||||
data->local_charset = strdup(iso_get_local_charset(0));
|
||||
if (data->local_charset == NULL) {
|
||||
ret = ISO_OUT_OF_MEM;
|
||||
@ -2346,9 +2453,6 @@ int iso_image_filesystem_new(IsoDataSource *src, struct iso_read_opts *opts,
|
||||
ifs->free = ifs_fs_free;
|
||||
|
||||
/* read Volume Descriptors and ensure it is a valid image */
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
if (data->md5_load) {
|
||||
/* From opts->block on : check for superblock and tree tags */;
|
||||
ret = iso_src_check_sb_tree(src, opts->block, 0);
|
||||
@ -2363,8 +2467,6 @@ int iso_image_filesystem_new(IsoDataSource *src, struct iso_read_opts *opts,
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
/* 1. first, open the filesystem */
|
||||
ifs_fs_open(ifs);
|
||||
|
||||
@ -2394,21 +2496,18 @@ int iso_image_filesystem_new(IsoDataSource *src, struct iso_read_opts *opts,
|
||||
|| vol->vol_desc_version[0] != 1
|
||||
|| strncmp((char*)vol->boot_sys_id,
|
||||
"EL TORITO SPECIFICATION", 23)) {
|
||||
|
||||
ret = iso_msg_submit(data->msgid,
|
||||
iso_msg_submit(data->msgid,
|
||||
ISO_UNSUPPORTED_EL_TORITO, 0,
|
||||
"Unsupported Boot Vol. Desc. Only El-Torito "
|
||||
"Specification, Version 1.0 Volume "
|
||||
"Descriptors are supported. Ignoring boot info");
|
||||
if (ret < 0) {
|
||||
} else {
|
||||
data->catblock = iso_read_lsb(vol->boot_catalog, 4);
|
||||
ret = read_el_torito_boot_catalog(data, data->catblock);
|
||||
if (ret < 0 && ret != ISO_UNSUPPORTED_EL_TORITO &&
|
||||
ret != ISO_WRONG_EL_TORITO) {
|
||||
goto fs_cleanup;
|
||||
}
|
||||
break;
|
||||
}
|
||||
data->catblock = iso_read_lsb(vol->boot_catalog, 4);
|
||||
ret = read_el_torito_boot_catalog(data, data->catblock);
|
||||
if (ret < 0) {
|
||||
goto fs_cleanup;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -2458,11 +2557,8 @@ int iso_image_filesystem_new(IsoDataSource *src, struct iso_read_opts *opts,
|
||||
*/
|
||||
break;
|
||||
default:
|
||||
ret = iso_msg_submit(data->msgid, ISO_UNSUPPORTED_VD, 0,
|
||||
"Ignoring Volume descriptor %x.", buffer[0]);
|
||||
if (ret < 0) {
|
||||
goto fs_cleanup;
|
||||
}
|
||||
iso_msg_submit(data->msgid, ISO_UNSUPPORTED_VD, 0,
|
||||
"Ignoring Volume descriptor %x.", buffer[0]);
|
||||
break;
|
||||
}
|
||||
block++;
|
||||
@ -2582,7 +2678,7 @@ static
|
||||
int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
||||
IsoFileSource *src, IsoNode **node)
|
||||
{
|
||||
int ret;
|
||||
int ret, idx;
|
||||
struct stat info;
|
||||
IsoNode *new;
|
||||
char *name;
|
||||
@ -2694,11 +2790,16 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
||||
new = (IsoNode*) file;
|
||||
new->refcount = 0;
|
||||
|
||||
if (fsdata->eltorito && data->sections[0].block == fsdata->imgblock) {
|
||||
for (idx = 0; idx < fsdata->num_bootimgs; idx++)
|
||||
if (fsdata->eltorito && data->sections[0].block ==
|
||||
fsdata->bootblocks[idx])
|
||||
break;
|
||||
if (idx < fsdata->num_bootimgs) {
|
||||
/* it is boot image node */
|
||||
if (image->bootcat->image->image != NULL) {
|
||||
|
||||
if (image->bootcat->bootimages[idx]->image != NULL) {
|
||||
ret = iso_msg_submit(image->id, ISO_EL_TORITO_WARN, 0,
|
||||
"More than one image node has been found.");
|
||||
"More than one ISO node has been found for the same boot image.");
|
||||
if (ret < 0) {
|
||||
free(name);
|
||||
iso_stream_unref(stream);
|
||||
@ -2706,7 +2807,7 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
||||
}
|
||||
} else {
|
||||
/* and set the image node */
|
||||
image->bootcat->image->image = file;
|
||||
image->bootcat->bootimages[idx]->image = file;
|
||||
new->refcount++;
|
||||
}
|
||||
}
|
||||
@ -2846,7 +2947,7 @@ int iso_image_builder_new(IsoNodeBuilder *old, IsoNodeBuilder **builder)
|
||||
* accessible from the ISO filesystem.
|
||||
*/
|
||||
static
|
||||
int create_boot_img_filesrc(IsoImageFilesystem *fs, IsoImage *image,
|
||||
int create_boot_img_filesrc(IsoImageFilesystem *fs, IsoImage *image, int idx,
|
||||
IsoFileSource **src)
|
||||
{
|
||||
int ret;
|
||||
@ -2903,8 +3004,7 @@ int create_boot_img_filesrc(IsoImageFilesystem *fs, IsoImage *image,
|
||||
ifsdata->parent = NULL;
|
||||
ifsdata->info = atts;
|
||||
ifsdata->name = NULL;
|
||||
|
||||
ifsdata->sections[0].block = fsdata->imgblock;
|
||||
ifsdata->sections[0].block = fsdata->bootblocks[idx];
|
||||
ifsdata->sections[0].size = BLOCK_SIZE;
|
||||
ifsdata->nsections = 1;
|
||||
|
||||
@ -2921,12 +3021,112 @@ boot_fs_cleanup: ;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** ??? >>> ts B00428 : should the max size become public ? */
|
||||
#define Libisofs_boot_image_max_sizE (4096*1024)
|
||||
|
||||
/** Guess which of the loaded boot images contain boot information tables.
|
||||
Set boot->seems_boot_info_table accordingly.
|
||||
*/
|
||||
static
|
||||
int iso_image_eval_boot_info_table(IsoImage *image, struct iso_read_opts *opts,
|
||||
IsoDataSource *src, uint32_t iso_image_size, int flag)
|
||||
{
|
||||
int i, ret, section_count, todo, chunk;
|
||||
uint32_t img_lba, img_size, boot_pvd_found, image_pvd, alleged_size;
|
||||
struct iso_file_section *sections = NULL;
|
||||
struct el_torito_boot_image *boot;
|
||||
uint8_t *boot_image_buf = NULL, boot_info_found[16], buf[BLOCK_SIZE];
|
||||
IsoStream *stream = NULL;
|
||||
IsoFile *boot_file;
|
||||
|
||||
if (image->bootcat == NULL)
|
||||
return ISO_SUCCESS;
|
||||
for (i = 0; i < image->bootcat->num_bootimages; i++) {
|
||||
boot = image->bootcat->bootimages[i];
|
||||
boot_file = boot->image;
|
||||
boot->seems_boot_info_table = 0;
|
||||
img_size = iso_file_get_size(boot_file);
|
||||
if (img_size > Libisofs_boot_image_max_sizE || img_size < 64)
|
||||
continue;
|
||||
img_lba = 0;
|
||||
sections = NULL;
|
||||
ret = iso_file_get_old_image_sections(boot_file,
|
||||
§ion_count, §ions, 0);
|
||||
if (ret == 1 && section_count > 0)
|
||||
img_lba = sections[0].block;
|
||||
if (sections != NULL) {
|
||||
free(sections);
|
||||
sections = NULL;
|
||||
}
|
||||
if(img_lba == 0)
|
||||
continue;
|
||||
|
||||
boot_image_buf = calloc(1, img_size);
|
||||
if (boot_image_buf == NULL) {
|
||||
ret = ISO_OUT_OF_MEM;
|
||||
goto ex;
|
||||
}
|
||||
stream = iso_file_get_stream(boot_file);
|
||||
ret = iso_stream_open(stream);
|
||||
if (ret < 0) {
|
||||
stream = NULL;
|
||||
goto ex;
|
||||
}
|
||||
for (todo = img_size; todo > 0; ) {
|
||||
if (todo > BLOCK_SIZE)
|
||||
chunk = BLOCK_SIZE;
|
||||
else
|
||||
chunk = todo;
|
||||
ret = iso_stream_read(stream, boot_image_buf + (img_size - todo),
|
||||
chunk);
|
||||
if (ret != chunk) {
|
||||
ret = (ret < 0) ? ret : ISO_FILE_READ_ERROR;
|
||||
goto ex;
|
||||
}
|
||||
todo -= chunk;
|
||||
}
|
||||
iso_stream_close(stream);
|
||||
stream = NULL;
|
||||
|
||||
memcpy(boot_info_found, boot_image_buf + 8, 16);
|
||||
boot_pvd_found = iso_read_lsb(boot_info_found, 4);
|
||||
image_pvd = (uint32_t) (opts->block + 16);
|
||||
|
||||
/* Accomodate to eventually relocated superblock */
|
||||
if (image_pvd != boot_pvd_found &&
|
||||
image_pvd == 16 && boot_pvd_found < iso_image_size) {
|
||||
/* Check whether there is a PVD at boot_pvd_found
|
||||
and whether it bears the same image size
|
||||
*/
|
||||
ret = read_pvd_block(src, boot_pvd_found, buf, &alleged_size);
|
||||
if (ret == 1 &&
|
||||
alleged_size + boot_pvd_found == iso_image_size + image_pvd)
|
||||
image_pvd = boot_pvd_found;
|
||||
}
|
||||
|
||||
ret = make_boot_info_table(boot_image_buf, image_pvd,
|
||||
img_lba, img_size);
|
||||
if (ret < 0)
|
||||
goto ex;
|
||||
if (memcmp(boot_image_buf + 8, boot_info_found, 16) == 0)
|
||||
boot->seems_boot_info_table = 1;
|
||||
free(boot_image_buf);
|
||||
boot_image_buf = NULL;
|
||||
}
|
||||
ret = 1;
|
||||
ex:;
|
||||
if (boot_image_buf != NULL)
|
||||
free(boot_image_buf);
|
||||
if (stream != NULL)
|
||||
iso_stream_close(stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
struct iso_read_opts *opts,
|
||||
IsoReadImageFeatures **features)
|
||||
{
|
||||
int ret, hflag;
|
||||
int ret, hflag, i, idx;
|
||||
IsoImageFilesystem *fs;
|
||||
IsoFilesystem *fsback;
|
||||
IsoNodeBuilder *blback;
|
||||
@ -2934,9 +3134,9 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
IsoFileSource *newroot;
|
||||
_ImageFsData *data;
|
||||
struct el_torito_boot_catalog *oldbootcat;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
int i;
|
||||
uint8_t *rpt;
|
||||
IsoFileSource *boot_src;
|
||||
IsoNode *node;
|
||||
uint32_t old_checksum_start_lba;
|
||||
uint32_t old_checksum_end_lba;
|
||||
uint32_t old_checksum_idx_count;
|
||||
@ -2944,21 +3144,37 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
char checksum_type[81];
|
||||
uint32_t checksum_size;
|
||||
size_t size;
|
||||
uint8_t *rpt;
|
||||
void *ctx = NULL;
|
||||
char md5[16];
|
||||
#endif
|
||||
|
||||
if (image == NULL || src == NULL || opts == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
|
||||
|
||||
ret = iso_image_filesystem_new(src, opts, image->id, &fs);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
data = fs->data;
|
||||
|
||||
|
||||
if (opts->load_system_area) {
|
||||
if (image->system_area_data != NULL)
|
||||
free(image->system_area_data);
|
||||
image->system_area_data = calloc(32768, 1);
|
||||
if (image->system_area_data == NULL)
|
||||
return ISO_OUT_OF_MEM;
|
||||
image->system_area_options = 0;
|
||||
/* Read 32768 bytes */
|
||||
for (i = 0; i < 16; i++) {
|
||||
rpt = (uint8_t *) (image->system_area_data + i * 2048);
|
||||
ret = src->read_block(src, opts->block + i, rpt);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
/* get root from filesystem */
|
||||
ret = fs->get_root(fs, &newroot);
|
||||
if (ret < 0) {
|
||||
@ -2971,14 +3187,11 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
oldroot = image->root;
|
||||
oldbootcat = image->bootcat; /* could be NULL */
|
||||
image->bootcat = NULL;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
old_checksum_start_lba = image->checksum_start_lba;
|
||||
old_checksum_end_lba = image->checksum_end_lba;
|
||||
old_checksum_idx_count = image->checksum_idx_count;
|
||||
old_checksum_array = image->checksum_array;
|
||||
image->checksum_array = NULL;
|
||||
#endif
|
||||
|
||||
/* create new builder */
|
||||
ret = iso_image_builder_new(blback, &image->builder);
|
||||
@ -3023,23 +3236,34 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
struct el_torito_boot_catalog *catalog;
|
||||
ElToritoBootImage *boot_image= NULL;
|
||||
|
||||
boot_image = calloc(1, sizeof(ElToritoBootImage));
|
||||
if (boot_image == NULL) {
|
||||
ret = ISO_OUT_OF_MEM;
|
||||
goto import_revert;
|
||||
}
|
||||
boot_image->bootable = data->bootable;
|
||||
boot_image->type = data->type;
|
||||
boot_image->partition_type = data->partition_type;
|
||||
boot_image->load_seg = data->load_seg;
|
||||
boot_image->load_size = data->load_size;
|
||||
|
||||
catalog = calloc(1, sizeof(struct el_torito_boot_catalog));
|
||||
if (catalog == NULL) {
|
||||
ret = ISO_OUT_OF_MEM;
|
||||
goto import_revert;
|
||||
}
|
||||
catalog->image = boot_image;
|
||||
|
||||
catalog->num_bootimages = 0;
|
||||
for (idx = 0; idx < data->num_bootimgs; idx++) {
|
||||
boot_image = calloc(1, sizeof(ElToritoBootImage));
|
||||
if (boot_image == NULL) {
|
||||
ret = ISO_OUT_OF_MEM;
|
||||
goto import_revert;
|
||||
}
|
||||
boot_image->image = NULL;
|
||||
boot_image->bootable = data->boot_flags[idx] & 1;
|
||||
boot_image->type = data->media_types[idx];
|
||||
boot_image->partition_type = data->partition_types[idx];
|
||||
boot_image->load_seg = data->load_segs[idx];
|
||||
boot_image->load_size = data->load_sizes[idx];
|
||||
boot_image->platform_id = data->platform_ids[idx];
|
||||
memcpy(boot_image->id_string, data->id_strings[idx], 28);
|
||||
memcpy(boot_image->selection_crit, data->selection_crits, 20);
|
||||
|
||||
catalog->bootimages[catalog->num_bootimages] = boot_image;
|
||||
catalog->num_bootimages++;
|
||||
}
|
||||
for ( ; idx < Libisofs_max_boot_imageS; idx++)
|
||||
catalog->bootimages[idx] = NULL;
|
||||
image->bootcat = catalog;
|
||||
}
|
||||
|
||||
@ -3073,21 +3297,23 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
}
|
||||
|
||||
if (data->eltorito) {
|
||||
/* if catalog and image nodes were not filled, we create them here */
|
||||
if (image->bootcat->image->image == NULL) {
|
||||
IsoFileSource *src;
|
||||
IsoNode *node;
|
||||
ret = create_boot_img_filesrc(fs, image, &src);
|
||||
/* if catalog and boot image nodes were not filled,
|
||||
we create them here */
|
||||
for (idx = 0; idx < image->bootcat->num_bootimages; idx++) {
|
||||
if (image->bootcat->bootimages[idx]->image != NULL)
|
||||
continue;
|
||||
ret = create_boot_img_filesrc(fs, image, idx, &boot_src);
|
||||
if (ret < 0) {
|
||||
iso_node_builder_unref(image->builder);
|
||||
goto import_revert;
|
||||
}
|
||||
ret = image_builder_create_node(image->builder, image, src, &node);
|
||||
ret = image_builder_create_node(image->builder, image, boot_src,
|
||||
&node);
|
||||
if (ret < 0) {
|
||||
iso_node_builder_unref(image->builder);
|
||||
goto import_revert;
|
||||
}
|
||||
image->bootcat->image->image = (IsoFile*)node;
|
||||
image->bootcat->bootimages[idx]->image = (IsoFile*)node;
|
||||
|
||||
/* warn about hidden images */
|
||||
iso_msg_submit(image->id, ISO_EL_TORITO_HIDDEN, 0,
|
||||
@ -3140,8 +3366,6 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
(*features)->size = data->nblocks;
|
||||
}
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
if (data->md5_load) {
|
||||
/* Read checksum array */
|
||||
ret = iso_root_get_isofsca((IsoNode *) image->root,
|
||||
@ -3194,7 +3418,9 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
ret = iso_image_eval_boot_info_table(image, opts, src, data->nblocks, 0);
|
||||
if (ret < 0)
|
||||
goto import_revert;
|
||||
|
||||
ret = ISO_SUCCESS;
|
||||
goto import_cleanup;
|
||||
@ -3205,14 +3431,11 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
el_torito_boot_catalog_free(image->bootcat);
|
||||
image->root = oldroot;
|
||||
image->bootcat = oldbootcat;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
old_checksum_start_lba = image->checksum_start_lba;
|
||||
old_checksum_end_lba = image->checksum_end_lba;
|
||||
old_checksum_idx_count = image->checksum_idx_count;
|
||||
image->checksum_array = old_checksum_array;
|
||||
old_checksum_array = NULL;
|
||||
#endif
|
||||
|
||||
import_cleanup:;
|
||||
|
||||
@ -3223,14 +3446,10 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
iso_file_source_unref(newroot);
|
||||
fs->close(fs);
|
||||
iso_filesystem_unref(fs);
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
if (old_checksum_array != NULL)
|
||||
free(old_checksum_array);
|
||||
if (ctx != NULL)
|
||||
iso_md5_end(&ctx, md5);
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -3307,8 +3526,9 @@ int iso_read_opts_new(IsoReadOpts **opts, int profile)
|
||||
|
||||
ropts->file_mode = 0444;
|
||||
ropts->dir_mode = 0555;
|
||||
ropts->noaaip= 1;
|
||||
ropts->nomd5= 1;
|
||||
ropts->noaaip = 1;
|
||||
ropts->nomd5 = 1;
|
||||
ropts->load_system_area = 0;
|
||||
|
||||
*opts = ropts;
|
||||
return ISO_SUCCESS;
|
||||
@ -3444,6 +3664,15 @@ int iso_read_opts_auto_input_charset(IsoReadOpts *opts, int mode)
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
int iso_read_opts_load_system_area(IsoReadOpts *opts, int mode)
|
||||
{
|
||||
if (opts == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
opts->load_system_area = mode & 1;
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy an IsoReadImageFeatures object obtained with iso_image_import.
|
||||
*/
|
||||
|
@ -3,14 +3,19 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Filesystem/FileSource implementation to access the local filesystem.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "fsource.h"
|
||||
#include "util.h"
|
||||
#include "aaip_0_2.h"
|
||||
@ -57,9 +62,19 @@ char* lfs_get_path(IsoFileSource *src)
|
||||
if (data->parent == src) {
|
||||
return strdup("/");
|
||||
} else {
|
||||
char *path = lfs_get_path(data->parent);
|
||||
int pathlen = strlen(path);
|
||||
path = realloc(path, pathlen + strlen(data->name) + 2);
|
||||
char *path, *new_path;
|
||||
int pathlen;
|
||||
|
||||
path = lfs_get_path(data->parent);
|
||||
if (path == NULL)
|
||||
return NULL;
|
||||
pathlen = strlen(path);
|
||||
new_path = realloc(path, pathlen + strlen(data->name) + 2);
|
||||
if (new_path == NULL) {
|
||||
free(path);
|
||||
return NULL;
|
||||
}
|
||||
path= new_path;
|
||||
if (pathlen != 1) {
|
||||
/* pathlen can only be 1 for root */
|
||||
path[pathlen] = '/';
|
||||
|
@ -2,10 +2,15 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "fsource.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
|
@ -3,8 +3,9 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifndef LIBISO_FSOURCE_H_
|
||||
|
@ -3,10 +3,15 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "image.h"
|
||||
#include "node.h"
|
||||
@ -73,19 +78,17 @@ int iso_image_new(const char *name, IsoImage **image)
|
||||
img->volset_id = strdup(name);
|
||||
img->volume_id = strdup(name);
|
||||
}
|
||||
img->system_area_data = NULL;
|
||||
img->system_area_options = 0;
|
||||
img->builder_ignore_acl = 1;
|
||||
img->builder_ignore_ea = 1;
|
||||
img->inode_counter = 0;
|
||||
img->used_inodes = NULL;
|
||||
img->used_inodes_start = 0;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
img->checksum_start_lba = 0;
|
||||
img->checksum_end_lba = 0;
|
||||
img->checksum_idx_count = 0;
|
||||
img->checksum_array = NULL;
|
||||
#endif
|
||||
|
||||
*image = img;
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
@ -142,17 +145,12 @@ void iso_image_unref(IsoImage *image)
|
||||
|
||||
int iso_image_free_checksums(IsoImage *image, int flag)
|
||||
{
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
image->checksum_start_lba = 0;
|
||||
image->checksum_end_lba = 0;
|
||||
image->checksum_idx_count = 0;
|
||||
if (image->checksum_array != NULL)
|
||||
free(image->checksum_array);
|
||||
image->checksum_array = NULL;
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -172,13 +170,13 @@ int iso_image_free_checksums(IsoImage *image, int flag)
|
||||
*/
|
||||
int iso_image_attach_data(IsoImage *image, void *data, void (*give_up)(void*))
|
||||
{
|
||||
if (image == NULL || (data != NULL && free == NULL)) {
|
||||
if (image == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
|
||||
if (image->user_data != NULL) {
|
||||
/* free previously attached data */
|
||||
if (image->user_data_free) {
|
||||
if (image->user_data_free != NULL) {
|
||||
image->user_data_free(image->user_data);
|
||||
}
|
||||
image->user_data = NULL;
|
||||
@ -213,6 +211,8 @@ void iso_image_set_volset_id(IsoImage *image, const char *volset_id)
|
||||
|
||||
const char *iso_image_get_volset_id(const IsoImage *image)
|
||||
{
|
||||
if (image->volset_id == NULL)
|
||||
return "";
|
||||
return image->volset_id;
|
||||
}
|
||||
|
||||
@ -224,6 +224,8 @@ void iso_image_set_volume_id(IsoImage *image, const char *volume_id)
|
||||
|
||||
const char *iso_image_get_volume_id(const IsoImage *image)
|
||||
{
|
||||
if (image->volume_id == NULL)
|
||||
return "";
|
||||
return image->volume_id;
|
||||
}
|
||||
|
||||
@ -235,6 +237,8 @@ void iso_image_set_publisher_id(IsoImage *image, const char *publisher_id)
|
||||
|
||||
const char *iso_image_get_publisher_id(const IsoImage *image)
|
||||
{
|
||||
if (image->publisher_id == NULL)
|
||||
return "";
|
||||
return image->publisher_id;
|
||||
}
|
||||
|
||||
@ -247,6 +251,8 @@ void iso_image_set_data_preparer_id(IsoImage *image,
|
||||
|
||||
const char *iso_image_get_data_preparer_id(const IsoImage *image)
|
||||
{
|
||||
if (image->data_preparer_id == NULL)
|
||||
return "";
|
||||
return image->data_preparer_id;
|
||||
}
|
||||
|
||||
@ -258,6 +264,8 @@ void iso_image_set_system_id(IsoImage *image, const char *system_id)
|
||||
|
||||
const char *iso_image_get_system_id(const IsoImage *image)
|
||||
{
|
||||
if (image->system_id == NULL)
|
||||
return "";
|
||||
return image->system_id;
|
||||
}
|
||||
|
||||
@ -269,6 +277,8 @@ void iso_image_set_application_id(IsoImage *image, const char *application_id)
|
||||
|
||||
const char *iso_image_get_application_id(const IsoImage *image)
|
||||
{
|
||||
if (image->application_id == NULL)
|
||||
return "";
|
||||
return image->application_id;
|
||||
}
|
||||
|
||||
@ -281,6 +291,8 @@ void iso_image_set_copyright_file_id(IsoImage *image,
|
||||
|
||||
const char *iso_image_get_copyright_file_id(const IsoImage *image)
|
||||
{
|
||||
if (image->copyright_file_id == NULL)
|
||||
return "";
|
||||
return image->copyright_file_id;
|
||||
}
|
||||
|
||||
@ -293,6 +305,8 @@ void iso_image_set_abstract_file_id(IsoImage *image,
|
||||
|
||||
const char *iso_image_get_abstract_file_id(const IsoImage *image)
|
||||
{
|
||||
if (image->abstract_file_id == NULL)
|
||||
return "";
|
||||
return image->abstract_file_id;
|
||||
}
|
||||
|
||||
@ -304,6 +318,8 @@ void iso_image_set_biblio_file_id(IsoImage *image, const char *biblio_file_id)
|
||||
|
||||
const char *iso_image_get_biblio_file_id(const IsoImage *image)
|
||||
{
|
||||
if (image->biblio_file_id == NULL)
|
||||
return "";
|
||||
return image->biblio_file_id;
|
||||
}
|
||||
|
||||
@ -312,6 +328,16 @@ int iso_image_get_msg_id(IsoImage *image)
|
||||
return image->id;
|
||||
}
|
||||
|
||||
int iso_image_get_system_area(IsoImage *img, char system_area_data[32768],
|
||||
int *options, int flag)
|
||||
{
|
||||
*options = img->system_area_options;
|
||||
if (img->system_area_data == NULL)
|
||||
return 0;
|
||||
memcpy(system_area_data, img->system_area_data, 32768);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static
|
||||
int dir_update_size(IsoImage *image, IsoDir *dir)
|
||||
{
|
||||
@ -561,39 +587,23 @@ ex:;
|
||||
int iso_image_get_session_md5(IsoImage *image, uint32_t *start_lba,
|
||||
uint32_t *end_lba, char md5[16], int flag)
|
||||
{
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
if (image->checksum_array == NULL || image->checksum_idx_count < 1)
|
||||
return 0;
|
||||
*start_lba = image->checksum_start_lba;
|
||||
*end_lba = image->checksum_end_lba;
|
||||
memcpy(md5, image->checksum_array, 16);
|
||||
return ISO_SUCCESS;
|
||||
|
||||
#else
|
||||
|
||||
return 0;
|
||||
|
||||
#endif /* ! Libisofs_with_checksumS */
|
||||
|
||||
}
|
||||
|
||||
int iso_image_set_checksums(IsoImage *image, char *checksum_array,
|
||||
uint32_t start_lba, uint32_t end_lba,
|
||||
uint32_t idx_count, int flag)
|
||||
{
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
iso_image_free_checksums(image, 0);
|
||||
image->checksum_array = checksum_array;
|
||||
image->checksum_start_lba = start_lba;
|
||||
image->checksum_end_lba = end_lba;
|
||||
image->checksum_idx_count = idx_count;
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -3,8 +3,9 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
#ifndef LIBISO_IMAGE_H_
|
||||
#define LIBISO_IMAGE_H_
|
||||
@ -52,6 +53,11 @@ struct Iso_Image
|
||||
/* el-torito boot catalog */
|
||||
struct el_torito_boot_catalog *bootcat;
|
||||
|
||||
/* Eventually loaded system area data, or NULL */
|
||||
char *system_area_data;
|
||||
/* Prescribed/detected options, see iso_write_opts_set_system_area() */
|
||||
int system_area_options;
|
||||
|
||||
/* image identifier, for message origin identifier */
|
||||
int id;
|
||||
|
||||
@ -148,8 +154,6 @@ struct Iso_Image
|
||||
uint8_t *used_inodes;
|
||||
ino_t used_inodes_start;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
/**
|
||||
* Array of MD5 checksums as announced by xattr "isofs.ca" of the
|
||||
* root node. Array element 0 contains an overall image checksum for the
|
||||
@ -162,8 +166,6 @@ struct Iso_Image
|
||||
uint32_t checksum_idx_count;
|
||||
char *checksum_array;
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -2,10 +2,15 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "iso1999.h"
|
||||
#include "messages.h"
|
||||
#include "writer.h"
|
||||
@ -711,7 +716,7 @@ void write_one_dir_record(Ecma119Image *t, Iso1999Node *node, int file_id,
|
||||
iso_bb(rec->length, len, 4);
|
||||
iso_datetime_7(rec->recording_time, t->now, t->always_gmt);
|
||||
rec->flags[0] = ((node->type == ISO1999_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0);
|
||||
iso_bb(rec->vol_seq_number, 1, 2);
|
||||
iso_bb(rec->vol_seq_number, (uint32_t) 1, 2);
|
||||
rec->len_fi[0] = len_fi;
|
||||
}
|
||||
|
||||
@ -762,9 +767,9 @@ int iso1999_writer_write_vol_desc(IsoImageWriter *writer)
|
||||
strncpy_pad((char*)vol.volume_id, vol_id, 32);
|
||||
|
||||
iso_bb(vol.vol_space_size, t->vol_space_size, 4);
|
||||
iso_bb(vol.vol_set_size, 1, 2);
|
||||
iso_bb(vol.vol_seq_number, 1, 2);
|
||||
iso_bb(vol.block_size, BLOCK_SIZE, 2);
|
||||
iso_bb(vol.vol_set_size, (uint32_t) 1, 2);
|
||||
iso_bb(vol.vol_seq_number, (uint32_t) 1, 2);
|
||||
iso_bb(vol.block_size, (uint32_t) BLOCK_SIZE, 2);
|
||||
iso_bb(vol.path_table_size, t->iso1999_path_table_size, 4);
|
||||
iso_lsb(vol.l_path_table_pos, t->iso1999_l_path_table_pos, 4);
|
||||
iso_msb(vol.m_path_table_pos, t->iso1999_m_path_table_pos, 4);
|
||||
@ -1023,6 +1028,7 @@ int iso1999_writer_create(Ecma119Image *target)
|
||||
"Creating low level ISO 9660:1999 tree...");
|
||||
ret = iso1999_tree_create(target);
|
||||
if (ret < 0) {
|
||||
free((char *) writer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -3,10 +3,15 @@
|
||||
* Copyright (c) 2007 Mario Danic
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "joliet.h"
|
||||
#include "messages.h"
|
||||
#include "writer.h"
|
||||
@ -42,7 +47,7 @@ int get_joliet_name(Ecma119Image *t, IsoNode *iso, uint16_t **name)
|
||||
if (iso->type == LIBISO_DIR) {
|
||||
jname = iso_j_dir_id(ucs_name);
|
||||
} else {
|
||||
jname = iso_j_file_id(ucs_name);
|
||||
jname = iso_j_file_id(ucs_name, !!(t->no_force_dots & 2));
|
||||
}
|
||||
free(ucs_name);
|
||||
if (jname != NULL) {
|
||||
@ -551,17 +556,19 @@ int joliet_tree_create(Ecma119Image *t)
|
||||
}
|
||||
|
||||
/* the Joliet tree is stored in Ecma119Image target */
|
||||
t->joliet_root = root;
|
||||
if (t->eff_partition_offset > 0) {
|
||||
t->j_part_root = root;
|
||||
} else {
|
||||
t->joliet_root = root;
|
||||
}
|
||||
|
||||
iso_msg_debug(t->image->id, "Sorting the Joliet tree...");
|
||||
sort_tree(root);
|
||||
|
||||
iso_msg_debug(t->image->id, "Mangling Joliet names...");
|
||||
ret = mangle_tree(t, t->joliet_root);
|
||||
if (ret < 0) {
|
||||
ret = mangle_tree(t, root);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
@ -573,7 +580,7 @@ size_t calc_dirent_len(Ecma119Image *t, JolietNode *n)
|
||||
{
|
||||
/* note than name len is always even, so we always need the pad byte */
|
||||
int ret = n->name ? ucslen(n->name) * 2 + 34 : 34;
|
||||
if (n->type == JOLIET_FILE && !t->omit_version_numbers) {
|
||||
if (n->type == JOLIET_FILE && !(t->omit_version_numbers & 3)) {
|
||||
/* take into account version numbers */
|
||||
ret += 4;
|
||||
}
|
||||
@ -668,6 +675,7 @@ int joliet_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
{
|
||||
Ecma119Image *t;
|
||||
uint32_t path_table_size;
|
||||
size_t ndirs;
|
||||
|
||||
if (writer == NULL) {
|
||||
return ISO_OUT_OF_MEM;
|
||||
@ -691,6 +699,24 @@ int joliet_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
t->curblock += DIV_UP(path_table_size, BLOCK_SIZE);
|
||||
t->joliet_path_table_size = path_table_size;
|
||||
|
||||
if (t->partition_offset > 0) {
|
||||
/* Take into respect second directory tree */
|
||||
ndirs = t->joliet_ndirs;
|
||||
t->joliet_ndirs = 0;
|
||||
calc_dir_pos(t, t->j_part_root);
|
||||
if (t->joliet_ndirs != ndirs) {
|
||||
iso_msg_submit(t->image->id, ISO_ASSERT_FAILURE, 0,
|
||||
"Number of directories differs in Joliet partiton_tree");
|
||||
return ISO_ASSERT_FAILURE;
|
||||
}
|
||||
/* Take into respect second set of path tables */
|
||||
path_table_size = calc_path_table_size(t->j_part_root);
|
||||
t->j_part_l_path_table_pos = t->curblock;
|
||||
t->curblock += DIV_UP(path_table_size, BLOCK_SIZE);
|
||||
t->j_part_m_path_table_pos = t->curblock;
|
||||
t->curblock += DIV_UP(path_table_size, BLOCK_SIZE);
|
||||
}
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
@ -721,7 +747,7 @@ void write_one_dir_record(Ecma119Image *t, JolietNode *node, int file_id,
|
||||
|
||||
memcpy(rec->file_id, name, len_fi);
|
||||
|
||||
if (node->type == JOLIET_FILE && !t->omit_version_numbers) {
|
||||
if (node->type == JOLIET_FILE && !(t->omit_version_numbers & 3)) {
|
||||
len_dr += 4;
|
||||
rec->file_id[len_fi++] = 0;
|
||||
rec->file_id[len_fi++] = ';';
|
||||
@ -753,11 +779,11 @@ void write_one_dir_record(Ecma119Image *t, JolietNode *node, int file_id,
|
||||
node = node->parent;
|
||||
|
||||
rec->len_dr[0] = len_dr;
|
||||
iso_bb(rec->block, block, 4);
|
||||
iso_bb(rec->block, block - t->eff_partition_offset, 4);
|
||||
iso_bb(rec->length, len, 4);
|
||||
iso_datetime_7(rec->recording_time, t->now, t->always_gmt);
|
||||
rec->flags[0] = ((node->type == JOLIET_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0);
|
||||
iso_bb(rec->vol_seq_number, 1, 2);
|
||||
iso_bb(rec->vol_seq_number, (uint32_t) 1, 2);
|
||||
rec->len_fi[0] = len_fi;
|
||||
}
|
||||
|
||||
@ -789,7 +815,6 @@ void ucsncpy_pad(uint16_t *dest, const uint16_t *src, size_t max)
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
int joliet_writer_write_vol_desc(IsoImageWriter *writer)
|
||||
{
|
||||
IsoImage *image;
|
||||
@ -830,16 +855,25 @@ int joliet_writer_write_vol_desc(IsoImageWriter *writer)
|
||||
|
||||
/* make use of UCS-2 Level 3 */
|
||||
memcpy(vol.esc_sequences, "%/E", 3);
|
||||
|
||||
iso_bb(vol.vol_space_size, t->vol_space_size, 4);
|
||||
iso_bb(vol.vol_set_size, 1, 2);
|
||||
iso_bb(vol.vol_seq_number, 1, 2);
|
||||
iso_bb(vol.block_size, BLOCK_SIZE, 2);
|
||||
iso_bb(vol.vol_space_size, t->vol_space_size - t->eff_partition_offset,
|
||||
4);
|
||||
iso_bb(vol.vol_set_size, (uint32_t) 1, 2);
|
||||
iso_bb(vol.vol_seq_number, (uint32_t) 1, 2);
|
||||
iso_bb(vol.block_size, (uint32_t) BLOCK_SIZE, 2);
|
||||
iso_bb(vol.path_table_size, t->joliet_path_table_size, 4);
|
||||
iso_lsb(vol.l_path_table_pos, t->joliet_l_path_table_pos, 4);
|
||||
iso_msb(vol.m_path_table_pos, t->joliet_m_path_table_pos, 4);
|
||||
|
||||
write_one_dir_record(t, t->joliet_root, 0, vol.root_dir_record, 1, 0);
|
||||
if (t->eff_partition_offset > 0) {
|
||||
/* Point to second tables and second root */
|
||||
iso_lsb(vol.l_path_table_pos,
|
||||
t->j_part_l_path_table_pos - t->eff_partition_offset, 4);
|
||||
iso_msb(vol.m_path_table_pos,
|
||||
t->j_part_m_path_table_pos - t->eff_partition_offset, 4);
|
||||
write_one_dir_record(t, t->j_part_root, 0, vol.root_dir_record, 1, 0);
|
||||
} else {
|
||||
iso_lsb(vol.l_path_table_pos, t->joliet_l_path_table_pos, 4);
|
||||
iso_msb(vol.m_path_table_pos, t->joliet_m_path_table_pos, 4);
|
||||
write_one_dir_record(t, t->joliet_root, 0, vol.root_dir_record, 1, 0);
|
||||
}
|
||||
|
||||
ucsncpy_pad((uint16_t*)vol.vol_set_id, volset_id, 128);
|
||||
ucsncpy_pad((uint16_t*)vol.publisher_id, pub_id, 128);
|
||||
@ -898,7 +932,7 @@ int write_one_dir(Ecma119Image *t, JolietNode *dir)
|
||||
/* compute len of directory entry */
|
||||
fi_len = ucslen(child->name) * 2;
|
||||
len = fi_len + 34;
|
||||
if (child->type == JOLIET_FILE && !t->omit_version_numbers) {
|
||||
if (child->type == JOLIET_FILE && !(t->omit_version_numbers & 3)) {
|
||||
len += 4;
|
||||
}
|
||||
|
||||
@ -979,7 +1013,8 @@ int write_path_table(Ecma119Image *t, JolietNode **pathlist, int l_type)
|
||||
rec = (struct ecma119_path_table_record*) buf;
|
||||
rec->len_di[0] = dir->parent ? (uint8_t) ucslen(dir->name) * 2 : 1;
|
||||
rec->len_xa[0] = 0;
|
||||
write_int(rec->block, dir->info.dir->block, 4);
|
||||
write_int(rec->block, dir->info.dir->block - t->eff_partition_offset,
|
||||
4);
|
||||
write_int(rec->parent, parent + 1, 2);
|
||||
if (dir->parent) {
|
||||
memcpy(rec->dir_id, dir->name, rec->len_di[0]);
|
||||
@ -1018,7 +1053,12 @@ int write_path_tables(Ecma119Image *t)
|
||||
if (pathlist == NULL) {
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
pathlist[0] = t->joliet_root;
|
||||
|
||||
if (t->eff_partition_offset > 0) {
|
||||
pathlist[0] = t->j_part_root;
|
||||
} else {
|
||||
pathlist[0] = t->joliet_root;
|
||||
}
|
||||
cur = 1;
|
||||
|
||||
for (i = 0; i < t->joliet_ndirs; i++) {
|
||||
@ -1046,18 +1086,21 @@ int write_path_tables(Ecma119Image *t)
|
||||
}
|
||||
|
||||
static
|
||||
int joliet_writer_write_data(IsoImageWriter *writer)
|
||||
int joliet_writer_write_dirs(IsoImageWriter *writer)
|
||||
{
|
||||
int ret;
|
||||
Ecma119Image *t;
|
||||
JolietNode *root;
|
||||
|
||||
if (writer == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
t = writer->target;
|
||||
|
||||
/* first of all, we write the directory structure */
|
||||
ret = write_dirs(t, t->joliet_root);
|
||||
if (t->eff_partition_offset > 0) {
|
||||
root = t->j_part_root;
|
||||
} else {
|
||||
root = t->joliet_root;
|
||||
}
|
||||
ret = write_dirs(t, root);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@ -1068,12 +1111,40 @@ int joliet_writer_write_data(IsoImageWriter *writer)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static
|
||||
int joliet_writer_write_data(IsoImageWriter *writer)
|
||||
{
|
||||
int ret;
|
||||
Ecma119Image *t;
|
||||
|
||||
if (writer == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
t = writer->target;
|
||||
|
||||
ret = joliet_writer_write_dirs(writer);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (t->partition_offset > 0) {
|
||||
t->eff_partition_offset = t->partition_offset;
|
||||
ret = joliet_writer_write_dirs(writer);
|
||||
t->eff_partition_offset = 0;
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
static
|
||||
int joliet_writer_free_data(IsoImageWriter *writer)
|
||||
{
|
||||
/* free the Joliet tree */
|
||||
Ecma119Image *t = writer->target;
|
||||
joliet_node_free(t->joliet_root);
|
||||
if (t->j_part_root != NULL)
|
||||
joliet_node_free(t->j_part_root);
|
||||
t->j_part_root = NULL;
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
@ -1097,12 +1168,23 @@ int joliet_writer_create(Ecma119Image *target)
|
||||
iso_msg_debug(target->image->id, "Creating low level Joliet tree...");
|
||||
ret = joliet_tree_create(target);
|
||||
if (ret < 0) {
|
||||
free((char *) writer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* add this writer to image */
|
||||
target->writers[target->nwriters++] = writer;
|
||||
|
||||
if(target->partition_offset > 0) {
|
||||
/* Create second tree */
|
||||
target->eff_partition_offset = target->partition_offset;
|
||||
ret = joliet_tree_create(target);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
target->eff_partition_offset = 0;
|
||||
}
|
||||
|
||||
/* we need the volume descriptor */
|
||||
target->curblock++;
|
||||
return ISO_SUCCESS;
|
||||
|
@ -3,8 +3,9 @@
|
||||
* Copyright (c) 2007 Mario Danic
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
/**
|
||||
@ -53,4 +54,10 @@ struct joliet_node
|
||||
*/
|
||||
int joliet_writer_create(Ecma119Image *target);
|
||||
|
||||
|
||||
/* Not to be called but only for comparison with target->writers[i]
|
||||
*/
|
||||
int joliet_writer_write_vol_desc(IsoImageWriter *writer);
|
||||
|
||||
|
||||
#endif /* LIBISO_JOLIET_H */
|
||||
|
@ -2,9 +2,13 @@
|
||||
/* libiso_msgs (generated from libdax_msgs : Fri Feb 22 19:42:52 CET 2008)
|
||||
Message handling facility of libisofs.
|
||||
Copyright (C) 2006 - 2008 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
provided under GPL version 2
|
||||
provided under GPL version 2 or later
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
@ -2,7 +2,7 @@
|
||||
/* libiso_msgs (generated from libdax_msgs : Fri Feb 22 19:42:52 CET 2008)
|
||||
Message handling facility of libisofs.
|
||||
Copyright (C) 2006-2008 Thomas Schmitt <scdbackup@gmx.net>,
|
||||
provided under GPL version 2
|
||||
provided under GPL version 2 or later
|
||||
*/
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
291
libisofs/libisofs.ver
Normal file
291
libisofs/libisofs.ver
Normal file
@ -0,0 +1,291 @@
|
||||
LIBISOFS6 {
|
||||
global:
|
||||
aaip_xinfo_func;
|
||||
el_torito_get_bootable;
|
||||
el_torito_get_boot_media_type;
|
||||
el_torito_get_boot_platform_id;
|
||||
el_torito_get_id_string;
|
||||
el_torito_get_isolinux_options;
|
||||
el_torito_get_load_seg;
|
||||
el_torito_get_load_size;
|
||||
el_torito_get_selection_crit;
|
||||
el_torito_patch_isolinux_image;
|
||||
el_torito_seems_boot_info_table;
|
||||
el_torito_set_boot_platform_id;
|
||||
el_torito_set_id_string;
|
||||
el_torito_set_isolinux_options;
|
||||
el_torito_set_load_seg;
|
||||
el_torito_set_load_size;
|
||||
el_torito_set_no_bootable;
|
||||
el_torito_set_selection_crit;
|
||||
iso_data_source_new_from_file;
|
||||
iso_data_source_ref;
|
||||
iso_data_source_unref;
|
||||
iso_dir_add_node;
|
||||
iso_dir_find_children;
|
||||
iso_dir_get_children;
|
||||
iso_dir_get_children_count;
|
||||
iso_dir_get_node;
|
||||
iso_dir_iter_free;
|
||||
iso_dir_iter_has_next;
|
||||
iso_dir_iter_next;
|
||||
iso_dir_iter_remove;
|
||||
iso_dir_iter_take;
|
||||
iso_error_get_code;
|
||||
iso_error_get_priority;
|
||||
iso_error_get_severity;
|
||||
iso_error_to_msg;
|
||||
iso_file_add_external_filter;
|
||||
iso_file_add_gzip_filter;
|
||||
iso_file_add_zisofs_filter;
|
||||
iso_file_get_md5;
|
||||
iso_file_get_old_image_lba;
|
||||
iso_file_get_old_image_sections;
|
||||
iso_file_get_size;
|
||||
iso_file_get_sort_weight;
|
||||
iso_file_get_stream;
|
||||
iso_file_make_md5;
|
||||
iso_file_remove_filter;
|
||||
iso_file_source_access;
|
||||
iso_file_source_close;
|
||||
iso_file_source_get_aa_string;
|
||||
iso_file_source_get_filesystem;
|
||||
iso_file_source_get_name;
|
||||
iso_file_source_get_path;
|
||||
iso_file_source_lseek;
|
||||
iso_file_source_lstat;
|
||||
iso_file_source_open;
|
||||
iso_file_source_read;
|
||||
iso_file_source_readdir;
|
||||
iso_file_source_readlink;
|
||||
iso_file_source_ref;
|
||||
iso_file_source_stat;
|
||||
iso_file_source_unref;
|
||||
iso_filesystem_ref;
|
||||
iso_filesystem_unref;
|
||||
iso_finish;
|
||||
iso_get_local_charset;
|
||||
iso_get_messenger;
|
||||
iso_gzip_get_refcounts;
|
||||
iso_image_add_boot_image;
|
||||
iso_image_attach_data;
|
||||
iso_image_create_burn_source;
|
||||
iso_image_filesystem_new;
|
||||
iso_image_fs_get_abstract_file_id;
|
||||
iso_image_fs_get_application_id;
|
||||
iso_image_fs_get_biblio_file_id;
|
||||
iso_image_fs_get_copyright_file_id;
|
||||
iso_image_fs_get_data_preparer_id;
|
||||
iso_image_fs_get_publisher_id;
|
||||
iso_image_fs_get_system_id;
|
||||
iso_image_fs_get_volset_id;
|
||||
iso_image_fs_get_volume_id;
|
||||
iso_image_get_abstract_file_id;
|
||||
iso_image_get_all_boot_imgs;
|
||||
iso_image_get_application_id;
|
||||
iso_image_get_attached_data;
|
||||
iso_image_get_biblio_file_id;
|
||||
iso_image_get_boot_image;
|
||||
iso_image_get_copyright_file_id;
|
||||
iso_image_get_data_preparer_id;
|
||||
iso_image_get_msg_id;
|
||||
iso_image_get_publisher_id;
|
||||
iso_image_get_root;
|
||||
iso_image_get_session_md5;
|
||||
iso_image_get_system_area;
|
||||
iso_image_get_system_id;
|
||||
iso_image_get_volset_id;
|
||||
iso_image_get_volume_id;
|
||||
iso_image_import;
|
||||
iso_image_new;
|
||||
iso_image_ref;
|
||||
iso_image_remove_boot_image;
|
||||
iso_image_set_abstract_file_id;
|
||||
iso_image_set_application_id;
|
||||
iso_image_set_biblio_file_id;
|
||||
iso_image_set_boot_catalog_hidden;
|
||||
iso_image_set_boot_catalog_weight;
|
||||
iso_image_set_boot_image;
|
||||
iso_image_set_copyright_file_id;
|
||||
iso_image_set_data_preparer_id;
|
||||
iso_image_set_ignore_aclea;
|
||||
iso_image_set_publisher_id;
|
||||
iso_image_set_system_id;
|
||||
iso_image_set_volset_id;
|
||||
iso_image_set_volume_id;
|
||||
iso_image_unref;
|
||||
iso_image_update_sizes;
|
||||
iso_init;
|
||||
iso_init_with_flag;
|
||||
iso_lib_is_compatible;
|
||||
iso_lib_version;
|
||||
iso_local_get_acl_text;
|
||||
iso_local_get_attrs;
|
||||
iso_local_get_perms_wo_acl;
|
||||
iso_local_set_acl_text;
|
||||
iso_local_set_attrs;
|
||||
iso_md5_clone;
|
||||
iso_md5_compute;
|
||||
iso_md5_end;
|
||||
iso_md5_match;
|
||||
iso_md5_start;
|
||||
iso_msgs_submit;
|
||||
iso_new_find_conditions_and;
|
||||
iso_new_find_conditions_atime;
|
||||
iso_new_find_conditions_ctime;
|
||||
iso_new_find_conditions_gid;
|
||||
iso_new_find_conditions_mode;
|
||||
iso_new_find_conditions_mtime;
|
||||
iso_new_find_conditions_name;
|
||||
iso_new_find_conditions_not;
|
||||
iso_new_find_conditions_or;
|
||||
iso_new_find_conditions_uid;
|
||||
iso_node_add_xinfo;
|
||||
iso_node_cmp_ino;
|
||||
iso_node_get_acl_text;
|
||||
iso_node_get_atime;
|
||||
iso_node_get_attrs;
|
||||
iso_node_get_ctime;
|
||||
iso_node_get_gid;
|
||||
iso_node_get_hidden;
|
||||
iso_node_get_mode;
|
||||
iso_node_get_mtime;
|
||||
iso_node_get_name;
|
||||
iso_node_get_old_image_lba;
|
||||
iso_node_get_parent;
|
||||
iso_node_get_permissions;
|
||||
iso_node_get_perms_wo_acl;
|
||||
iso_node_get_type;
|
||||
iso_node_get_uid;
|
||||
iso_node_get_xinfo;
|
||||
iso_node_lookup_attr;
|
||||
iso_node_ref;
|
||||
iso_node_remove;
|
||||
iso_node_remove_xinfo;
|
||||
iso_node_set_acl_text;
|
||||
iso_node_set_atime;
|
||||
iso_node_set_attrs;
|
||||
iso_node_set_ctime;
|
||||
iso_node_set_gid;
|
||||
iso_node_set_hidden;
|
||||
iso_node_set_mtime;
|
||||
iso_node_set_name;
|
||||
iso_node_set_permissions;
|
||||
iso_node_set_sort_weight;
|
||||
iso_node_set_uid;
|
||||
iso_node_take;
|
||||
iso_node_unref;
|
||||
iso_node_zf_by_magic;
|
||||
iso_obtain_msgs;
|
||||
iso_read_image_features_destroy;
|
||||
iso_read_image_features_get_size;
|
||||
iso_read_image_features_has_eltorito;
|
||||
iso_read_image_features_has_iso1999;
|
||||
iso_read_image_features_has_joliet;
|
||||
iso_read_image_features_has_rockridge;
|
||||
iso_read_opts_auto_input_charset;
|
||||
iso_read_opts_free;
|
||||
iso_read_opts_load_system_area;
|
||||
iso_read_opts_new;
|
||||
iso_read_opts_set_default_gid;
|
||||
iso_read_opts_set_default_permissions;
|
||||
iso_read_opts_set_default_uid;
|
||||
iso_read_opts_set_input_charset;
|
||||
iso_read_opts_set_new_inos;
|
||||
iso_read_opts_set_no_aaip;
|
||||
iso_read_opts_set_no_iso1999;
|
||||
iso_read_opts_set_no_joliet;
|
||||
iso_read_opts_set_no_md5;
|
||||
iso_read_opts_set_no_rockridge;
|
||||
iso_read_opts_set_preferjoliet;
|
||||
iso_read_opts_set_start_block;
|
||||
iso_ring_buffer_get_status;
|
||||
iso_set_abort_severity;
|
||||
iso_set_local_charset;
|
||||
iso_set_msgs_severities;
|
||||
iso_sev_to_text;
|
||||
iso_special_get_dev;
|
||||
iso_stream_close;
|
||||
iso_stream_cmp_ino;
|
||||
iso_stream_get_external_filter;
|
||||
iso_stream_get_id;
|
||||
iso_stream_get_input_stream;
|
||||
iso_stream_get_size;
|
||||
iso_stream_get_source_path;
|
||||
iso_stream_is_repeatable;
|
||||
iso_stream_open;
|
||||
iso_stream_read;
|
||||
iso_stream_ref;
|
||||
iso_stream_unref;
|
||||
iso_stream_update_size;
|
||||
iso_symlink_get_dest;
|
||||
iso_symlink_set_dest;
|
||||
iso_text_to_sev;
|
||||
iso_tree_add_dir_rec;
|
||||
iso_tree_add_exclude;
|
||||
iso_tree_add_new_cut_out_node;
|
||||
iso_tree_add_new_dir;
|
||||
iso_tree_add_new_file;
|
||||
iso_tree_add_new_node;
|
||||
iso_tree_add_new_special;
|
||||
iso_tree_add_new_symlink;
|
||||
iso_tree_add_node;
|
||||
iso_tree_get_follow_symlinks;
|
||||
iso_tree_get_ignore_hidden;
|
||||
iso_tree_get_ignore_special;
|
||||
iso_tree_get_node_path;
|
||||
iso_tree_get_replace_mode;
|
||||
iso_tree_path_to_node;
|
||||
iso_tree_remove_exclude;
|
||||
iso_tree_set_follow_symlinks;
|
||||
iso_tree_set_ignore_hidden;
|
||||
iso_tree_set_ignore_special;
|
||||
iso_tree_set_replace_mode;
|
||||
iso_tree_set_report_callback;
|
||||
iso_util_decode_md5_tag;
|
||||
iso_write_opts_free;
|
||||
iso_write_opts_get_data_start;
|
||||
iso_write_opts_new;
|
||||
iso_write_opts_set_aaip;
|
||||
iso_write_opts_set_aaip_susp_1_10;
|
||||
iso_write_opts_set_allow_deep_paths;
|
||||
iso_write_opts_set_allow_full_ascii;
|
||||
iso_write_opts_set_allow_longer_paths;
|
||||
iso_write_opts_set_allow_lowercase;
|
||||
iso_write_opts_set_always_gmt;
|
||||
iso_write_opts_set_appendable;
|
||||
iso_write_opts_set_default_dir_mode;
|
||||
iso_write_opts_set_default_file_mode;
|
||||
iso_write_opts_set_default_gid;
|
||||
iso_write_opts_set_default_timestamp;
|
||||
iso_write_opts_set_default_uid;
|
||||
iso_write_opts_set_dir_rec_mtime;
|
||||
iso_write_opts_set_fifo_size;
|
||||
iso_write_opts_set_hardlinks;
|
||||
iso_write_opts_set_iso1999;
|
||||
iso_write_opts_set_iso_level;
|
||||
iso_write_opts_set_joliet;
|
||||
iso_write_opts_set_joliet_longer_paths;
|
||||
iso_write_opts_set_max_37_char_filenames;
|
||||
iso_write_opts_set_ms_block;
|
||||
iso_write_opts_set_no_force_dots;
|
||||
iso_write_opts_set_omit_version_numbers;
|
||||
iso_write_opts_set_output_charset;
|
||||
iso_write_opts_set_overwrite_buf;
|
||||
iso_write_opts_set_part_offset;
|
||||
iso_write_opts_set_pvd_times;
|
||||
iso_write_opts_set_record_md5;
|
||||
iso_write_opts_set_relaxed_vol_atts;
|
||||
iso_write_opts_set_replace_mode;
|
||||
iso_write_opts_set_replace_timestamps;
|
||||
iso_write_opts_set_rockridge;
|
||||
iso_write_opts_set_rrip_1_10_px_ino;
|
||||
iso_write_opts_set_rrip_version_1_10;
|
||||
iso_write_opts_set_scdbackup_tag;
|
||||
iso_write_opts_set_sort_files;
|
||||
iso_write_opts_set_system_area;
|
||||
iso_zisofs_get_params;
|
||||
iso_zisofs_get_refcounts;
|
||||
iso_zisofs_set_params;
|
||||
local: *;
|
||||
};
|
@ -1,3 +1,8 @@
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
@ -10,6 +15,7 @@
|
||||
/* for gettimeofday() */
|
||||
#include <sys/time.h>
|
||||
|
||||
|
||||
/* This code stems from syslinux-3.72/utils/isohybrid, a perl script
|
||||
under GPL which is Copyright 2002-2008 H. Peter Anvin.
|
||||
|
||||
@ -25,13 +31,13 @@ and is now under the licenses to which H.Peter Anvin agreed:
|
||||
or both, at your option.
|
||||
Sincerely, H. Peter Anvin
|
||||
|
||||
In the context of xorriso-standalone, this code is under GPLv2 derived from
|
||||
LGPL. In the context of libisofs this code derives its matching open source
|
||||
In the context of GNU xorriso, this code is under GPLv3+ derived from LGPL.
|
||||
In the context of libisofs this code derives its matching free software
|
||||
license from above stem licenses, typically from LGPL.
|
||||
In case its generosity is needed, here is the 2-clause BSD license:
|
||||
|
||||
make_isohybrid_mbr.c is copyright 2002-2008 H. Peter Anvin
|
||||
and 2008-2009 libburnia project.
|
||||
and 2008-2010 Thomas Schmitt
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
@ -51,8 +57,9 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/* A helper function. One could replace it by one or two macros. */
|
||||
static int lsb_to_buf(char **wpt, int value, int bits, int flag)
|
||||
static int lsb_to_buf(char **wpt, uint32_t value, int bits, int flag)
|
||||
{
|
||||
int b;
|
||||
|
||||
@ -61,6 +68,11 @@ static int lsb_to_buf(char **wpt, int value, int bits, int flag)
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
/* ====================================================================== */
|
||||
/* Deprecated Function */
|
||||
/* ====================================================================== */
|
||||
|
||||
/*
|
||||
* Create a MBR for an isohybrid enabled ISOLINUX boot image.
|
||||
*
|
||||
@ -228,3 +240,214 @@ int make_isohybrid_mbr(int bin_lba, int *img_blocks, char *mbr, int flag)
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
/* ====================================================================== */
|
||||
/* The New MBR Producer */
|
||||
/* ====================================================================== */
|
||||
|
||||
/* The new MBR producer for isohybrid is a slightly generalized version of
|
||||
the deprecated function make_isohybrid_mbr(). It complies to the urge
|
||||
of H.Peter Anvin not to hardcode MBR templates but rather to read a
|
||||
file from the Syslinux tree, and to patch it as was done with the old
|
||||
MBR producer.
|
||||
|
||||
The old algorithm was clarified publicly by the following mail.
|
||||
Changes towards the old algorithm:
|
||||
- 512-byte LBA of boot image is extended to 64 bit (we stay with 32)
|
||||
- check for a magic number is now gone
|
||||
|
||||
The new implementation tries to use similar terms as the mail in order
|
||||
to facilitate its future discussion with Syslinux developers.
|
||||
|
||||
From hpa@zytor.com Thu Apr 1 08:32:52 2010
|
||||
Date: Wed, 31 Mar 2010 14:53:51 -0700
|
||||
From: H. Peter Anvin <hpa@zytor.com>
|
||||
To: For discussion of Syslinux and tftp-hpa <syslinux@zytor.com>
|
||||
Cc: Thomas Schmitt <scdbackup@gmx.net>
|
||||
Subject: Re: [syslinux] port syslinux isohybrid perl script to C
|
||||
|
||||
[...]
|
||||
|
||||
[me:]
|
||||
> Currently i lack of blob and prescriptions.
|
||||
|
||||
The blobs are available in the Syslinux build tree under the names:
|
||||
|
||||
mbr/isohdp[fp]x*.bin
|
||||
|
||||
The default probably should be mbr/isohdppx.bin, but it's ultimately up
|
||||
to the user.
|
||||
|
||||
User definable parameters:
|
||||
|
||||
-> MBR ID (default random 32-bit number,
|
||||
or preserved from previous instance)
|
||||
-> Sector count (default 32, range 1-63)
|
||||
-> Head count (default 64, range 1-256)
|
||||
-> Partition offset (default 0, range 0-64)
|
||||
-> Partition number (default 1, range 1-4)
|
||||
-> Filesystem type (default 0x17, range 1-255)
|
||||
|
||||
Note: the filesystem type is largely arbitrary, in theory it can be any
|
||||
value other than 0x00, 0x05, 0x0f, 0x85, 0xee, or 0xef. 0x17 ("Windows
|
||||
IFS Hidden") seems safeish, some people believe 0x83 (Linux) is better.
|
||||
|
||||
Here is the prescriptions for how to install it:
|
||||
|
||||
All numbers are littleendian. "word" means 16 bits, "dword" means 32
|
||||
bits, "qword" means 64 bits.
|
||||
|
||||
Common subroutine LBA_to_CHS():
|
||||
s = (lba % sector_count) + 1
|
||||
t = (lba / sector_count)
|
||||
h = (t % head_count)
|
||||
c = (t / head_count)
|
||||
|
||||
if (c >= 1024):
|
||||
c = 1023
|
||||
h = head_count
|
||||
s = sector_count
|
||||
|
||||
s = s | ((c & 0x300) >> 2)
|
||||
c = c & 0xff
|
||||
|
||||
write byte h
|
||||
write byte s
|
||||
write byte c
|
||||
|
||||
Main:
|
||||
Pad image_size to a multiple of sector_count*head_count
|
||||
Use the input file unmodified for bytes 0..431
|
||||
write qword boot_lba # Offset 432
|
||||
write dword mbr_id # Offset 440
|
||||
write word 0 # Offset 444
|
||||
|
||||
# Offset 446
|
||||
For each partition entry 1..4:
|
||||
if this_partition != partition_number:
|
||||
write 16 zero bytes
|
||||
else:
|
||||
write byte 0x80
|
||||
write LBA_to_CHS(partition_offset)
|
||||
write byte filesystem_type
|
||||
write LBA_to_CHS(image_size-1)
|
||||
write dword partition_offset
|
||||
write dword image_size
|
||||
|
||||
# Offset 510
|
||||
write word 0xaa55
|
||||
|
||||
Use the input file unmodified for bytes 512..32767
|
||||
(pad with zero as necessary)
|
||||
|
||||
[...]
|
||||
|
||||
-hpa
|
||||
*/
|
||||
|
||||
|
||||
static
|
||||
int lba512chs_to_buf(char **wpt, off_t lba, int head_count, int sector_count)
|
||||
{
|
||||
int s, t, h, c;
|
||||
|
||||
s = (lba % sector_count) + 1;
|
||||
t = (lba / sector_count);
|
||||
h = (t % head_count);
|
||||
c = (t / head_count);
|
||||
if (c >= 1024) {
|
||||
c = 1023;
|
||||
h = head_count; /* >>> not -1 ? Limits head_count to 255 */
|
||||
s = sector_count;
|
||||
}
|
||||
s = s | ((c & 0x300) >> 2);
|
||||
c = c & 0xff;
|
||||
(*((unsigned char **) wpt))[0] = h;
|
||||
(*((unsigned char **) wpt))[1] = s;
|
||||
(*((unsigned char **) wpt))[2] = c;
|
||||
(*wpt)+= 3;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @param flag bit0= make own random MBR Id from current time
|
||||
*/
|
||||
int make_isolinux_mbr(int32_t *img_blocks, uint32_t boot_lba,
|
||||
uint32_t mbr_id, int head_count, int sector_count,
|
||||
int part_offset, int part_number, int fs_type,
|
||||
uint8_t *buf, int flag)
|
||||
{
|
||||
uint32_t spc, id, part, nominal_part_size;
|
||||
off_t hd_img_blocks, hd_boot_lba;
|
||||
char *wpt;
|
||||
/* For generating a weak random number */
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
|
||||
/* Pad image_size to a multiple of sector_count*head_count
|
||||
*/
|
||||
spc = head_count * sector_count;
|
||||
hd_img_blocks = ((off_t) *img_blocks) * (off_t) 4;
|
||||
if (hd_img_blocks % spc) {
|
||||
hd_img_blocks += spc - (hd_img_blocks % spc);
|
||||
*img_blocks = hd_img_blocks / 4 + !!(hd_img_blocks % 4);
|
||||
}
|
||||
|
||||
wpt = (char *) buf + 432;
|
||||
|
||||
/* write qword boot_lba # Offset 432
|
||||
*/
|
||||
hd_boot_lba = ((off_t) boot_lba) * (off_t) 4;
|
||||
lsb_to_buf(&wpt, hd_boot_lba & 0xffffffff, 32, 0);
|
||||
lsb_to_buf(&wpt, hd_boot_lba >> 32, 32, 0);
|
||||
|
||||
/* write dword mbr_id # Offset 440
|
||||
(here some 32-bit random value with no crypto strength)
|
||||
*/
|
||||
if (flag & 1) {
|
||||
gettimeofday(&tv, &tz);
|
||||
id = 0xffffffff & (tv.tv_sec ^ (tv.tv_usec * 2000));
|
||||
lsb_to_buf(&wpt, id, 32, 0);
|
||||
}
|
||||
|
||||
/* write word 0 # Offset 444
|
||||
*/
|
||||
lsb_to_buf(&wpt, 0, 16, 0);
|
||||
|
||||
/* # Offset 446
|
||||
*/
|
||||
for (part = 1 ; part <= 4; part++) {
|
||||
if (part != part_number) {
|
||||
/* if this_partition != partition_number: write 16 zero bytes */
|
||||
memset(wpt, 0, 16);
|
||||
wpt+= 16;
|
||||
continue;
|
||||
}
|
||||
/* write byte 0x80
|
||||
write LBA_to_CHS(partition_offset)
|
||||
write byte filesystem_type
|
||||
write LBA_to_CHS(image_size-1)
|
||||
write dword partition_offset
|
||||
write dword image_size
|
||||
*/
|
||||
lsb_to_buf(&wpt, 0x80, 8, 0);
|
||||
lba512chs_to_buf(&wpt, part_offset, head_count, sector_count);
|
||||
lsb_to_buf(&wpt, fs_type, 8, 0);
|
||||
lba512chs_to_buf(&wpt, hd_img_blocks - 1, head_count, sector_count);
|
||||
lsb_to_buf(&wpt, part_offset, 32, 0);
|
||||
if (hd_img_blocks - (off_t) part_offset > (off_t) 0xffffffff)
|
||||
nominal_part_size = 0xffffffff;
|
||||
else
|
||||
nominal_part_size = hd_img_blocks - (off_t) part_offset;
|
||||
lsb_to_buf(&wpt, nominal_part_size, 32, 0);
|
||||
}
|
||||
|
||||
/* write word 0xaa55 # Offset 510
|
||||
*/
|
||||
lsb_to_buf(&wpt, 0xaa55, 16, 0);
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
|
181
libisofs/md5.c
181
libisofs/md5.c
@ -2,11 +2,16 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -429,8 +434,6 @@ int checksum_md5_xinfo_func(void *data, int flag)
|
||||
|
||||
/* MD5 checksum image writer */
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
/*
|
||||
@flag bit0= recursion
|
||||
bit1= session will be appended to an existing image
|
||||
@ -507,15 +510,10 @@ int checksum_copy_old_nodes(Ecma119Image *target, IsoNode *node, int flag)
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
|
||||
static
|
||||
int checksum_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
{
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
size_t size;
|
||||
Ecma119Image *t;
|
||||
int ret;
|
||||
@ -556,9 +554,6 @@ int checksum_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
t->checksum_idx_counter + 2, 16, "MD5", 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
@ -579,9 +574,6 @@ int checksum_writer_write_vol_desc(IsoImageWriter *writer)
|
||||
static
|
||||
int checksum_writer_write_data(IsoImageWriter *writer)
|
||||
{
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
int wres, res;
|
||||
size_t i, size;
|
||||
Ecma119Image *t;
|
||||
@ -648,12 +640,6 @@ ex:;
|
||||
if (ctx != NULL)
|
||||
iso_md5_end(&ctx, md5);
|
||||
return(res);
|
||||
|
||||
#else /* Libisofs_with_checksumS */
|
||||
|
||||
return ISO_SUCCESS;
|
||||
|
||||
#endif /* ! Libisofs_with_checksumS */
|
||||
}
|
||||
|
||||
|
||||
@ -683,21 +669,69 @@ int checksum_writer_create(Ecma119Image *target)
|
||||
|
||||
/* add this writer to image */
|
||||
target->writers[target->nwriters++] = writer;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
/* Account for superblock checksum tag */
|
||||
if (target->md5_session_checksum) {
|
||||
target->checksum_sb_tag_pos = target->curblock;
|
||||
target->curblock++;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag)
|
||||
{
|
||||
void *ctx = NULL;
|
||||
off_t pos = 0, line_start;
|
||||
int record_len, block_len, res, i;
|
||||
char postext[40], md5[16], record[160];
|
||||
|
||||
line_start = strlen(tag_block);
|
||||
iso_md5_compute(t->checksum_ctx, tag_block, line_start);
|
||||
res = iso_md5_clone(t->checksum_ctx, &ctx);
|
||||
if (res < 0)
|
||||
goto ex;
|
||||
res = iso_md5_end(&ctx, md5);
|
||||
|
||||
pos = (off_t) t->checksum_tag_pos * (off_t) 2048 + line_start;
|
||||
if(pos >= 1000000000)
|
||||
sprintf(postext, "%u%9.9u", (unsigned int) (pos / 1000000000),
|
||||
(unsigned int) (pos % 1000000000));
|
||||
else
|
||||
sprintf(postext, "%u", (unsigned int) pos);
|
||||
sprintf(record, "%s %s ", t->scdbackup_tag_parm, postext);
|
||||
record_len = strlen(record);
|
||||
for (i = 0; i < 16; i++)
|
||||
sprintf(record + record_len + 2 * i,
|
||||
"%2.2x", ((unsigned char *) md5)[i]);
|
||||
record_len += 32;
|
||||
|
||||
res = iso_md5_start(&ctx);
|
||||
if (res < 0)
|
||||
goto ex;
|
||||
iso_md5_compute(ctx, record, record_len);
|
||||
iso_md5_end(&ctx, md5);
|
||||
|
||||
sprintf(tag_block + line_start, "scdbackup_checksum_tag_v0.1 %s %d %s ",
|
||||
postext, record_len, record);
|
||||
block_len = strlen(tag_block);
|
||||
for (i = 0; i < 16; i++)
|
||||
sprintf(tag_block + block_len + 2 * i,
|
||||
"%2.2x", ((unsigned char *) md5)[i]);
|
||||
block_len+= 32;
|
||||
tag_block[block_len++]= '\n';
|
||||
|
||||
if (t->scdbackup_tag_written != NULL)
|
||||
strncpy(t->scdbackup_tag_written, tag_block + line_start,
|
||||
block_len - line_start);
|
||||
res = ISO_SUCCESS;
|
||||
ex:;
|
||||
if (ctx != NULL)
|
||||
iso_md5_end(&ctx, md5);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/* Write stream detectable checksum tag to extra block.
|
||||
* @flag bit0-7= tag type
|
||||
* 1= session tag (End checksumming.)
|
||||
@ -708,9 +742,6 @@ int checksum_writer_create(Ecma119Image *target)
|
||||
*/
|
||||
int iso_md5_write_tag(Ecma119Image *t, int flag)
|
||||
{
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
int res, mode, l, i, wres, tag_id_len;
|
||||
void *ctx = NULL;
|
||||
char md5[16], tag_block[2048], *tag_id;
|
||||
@ -719,11 +750,16 @@ int iso_md5_write_tag(Ecma119Image *t, int flag)
|
||||
start = t->checksum_range_start;
|
||||
memset(tag_block, 0, 2048);
|
||||
mode = flag & 255;
|
||||
if (mode < 1 || mode > 4)
|
||||
return ISO_WRONG_ARG_VALUE;
|
||||
res = iso_md5_clone(t->checksum_ctx, &ctx);
|
||||
if (res < 0)
|
||||
return res;
|
||||
res = iso_md5_end(&ctx, md5);
|
||||
if (mode == 1) {
|
||||
res = iso_md5_end(&(t->checksum_ctx), md5);
|
||||
size = t->checksum_range_size;
|
||||
pos = t->checksum_tag_pos;
|
||||
} else if (mode >= 2 && mode <= 4) {
|
||||
} else {
|
||||
if (mode == 2) {
|
||||
pos = t->checksum_sb_tag_pos;
|
||||
} else if (mode == 3) {
|
||||
@ -733,46 +769,51 @@ int iso_md5_write_tag(Ecma119Image *t, int flag)
|
||||
start = pos - (pos % 32);
|
||||
}
|
||||
size = pos - start;
|
||||
res = iso_md5_clone(t->checksum_ctx, &ctx);
|
||||
if (res < 0)
|
||||
return res;
|
||||
res = iso_md5_end(&ctx, md5);
|
||||
} else {
|
||||
return ISO_WRONG_ARG_VALUE;
|
||||
}
|
||||
if (res > 0) {
|
||||
iso_util_tag_magic(mode, &tag_id, &tag_id_len, 0);
|
||||
sprintf(tag_block,
|
||||
"%s pos=%u range_start=%u range_size=%u",
|
||||
tag_id, pos, start, size);
|
||||
if (res < 0)
|
||||
goto ex;
|
||||
|
||||
l = strlen(tag_block);
|
||||
if (mode == 2) {
|
||||
sprintf(tag_block + l, " next=%u", t->checksum_tree_tag_pos);
|
||||
} else if (mode == 3) {
|
||||
sprintf(tag_block + l, " next=%u", t->checksum_tag_pos);
|
||||
} else if (mode == 4) {
|
||||
sprintf(tag_block + l, " session_start=%u", t->ms_block);
|
||||
}
|
||||
strcat(tag_block + l, " md5=");
|
||||
l = strlen(tag_block);
|
||||
iso_util_tag_magic(mode, &tag_id, &tag_id_len, 0);
|
||||
sprintf(tag_block, "%s pos=%u range_start=%u range_size=%u",
|
||||
tag_id, pos, start, size);
|
||||
|
||||
l = strlen(tag_block);
|
||||
if (mode == 2) {
|
||||
sprintf(tag_block + l, " next=%u", t->checksum_tree_tag_pos);
|
||||
} else if (mode == 3) {
|
||||
sprintf(tag_block + l, " next=%u", t->checksum_tag_pos);
|
||||
} else if (mode == 4) {
|
||||
sprintf(tag_block + l, " session_start=%u", t->ms_block);
|
||||
}
|
||||
strcat(tag_block + l, " md5=");
|
||||
l = strlen(tag_block);
|
||||
for (i = 0; i < 16; i++)
|
||||
sprintf(tag_block + l + 2 * i, "%2.2x",
|
||||
((unsigned char *) md5)[i]);
|
||||
l+= 32;
|
||||
|
||||
res = iso_md5_start(&ctx);
|
||||
if (res > 0) {
|
||||
iso_md5_compute(ctx, tag_block, l);
|
||||
iso_md5_end(&ctx, md5);
|
||||
strcpy(tag_block + l, " self=");
|
||||
l += 6;
|
||||
for (i = 0; i < 16; i++)
|
||||
sprintf(tag_block + l + 2 * i, "%2.2x",
|
||||
((unsigned char *) md5)[i]);
|
||||
l+= 32;
|
||||
|
||||
res = iso_md5_start(&ctx);
|
||||
if (res > 0) {
|
||||
iso_md5_compute(ctx, tag_block, l);
|
||||
iso_md5_end(&ctx, md5);
|
||||
strcpy(tag_block + l, " self=");
|
||||
l += 6;
|
||||
for (i = 0; i < 16; i++)
|
||||
sprintf(tag_block + l + 2 * i, "%2.2x",
|
||||
((unsigned char *) md5)[i]);
|
||||
}
|
||||
tag_block[l + 32] = '\n';
|
||||
}
|
||||
tag_block[l + 32] = '\n';
|
||||
|
||||
if (mode == 1 && t->scdbackup_tag_parm[0]) {
|
||||
if (t->ms_block > 0) {
|
||||
iso_msg_submit(t->image->id, ISO_SCDBACKUP_TAG_NOT_0, 0, NULL);
|
||||
} else {
|
||||
res = iso_md5_write_scdbackup_tag(t, tag_block, 0);
|
||||
if (res < 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == 4) {
|
||||
if (t->opts_overwrite != NULL)
|
||||
memcpy(t->opts_overwrite + pos * 2048, tag_block, 2048);
|
||||
@ -783,18 +824,12 @@ int iso_md5_write_tag(Ecma119Image *t, int flag)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
res = ISO_SUCCESS;
|
||||
ex:;
|
||||
if (ctx != NULL)
|
||||
iso_md5_end(&ctx, md5);
|
||||
return res;
|
||||
|
||||
#else /* Libisofs_with_checksumS */
|
||||
|
||||
return ISO_SUCCESS;
|
||||
|
||||
#endif /* ! Libisofs_with_checksumS */
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifndef LIBISO_MD5_H_
|
||||
|
@ -2,9 +2,15 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <string.h>
|
||||
@ -152,6 +158,8 @@ const char *iso_error_to_msg(int errcode)
|
||||
return "Try to set the boot image of an already bootable image";
|
||||
case ISO_BOOT_IMAGE_NOT_VALID:
|
||||
return "Trying to use an invalid file as boot image";
|
||||
case ISO_BOOT_IMAGE_OVERFLOW:
|
||||
return "Too many boot images added";
|
||||
case ISO_FILE_ERROR:
|
||||
return "Error on file operation";
|
||||
case ISO_FILE_ALREADY_OPENED:
|
||||
@ -274,6 +282,16 @@ const char *iso_error_to_msg(int errcode)
|
||||
return "Checksum tag with unexpected address range encountered";
|
||||
case ISO_MD5_STREAM_CHANGE:
|
||||
return "Detected file content changes while it was written into the image";
|
||||
case ISO_SCDBACKUP_TAG_NOT_0:
|
||||
return "Session does not start at LBA 0. scdbackup checksum tag not written.";
|
||||
case ISO_BOOT_NO_CATALOG:
|
||||
return "No boot catalog created yet";
|
||||
case ISO_OVWRT_MS_TOO_SMALL:
|
||||
return "Multi-session offset too small for overwrite buffer";
|
||||
case ISO_PART_OFFST_TOO_SMALL:
|
||||
return "Partition offset too small for first tree root.";
|
||||
case ISO_OVWRT_FIFO_TOO_SMALL:
|
||||
return "The ring buffer is too small for overwrite buffer";
|
||||
default:
|
||||
return "Unknown error";
|
||||
}
|
||||
@ -414,8 +432,6 @@ int iso_obtain_msgs(char *minimum_severity, int *error_code, int *imgid,
|
||||
}
|
||||
|
||||
|
||||
/* ts A80222 : derived from libburn/init.c:burn_msgs_submit()
|
||||
*/
|
||||
int iso_msgs_submit(int error_code, char msg_text[], int os_errno,
|
||||
char severity[], int origin)
|
||||
{
|
||||
@ -443,8 +459,6 @@ int iso_msgs_submit(int error_code, char msg_text[], int os_errno,
|
||||
}
|
||||
|
||||
|
||||
/* ts A80222 : derived from libburn/init.c:burn_text_to_sev()
|
||||
*/
|
||||
int iso_text_to_sev(char *severity_name, int *sevno)
|
||||
{
|
||||
int ret;
|
||||
@ -456,8 +470,6 @@ int iso_text_to_sev(char *severity_name, int *sevno)
|
||||
}
|
||||
|
||||
|
||||
/* ts A80222 : derived from libburn/init.c:burn_sev_to_text()
|
||||
*/
|
||||
int iso_sev_to_text(int severity_number, char **severity_name)
|
||||
{
|
||||
int ret;
|
||||
@ -496,7 +508,6 @@ int iso_error_get_code(int e)
|
||||
}
|
||||
|
||||
|
||||
/* ts A80222 */
|
||||
int iso_report_errfile(char *path, int error_code, int os_errno, int flag)
|
||||
{
|
||||
libiso_msgs_submit(libiso_msgr, 0, error_code,
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -3,10 +3,15 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "image.h"
|
||||
#include "node.h"
|
||||
@ -22,6 +27,12 @@
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX Libisofs_default_path_maX
|
||||
#endif
|
||||
|
||||
|
||||
struct dir_iter_data
|
||||
{
|
||||
/* points to the last visited child, to NULL before start */
|
||||
@ -201,6 +212,7 @@ int iso_node_get_xinfo(IsoNode *node, iso_node_xinfo_func proc, void **data)
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
|
||||
*data = NULL;
|
||||
pos = node->xinfo;
|
||||
while (pos != NULL) {
|
||||
if (pos->process == proc) {
|
||||
@ -420,6 +432,12 @@ void iso_node_set_hidden(IsoNode *node, int hide_attrs)
|
||||
}
|
||||
}
|
||||
|
||||
int iso_node_get_hidden(IsoNode *node)
|
||||
{
|
||||
return node->hidden;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add a new node to a dir. Note that this function don't add a new ref to
|
||||
* the node, so you don't need to free it, it will be automatically freed
|
||||
@ -1276,6 +1294,7 @@ int iso_node_new_file(char *name, IsoStream *stream, IsoFile **file)
|
||||
new->node.type = LIBISO_FILE;
|
||||
new->node.name = name;
|
||||
new->node.mode = S_IFREG;
|
||||
new->sort_weight = 0;
|
||||
new->stream = stream;
|
||||
|
||||
*file = new;
|
||||
@ -2651,9 +2670,6 @@ ex:;
|
||||
/* API */
|
||||
int iso_file_get_md5(IsoImage *image, IsoFile *file, char md5[16], int flag)
|
||||
{
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
int ret, i;
|
||||
size_t value_len;
|
||||
char *value = NULL;
|
||||
@ -2693,21 +2709,12 @@ ex:;
|
||||
if (value != NULL)
|
||||
free(value);
|
||||
return ret;
|
||||
|
||||
#else
|
||||
|
||||
return 0;
|
||||
|
||||
#endif /* ! Libisofs_with_checksumS */
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* API */
|
||||
int iso_file_make_md5(IsoFile *file, int flag)
|
||||
{
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
int ret, dig = 0;
|
||||
char *md5 = NULL;
|
||||
|
||||
@ -2728,13 +2735,6 @@ int iso_file_make_md5(IsoFile *file, int flag)
|
||||
ret = 1;
|
||||
ex:;
|
||||
return ret;
|
||||
|
||||
#else
|
||||
|
||||
return ISO_ERROR;
|
||||
|
||||
#endif /* ! Libisofs_with_checksumS */
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -3,8 +3,9 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
#ifndef LIBISO_NODE_H_
|
||||
#define LIBISO_NODE_H_
|
||||
|
@ -4,10 +4,15 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "rockridge.h"
|
||||
#include "node.h"
|
||||
#include "ecma119_tree.h"
|
||||
@ -108,12 +113,12 @@ int rrip_add_PX(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp)
|
||||
PX[2] = 36;
|
||||
}
|
||||
PX[3] = 1;
|
||||
iso_bb(&PX[4], px_get_mode(t, n), 4);
|
||||
iso_bb(&PX[12], n->nlink, 4);
|
||||
iso_bb(&PX[20], px_get_uid(t, n), 4);
|
||||
iso_bb(&PX[28], px_get_gid(t, n), 4);
|
||||
iso_bb(&PX[4], (uint32_t) px_get_mode(t, n), 4);
|
||||
iso_bb(&PX[12], (uint32_t) n->nlink, 4);
|
||||
iso_bb(&PX[20], (uint32_t) px_get_uid(t, n), 4);
|
||||
iso_bb(&PX[28], (uint32_t) px_get_gid(t, n), 4);
|
||||
if (t->rrip_1_10_px_ino || !t->rrip_version_1_10) {
|
||||
iso_bb(&PX[36], n->ino, 4);
|
||||
iso_bb(&PX[36], (uint32_t) n->ino, 4);
|
||||
}
|
||||
|
||||
return susp_append(t, susp, PX);
|
||||
@ -179,7 +184,8 @@ int rrip_add_PL(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp)
|
||||
PL[3] = 1;
|
||||
|
||||
/* write the location of the real parent, already computed */
|
||||
iso_bb(&PL[4], n->info.dir->real_parent->info.dir->block, 4);
|
||||
iso_bb(&PL[4],
|
||||
n->info.dir->real_parent->info.dir->block - t->eff_partition_offset, 4);
|
||||
return susp_append(t, susp, PL);
|
||||
}
|
||||
|
||||
@ -242,10 +248,10 @@ int rrip_add_PN(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp)
|
||||
*/
|
||||
if (sizeof(node->dev) > 4) {
|
||||
high_shift = 32;
|
||||
iso_bb(&PN[4], node->dev >> high_shift, 4);
|
||||
iso_bb(&PN[4], (uint32_t) (node->dev >> high_shift), 4);
|
||||
} else
|
||||
iso_bb(&PN[4], 0, 4);
|
||||
iso_bb(&PN[12], node->dev & 0xffffffff, 4);
|
||||
iso_bb(&PN[12], (uint32_t) (node->dev & 0xffffffff), 4);
|
||||
return susp_append(t, susp, PN);
|
||||
}
|
||||
|
||||
@ -272,7 +278,8 @@ int rrip_add_CL(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp)
|
||||
CL[1] = 'L';
|
||||
CL[2] = 12;
|
||||
CL[3] = 1;
|
||||
iso_bb(&CL[4], n->info.real_me->info.dir->block, 4);
|
||||
iso_bb(&CL[4], n->info.real_me->info.dir->block - t->eff_partition_offset,
|
||||
4);
|
||||
return susp_append(t, susp, CL);
|
||||
}
|
||||
|
||||
@ -692,9 +699,10 @@ int susp_add_CE(Ecma119Image *t, size_t ce_len, struct susp_info *susp)
|
||||
CE[1] = 'E';
|
||||
CE[2] = 28;
|
||||
CE[3] = 1;
|
||||
iso_bb(&CE[4], susp->ce_block, 4);
|
||||
|
||||
iso_bb(&CE[4], susp->ce_block - t->eff_partition_offset, 4);
|
||||
iso_bb(&CE[12], susp->ce_len, 4);
|
||||
iso_bb(&CE[20], ce_len, 4);
|
||||
iso_bb(&CE[20], (uint32_t) ce_len, 4);
|
||||
|
||||
return susp_append(t, susp, CE);
|
||||
}
|
||||
|
@ -4,8 +4,9 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -3,8 +3,9 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -12,6 +13,10 @@
|
||||
* Rock Ridge and AAIP extensions on an ECMA-119 image.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "ecma119.h"
|
||||
#include "util.h"
|
||||
@ -302,7 +307,7 @@ int read_rr_NM(struct susp_sys_user_entry *nm, char **name, int *cont)
|
||||
*name = realloc(*name, strlen(*name) + nm->len_sue[0] - 5 + 1);
|
||||
strncat(*name, (char*)nm->data.NM.name, nm->len_sue[0] - 5);
|
||||
} else {
|
||||
*name = strcopy((char*)nm->data.NM.name, nm->len_sue[0] - 5);
|
||||
*name = iso_util_strcopy((char*)nm->data.NM.name, nm->len_sue[0] - 5);
|
||||
}
|
||||
if (*name == NULL) {
|
||||
return ISO_OUT_OF_MEM;
|
||||
@ -380,7 +385,7 @@ int read_rr_SL(struct susp_sys_user_entry *sl, char **dest, int *cont)
|
||||
/* we don't have to add the '/' */
|
||||
strncat(*dest, comp, len);
|
||||
} else {
|
||||
*dest = strcopy(comp, len);
|
||||
*dest = iso_util_strcopy(comp, len);
|
||||
}
|
||||
if (*dest == NULL) {
|
||||
return ISO_OUT_OF_MEM;
|
||||
|
@ -3,10 +3,15 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "stream.h"
|
||||
#include "fsource.h"
|
||||
@ -17,6 +22,12 @@
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX Libisofs_default_path_maX
|
||||
#endif
|
||||
|
||||
|
||||
ino_t serial_id = (ino_t)1;
|
||||
ino_t mem_serial_id = (ino_t)1;
|
||||
ino_t cut_out_serial_id = (ino_t)1;
|
||||
@ -575,7 +586,7 @@ int iso_memory_stream_new(unsigned char *buf, size_t size, IsoStream **stream)
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
data = malloc(sizeof(MemStreamData));
|
||||
if (str == NULL) {
|
||||
if (data == NULL) {
|
||||
free(str);
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
@ -857,9 +868,6 @@ int iso_stream_read_buffer(IsoStream *stream, char *buf, size_t count,
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
|
||||
/* @param flag bit0= dig out most original stream (e.g. because from old image)
|
||||
@return 1=ok, md5 is valid,
|
||||
0= not ok,
|
||||
@ -916,6 +924,3 @@ ex:;
|
||||
iso_md5_end(&ctx, md5);
|
||||
return res;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
|
@ -3,8 +3,9 @@
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
#ifndef LIBISO_STREAM_H_
|
||||
#define LIBISO_STREAM_H_
|
||||
|
@ -1,38 +1,218 @@
|
||||
/*
|
||||
* Copyright (c) 2008 Vreixo Formoso
|
||||
* Copyright (c) 2010 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "system_area.h"
|
||||
#include "eltorito.h"
|
||||
#include "filesrc.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
/*
|
||||
* Create a MBR for an isohybrid enabled ISOLINUX boot image.
|
||||
*
|
||||
* It is assumed that the caller has verified the readiness of the boot image
|
||||
* by checking for 0xfb 0xc0 0x78 0x70 at bytes 0x40 to 0x43 of isolinux.bin.
|
||||
*
|
||||
* @param bin_lba The predicted LBA of isolinux.bin within the emerging ISO.
|
||||
* @param img_blocks The predicted number of 2048 byte blocks in the ISO.
|
||||
* It will get rounded up to full MBs and that many blocks
|
||||
* must really be written as ISO 9660 image.
|
||||
* @param mbr A buffer of at least 512 bytes to take the result which is
|
||||
* to be written as the very beginning of the ISO.
|
||||
* @param flag unused yet, submit 0
|
||||
* @return <0 = fatal, 0 = failed , 1 = ok , 2 = ok with size warning
|
||||
* See libisofs/make_isohybrid_mbr.c
|
||||
* Deprecated.
|
||||
*/
|
||||
int make_isohybrid_mbr(int bin_lba, int *img_blocks, char *mbr, int flag);
|
||||
|
||||
/*
|
||||
* The New ISOLINUX MBR Producer.
|
||||
* Be cautious with changing parameters. Only few combinations are tested.
|
||||
*
|
||||
*/
|
||||
int make_isolinux_mbr(uint32_t *img_blocks, uint32_t boot_lba,
|
||||
uint32_t mbr_id, int head_count, int sector_count,
|
||||
int part_offset, int part_number, int fs_type,
|
||||
uint8_t *buf, int flag);
|
||||
|
||||
|
||||
/*
|
||||
* @param flag bit0= img_blocks is start address rather than end address:
|
||||
do not subtract 1
|
||||
*/
|
||||
static
|
||||
void iso_compute_cyl_head_sec(uint32_t *img_blocks, int hpc, int sph,
|
||||
uint32_t *end_lba, uint32_t *end_sec,
|
||||
uint32_t *end_head, uint32_t *end_cyl, int flag)
|
||||
{
|
||||
uint32_t secs;
|
||||
|
||||
/* Partition table unit is 512 bytes per sector, ECMA-119 unit is 2048 */
|
||||
if (*img_blocks >= 0x40000000)
|
||||
*img_blocks = 0x40000000 - 1; /* truncate rather than roll over */
|
||||
if (flag & 1)
|
||||
secs = *end_lba = *img_blocks * 4; /* first valid 512-lba */
|
||||
else
|
||||
secs = *end_lba = *img_blocks * 4 - 1; /* last valid 512-lba */
|
||||
*end_cyl = secs / (sph * hpc);
|
||||
secs -= *end_cyl * sph * hpc;
|
||||
*end_head = secs / sph;
|
||||
*end_sec = secs - *end_head * sph + 1; /* Sector count starts by 1 */
|
||||
if (*end_cyl >= 1024) {
|
||||
*end_cyl = 1023;
|
||||
*end_head = hpc - 1;
|
||||
*end_sec = sph;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* This is the gesture of grub-mkisofs --protective-msdos-label as explained by
|
||||
Vladimir Serbinenko <phcoder@gmail.com>, 2 April 2010, on grub-devel@gnu.org
|
||||
"Currently we use first and not last entry. You need to:
|
||||
1) Zero-fill 446-510
|
||||
2) Put 0x55, 0xAA into 510-512
|
||||
3) Put 0x80 (for bootable partition), 0, 2, 0 (C/H/S of the start), 0xcd
|
||||
(partition type), [3 bytes of C/H/S end], 0x01, 0x00, 0x00, 0x00 (LBA
|
||||
start in little endian), [LBA end in little endian] at 446-462
|
||||
"
|
||||
|
||||
"C/H/S end" means the CHS address of the last block in the partition.
|
||||
It seems that not "[LBA end in little endian]" but "number of blocks"
|
||||
should go into bytes 458-461. But with a start lba of 1, this is the
|
||||
same number.
|
||||
See also http://en.wikipedia.org/wiki/Master_boot_record
|
||||
|
||||
flag bit0= do not write 0x55, 0xAA to 510,511
|
||||
bit1= do not mark partition as bootable
|
||||
*/
|
||||
static
|
||||
int make_grub_msdos_label(uint32_t img_blocks, uint8_t *buf, int flag)
|
||||
{
|
||||
uint8_t *wpt;
|
||||
uint32_t end_lba, end_sec, end_head, end_cyl;
|
||||
int sph = 63, hpc = 255, i;
|
||||
|
||||
iso_compute_cyl_head_sec(&img_blocks, hpc, sph,
|
||||
&end_lba, &end_sec, &end_head, &end_cyl, 0);
|
||||
|
||||
/* 1) Zero-fill 446-510 */
|
||||
wpt = buf + 446;
|
||||
memset(wpt, 0, 64);
|
||||
|
||||
if (!(flag & 1)) {
|
||||
/* 2) Put 0x55, 0xAA into 510-512 (actually 510-511) */
|
||||
buf[510] = 0x55;
|
||||
buf[511] = 0xAA;
|
||||
}
|
||||
if (!(flag & 2)) {
|
||||
/* 3) Put 0x80 (for bootable partition), */
|
||||
*(wpt++) = 0x80;
|
||||
} else {
|
||||
*(wpt++) = 0;
|
||||
}
|
||||
|
||||
/* 0, 2, 0 (C/H/S of the start), */
|
||||
*(wpt++) = 0;
|
||||
*(wpt++) = 2;
|
||||
*(wpt++) = 0;
|
||||
|
||||
/* 0xcd (partition type) */
|
||||
*(wpt++) = 0xcd;
|
||||
|
||||
/* [3 bytes of C/H/S end], */
|
||||
*(wpt++) = end_head;
|
||||
*(wpt++) = end_sec | ((end_cyl & 0x300) >> 2);
|
||||
*(wpt++) = end_cyl & 0xff;
|
||||
|
||||
|
||||
/* 0x01, 0x00, 0x00, 0x00 (LBA start in little endian), */
|
||||
*(wpt++) = 0x01;
|
||||
*(wpt++) = 0x00;
|
||||
*(wpt++) = 0x00;
|
||||
*(wpt++) = 0x00;
|
||||
|
||||
/* [LBA end in little endian] */
|
||||
for (i = 0; i < 4; i++)
|
||||
*(wpt++) = (end_lba >> (8 * i)) & 0xff;
|
||||
|
||||
/* at 446-462 */
|
||||
if (wpt - buf != 462) {
|
||||
fprintf(stderr,
|
||||
"libisofs: program error in make_grub_msdos_label: \"assert 462\"\n");
|
||||
return ISO_ASSERT_FAILURE;
|
||||
}
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= zeroize partitions entries 2, 3, 4
|
||||
*/
|
||||
static
|
||||
int iso_offset_partition_start(uint32_t img_blocks, uint32_t partition_offset,
|
||||
int sph_in, int hpc_in, uint8_t *buf, int flag)
|
||||
{
|
||||
uint8_t *wpt;
|
||||
uint32_t end_lba, end_sec, end_head, end_cyl;
|
||||
uint32_t start_lba, start_sec, start_head, start_cyl;
|
||||
int sph = 63, hpc = 255, i;
|
||||
|
||||
if (sph_in > 0)
|
||||
sph = sph_in;
|
||||
if (hpc_in > 0)
|
||||
hpc = hpc_in;
|
||||
iso_compute_cyl_head_sec(&partition_offset, hpc, sph,
|
||||
&start_lba, &start_sec, &start_head, &start_cyl, 1);
|
||||
iso_compute_cyl_head_sec(&img_blocks, hpc, sph,
|
||||
&end_lba, &end_sec, &end_head, &end_cyl, 0);
|
||||
wpt = buf + 446;
|
||||
|
||||
/* Let pass only legal bootability values */
|
||||
if (*wpt != 0 && *wpt != 0x80)
|
||||
(*wpt) = 0;
|
||||
wpt++;
|
||||
|
||||
/* C/H/S of the start */
|
||||
*(wpt++) = start_head;
|
||||
*(wpt++) = start_sec | ((start_cyl & 0x300) >> 2);
|
||||
*(wpt++) = end_cyl & 0xff;
|
||||
|
||||
/* (partition type) */
|
||||
wpt++;
|
||||
|
||||
/* 3 bytes of C/H/S end */
|
||||
*(wpt++) = end_head;
|
||||
*(wpt++) = end_sec | ((end_cyl & 0x300) >> 2);
|
||||
*(wpt++) = end_cyl & 0xff;
|
||||
|
||||
/* LBA start in little endian */
|
||||
for (i = 0; i < 4; i++)
|
||||
*(wpt++) = (start_lba >> (8 * i)) & 0xff;
|
||||
|
||||
/* Number of sectors in partition, little endian */
|
||||
end_lba = end_lba - start_lba + 1;
|
||||
for (i = 0; i < 4; i++)
|
||||
*(wpt++) = (end_lba >> (8 * i)) & 0xff;
|
||||
|
||||
if (wpt - buf != 462) {
|
||||
fprintf(stderr,
|
||||
"libisofs: program error in iso_offset_partition_start: \"assert 462\"\n");
|
||||
return ISO_ASSERT_FAILURE;
|
||||
}
|
||||
|
||||
if (flag & 1) /* zeroize the other partition entries */
|
||||
memset(wpt, 0, 3 * 16);
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
||||
{
|
||||
int ret, int_img_blocks;
|
||||
uint32_t img_blocks;
|
||||
|
||||
if ((t == NULL) || (buf == NULL)) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
@ -40,26 +220,62 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
||||
/* set buf to 0s */
|
||||
memset(buf, 0, 16 * BLOCK_SIZE);
|
||||
|
||||
if (t->catalog != NULL && t->catalog->image->isolinux_options & 0x02) {
|
||||
/* We need to write a MBR for an hybrid image */
|
||||
int ret;
|
||||
int img_blocks;
|
||||
|
||||
img_blocks = t->curblock;
|
||||
ret = make_isohybrid_mbr(t->bootimg->sections[0].block, &img_blocks, (char*)buf, 0);
|
||||
|
||||
/*
|
||||
API description of el_torito_set_isolinux_options() prescribes
|
||||
to pad to full MB.
|
||||
So this is not urgent any more :
|
||||
|
||||
// FIXME the new img_blocks size should be taken into account
|
||||
*/
|
||||
img_blocks = t->curblock;
|
||||
if (t->system_area_data != NULL) {
|
||||
/* Write more or less opaque boot image */
|
||||
memcpy(buf, t->system_area_data, 16 * BLOCK_SIZE);
|
||||
|
||||
} else if (t->catalog != NULL &&
|
||||
(t->catalog->bootimages[0]->isolinux_options & 0x0a) == 0x02) {
|
||||
/* Check for isolinux image with magic number of 3.72 and produce
|
||||
an MBR from our built-in template. (Deprecated since 31 Mar 2010)
|
||||
*/
|
||||
if (img_blocks < 0x80000000) {
|
||||
int_img_blocks= img_blocks;
|
||||
} else {
|
||||
int_img_blocks= 0x7ffffff0;
|
||||
}
|
||||
ret = make_isohybrid_mbr(t->bootsrc[0]->sections[0].block,
|
||||
&int_img_blocks, (char*)buf, 0);
|
||||
if (ret != 1) {
|
||||
/* error, it should never happen */
|
||||
return ISO_ASSERT_FAILURE;
|
||||
}
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
if (t->system_area_options & 1) {
|
||||
/* Write GRUB protective msdos label, i.e. a simple partition table */
|
||||
ret = make_grub_msdos_label(img_blocks, buf, 0);
|
||||
if (ret != ISO_SUCCESS) /* error should never happen */
|
||||
return ISO_ASSERT_FAILURE;
|
||||
} else if(t->system_area_options & 2) {
|
||||
/* Patch externally provided system area as isohybrid MBR */
|
||||
if (t->catalog == NULL || t->system_area_data == NULL) {
|
||||
/* isohybrid makes only sense together with ISOLINUX boot image
|
||||
and externally provided System Area.
|
||||
*/
|
||||
return ISO_ISOLINUX_CANT_PATCH;
|
||||
}
|
||||
ret = make_isolinux_mbr(&img_blocks, t->bootsrc[0]->sections[0].block,
|
||||
(uint32_t) 0, 64, 32, 0, 1, 0x17, buf, 1);
|
||||
if (ret != 1)
|
||||
return ret;
|
||||
} else if(t->partition_offset > 0) {
|
||||
/* Write a simple partition table. */
|
||||
ret = make_grub_msdos_label(img_blocks, buf, 2);
|
||||
if (ret != ISO_SUCCESS) /* error should never happen */
|
||||
return ISO_ASSERT_FAILURE;
|
||||
}
|
||||
|
||||
if (t->partition_offset > 0) {
|
||||
/* Adjust partition table to partition offset */
|
||||
img_blocks = t->curblock; /* value might be altered */
|
||||
ret = iso_offset_partition_start(img_blocks, t->partition_offset,
|
||||
t->partition_secs_per_head,
|
||||
t->partition_heads_per_cyl, buf, 1);
|
||||
if (ret != ISO_SUCCESS) /* error should never happen */
|
||||
return ISO_ASSERT_FAILURE;
|
||||
}
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2008 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -2,14 +2,19 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Functions that act on the iso tree.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "node.h"
|
||||
#include "image.h"
|
||||
@ -25,6 +30,12 @@
|
||||
#include <stdio.h>
|
||||
#include <fnmatch.h>
|
||||
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX Libisofs_default_path_maX
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Add a new directory to the iso tree.
|
||||
*
|
||||
@ -914,7 +925,7 @@ int iso_tree_path_to_node(IsoImage *image, const char *path, IsoNode **node)
|
||||
int result;
|
||||
IsoNode *n;
|
||||
IsoDir *dir;
|
||||
char *ptr, *brk_info, *component;
|
||||
char *ptr, *brk_info = NULL, *component;
|
||||
|
||||
if (image == NULL || path == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
#ifndef LIBISO_IMAGE_TREE_H_
|
||||
#define LIBISO_IMAGE_TREE_H_
|
||||
|
@ -1,12 +1,18 @@
|
||||
/*
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
* Copyright (c) 2007 Mario Danic
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "util.h"
|
||||
#include "libisofs.h"
|
||||
#include "messages.h"
|
||||
@ -906,7 +912,10 @@ ex:;
|
||||
return retval;
|
||||
}
|
||||
|
||||
uint16_t *iso_j_file_id(const uint16_t *src)
|
||||
/*
|
||||
bit0= no_force_dots
|
||||
*/
|
||||
uint16_t *iso_j_file_id(const uint16_t *src, int flag)
|
||||
{
|
||||
uint16_t *dot;
|
||||
size_t lname, lext, lnname, lnext, pos, i;
|
||||
@ -952,6 +961,10 @@ uint16_t *iso_j_file_id(const uint16_t *src)
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
if ((flag & 1) && lnext <= 0)
|
||||
goto is_done;
|
||||
|
||||
set_ucsbe(dest + pos, '.');
|
||||
pos++;
|
||||
|
||||
@ -965,6 +978,8 @@ uint16_t *iso_j_file_id(const uint16_t *src)
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
is_done:;
|
||||
set_ucsbe(dest + pos, '\0');
|
||||
return ucsdup(dest);
|
||||
}
|
||||
@ -1204,7 +1219,7 @@ void iso_datetime_7(unsigned char *buf, time_t t, int always_gmt)
|
||||
}
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
tm.tm_isdst = -1; /* some Linuxes change tm_isdst only if it is -1 */
|
||||
tm.tm_isdst = -1; /* some OSes change tm_isdst only if it is -1 */
|
||||
localtime_r(&t, &tm);
|
||||
|
||||
#ifdef HAVE_TM_GMTOFF
|
||||
@ -1248,7 +1263,7 @@ void iso_datetime_17(unsigned char *buf, time_t t, int always_gmt)
|
||||
}
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
tm.tm_isdst = -1; /* some Linuxes change tm_isdst only if it is -1 */
|
||||
tm.tm_isdst = -1; /* some OSes change tm_isdst only if it is -1 */
|
||||
localtime_r(&t, &tm);
|
||||
|
||||
localtime_r(&t, &tm);
|
||||
@ -1381,21 +1396,33 @@ int iso_eaccess(const char *path)
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
char *strcopy(const char *buf, size_t len)
|
||||
char *iso_util_strcopy(const char *buf, size_t len)
|
||||
{
|
||||
char *str;
|
||||
|
||||
str = malloc((len + 1) * sizeof(char));
|
||||
str = calloc(len + 1, 1);
|
||||
if (str == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
strncpy(str, buf, len);
|
||||
str[len] = '\0';
|
||||
return str;
|
||||
}
|
||||
|
||||
char *iso_util_strcopy_untail(const char *buf, size_t len)
|
||||
{
|
||||
char *str;
|
||||
|
||||
str = iso_util_strcopy(buf, len);
|
||||
if (str == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
/* remove trailing spaces */
|
||||
for (len = len-1; str[len] == ' ' && len > 0; --len)
|
||||
str[len] = '\0';
|
||||
|
||||
for (len = len-1; len >= 0; --len) {
|
||||
if (str[len] != ' ')
|
||||
break;
|
||||
str[len] = 0;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,11 @@
|
||||
/*
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
* Copyright (c) 2009 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifndef LIBISO_UTIL_H_
|
||||
@ -149,11 +151,12 @@ char *iso_r_fileid(const char *src, size_t len, int relaxed, int forcedot);
|
||||
* 2 bytes and the resulting string is NULL-terminated by a 2-byte NULL.
|
||||
*
|
||||
* Note that version number and (;1) is not appended.
|
||||
*
|
||||
* @param flag
|
||||
* bit0= no_force_dots
|
||||
* @return
|
||||
* NULL if the original name and extension both are of length 0.
|
||||
*/
|
||||
uint16_t *iso_j_file_id(const uint16_t *src);
|
||||
uint16_t *iso_j_file_id(const uint16_t *src, int flag);
|
||||
|
||||
/**
|
||||
* Create a Joliet directory identifier that consists of name and optionally
|
||||
@ -250,7 +253,14 @@ int iso_eaccess(const char *path);
|
||||
* Copy up to \p len chars from \p buf and return this newly allocated
|
||||
* string. The new string is null-terminated.
|
||||
*/
|
||||
char *strcopy(const char *buf, size_t len);
|
||||
char *iso_util_strcopy(const char *buf, size_t len);
|
||||
|
||||
/**
|
||||
* Copy up to \p len chars from \p buf and return this newly allocated
|
||||
* string. The new string is null-terminated.
|
||||
* Any trailing blanks will be removed.
|
||||
*/
|
||||
char *iso_util_strcopy_untail(const char *buf, size_t len);
|
||||
|
||||
/**
|
||||
* Copy up to \p max characters from \p src to \p dest. If \p src has less than
|
||||
|
@ -2,10 +2,15 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "util.h"
|
||||
#include "libisofs.h"
|
||||
|
||||
|
@ -2,10 +2,15 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "util.h"
|
||||
#include "libisofs.h"
|
||||
|
||||
@ -280,7 +285,7 @@ void ** iso_rbtree_to_array(IsoRBTree *tree, int (*include_item)(void *),
|
||||
size_t *size)
|
||||
{
|
||||
size_t pos;
|
||||
void **array;
|
||||
void **array, **new_array;
|
||||
|
||||
array = malloc((tree->size + 1) * sizeof(void*));
|
||||
if (array == NULL) {
|
||||
@ -291,7 +296,12 @@ void ** iso_rbtree_to_array(IsoRBTree *tree, int (*include_item)(void *),
|
||||
pos = rbtree_to_array_aux(tree->root, array, 0, include_item);
|
||||
array[pos] = NULL;
|
||||
|
||||
array = realloc(array, (pos + 1) * sizeof(void*));
|
||||
new_array = realloc(array, (pos + 1) * sizeof(void*));
|
||||
if (new_array == NULL) {
|
||||
free((char *) array);
|
||||
return NULL;
|
||||
}
|
||||
array= new_array;
|
||||
if (size) {
|
||||
*size = pos;
|
||||
}
|
||||
|
@ -2,8 +2,9 @@
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation. See COPYING file for details.
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
* or later as published by the Free Software Foundation.
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
#ifndef LIBISO_IMAGE_WRITER_H_
|
||||
#define LIBISO_IMAGE_WRITER_H_
|
||||
|
Reference in New Issue
Block a user