Compare commits
76 Commits
release-0.
...
release-0.
Author | SHA1 | Date | |
---|---|---|---|
6927fd35e8 | |||
fb231ff186 | |||
b2fde289b1 | |||
dcc6ffd184 | |||
27e69c38ab | |||
f4b2bfc0d6 | |||
5482d5d7b4 | |||
b2997dcc46 | |||
48ae8acbd6 | |||
a488f8fb14 | |||
ea8da1f7d3 | |||
8ad92a08ea | |||
35c043a0f9 | |||
fce35ac718 | |||
01518896f9 | |||
caf90e35f5 | |||
1f486fd78b | |||
b58d1e28ef | |||
ebb5937568 | |||
ef444fb29c | |||
1ccbaa302c | |||
0d35100eb0 | |||
48316af1d9 | |||
a75fb9a894 | |||
a0ba4b976c | |||
870280a018 | |||
f33df0ef29 | |||
2a087f6f39 | |||
b07d3ab0c3 | |||
f12df92600 | |||
8a75d35c46 | |||
bb28c69cae | |||
25068a4de2 | |||
d2094a0d80 | |||
16dcf4a29c | |||
69a25c9734 | |||
a387a8b06a | |||
a9af97733e | |||
c30674095b | |||
be838b6940 | |||
b0c79a9a1e | |||
8725baa55f | |||
59ab73c57f | |||
7386596bfa | |||
4833ef23e5 | |||
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 |
208
ChangeLog
208
ChangeLog
@ -1 +1,209 @@
|
||||
bzr branch lp:libisofs/for-libisoburn (to become libisofs-0.6.42.tar.gz)
|
||||
===============================================================================
|
||||
- no novelties yet
|
||||
|
||||
libisofs-0.6.40.tar.gz Fri Dec 10 2010
|
||||
===============================================================================
|
||||
* New API call iso_write_opts_set_disc_label(), new system area type
|
||||
3 = SUN Disk Label for booting SUN SPARC systems.
|
||||
* New API call iso_write_opts_set_will_cancel() avoids start of write thread
|
||||
and is to be used to inquire the future image size.
|
||||
* New error reply code ISO_DISPLACE_ROLLOVER for external data sources with
|
||||
address displacement.
|
||||
|
||||
libisofs-0.6.38.tar.gz Sat Oct 23 2010
|
||||
===============================================================================
|
||||
* New API calls iso_write_opts_attach_jte() and iso_write_opts_detach_jte()
|
||||
allow to use libjte for jigdo production.
|
||||
* New API call iso_write_opts_set_tail_blocks() for tail padding inside
|
||||
ISO image.
|
||||
* New API call iso_image_generator_is_running() to learn when the write thread
|
||||
is done.
|
||||
* New API calls iso_image_add_mips_boot_file(),
|
||||
iso_image_get_mips_boot_files(), iso_image_give_up_mips_boot().
|
||||
* New API call iso_write_opts_set_partition_img() for appending e.g. a small
|
||||
empty FAT12 filesystem which may be used on USB stick.
|
||||
|
||||
libisofs-0.6.36.tar.gz Wed Sep 15 2010
|
||||
===============================================================================
|
||||
* New API function iso_write_opts_set_part_offset() controls creation of
|
||||
an MBR with a first partiton table entry that bears non-zero start address.
|
||||
A second set of volume descriptors and directory tree+tables gets created
|
||||
which can be used to mount the image at the partition start.
|
||||
* Hiding all non-API symbols from the linker by use of --version-script
|
||||
* Automatic C++ detection in libisofs.h by using macro __cplusplus
|
||||
* Corrected several memory leaks and potential NULL pointer evaluations
|
||||
in case of memory shortage.
|
||||
* Now with history of release notes in ./ChangeLog file.
|
||||
|
||||
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
|
||||
|
||||
|
@ -16,7 +16,9 @@ libisofs_libisofs_la_LDFLAGS = \
|
||||
|
||||
# Eventually enabling system adapters for ACL and EA.
|
||||
# ts A90409: Eventually enabling use of zlib.
|
||||
libisofs_libisofs_la_CFLAGS = $(LIBACL_DEF) $(XATTR_DEF) $(ZLIB_DEF)
|
||||
# ts B00927: Eventually enabling use of libjte (Jigdo Template Extraction)
|
||||
libisofs_libisofs_la_CFLAGS = $(LIBACL_DEF) $(XATTR_DEF) $(ZLIB_DEF) \
|
||||
$(LIBJTE_DEF)
|
||||
|
||||
# ts A90114 : added aaip_0_2.*
|
||||
|
||||
@ -42,7 +44,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 +82,9 @@ libisofs_libisofs_la_LIBADD= \
|
||||
libinclude_HEADERS = \
|
||||
libisofs/libisofs.h
|
||||
|
||||
install-exec-hook:
|
||||
$(LIBBURNIA_LDCONFIG_CMD) "$(DESTDIR)$(libdir)" || echo 'NOTE: Explicite dynamic library configuration failed. If needed, configure manually for:' "$(DESTDIR)$(libdir)"
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
## Build demo applications
|
||||
@ -262,6 +266,7 @@ EXTRA_DIST = \
|
||||
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
|
||||
|
40
README
40
README
@ -37,7 +37,25 @@ and execute
|
||||
To make the libraries accessible for running resp. developing applications
|
||||
make install
|
||||
|
||||
See INSTALL file for further details.
|
||||
On GNU/Linux it will try to run program ldconfig with the library installation
|
||||
directory as only argument. Failure to do so will not abort installation.
|
||||
One may disable ldconfig by ./configure option --disable-ldconfig-at-install .
|
||||
|
||||
By use of a version script, the libisofs.so library exposes no other function
|
||||
names but those of the API definitions in <libisofs/libisofs.h>.
|
||||
If -Wl,--version-script=... makes problems with the local compiler, then
|
||||
disable this encapsulation feature by
|
||||
./configure --disable-versioned-libs
|
||||
make clean ; make
|
||||
|
||||
The ./configure script checks for the availability of supporting libraries.
|
||||
If found, they will become mandatory for the emerging libisofs.so and all
|
||||
applications which use it. This dependency can be avoided by configure options
|
||||
--disable-libacl avoid use of ACL functions like acl_to_text()
|
||||
--disable-xattr avoid use of xattr functions like listxattr()
|
||||
--disable-zlib avoid use of zlib functions like compress2()
|
||||
|
||||
See INSTALL file for general options of ./configure.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
@ -113,7 +131,6 @@ 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
|
||||
@ -122,22 +139,9 @@ a) Images with unsupported features, such as:
|
||||
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 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.
|
||||
b) Bootable El-Torito images may have problems, that result in a new image that
|
||||
is not bootable, or that boots from an outdated session. In some cases it
|
||||
might be necessary to add boot info again in a new first session.
|
||||
- There is no safe way to modify hidden boot images, as the size of the
|
||||
boot image can't be figured out.
|
||||
|
||||
|
17
acinclude.m4
17
acinclude.m4
@ -16,10 +16,12 @@ AC_DEFUN([TARGET_SHIZZLE],
|
||||
|
||||
AC_MSG_CHECKING([target operating system])
|
||||
|
||||
LIBBURNIA_LDCONFIG_CMD="echo 'No ldconfig run performed. If needed, configure manually for:'"
|
||||
case $target in
|
||||
*-*-linux*)
|
||||
ARCH=linux
|
||||
LIBBURN_ARCH_LIBS=
|
||||
LIBBURNIA_LDCONFIG_CMD=ldconfig
|
||||
;;
|
||||
*-*-freebsd*)
|
||||
ARCH=freebsd
|
||||
@ -131,6 +133,21 @@ iconv_close(cd);
|
||||
])
|
||||
|
||||
|
||||
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
|
||||
|
60
configure.ac
60
configure.ac
@ -1,4 +1,4 @@
|
||||
AC_INIT([libisofs], [0.6.32], [http://libburnia-project.org])
|
||||
AC_INIT([libisofs], [0.6.40], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
dnl AC_CONFIG_HEADER([config.h])
|
||||
|
||||
@ -9,12 +9,6 @@ LIBBURNIA_SET_FLAGS
|
||||
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
|
||||
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)
|
||||
|
||||
dnl
|
||||
dnl if MAJOR or MINOR version changes, be sure to change AC_INIT above to match
|
||||
dnl
|
||||
@ -46,7 +40,7 @@ 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=32
|
||||
LIBISOFS_MICRO_VERSION=40
|
||||
LIBISOFS_VERSION=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION.$LIBISOFS_MICRO_VERSION
|
||||
|
||||
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
||||
@ -56,10 +50,10 @@ AC_SUBST(LIBISOFS_VERSION)
|
||||
|
||||
dnl Libtool versioning
|
||||
LT_RELEASE=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION
|
||||
# 2010.05.03 development jump has not yet happened
|
||||
# SONAME = 34 - 28 = 6 . Library name = libisofs.6.28.0
|
||||
LT_CURRENT=34
|
||||
LT_AGE=28
|
||||
# 2010.12.10 development jump has not yet happened
|
||||
# SONAME = 42 - 36 = 6 . Library name = libisofs.6.36.0
|
||||
LT_CURRENT=42
|
||||
LT_AGE=36
|
||||
LT_REVISION=0
|
||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||
|
||||
@ -211,6 +205,48 @@ else
|
||||
fi
|
||||
AC_SUBST(ZLIB_DEF)
|
||||
|
||||
dnl ts B00927
|
||||
AC_ARG_ENABLE(libjte,
|
||||
[ --enable-libjte Enable use of libjte by libisofs, default=yes],
|
||||
, enable_libjte=yes)
|
||||
if test "x$enable_libjte" = xyes; then
|
||||
LIBJTE_DEF="-DLibisofs_with_libjtE"
|
||||
AC_CHECK_HEADER(libjte/libjte.h, AC_CHECK_LIB(jte, libjte_new, , LIBJTE_DEF= ), LIBJTE_DEF= )
|
||||
else
|
||||
LIBJTE_DEF=
|
||||
fi
|
||||
AC_SUBST(LIBJTE_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_ARG_ENABLE(ldconfig-at-install,
|
||||
[ --enable-ldconfig-at-install On GNU/Linux run ldconfig, default=yes],
|
||||
, ldconfig_at_install=yes)
|
||||
if test x$ldconfig_at_install = xyes; then
|
||||
dummy=dummy
|
||||
else
|
||||
LIBBURNIA_LDCONFIG_CMD="echo 'NOTE: ldconfig is disabled. If needed, configure manually for:'"
|
||||
echo "disabled run of ldconfig during installation on GNU/Linux"
|
||||
fi
|
||||
AC_SUBST(LIBBURNIA_LDCONFIG_CMD)
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
|
126
demo/demo.c
126
demo/demo.c
@ -52,19 +52,6 @@ static char helptext[][80] = {
|
||||
#include <limits.h>
|
||||
|
||||
|
||||
|
||||
#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>
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX Libisofs_default_path_maX
|
||||
#endif
|
||||
@ -98,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] = '|';
|
||||
@ -132,6 +121,7 @@ tree_print_dir(IsoDir *dir, int level)
|
||||
}
|
||||
}
|
||||
iso_dir_iter_free(iter);
|
||||
free(sp);
|
||||
}
|
||||
|
||||
int gesture_tree(int argc, char **argv)
|
||||
@ -270,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;
|
||||
@ -281,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;
|
||||
@ -303,7 +293,7 @@ int gesture_iso(int argc, char **argv)
|
||||
break;
|
||||
case '?':
|
||||
iso_usage(argv);
|
||||
exit(1);
|
||||
goto ex;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -311,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);
|
||||
@ -346,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) {
|
||||
@ -356,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);
|
||||
@ -365,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);
|
||||
@ -375,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;
|
||||
}
|
||||
|
||||
|
||||
@ -436,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] = '|';
|
||||
@ -466,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)
|
||||
@ -630,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();
|
||||
@ -651,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);
|
||||
@ -667,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;
|
||||
}
|
||||
|
||||
|
||||
@ -728,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();
|
||||
@ -756,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);
|
||||
@ -772,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);
|
||||
@ -780,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 */
|
||||
@ -805,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;
|
||||
}
|
||||
|
||||
|
||||
|
727
doc/boot_sectors.txt
Normal file
727
doc/boot_sectors.txt
Normal file
@ -0,0 +1,727 @@
|
||||
|
||||
|
||||
|
||||
Collection of Boot Sector Formats for ISO 9660 Images
|
||||
|
||||
|
||||
by Thomas Schmitt - mailto:scdbackup@gmx.net
|
||||
Libburnia project - mailto:libburn-hackers@pykix.org
|
||||
|
||||
This information is collected from various sources. Some is backed by
|
||||
specifications, some is just rumor which happens to work (maybe not even that).
|
||||
|
||||
|
||||
Content
|
||||
|
||||
EL Torito CD booting, for PC-BIOS x86, PowerPC, (old) Mac, EFI.
|
||||
|
||||
MBR, for PC-BIOS x86 from (pseudo-) hard disk
|
||||
- SYSLINUX isohybrid MBR
|
||||
- GRUB2 grub-mkrescue MBR.
|
||||
|
||||
MIPS Volume Header, for MIPS Big Endian, e.g. SGI Indigo2.
|
||||
|
||||
DEC Boot Block, for MIPS Little Endian , e.g. DECstation.
|
||||
|
||||
SUN Disk Label and boot images, for SUN SPARC
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
EL Torito CD booting
|
||||
for PC-BIOS x86, PowerPC, (old) Mac, EFI
|
||||
|
||||
Sources:
|
||||
El Torito, Bootable CD-ROM Format Specification, Version 1.0, 1995
|
||||
which refers to ECMA-119, the standard for ISO 9660 filesystems.
|
||||
libisofs/eltorito.[ch] by Vreixo Formoso.
|
||||
man mkisofs by Joerg Schilling.
|
||||
|
||||
|
||||
ECMA-119 prescribes that the first 32 kB of an ISO 9660 image are System Area
|
||||
with arbitrary content. This prescription is obeyed by PC-BIOS systems only
|
||||
if the ISO 9660 image is presented on CD, DVD or BD media.
|
||||
In this case the El Torito Boot record is the starting point of booting.
|
||||
|
||||
The Boot Record is a ECMA-119 Volume Descriptor which is eventually located
|
||||
at 2 kB block number 17 (decimal). Its content points to the location of the
|
||||
Boot Catalog.
|
||||
The format is described in part by ECMA-119 8.2 "Boot Record" and further
|
||||
specified by El Torito figure 7.
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 0 | 0 | Volume Descriptor Type. 0= Boot record
|
||||
1 - 5 | "CD001" | Standard Identifier
|
||||
6 - 6 | 1 | Volume Descriptor Version
|
||||
7 - 38 | el_torito | Boot System Identifier
|
||||
39 - 70 | 0 | Boot Identifier
|
||||
| |
|
||||
71 -2047 | ========== | Boot System Use
|
||||
| |
|
||||
71 - 74 | cataloglba | The 2 kB block number of the Boot Catalog
|
||||
| | as little-endian 32 bit number.
|
||||
| |
|
||||
75 -2047 | 0 | Unused
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
el_torito is the constant string "EL TORITO SPECIFICATION" padded by 9 zeros.
|
||||
cataloglba has to be provided by the file system generator.
|
||||
|
||||
|
||||
The Boot Catalog lists the available boot images which may be prepared for
|
||||
multiple system architectures, called "platforms".
|
||||
It consists of one or more 2 kB blocks. The content is a sequence of fixed
|
||||
format entries, 32 bytes each.
|
||||
The entries are grouped in sections, which assign the entries to a particular
|
||||
system architecture. The booting system will then choose an entry from an
|
||||
appropriate section.
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 31 | ========== | Validation Entry
|
||||
| | begins the first section, specifies an architecture
|
||||
32 - 63 | ========== | Initial/Default Entry
|
||||
| | points to a boot image for given architecture
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
Optional:
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
64 - 95 | ========== | Section Header entry
|
||||
| | begins new section, specifies an architecture
|
||||
96 - 127 | ========== | Section Entry
|
||||
| | points to a boot image for given architecture
|
||||
... | .......... | Optional more Section Entries
|
||||
... | .......... | Optional more Section Headers and their Section
|
||||
| | Entries
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
An architecture is refered by a Platform Id number.
|
||||
Defined by El Torito are:
|
||||
0 = "80x86" which is used for standard PCs with Intel x86 or compatible CPU
|
||||
1 = "PowerPC" (possibly for IBM machines with PowerPC CPU)
|
||||
2 = "Mac" (possibly for Apple computers with MC68000 or PowerPC CPU)
|
||||
Further in use by GRUB2 is:
|
||||
0xef = EFI, a competitor resp. successor to PC-BIOS, possibly in use with
|
||||
Intel ia64 Itanium and possibly with newer Apple machines.
|
||||
|
||||
Words resp. numbers are represented are little-endian.
|
||||
|
||||
Validation Entry:
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 0 | 1 | Header Id
|
||||
| |
|
||||
1 - 1 | platform_id| Platform Id. One of: 0, 1, 2, 0xef. See above.
|
||||
| |
|
||||
2 - 3 | 0 | Reserved
|
||||
4 - 27 | manuf_dev | ID string identifies the manufacturer/developer
|
||||
| | (no non-zero examples known yet)
|
||||
| |
|
||||
28 - 29 | checksum | Checksum Word for the Validation Entry.
|
||||
| | The sum of all words in the entry has to be 0.
|
||||
| |
|
||||
30 - 30 | 0x55 |
|
||||
31 - 31 | 0xaa |
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
|
||||
Initial/Default Entry:
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 0 | boot_indct | Boot Indicator: 0x88 = bootable, 0x00 = not bootable
|
||||
| |
|
||||
1 - 1 | boot_media | Boot Media Type (i.e. media emulated by boot image):
|
||||
| | 0= no emulation , 1= 1.2 MB diskette, 2=1.44 MB,
|
||||
| | 3= 2.88 MB , 4= hard disk
|
||||
| | (About everybody uses 0 = no emulation)
|
||||
| |
|
||||
2 - 3 | load_seg | Load Segment. (meaning unclear)
|
||||
| | "If this value is 0 the system will use the
|
||||
| | traditional segment of 7C0."
|
||||
| | libisofs default is 0
|
||||
| |
|
||||
4 - 4 | sys_type | System Type.
|
||||
| | "Must be a copy of byte 5 from the partition table
|
||||
| | found in the boot image."
|
||||
| | libisofs reads the start the boot image as MBR
|
||||
| | if boot_media == 4. This emulated MBR has a
|
||||
| | partition table from where a byte gets copied.
|
||||
| | Else this byte is 0.
|
||||
| |
|
||||
5 - 5 | 0 | Unused
|
||||
| |
|
||||
6 - 7 | sec_count | Sector Count.
|
||||
| | "the number of virtual/emulated sectors the system
|
||||
| | will store at Load Segment during the initial boot
|
||||
| | procedure."
|
||||
| | libisofs stores 1 for emulated boot_media and
|
||||
| | 0 for boot_media == 0.
|
||||
| |
|
||||
8 - 11 | load_rba | Load RBA. The 2 kB block address where the boot
|
||||
| | image file content is located in the ISO 9660 image.
|
||||
| |
|
||||
12 - 31 | 0 | Unused
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
|
||||
Section Header Entry:
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 0 | head_ind | Header Indicator: 0x90 = more headers follow
|
||||
| | 0x91 = final header, last section
|
||||
| |
|
||||
1 - 1 | platform_id| Platform Id. One of: 0, 1, 2, 0xef. See above.
|
||||
| |
|
||||
2 - 3 | num_entries| Number of entries to follow in this section
|
||||
| |
|
||||
4 - 31 | | ID string identifies the manufacturer/developer
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
|
||||
Section Entry:
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 0 | boot_indct | Boot Indicator: 0x88 = bootable, 0x00 = not bootable
|
||||
| |
|
||||
1 - 1 | boot_media | Boot Media Type (i.e. media emulated by boot image):
|
||||
| | Bit 0 to 3 govern emulation
|
||||
| | 0= no emulation , 1= 1.2 MB diskette, 2=1.44 MB,
|
||||
| | 3= 2.88 MB , 4= hard disk
|
||||
| | (About everybody uses 0 = no emulation)
|
||||
| | Bit 4 is reserved and must be 0
|
||||
| | Bit 5 "Continuation entry follows" (meaning unclear)
|
||||
| | Might be the indicator for Extension Entries,
|
||||
| | which are not described here.
|
||||
| | Bit 6 "Image contains an ATAPI driver"
|
||||
| | Bit 7 "Image contains SCSI drivers"
|
||||
| |
|
||||
2 - 3 | load_seg | Load Segment. (meaning unclear)
|
||||
| | See above Initial/Default Entry
|
||||
| | libisofs default is 0.
|
||||
4 - 4 | sys_type | System Type.
|
||||
| | See above Initial/Default Entry
|
||||
| | 0 if not emulation == 4.
|
||||
5 - 5 | 0 | Unused
|
||||
| |
|
||||
6 - 7 | sec_count | Sector Count.
|
||||
| | See above Initial/Default Entry
|
||||
| | libisofs stores 1 for emulated boot_media and
|
||||
| | 0 for boot_media == 0.
|
||||
| |
|
||||
8 - 11 | load_rba | Load RBA. The 2 kB block address where the boot
|
||||
| | image file content is located in the ISO 9660 image.
|
||||
| |
|
||||
12 - 31 | sel_crit | "Vendor unique selection criteria."
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
|
||||
The boot image file content is mostly opaque to the ISO 9660 image generator.
|
||||
Nevertheless there is a tradition named "Boot Info Table" which prescribes
|
||||
to write information into byte fields of the boot image file content.
|
||||
There are no general means known how a producer of ISO 9660 images could
|
||||
detect the need for Boot Info Table production.
|
||||
It rather needs a hint from the user who has to know whether the boot image
|
||||
expects a Boot Info Table.
|
||||
The Boot Info Table begins at byte 8 of the boot image content.
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
8 - 11 | pvd_lba | Block address of the Primary Volume Descriptor
|
||||
| | This is the session start LBA + 16.
|
||||
| |
|
||||
12 - 15 | file_lba | Block address of the start of the boot image file
|
||||
| | content.
|
||||
| |
|
||||
16 - 19 | file_len | Number of bytes in boot image file content.
|
||||
| |
|
||||
20 - 23 | checksum | Little-endian: The sum of all 32-bit words of the
|
||||
| | file content from byte 64 to file end.
|
||||
| |
|
||||
24 - 63 | 0 | Reserved
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
MBR
|
||||
for PC-BIOS x86 from (pseudo-) hard disk
|
||||
|
||||
Sources:
|
||||
http://en.wikipedia.org/wiki/Master_boot_record
|
||||
Mailing list conversations with H. Peter Anvin and Vladimir Serbinenko.
|
||||
|
||||
|
||||
The candidates for MBR booting will normally use El Torito rather than MBR
|
||||
if the ISO image is presented on CD, DVD, or BD media.
|
||||
The eventual MBR comes into effect if the image is on a media that is
|
||||
interpreted by the BIOS as some kind of hard disk. Usually real hard disks,
|
||||
floppy disks, USB sticks, memory cards.
|
||||
|
||||
An important part of an MBR is the DOS style partition table. It describes up
|
||||
to four primary partitions. There are two formats used for block address:
|
||||
Cylinder/Head/Sector (C/H/S) and Logical Block Address (LBA). Both are based
|
||||
on units of 512 bytes. So MBR_LBA = ISO_LBA * 4.
|
||||
|
||||
For C/H/S, the sector address is broken up into whole cylinders, remaining
|
||||
heads, and remaining sectors + 1. The nomenclature seems to stem from antique
|
||||
drum storage.
|
||||
There are two parameters, sectors_per_head and heads_per_cylinder which are not
|
||||
stored in the MBR. So it is more or less arbitray how to convert a LBA into
|
||||
a C/H/S address and vice versa. For maximum range of C/H/S addresses one
|
||||
may use sectors_per_head = 63 , heads_per_cylinder = 255.
|
||||
|
||||
|
||||
Words are composed little-endian style.
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 439 | = opaque = | Code Area filled with bytes for some boot system,
|
||||
| | typically machine code.
|
||||
| |
|
||||
440 - 443 | disk_sgntr | Disc signature, an individual disk id of obscure
|
||||
| | usability.
|
||||
| | (The Code Area might extend up to this field.)
|
||||
| |
|
||||
444 - 445 | 0 | "usually nulls"
|
||||
| | (The Code Area might extend up to this field.)
|
||||
| |
|
||||
446 - 461 | ========== | Partition Table Entry for partition 1
|
||||
| |
|
||||
446 - 446 | status | Governs bootability:
|
||||
| | 0x80 = bootable/active , 0x00 non-bootable/inactive
|
||||
| |
|
||||
447 - 449 | ========== | C/H/S address of partition start
|
||||
447 - 447 | start_head | Heads part of start address.
|
||||
448 - 448 | start_c_s | Bits 0 to 5 : Sectors part of start address.
|
||||
| | Bits 6 to 7 : Bits 8 to 9 of cylinders part.
|
||||
449 - 449 | start_cyl | Lower 8 bits of cylinders part of start address
|
||||
| |
|
||||
450 - 450 | part_type | Partition type indicates the purpose or kind of
|
||||
| | filesystem in the partition.
|
||||
| |
|
||||
451 - 453 | ========== | C/H/S address of last absolute sector in partition
|
||||
451 - 451 | end_head | Heads part of end address.
|
||||
452 - 452 | end_c_s | Bits 0 to 5 : Sectors part of end address.
|
||||
| Values: 1 to 63, not 0.
|
||||
| | Bits 6 to 7 : Bits 8 to 9 of cylinders part.
|
||||
453 - 453 | end_cyl | Lower 8 bits of cylinders part of end address
|
||||
| |
|
||||
454 - 457 | start_lba | LBA of first absolute sector in partiton.
|
||||
| | Block size is 512. Counting starts at 0.
|
||||
| |
|
||||
458 - 461 | num_blocks | Number of sectors in partition.
|
||||
| |
|
||||
462 - 477 | ========== | Partition Table Entry for partition 2
|
||||
| part_entr2 | 16 bytes. Format as with partition 1.
|
||||
| | All 0 means that partition is unused/undefined.
|
||||
| |
|
||||
478 - 493 | ========== | Partition Table Entry for partition 3
|
||||
| part_entr3 | 16 bytes. See above.
|
||||
| |
|
||||
494 - 509 | ========== | Partition Table Entry for partition 4
|
||||
| part_entr4 | 16 bytes. See above.
|
||||
| |
|
||||
510 - 510 | 0x55 | MBR signature
|
||||
511 - 511 | 0xaa | MBR signature
|
||||
| |
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
|
||||
By tradition the MBR itself and possibly more blocks are not claimed by any
|
||||
partition. But starting the first partition at a non-zero block address causes
|
||||
on Linux a partition device file (e.g. /dev/sdb1) which cannot be used to mount
|
||||
the ISO filesystem.
|
||||
|
||||
libisofs is able to produce a second set of trees and meta data which is
|
||||
suitable for being mounted at start block 16 (ISO) resp. 64 (MBR).
|
||||
See <libisofs/libisofs.h> for call iso_write_opts_set_part_offset()
|
||||
and http://libburnia-project.org/wiki/PartitionOffset for examples with
|
||||
program xorriso.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
SYSLINUX Isohybrid MBR
|
||||
|
||||
Sources:
|
||||
syslinux-3.72/utils/isohybrid , a perl script by H. Peter Anvin = hpa.
|
||||
Mailing list conversations with hpa.
|
||||
|
||||
|
||||
An isohybrid MBR directs the booting BIOS to an ISOLINUX boot image which
|
||||
is also the target of an El Torito boot catalog entry.
|
||||
For that purpose one has to take an MBR template and has to set a few bytes
|
||||
to values which sufficiently describe the ISO image and the boot image file.
|
||||
|
||||
Words are composed little-endian style.
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 431 | = opaque = | Syslinux machine code provided by MBR template
|
||||
| |
|
||||
432 - 439 | hd_bootlba | Address of the ISOLINUX boot image file in the
|
||||
| | ISO image. Counted in 512 byte blocks.
|
||||
| |
|
||||
440 - 443 | mbr_id | Random number
|
||||
444 - 445 | 0 | Padding
|
||||
| |
|
||||
446 - 509 | ========== | Partition table
|
||||
| |
|
||||
446 - 461 | part_entry | Partition table entry 1 describing ISO image size
|
||||
| | starting at LBA 0. I.e. contrary to tradition.
|
||||
| | See above for partition table entry format.
|
||||
| |
|
||||
462 - 509 | 0 | Unused partition entries 2 to 4
|
||||
510 - 511 | 0xaa55 | MBR signature
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
|
||||
hpa about MBR templates and partition table filesystem types:
|
||||
|
||||
"[MBR templates] 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.
|
||||
[...]
|
||||
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.
|
||||
"
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
GRUB2 grub-mkrescue MBR
|
||||
|
||||
Sources:
|
||||
Mailing list conversations with Vladimir Serbinenko.
|
||||
|
||||
|
||||
The MBR file that is used with GRUB2 script grub-mkrescue needs only a
|
||||
partition table entry which describes the image size.
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 445 | = opaque = | GRUB2 machine code provided by MBR template
|
||||
| |
|
||||
446 - 509 | ========== | Partition table
|
||||
| |
|
||||
446 - 461 | part_entry | Partition table entry 1 describing ISO image size
|
||||
| | Peculiar is the start offset of 1 block.
|
||||
| | This prevents mounting of the partition.
|
||||
| | See above for partition table entry format.
|
||||
| |
|
||||
462 - 509 | 0 | Unused partition entries 2 to 4
|
||||
510 - 511 | 0xaa55 | MBR signature
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
Vladimir Serbinenko about the partition table entry:
|
||||
"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
|
||||
"
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
MIPS Volume Header
|
||||
for MIPS Big Endian, e.g. SGI Indigo2
|
||||
|
||||
Sources:
|
||||
cdrkit-1.1.10/genisoimage/boot-mips.c
|
||||
by Steve McIntyre <steve@einval.com>
|
||||
which refers to
|
||||
genisovh by Florian Lohoff <flo@rfc822.org>
|
||||
and Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
|
||||
who seem to have learned parameter settings from IRIX CD media
|
||||
There are traces in the web which relate this to specs by
|
||||
MIPS Computer Systems, Inc. , 1985
|
||||
Silicon Graphics Computer Systems, Inc. , 2000
|
||||
|
||||
|
||||
The first 512 bytes of the media constitute the Volume Header.
|
||||
Words are composed big-endian style.
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 3 | 0x0be5a941 | Magic number
|
||||
4 - 5 | 0 | Root partition number
|
||||
6 - 7 | 0 | Swap partition number
|
||||
8 - 23 | 0 | Name of file to boot (unclear what this means)
|
||||
| |
|
||||
24 - 71 | ========== | Device Parameters
|
||||
| |
|
||||
24 - 24 | 0 | Spiral addressing skew (unclear what this means)
|
||||
25 - 25 | 0 | Words of 0 before header
|
||||
26 - 26 | 0 | Words of 0 between hdr and data
|
||||
27 - 27 | 0 | Spare sectors per cylinder
|
||||
28 - 29 | num_cyl_l | Number of usable cylinder, lower two bytes
|
||||
| | ((iso_size + BYTES_PER_SECTOR - 1) /
|
||||
| | (SECTORS_PER_TRACK * BYTES_PER_SECTOR)) & 0xffff
|
||||
30 - 31 | 0 | Starting head of volume 0
|
||||
32 - 33 | 1 | Number of tracks per cylinder
|
||||
34 - 34 | 0 | Depth of CTQ queue (unclear what this means)
|
||||
35 - 35 | num_cyl_h | Number of usable cylinders, high byte
|
||||
| | ((iso_size + BYTES_PER_SECTOR - 1) /
|
||||
| | (SECTORS_PER_TRACK * BYTES_PER_SECTOR)) >> 16
|
||||
36 - 37 | 0 | unused
|
||||
38 - 39 | 32 | SECTORS_PER_TRACK
|
||||
40 - 41 | 512 | BYTES_PER_SECTOR
|
||||
42 - 43 | 0 | Sector interleave (unclear what this means)
|
||||
44 - 47 | 0x00000034 | Controller characteristics composed from
|
||||
| | DP_RESEEK 0x00000020 /* recalibrate as last resort */
|
||||
| | DP_IGNOREERRORS 0x00000010
|
||||
| | /* transfer data regardless of errors */
|
||||
| | DP_TRKFWD 0x00000004
|
||||
| | /* forward to replacement track */
|
||||
48 - 51 | 0 | Bytes/sec for kernel stats
|
||||
52 - 55 | 0 | Max num retries on data error
|
||||
56 - 59 | 0 | ms per word to xfer, for iostat
|
||||
60 - 71 | 0 | 6 parameter words for xylogics controllers
|
||||
| |
|
||||
72 - 311 | ========== | Volume Directory with 15 entries of 16 bytes each
|
||||
| |
|
||||
72 - 87 | ========== | Volume Directory Entry 1
|
||||
72 - 79 | boot_name | Boot file basename, eventually padded by 0 to lenght 8
|
||||
80 - 83 | boot_block | ISO 9660 LBA of boot file * 4, i.e. in blocks of 512
|
||||
84 - 87 | boot_bytes | File length in bytes
|
||||
| |
|
||||
88 - 311 | see above | Volume Directory Entries 2 to 15
|
||||
| |
|
||||
312 - 504 | ========== | Partition Table with 16 entries of 12 bytes each
|
||||
| |
|
||||
312 - 407 | 0 | Unused partition entries 1 to 8
|
||||
| |
|
||||
408 - 419 | ========== | Partition Table Entry 9 for Volume Header
|
||||
408 - 411 | part_blks | Number of 512 byte blocks in partition
|
||||
| |(iso_size + (BYTES_PER_SECTOR - 1)) / BYTES_PER_SECTOR
|
||||
412 - 415 | 0 | Start block of partition
|
||||
416 - 419 | 0 | PTYPE_VOLHDR = Partition is volume header
|
||||
| |
|
||||
420 - 431 | 0 | Unused partition entry 10
|
||||
| |
|
||||
432 - 443 | ========== | Partition Table Entry 11 for Volume
|
||||
432 - 435 | part_blks | Number of 512 byte blocks in partition
|
||||
| |(iso_size + (BYTES_PER_SECTOR - 1)) / BYTES_PER_SECTOR
|
||||
436 - 439 | 0 | Start block of partition
|
||||
440 - 443 | 6 | PTYPE_VOLUME = Partition is entire volume
|
||||
| |
|
||||
444 - 503 | 0 | Unused partition entries 12 to 16
|
||||
| |
|
||||
504 - 507 | head_chk | Volume header checksum
|
||||
| | The two's complement of bytes 0 to 503 read as big
|
||||
| | endian unsigned 32 bit: sum(words) + head_chk == 0
|
||||
| |
|
||||
508 - 511 | 0 | Volume header end padding
|
||||
| |
|
||||
up to 2048 | 0 | ISO 9660 Block end padding
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
DEC Boot Block
|
||||
for MIPS Little Endian , e.g. DECstation
|
||||
|
||||
Sources:
|
||||
cdrkit-1.1.10/genisoimage/boot-mipsel.c
|
||||
by Steve McIntyre <steve@einval.com>
|
||||
which refers to
|
||||
delo by Florian Lohoff <flo@rfc822.org>
|
||||
and Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
|
||||
cdrkit-1.1.10/include/glibc_elf.h
|
||||
by Steve McIntyre
|
||||
which is based on
|
||||
<elf.h> from GNUC C Library by Free Software Foundation, Inc.
|
||||
|
||||
|
||||
There seems to be only one boot file possible.
|
||||
Some information needs to be read out of the ELF headers of this boot file.
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 7 | 0 | Padding
|
||||
| |
|
||||
8 - 11 | 0x0002757a | Magic number
|
||||
| |
|
||||
12 - 15 | 1 | Mode /* 0: Single extent, 1: Multi extent boot */
|
||||
| |
|
||||
16 - 19 | load_adr | Load address /* Load below kernel */
|
||||
| | Stems from ELF header of boot file.
|
||||
| | See below Elf32_Phdr field p_vaddr.
|
||||
| |
|
||||
20 - 23 | exec_adr | Execution address /* And exec there */
|
||||
| | Stems from ELF header of boot file.
|
||||
| | See below Elf32_Ehdr field e_entry.
|
||||
| |
|
||||
24 - 31 | ========== | Boot Map Entry 1
|
||||
| |
|
||||
24 - 27 | seg_size | Segment size in file. Blocks of 512 bytes.
|
||||
| | Stems from ELF header of boot file.
|
||||
| | (Elf32_Phdr field p_filesz + 511) / 512;
|
||||
| |
|
||||
28 - 31 | seg_start | Segment file offset. Blocks 512 bytes.
|
||||
| | ISO 9660 LBA of boot file * 4 plus offset
|
||||
| | + offset which stems from ELF header of boot file:
|
||||
| | (Elf32_Phdr field p_offset + 511) / 512;
|
||||
| |
|
||||
32 - 431 | ========== | Boot Map Entries 2 to 51
|
||||
| 0 |
|
||||
| |
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
|
||||
Elf32_Ehdr gets loaded from boot file byte address 0:
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 23 | | ( Magic number, file information )
|
||||
| |
|
||||
24 - 27 | e_entry | /* Entry point virtual address */
|
||||
| = exec_adr | Needed for exec_adr
|
||||
| |
|
||||
28 - 31 | e_phoff | /* Program header table file offset */
|
||||
| | Byte address of Elf32_Phdr
|
||||
| |
|
||||
|
||||
Elf32_Phdr gets loaded from boot file byte_address Elf32_Ehdr.e_phoff :
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 3 | | ( Segment type )
|
||||
| |
|
||||
4 - 7 | p_offset | /* Segment file offset */
|
||||
|-> seg_start| Needed for seg_start
|
||||
| |
|
||||
8 - 11 | p_vaddr | /* Segment virtual address */
|
||||
| =load_adr | Needed for load_adr
|
||||
| |
|
||||
12 - 15 | | (Segment physical address)
|
||||
| |
|
||||
16 - 19 | p_filesz | /* Segment size in file */
|
||||
|-> seg_size | Needed for seg_size
|
||||
| |
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
SUN Disk Label and boot images
|
||||
for SUN SPARC
|
||||
|
||||
Sources:
|
||||
cdrtools-2.01.01a77/mkisofs/sunlabel.h
|
||||
cdrtools-2.01.01a77/mkisofs/mkisofs.8
|
||||
by Joerg Schilling
|
||||
|
||||
|
||||
The Disk Label is written to the first 512 bytes of the image. It can mark
|
||||
8 partitions (slices ) of which the first contains the ISO image. The other
|
||||
7 may contain boot images.
|
||||
Words are composed big-endian style.
|
||||
|
||||
Boot images are provided externally. mkisofs arranges them after the end of
|
||||
the ISO image so that each starts at a cylinder boundary (320 kB).
|
||||
|
||||
There is a mechanism in mkisofs which fills unused partitions by copies of
|
||||
their predecessor in the partition table:
|
||||
"If the special filename ... is used, the actual and all following
|
||||
boot partitions are mapped to the previous partition.
|
||||
If mkisofs is called with -G image -B ... all boot partitions are
|
||||
mapped to the partition that contains the ISO9660 filesystem."
|
||||
|
||||
|
||||
Disk Label components:
|
||||
|
||||
Byte Range | Value | Meaning
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
0 - 127 | label | ASCII Label
|
||||
| | "CD-ROM Disc with Sun sparc boot created by ..."
|
||||
| | mkisofs option -sparc-label
|
||||
| |
|
||||
128 - 263 | ========== | /* vtoc inclusions from AT&T SVr4 */
|
||||
| |
|
||||
128 - 131 | 1 | Layout version
|
||||
132 - 139 | 0 | /* volume name */
|
||||
140 - 141 | 8 | Number of partitions
|
||||
| |
|
||||
142 - 173 | ========== | 8 partition entries of 4 bytes
|
||||
| |
|
||||
142 - 145 | ========== | Entry for partition 1
|
||||
142 - 143 | 4 | ID tag of partition: 4 = User partition
|
||||
144 - 145 | 0x10 | Permissions: 0x10 = read-only
|
||||
| |
|
||||
146 - 149 | ========== | Entry for partition 2
|
||||
146 - 147 | id_tag2 | ID tag of partition:
|
||||
| | 0 = unused
|
||||
| | 2 = Root partition with boot image
|
||||
148 - 149 | perm2 | Permissions:
|
||||
| | 0 = unused
|
||||
| | 0x10 = read-only (if used)
|
||||
| |
|
||||
150 - 173 | ========== | Entries for partition 3 to 8.
|
||||
| | See above: Entry for partition 2
|
||||
| |
|
||||
174 - 175 | 0 | Padding
|
||||
| |
|
||||
176 - 187 | 0 | /* info for mboot */
|
||||
| |
|
||||
188 - 191 | 0x600ddeee | /* to verify vtoc sanity */
|
||||
| |
|
||||
192 - 231 | 0 | Reserved
|
||||
| |
|
||||
232 - 263 | 0 | 8 Timestamps of yet unknown format
|
||||
| |
|
||||
264 - 419 | 0 | Padding
|
||||
| |
|
||||
420 - 443 | ========== | Disk properties
|
||||
| |
|
||||
420 - 421 | 350 | Rotations per minute
|
||||
422 - 423 | 2048 | Number of physical cylinders (fixely 640 MB)
|
||||
424 - 425 | 0 | /* alternates per cylinder */
|
||||
426 - 429 | 0 | /* obsolete */
|
||||
430 - 431 | 1 | /* interleave factor */
|
||||
432 - 433 | 2048 | Number of data cylinders (fixely 640 MB)
|
||||
434 - 435 | 0 | /* # of alternate cylinders */
|
||||
436 - 437 | 1 | Number of heads per cylinder (i.e. 1 cyl = 320 kB)
|
||||
438 - 439 | 640 | Number of sectors per head (i.e. 1 head = 320 kB)
|
||||
440 - 443 | 0 | /* obsolete */
|
||||
| |
|
||||
444 - 507 | ========== | Partition table
|
||||
| |
|
||||
444 - 451 | ========== | Partition table entry #1
|
||||
| |
|
||||
444 - 447 | start_cyl | Start cylinder
|
||||
| |
|
||||
448 - 451 | num_blocks | Number of blocks in partition
|
||||
| |
|
||||
452 - 507 | ========== | Partition table entries #2 to #8
|
||||
| ... | See above Partition table entry #1
|
||||
| |
|
||||
508 - 509 | 0xdabe | Magic Number
|
||||
| |
|
||||
510 - 511 | checksum | The result of exoring 2-byte words 0 to 254
|
||||
| |
|
||||
---------- | ---------- | ----------------------------------------------------
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
>>> ??? HP-PA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
>>> ??? DEC Alpha
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
@ -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.
|
||||
|
@ -15,6 +15,10 @@
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
@ -11,6 +11,10 @@
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
@ -11,6 +11,10 @@
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
@ -291,9 +295,9 @@ ex:;
|
||||
aaip_get_acl_text("", &a_acl_text, 1 << 15); /* free */
|
||||
if(d_acl_text != NULL)
|
||||
aaip_get_acl_text("", &d_acl_text, 1 << 15); /* free */
|
||||
if(list != NULL)
|
||||
free(list);
|
||||
if(ret <= 0 || (flag & (1 << 15))) {
|
||||
if(list != NULL)
|
||||
free(list);
|
||||
if(*names != NULL) {
|
||||
for(i= 0; i < *num_attrs; i++)
|
||||
free((*names)[i]);
|
||||
|
@ -11,6 +11,10 @@
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
@ -17,6 +17,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
Use the copy of the struct burn_source definition in libisofs.h
|
||||
*/
|
||||
@ -289,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
|
||||
@ -317,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;
|
||||
}
|
||||
|
||||
|
@ -63,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
|
||||
|
@ -8,6 +8,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
/* libisofs.h defines aaip_xinfo_func */
|
||||
#include "libisofs.h"
|
||||
|
||||
|
@ -7,6 +7,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "util.h"
|
||||
|
||||
|
1118
libisofs/ecma119.c
1118
libisofs/ecma119.c
File diff suppressed because it is too large
Load Diff
@ -32,11 +32,33 @@
|
||||
*/
|
||||
#define ISO_EXTENT_SIZE 0xFFFFF800
|
||||
|
||||
/*
|
||||
* The maximum number of partition images that can be registered. Depending
|
||||
* on the system area type, the effectively usable number may be smaller or
|
||||
* even 0.
|
||||
*/
|
||||
#define ISO_MAX_PARTITIONS 8
|
||||
|
||||
/*
|
||||
* The cylindersize with SUN Disk Label
|
||||
* (512 bytes/sector, 640 sectors/head, 1 head/cyl = 320 KiB).
|
||||
* Expressed in ECMA-119 blocks of 2048 bytes/block.
|
||||
*/
|
||||
#define ISO_SUN_CYL_SIZE 160
|
||||
|
||||
/*
|
||||
* Maximum length of a disc label text plus 1.
|
||||
*/
|
||||
#define ISO_DISC_LABEL_SIZE 129
|
||||
|
||||
|
||||
/**
|
||||
* Holds the options for the image generation.
|
||||
*/
|
||||
struct iso_write_opts {
|
||||
|
||||
int will_cancel;
|
||||
|
||||
int level; /**< ISO level to write at. (ECMA-119, 10) */
|
||||
|
||||
/** Which extensions to support. */
|
||||
@ -152,8 +174,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
|
||||
@ -174,8 +194,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;
|
||||
|
||||
@ -318,6 +336,35 @@ struct iso_write_opts {
|
||||
*/
|
||||
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;
|
||||
|
||||
#ifdef Libisofs_with_libjtE
|
||||
/* Parameters and state of Jigdo Template Export environment.
|
||||
*/
|
||||
struct libjte_env *libjte_handle;
|
||||
#endif /* Libisofs_with_libjtE */
|
||||
|
||||
/* A trailing padding of zero bytes which belongs to the image
|
||||
*/
|
||||
uint32_t tail_blocks;
|
||||
|
||||
/* Eventual disk file paths of prepared images which shall be appended
|
||||
after the ISO image and described by partiton table entries in a MBR
|
||||
*/
|
||||
char *appended_partitions[ISO_MAX_PARTITIONS];
|
||||
uint8_t appended_part_types[ISO_MAX_PARTITIONS];
|
||||
|
||||
/* Eventual name of the non-ISO aspect of the image. E.g. SUN ASCII label.
|
||||
*/
|
||||
char ascii_disc_label[ISO_DISC_LABEL_SIZE];
|
||||
};
|
||||
|
||||
typedef struct ecma119_image Ecma119Image;
|
||||
@ -329,9 +376,13 @@ typedef struct Iso_Image_Writer IsoImageWriter;
|
||||
|
||||
struct ecma119_image
|
||||
{
|
||||
int refcount;
|
||||
|
||||
IsoImage *image;
|
||||
Ecma119Node *root;
|
||||
|
||||
int will_cancel :1;
|
||||
|
||||
unsigned int iso_level :2;
|
||||
|
||||
/* extensions */
|
||||
@ -373,13 +424,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.
|
||||
@ -412,8 +459,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;
|
||||
|
||||
/*
|
||||
@ -422,6 +470,11 @@ struct ecma119_image
|
||||
*/
|
||||
uint32_t curblock;
|
||||
|
||||
/*
|
||||
* The address to be used for the content pointer of empty data files.
|
||||
*/
|
||||
uint32_t empty_file_block;
|
||||
|
||||
/*
|
||||
* number of dirs in ECMA-119 tree, computed together with dir position,
|
||||
* and needed for path table computation in a efficient way
|
||||
@ -466,14 +519,19 @@ struct ecma119_image
|
||||
*/
|
||||
char *system_area_data;
|
||||
/*
|
||||
* bit0= make bytes 446 - 512 of the system area a partition
|
||||
* bit0= Only with PC-BIOS DOS MBR
|
||||
* 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.
|
||||
* bit1= Only with PC-BIOS DOS MBR
|
||||
* 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.
|
||||
* bit2-7= System area type
|
||||
* 0= DOS MBR
|
||||
* 1= MIPS Big Endian Volume Header
|
||||
*/
|
||||
int system_area_options;
|
||||
|
||||
@ -490,7 +548,7 @@ struct ecma119_image
|
||||
* file data is written in the first 64 KiB, that are the bytes we usually
|
||||
* overwrite.
|
||||
*/
|
||||
uint32_t pad_blocks;
|
||||
uint32_t mspad_blocks;
|
||||
|
||||
size_t nwriters;
|
||||
IsoImageWriter **writers;
|
||||
@ -498,8 +556,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;
|
||||
@ -525,13 +581,12 @@ struct ecma119_image
|
||||
char scdbackup_tag_parm[100];
|
||||
char *scdbackup_tag_written;
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
/* Buffer for communication between burn_source and writer thread */
|
||||
IsoRingBuffer *buffer;
|
||||
|
||||
/* writer thread descriptor */
|
||||
pthread_t wthread;
|
||||
int wthread_is_running;
|
||||
pthread_attr_t th_attr;
|
||||
|
||||
/* User settable PVD time stamps */
|
||||
@ -543,6 +598,52 @@ struct ecma119_image
|
||||
* 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;
|
||||
|
||||
#ifdef Libisofs_with_libjtE
|
||||
struct libjte_env *libjte_handle;
|
||||
#endif /* Libisofs_with_libjtE */
|
||||
|
||||
uint32_t tail_blocks;
|
||||
|
||||
/* Memorized ELF parameters from MIPS Little Endian boot file */
|
||||
uint32_t mipsel_e_entry;
|
||||
uint32_t mipsel_p_offset;
|
||||
uint32_t mipsel_p_vaddr;
|
||||
uint32_t mipsel_p_filesz;
|
||||
|
||||
char *appended_partitions[ISO_MAX_PARTITIONS];
|
||||
uint8_t appended_part_types[ISO_MAX_PARTITIONS];
|
||||
/* Counted in blocks of 2048 */
|
||||
uint32_t appended_part_prepad[ISO_MAX_PARTITIONS];
|
||||
uint32_t appended_part_start[ISO_MAX_PARTITIONS];
|
||||
uint32_t appended_part_size[ISO_MAX_PARTITIONS];
|
||||
|
||||
char ascii_disc_label[ISO_DISC_LABEL_SIZE];
|
||||
|
||||
};
|
||||
|
||||
#define BP(a,b) [(b) - (a) + 1]
|
||||
|
@ -8,6 +8,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "ecma119_tree.h"
|
||||
#include "ecma119.h"
|
||||
#include "node.h"
|
||||
@ -146,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);
|
||||
@ -166,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;
|
||||
}
|
||||
@ -267,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 {
|
||||
@ -331,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 {
|
||||
@ -344,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,
|
||||
@ -355,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;
|
||||
@ -381,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;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -648,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;
|
||||
@ -657,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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -778,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;
|
||||
}
|
||||
@ -981,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 */
|
||||
@ -989,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;
|
||||
}
|
||||
@ -1009,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;
|
||||
}
|
||||
@ -1027,3 +1109,35 @@ int ecma119_tree_create(Ecma119Image *img)
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search the tree for a certain IsoNode and return its owning Ecma119Node
|
||||
* or NULL.
|
||||
*/
|
||||
static
|
||||
Ecma119Node *search_iso_node(Ecma119Node *root, IsoNode *node)
|
||||
{
|
||||
size_t i;
|
||||
Ecma119Node *res = NULL;
|
||||
|
||||
if (root->node == node)
|
||||
return root;
|
||||
for (i = 0; i < root->info.dir->nchildren && res == NULL; i++) {
|
||||
if (root->info.dir->children[i]->type == ECMA119_DIR)
|
||||
res = search_iso_node(root->info.dir->children[i], node);
|
||||
else if (root->info.dir->children[i]->node == node)
|
||||
res = root->info.dir->children[i];
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
Ecma119Node *ecma119_search_iso_node(Ecma119Image *img, IsoNode *node)
|
||||
{
|
||||
Ecma119Node *res = NULL;
|
||||
|
||||
if (img->root != NULL)
|
||||
res = search_iso_node(img->root, node);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -90,4 +90,11 @@ int ecma119_tree_create(Ecma119Image *img);
|
||||
*/
|
||||
void ecma119_node_free(Ecma119Node *node);
|
||||
|
||||
/**
|
||||
* Search the tree for a certain IsoNode and return its owning Ecma119Node
|
||||
* or NULL.
|
||||
*/
|
||||
Ecma119Node *ecma119_search_iso_node(Ecma119Image *img, IsoNode *node);
|
||||
|
||||
|
||||
#endif /*LIBISO_ECMA119_TREE_H_*/
|
||||
|
@ -8,6 +8,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "eltorito.h"
|
||||
#include "stream.h"
|
||||
#include "fsource.h"
|
||||
@ -305,6 +309,7 @@ int create_image(IsoImage *image, const char *image_path,
|
||||
int boot_media_type = 0;
|
||||
int load_sectors = 0; /* number of sector to load */
|
||||
unsigned char partition_type = 0;
|
||||
off_t size;
|
||||
IsoNode *imgfile;
|
||||
IsoStream *stream;
|
||||
|
||||
@ -313,6 +318,9 @@ int create_image(IsoImage *image, const char *image_path,
|
||||
return ret;
|
||||
}
|
||||
if (ret == 0) {
|
||||
iso_msg_submit(image->id, ISO_NODE_DOESNT_EXIST, 0,
|
||||
"El Torito boot image file missing in ISO image: '%s'",
|
||||
image_path);
|
||||
return ISO_NODE_DOESNT_EXIST;
|
||||
}
|
||||
|
||||
@ -327,9 +335,16 @@ int create_image(IsoImage *image, const char *image_path,
|
||||
return ISO_BOOT_IMAGE_NOT_VALID;
|
||||
}
|
||||
|
||||
size = iso_stream_get_size(stream);
|
||||
if (size <= 0) {
|
||||
iso_msg_submit(image->id, ISO_BOOT_IMAGE_NOT_VALID, 0,
|
||||
"Boot image file is empty");
|
||||
return ISO_BOOT_IMAGE_NOT_VALID;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case ELTORITO_FLOPPY_EMUL:
|
||||
switch (iso_stream_get_size(stream)) {
|
||||
switch (size) {
|
||||
case 1200 * 1024:
|
||||
boot_media_type = 1; /* 1.2 meg diskette */
|
||||
break;
|
||||
@ -467,6 +482,9 @@ int iso_image_set_boot_image(IsoImage *image, const char *image_path,
|
||||
catname[0] = '\0';
|
||||
ret = iso_tree_path_to_node(image, catdir, &p);
|
||||
if (ret <= 0) {
|
||||
iso_msg_submit(image->id, ISO_NODE_DOESNT_EXIST, 0,
|
||||
"Cannot find directory for El Torito boot catalog in ISO image: '%s'",
|
||||
catdir);
|
||||
free(catdir);
|
||||
return ret < 0 ? ret : ISO_NODE_DOESNT_EXIST;
|
||||
}
|
||||
@ -649,6 +667,8 @@ int iso_image_add_boot_image(IsoImage *image, const char *image_path,
|
||||
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);
|
||||
@ -670,6 +690,18 @@ int iso_image_set_boot_catalog_weight(IsoImage *image, int 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;
|
||||
@ -924,7 +956,7 @@ int catalog_stream_new(Ecma119Image *target, IsoStream **stream)
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
data = calloc(1, sizeof(struct catalog_stream));
|
||||
if (str == NULL) {
|
||||
if (data == NULL) {
|
||||
free(str);
|
||||
return ISO_OUT_OF_MEM;
|
||||
}
|
||||
@ -1089,6 +1121,7 @@ int eltorito_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
}
|
||||
ret = iso_stream_open(original);
|
||||
if (ret < 0) {
|
||||
free(buf);
|
||||
return ret;
|
||||
}
|
||||
ret = iso_stream_read(original, buf, size);
|
||||
@ -1131,7 +1164,6 @@ int eltorito_writer_write_vol_desc(IsoImageWriter *writer)
|
||||
|
||||
t = writer->target;
|
||||
cat = t->catalog;
|
||||
|
||||
iso_msg_debug(t->image->id, "Write El-Torito boot record");
|
||||
|
||||
memset(&vol, 0, sizeof(struct ecma119_boot_rec_vol_desc));
|
||||
@ -1139,8 +1171,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));
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2007 Vreixo Formoso
|
||||
* 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
|
||||
@ -7,6 +8,11 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "filesrc.h"
|
||||
#include "node.h"
|
||||
#include "util.h"
|
||||
@ -14,16 +20,28 @@
|
||||
#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>
|
||||
|
||||
|
||||
#ifdef Xorriso_standalonE
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
#include "../libjte/libjte.h"
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#ifdef Libisofs_with_libjtE
|
||||
#include <libjte/libjte.h>
|
||||
#endif
|
||||
|
||||
#endif /* ! Xorriso_standalonE */
|
||||
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX Libisofs_default_path_maX
|
||||
#endif
|
||||
@ -53,11 +71,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;
|
||||
@ -103,9 +118,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
|
||||
*/
|
||||
@ -113,17 +125,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,
|
||||
@ -149,8 +156,6 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
||||
return cret;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
@ -261,7 +266,12 @@ int filesrc_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
/*
|
||||
* final section
|
||||
*/
|
||||
file->sections[extent].block = t->curblock + extent * (ISO_EXTENT_SIZE / BLOCK_SIZE);
|
||||
if (section_size <= 0) {
|
||||
file->sections[extent].block = t->empty_file_block;
|
||||
} else {
|
||||
file->sections[extent].block =
|
||||
t->curblock + extent * (ISO_EXTENT_SIZE / BLOCK_SIZE);
|
||||
}
|
||||
file->sections[extent].size = (uint32_t)section_size;
|
||||
|
||||
t->curblock += DIV_UP(iso_file_src_get_size(file), BLOCK_SIZE);
|
||||
@ -304,21 +314,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)
|
||||
{
|
||||
@ -331,14 +336,13 @@ 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;
|
||||
#ifdef Libisofs_with_libjtE
|
||||
int jte_begun = 0;
|
||||
#endif
|
||||
|
||||
|
||||
if (writer == NULL) {
|
||||
return ISO_ASSERT_FAILURE;
|
||||
}
|
||||
@ -353,17 +357,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) {
|
||||
@ -407,18 +405,29 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
#ifdef Libisofs_with_libjtE
|
||||
if (t->libjte_handle != NULL) {
|
||||
res = libjte_begin_data_file(t->libjte_handle, name,
|
||||
BLOCK_SIZE, file_size);
|
||||
if (res <= 0) {
|
||||
res = iso_libjte_forward_msgs(t->libjte_handle, t->image->id,
|
||||
ISO_LIBJTE_FILE_FAILED, 0);
|
||||
if (res < 0) {
|
||||
filesrc_close(file);
|
||||
ret = ISO_LIBJTE_FILE_FAILED;
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
jte_begun = 1;
|
||||
}
|
||||
#endif /* Libisofs_with_libjtE */
|
||||
|
||||
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;
|
||||
@ -434,9 +443,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)
|
||||
@ -447,9 +453,6 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
||||
if (res <= 0)
|
||||
file->checksum_index = 0;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
}
|
||||
|
||||
filesrc_close(file);
|
||||
@ -484,9 +487,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)
|
||||
@ -497,14 +497,8 @@ 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 &&
|
||||
file->checksum_index <= t->checksum_idx_counter) {
|
||||
/* Obtain checksum and dispose checksum context */
|
||||
@ -530,17 +524,33 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
||||
memcpy(t->checksum_buffer + 16 * file->checksum_index, md5, 16);
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
#ifdef Libisofs_with_libjtE
|
||||
if (t->libjte_handle != NULL) {
|
||||
res = libjte_end_data_file(t->libjte_handle);
|
||||
if (res <= 0) {
|
||||
iso_libjte_forward_msgs(t->libjte_handle, t->image->id,
|
||||
ISO_LIBJTE_FILE_FAILED, 0);
|
||||
ret = ISO_LIBJTE_FILE_FAILED;
|
||||
goto ex;
|
||||
}
|
||||
jte_begun = 0;
|
||||
}
|
||||
#endif /* Libisofs_with_libjtE */
|
||||
|
||||
}
|
||||
|
||||
ret = ISO_SUCCESS;
|
||||
ex:;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
if (ctx != NULL) /* avoid any memory leak */
|
||||
iso_md5_end(&ctx, md5);
|
||||
#endif
|
||||
|
||||
#ifdef Libisofs_with_libjtE
|
||||
if (jte_begun) {
|
||||
libjte_end_data_file(t->libjte_handle);
|
||||
iso_libjte_forward_msgs(t->libjte_handle, t->image->id,
|
||||
ISO_LIBJTE_END_FAILED, 0);
|
||||
}
|
||||
#endif /* Libisofs_with_libjtE */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -18,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;
|
||||
|
@ -8,6 +8,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "filter.h"
|
||||
#include "node.h"
|
||||
|
@ -13,6 +13,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "../libisofs.h"
|
||||
#include "../filter.h"
|
||||
#include "../fsource.h"
|
||||
|
@ -17,6 +17,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "../libisofs.h"
|
||||
#include "../filter.h"
|
||||
#include "../fsource.h"
|
||||
|
@ -1,188 +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
|
||||
* or later 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;
|
||||
}
|
@ -14,6 +14,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "../libisofs.h"
|
||||
#include "../filter.h"
|
||||
#include "../fsource.h"
|
||||
@ -826,6 +830,9 @@ int ziso_cmp_ino(IsoStream *s1, IsoStream *s2)
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
|
||||
|
||||
#ifdef Libisofs_with_zliB
|
||||
|
||||
static
|
||||
void ziso_filter_free(FilterContext *filter)
|
||||
{
|
||||
@ -913,8 +920,6 @@ int ziso_filter_get_uncompressor(FilterContext *filter, IsoStream *original,
|
||||
}
|
||||
|
||||
|
||||
#ifdef Libisofs_with_zliB
|
||||
|
||||
/* Produce a parameter object suitable for iso_file_add_filter().
|
||||
* It may be disposed by free() after all those calls are made.
|
||||
*
|
||||
|
@ -7,6 +7,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "node.h"
|
||||
|
||||
|
@ -13,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"
|
||||
@ -389,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);
|
||||
@ -2439,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);
|
||||
@ -2456,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);
|
||||
|
||||
@ -2787,8 +2796,17 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
||||
break;
|
||||
if (idx < fsdata->num_bootimgs) {
|
||||
/* it is boot image node */
|
||||
|
||||
if (image->bootcat->bootimages[idx]->image != NULL) {
|
||||
/* idx is already occupied, try to find unoccupied one
|
||||
which has the same block address.
|
||||
*/
|
||||
for (; idx < fsdata->num_bootimgs; idx++)
|
||||
if (fsdata->eltorito && data->sections[0].block ==
|
||||
fsdata->bootblocks[idx] &&
|
||||
image->bootcat->bootimages[idx]->image == NULL)
|
||||
break;
|
||||
}
|
||||
if (idx >= fsdata->num_bootimgs) {
|
||||
ret = iso_msg_submit(image->id, ISO_EL_TORITO_WARN, 0,
|
||||
"More than one ISO node has been found for the same boot image.");
|
||||
if (ret < 0) {
|
||||
@ -3128,8 +3146,6 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
uint8_t *rpt;
|
||||
IsoFileSource *boot_src;
|
||||
IsoNode *node;
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
uint32_t old_checksum_start_lba;
|
||||
uint32_t old_checksum_end_lba;
|
||||
uint32_t old_checksum_idx_count;
|
||||
@ -3139,7 +3155,6 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
size_t size;
|
||||
void *ctx = NULL;
|
||||
char md5[16];
|
||||
#endif
|
||||
|
||||
if (image == NULL || src == NULL || opts == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
@ -3181,14 +3196,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);
|
||||
@ -3363,8 +3375,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,
|
||||
@ -3417,8 +3427,6 @@ 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;
|
||||
@ -3432,14 +3440,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:;
|
||||
|
||||
@ -3450,14 +3455,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;
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,10 @@
|
||||
* 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"
|
||||
@ -58,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] = '/';
|
||||
|
@ -7,6 +7,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "fsource.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
|
@ -8,6 +8,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "image.h"
|
||||
#include "node.h"
|
||||
@ -32,7 +36,7 @@
|
||||
*/
|
||||
int iso_image_new(const char *name, IsoImage **image)
|
||||
{
|
||||
int res;
|
||||
int res, i;
|
||||
IsoImage *img;
|
||||
|
||||
if (image == NULL) {
|
||||
@ -76,19 +80,19 @@ int iso_image_new(const char *name, IsoImage **image)
|
||||
}
|
||||
img->system_area_data = NULL;
|
||||
img->system_area_options = 0;
|
||||
img->num_mips_boot_files = 0;
|
||||
for (i = 0; i < 15; i++)
|
||||
img->mips_boot_file_paths[i] = NULL;
|
||||
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
|
||||
|
||||
img->generator_is_running = 0;
|
||||
*image = img;
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
@ -102,7 +106,7 @@ void iso_image_ref(IsoImage *image)
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrements the reference couting of the given image.
|
||||
* Decrements the reference counting of the given image.
|
||||
* If it reaches 0, the image is free, together with its tree nodes (whether
|
||||
* their refcount reach 0 too, of course).
|
||||
*/
|
||||
@ -126,6 +130,7 @@ void iso_image_unref(IsoImage *image)
|
||||
iso_node_builder_unref(image->builder);
|
||||
iso_filesystem_unref(image->fs);
|
||||
el_torito_boot_catalog_free(image->bootcat);
|
||||
iso_image_give_up_mips_boot(image, 0);
|
||||
free(image->volset_id);
|
||||
free(image->volume_id);
|
||||
free(image->publisher_id);
|
||||
@ -145,17 +150,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;
|
||||
}
|
||||
|
||||
@ -175,13 +175,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;
|
||||
@ -592,39 +592,66 @@ 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;
|
||||
}
|
||||
|
||||
int iso_image_generator_is_running(IsoImage *image)
|
||||
{
|
||||
return image->generator_is_running;
|
||||
}
|
||||
|
||||
|
||||
/* API */
|
||||
int iso_image_add_mips_boot_file(IsoImage *image, char *path, int flag)
|
||||
{
|
||||
if (image->num_mips_boot_files >= 15)
|
||||
return ISO_BOOT_TOO_MANY_MIPS;
|
||||
image->mips_boot_file_paths[image->num_mips_boot_files] = strdup(path);
|
||||
if (image->mips_boot_file_paths[image->num_mips_boot_files] == NULL)
|
||||
return ISO_OUT_OF_MEM;
|
||||
image->num_mips_boot_files++;
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int iso_image_get_mips_boot_files(IsoImage *image, char *paths[15], int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < image->num_mips_boot_files; i++)
|
||||
paths[i] = image->mips_boot_file_paths[i];
|
||||
for (; i < 15; i++)
|
||||
paths[i] = NULL;
|
||||
return image->num_mips_boot_files;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int iso_image_give_up_mips_boot(IsoImage *image, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < image->num_mips_boot_files; i++)
|
||||
if (image->mips_boot_file_paths[i] != NULL) {
|
||||
free(image->mips_boot_file_paths[i]);
|
||||
image->mips_boot_file_paths[i] = NULL;
|
||||
}
|
||||
image->num_mips_boot_files = 0;
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
@ -58,6 +58,14 @@ struct Iso_Image
|
||||
/* Prescribed/detected options, see iso_write_opts_set_system_area() */
|
||||
int system_area_options;
|
||||
|
||||
/*
|
||||
* Up to 15 boot files can be referred by a MIPS Big Endian Volume Header.
|
||||
The mips_boot_file_paths are ISO 9660 Rock Ridge paths.
|
||||
*/
|
||||
int num_mips_boot_files;
|
||||
char *mips_boot_file_paths[15]; /* ISO 9660 Rock Ridge Paths */
|
||||
|
||||
|
||||
/* image identifier, for message origin identifier */
|
||||
int id;
|
||||
|
||||
@ -154,8 +162,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
|
||||
@ -168,7 +174,11 @@ struct Iso_Image
|
||||
uint32_t checksum_idx_count;
|
||||
char *checksum_array;
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
/**
|
||||
* Whether a write run has been started by iso_image_create_burn_source()
|
||||
* and has not yet been finished.
|
||||
*/
|
||||
int generator_is_running;
|
||||
|
||||
};
|
||||
|
||||
|
@ -7,6 +7,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "iso1999.h"
|
||||
#include "messages.h"
|
||||
#include "writer.h"
|
||||
@ -1024,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;
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "joliet.h"
|
||||
#include "messages.h"
|
||||
#include "writer.h"
|
||||
@ -244,7 +248,7 @@ int create_tree(Ecma119Image *t, IsoNode *iso, JolietNode **tree, int pathlen)
|
||||
char *ipath = iso_tree_get_node_path(iso);
|
||||
ret = iso_msg_submit(t->image->id, ISO_FILE_IGNORED, 0,
|
||||
"Can't add %s to Joliet tree. %s can only be added to a "
|
||||
"Rock Ridget tree.", ipath, (iso->type == LIBISO_SYMLINK ?
|
||||
"Rock Ridge tree.", ipath, (iso->type == LIBISO_SYMLINK ?
|
||||
"Symlinks" : "Special files"));
|
||||
free(ipath);
|
||||
}
|
||||
@ -552,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;
|
||||
}
|
||||
|
||||
@ -669,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;
|
||||
@ -692,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;
|
||||
}
|
||||
|
||||
@ -754,7 +779,7 @@ 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);
|
||||
@ -790,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;
|
||||
@ -831,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_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);
|
||||
@ -980,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]);
|
||||
@ -1019,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++) {
|
||||
@ -1047,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;
|
||||
}
|
||||
@ -1069,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;
|
||||
}
|
||||
|
||||
@ -1098,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;
|
||||
|
@ -54,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 */
|
||||
|
@ -5,6 +5,10 @@
|
||||
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>
|
||||
|
File diff suppressed because it is too large
Load Diff
301
libisofs/libisofs.ver
Normal file
301
libisofs/libisofs.ver
Normal file
@ -0,0 +1,301 @@
|
||||
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_add_mips_boot_file;
|
||||
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_generator_is_running;
|
||||
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_mips_boot_files;
|
||||
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_give_up_mips_boot;
|
||||
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_attach_jte;
|
||||
iso_write_opts_detach_jte;
|
||||
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_disc_label;
|
||||
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_partition_img;
|
||||
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_write_opts_set_tail_blocks;
|
||||
iso_write_opts_set_will_cancel;
|
||||
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>
|
||||
|
@ -8,6 +8,10 @@
|
||||
*/
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -430,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
|
||||
@ -508,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;
|
||||
@ -557,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;
|
||||
}
|
||||
|
||||
@ -580,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;
|
||||
@ -649,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 */
|
||||
}
|
||||
|
||||
|
||||
@ -684,17 +669,11 @@ 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;
|
||||
}
|
||||
|
||||
@ -702,9 +681,6 @@ int checksum_writer_create(Ecma119Image *target)
|
||||
static
|
||||
int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag)
|
||||
{
|
||||
|
||||
#ifdef Libisofs_with_checksumS
|
||||
|
||||
void *ctx = NULL;
|
||||
off_t pos = 0, line_start;
|
||||
int record_len, block_len, res, i;
|
||||
@ -753,12 +729,6 @@ ex:;
|
||||
if (ctx != NULL)
|
||||
iso_md5_end(&ctx, md5);
|
||||
return res;
|
||||
|
||||
#else
|
||||
|
||||
return ISO_SUCCESS;
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
}
|
||||
|
||||
|
||||
@ -772,9 +742,6 @@ ex:;
|
||||
*/
|
||||
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;
|
||||
@ -863,13 +830,6 @@ ex:;
|
||||
if (ctx != NULL)
|
||||
iso_md5_end(&ctx, md5);
|
||||
return res;
|
||||
|
||||
#else /* Libisofs_with_checksumS */
|
||||
|
||||
return ISO_SUCCESS;
|
||||
|
||||
#endif /* ! Libisofs_with_checksumS */
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -6,12 +6,31 @@
|
||||
* 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>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef Xorriso_standalonE
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
#include "../libjte/libjte.h"
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#ifdef Libisofs_with_libjtE
|
||||
#include <libjte/libjte.h>
|
||||
#endif
|
||||
|
||||
#endif /* ! Xorriso_standalonE */
|
||||
|
||||
#include "libiso_msgs.h"
|
||||
#include "libisofs.h"
|
||||
#include "messages.h"
|
||||
@ -66,6 +85,41 @@ struct libiso_msgs *libiso_msgr = NULL;
|
||||
int iso_init_with_flag(int flag)
|
||||
{
|
||||
|
||||
#ifdef Libisofs_with_libjtE
|
||||
|
||||
/* Ugly compile time check for header version compatibility.
|
||||
If everthing matches, then it produces no C code. In case of mismatch,
|
||||
intentionally faulty C code will be inserted.
|
||||
*/
|
||||
/* The indendation is an advise of man gcc to help old compilers ignoring */
|
||||
#if iso_libjte_req_major > LIBJTE_VERSION_MAJOR
|
||||
#define Libisofs_libjte_dot_h_too_olD 1
|
||||
#endif
|
||||
#if iso_libjte_req_major == LIBJTE_VERSION_MAJOR && iso_libjte_req_minor > LIBJTE_VERSION_MINOR
|
||||
#define Libisofs_libjte_dot_h_too_olD 1
|
||||
#endif
|
||||
#if iso_libjte_req_minor == LIBJTE_VERSION_MINOR && iso_libjte_req_micro > LIBJTE_VERSION_MICRO
|
||||
#define Libisofs_libjte_dot_h_too_olD 1
|
||||
#endif
|
||||
|
||||
#ifdef Libisofs_libjte_dot_h_too_olD
|
||||
LIBJTE_MISCONFIGURATION = 0;
|
||||
INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libjte_dot_h_TOO_OLD__SEE_libisofs_dot_h_AND_messages_c = 0;
|
||||
LIBJTE_MISCONFIGURATION_ = 0;
|
||||
#endif
|
||||
|
||||
if (! libjte__is_compatible(LIBJTE_VERSION_MAJOR, LIBJTE_VERSION_MINOR,
|
||||
LIBJTE_VERSION_MICRO, 0)) {
|
||||
fprintf(stderr,
|
||||
"\nlibisofs: libjte TOO OLD ! Need at least libjte-%d.%d.%d\n\n",
|
||||
LIBJTE_VERSION_MAJOR, LIBJTE_VERSION_MINOR,
|
||||
LIBJTE_VERSION_MICRO);
|
||||
return ISO_FATAL_ERROR;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_libjtE */
|
||||
|
||||
|
||||
if (! (flag & 1)) {
|
||||
iso_init_locale(0);
|
||||
}
|
||||
@ -279,6 +333,34 @@ const char *iso_error_to_msg(int errcode)
|
||||
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";
|
||||
case ISO_LIBJTE_NOT_ENABLED:
|
||||
return "Use of libjte was not enabled at compile time";
|
||||
case ISO_LIBJTE_START_FAILED:
|
||||
return "Failed to start up Jigdo Template Extraction";
|
||||
case ISO_LIBJTE_END_FAILED:
|
||||
return "Failed to finish Jigdo Template Extraction";
|
||||
case ISO_LIBJTE_FILE_FAILED:
|
||||
return "Failed to process file for Jigdo Template Extraction";
|
||||
case ISO_BOOT_TOO_MANY_MIPS:
|
||||
return "Too many MIPS Big Endian boot files given (max. 15)";
|
||||
case ISO_BOOT_FILE_MISSING:
|
||||
return "Boot file missing in image";
|
||||
case ISO_BAD_PARTITION_NO:
|
||||
return "Partition number out of range";
|
||||
case ISO_BAD_PARTITION_FILE:
|
||||
return "Cannot open data file for appended partition";
|
||||
case ISO_NON_MBR_SYS_AREA:
|
||||
return "May not combine appended partition with non-MBR system area";
|
||||
case ISO_DISPLACE_ROLLOVER:
|
||||
return "Displacement offset leads outside 32 bit range";
|
||||
default:
|
||||
return "Unknown error";
|
||||
}
|
||||
@ -419,8 +501,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)
|
||||
{
|
||||
@ -448,8 +528,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;
|
||||
@ -461,8 +539,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;
|
||||
@ -501,7 +577,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,
|
||||
@ -509,3 +584,33 @@ int iso_report_errfile(char *path, int error_code, int os_errno, int flag)
|
||||
path, os_errno, 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int iso_libjte_forward_msgs(void *libjte_handle,
|
||||
int imgid, int errcode, int flag)
|
||||
{
|
||||
|
||||
#ifdef Libisofs_with_libjtE
|
||||
|
||||
char *msg = NULL;
|
||||
int res;
|
||||
struct libjte_env *handle = (struct libjte_env *) libjte_handle;
|
||||
|
||||
res = ISO_SUCCESS;
|
||||
while(1) {
|
||||
msg= libjte_get_next_message(handle);
|
||||
if(msg == NULL)
|
||||
break;
|
||||
res = iso_msg_submit(imgid, errcode, 0, msg);
|
||||
free(msg);
|
||||
}
|
||||
return res;
|
||||
|
||||
#else /* Libisofs_with_libjtE */
|
||||
|
||||
return ISO_SUCCESS;
|
||||
|
||||
#endif /* ! Libisofs_with_libjtE */
|
||||
|
||||
}
|
||||
|
||||
|
@ -46,7 +46,6 @@ int iso_msg_is_abort(int errcode);
|
||||
int iso_msg_submit(int imgid, int errcode, int causedby, const char *fmt, ...);
|
||||
|
||||
|
||||
/* ts A80222 */
|
||||
/* To be called with events which report incidents with individual input
|
||||
files from the local filesystem. Not with image nodes, files containing an
|
||||
image or similar file-like objects.
|
||||
@ -54,4 +53,10 @@ int iso_msg_submit(int imgid, int errcode, int causedby, const char *fmt, ...);
|
||||
int iso_report_errfile(char *path, int error_code, int os_errno, int flag);
|
||||
|
||||
|
||||
/* Drains the libjte message list and puts out the messages via
|
||||
iso_msg_submit()
|
||||
*/
|
||||
int iso_libjte_forward_msgs(void *libjte_handle,
|
||||
int imgid, int errcode, int flag);
|
||||
|
||||
#endif /*MESSAGES_H_*/
|
||||
|
@ -8,6 +8,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "image.h"
|
||||
#include "node.h"
|
||||
@ -428,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
|
||||
@ -2660,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;
|
||||
@ -2702,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;
|
||||
|
||||
@ -2737,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 */
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -9,6 +9,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "rockridge.h"
|
||||
#include "node.h"
|
||||
#include "ecma119_tree.h"
|
||||
@ -180,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);
|
||||
}
|
||||
|
||||
@ -273,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);
|
||||
}
|
||||
|
||||
@ -693,7 +699,8 @@ 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], (uint32_t) ce_len, 4);
|
||||
|
||||
|
@ -13,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"
|
||||
|
@ -8,6 +8,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "stream.h"
|
||||
#include "fsource.h"
|
||||
@ -582,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;
|
||||
}
|
||||
@ -864,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,
|
||||
@ -923,6 +924,3 @@ ex:;
|
||||
iso_md5_end(&ctx, md5);
|
||||
return res;
|
||||
}
|
||||
|
||||
#endif /* Libisofs_with_checksumS */
|
||||
|
||||
|
@ -8,12 +8,24 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "system_area.h"
|
||||
#include "eltorito.h"
|
||||
#include "filesrc.h"
|
||||
#include "ecma119_tree.h"
|
||||
#include "image.h"
|
||||
#include "messages.h"
|
||||
#include "ecma119.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
/*
|
||||
@ -28,12 +40,127 @@ int make_isohybrid_mbr(int bin_lba, int *img_blocks, char *mbr, int flag);
|
||||
* Be cautious with changing parameters. Only few combinations are tested.
|
||||
*
|
||||
*/
|
||||
int make_isolinux_mbr(int32_t *img_blocks, uint32_t boot_lba,
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Compute size and position of appended partitions.
|
||||
*/
|
||||
int iso_compute_append_partitions(Ecma119Image *t, int flag)
|
||||
{
|
||||
int ret, i, sa_type;
|
||||
uint32_t pos, size, add_pos = 0;
|
||||
struct stat stbuf;
|
||||
|
||||
sa_type = (t->system_area_options >> 2) & 0x3f;
|
||||
pos = (t->vol_space_size + t->ms_block);
|
||||
for (i = 0; i < ISO_MAX_PARTITIONS; i++) {
|
||||
if (t->appended_partitions[i] == NULL)
|
||||
continue;
|
||||
if (t->appended_partitions[i][0] == 0)
|
||||
continue;
|
||||
ret = stat(t->appended_partitions[i], &stbuf);
|
||||
if (ret == -1)
|
||||
return ISO_BAD_PARTITION_FILE;
|
||||
if (! S_ISREG(stbuf.st_mode))
|
||||
return ISO_BAD_PARTITION_FILE;
|
||||
size = ((stbuf.st_size + 2047) / 2048);
|
||||
if (sa_type == 3 && (pos % ISO_SUN_CYL_SIZE))
|
||||
add_pos = ISO_SUN_CYL_SIZE - (pos % ISO_SUN_CYL_SIZE);
|
||||
t->appended_part_prepad[i] = add_pos;
|
||||
t->appended_part_start[i] = pos + add_pos;
|
||||
t->appended_part_size[i] = size;
|
||||
pos += add_pos + size;
|
||||
t->total_size += (add_pos + size) * 2048;
|
||||
}
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/* Note: partition_offset and partition_size are counted in 2048 blocks
|
||||
*/
|
||||
static int write_mbr_partition_entry(int partition_number, int partition_type,
|
||||
uint32_t partition_offset, uint32_t partition_size,
|
||||
int sph, int hpc, 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;
|
||||
uint32_t after_end;
|
||||
int i;
|
||||
|
||||
after_end = partition_offset + partition_size;
|
||||
iso_compute_cyl_head_sec(&partition_offset, hpc, sph,
|
||||
&start_lba, &start_sec, &start_head, &start_cyl, 1);
|
||||
iso_compute_cyl_head_sec(&after_end, hpc, sph,
|
||||
&end_lba, &end_sec, &end_head, &end_cyl, 0);
|
||||
wpt = buf + 446 + (partition_number - 1) * 16;
|
||||
|
||||
/* Not bootable */
|
||||
*(wpt++) = 0x00;
|
||||
|
||||
/* C/H/S of the start */
|
||||
*(wpt++) = start_head;
|
||||
*(wpt++) = start_sec | ((start_cyl & 0x300) >> 2);
|
||||
*(wpt++) = start_cyl & 0xff;
|
||||
|
||||
/* (partition type) */
|
||||
*(wpt++) = partition_type;
|
||||
|
||||
/* 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;
|
||||
|
||||
/* Afaik, partition tables are recognize donly with MBR signature */
|
||||
buf[510] = 0x55;
|
||||
buf[511] = 0xAA;
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/* 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:
|
||||
@ -49,38 +176,36 @@ int make_isolinux_mbr(int32_t *img_blocks, uint32_t boot_lba,
|
||||
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(int img_blocks, uint8_t *buf, int flag)
|
||||
int make_grub_msdos_label(uint32_t img_blocks, int sph, int hpc,
|
||||
uint8_t *buf, int flag)
|
||||
{
|
||||
uint8_t *wpt;
|
||||
unsigned long end_lba, secs, end_sec, end_head, end_cyl;
|
||||
int sph = 63, hpc = 255, i;
|
||||
uint32_t end_lba, end_sec, end_head, end_cyl;
|
||||
int i;
|
||||
|
||||
/* 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 */
|
||||
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;
|
||||
}
|
||||
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);
|
||||
|
||||
/* 2) Put 0x55, 0xAA into 510-512 (actually 510-511) */
|
||||
buf[510] = 0x55;
|
||||
buf[511] = 0xAA;
|
||||
|
||||
/* 3) Put 0x80 (for bootable partition), */
|
||||
*(wpt++) = 0x80;
|
||||
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;
|
||||
@ -116,10 +241,454 @@ int make_grub_msdos_label(int img_blocks, uint8_t *buf, int flag)
|
||||
}
|
||||
|
||||
|
||||
int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
||||
/* @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, int hpc, 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 i;
|
||||
|
||||
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++) = start_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;
|
||||
}
|
||||
|
||||
|
||||
static int boot_nodes_from_iso_path(Ecma119Image *t, char *path,
|
||||
IsoNode **iso_node, Ecma119Node **ecma_node,
|
||||
char *purpose, int flag)
|
||||
{
|
||||
int ret;
|
||||
int img_blocks;
|
||||
|
||||
ret = iso_tree_path_to_node(t->image, path, iso_node);
|
||||
if (ret < 0) {
|
||||
iso_msg_submit(t->image->id, ISO_BOOT_FILE_MISSING, 0,
|
||||
"Cannot find %s '%s'", purpose, path);
|
||||
return ISO_BOOT_FILE_MISSING;
|
||||
}
|
||||
if ((*iso_node)->type != LIBISO_FILE) {
|
||||
iso_msg_submit(t->image->id, ISO_BOOT_IMAGE_NOT_VALID, 0,
|
||||
"Designated boot file is not a data file: '%s'", path);
|
||||
return ISO_BOOT_IMAGE_NOT_VALID;
|
||||
}
|
||||
|
||||
*ecma_node= ecma119_search_iso_node(t, *iso_node);
|
||||
if (*ecma_node == NULL) {
|
||||
iso_msg_submit(t->image->id, ISO_BOOT_IMAGE_NOT_VALID, 0,
|
||||
"Program error: IsoFile has no Ecma119Node: '%s'", path);
|
||||
return ISO_ASSERT_FAILURE;
|
||||
} else {
|
||||
if ((*ecma_node)->type != ECMA119_FILE) {
|
||||
iso_msg_submit(t->image->id, ISO_BOOT_IMAGE_NOT_VALID, 0,
|
||||
"Program error: Ecma119Node of IsoFile is no ECMA119_FILE: '%s'",
|
||||
path);
|
||||
return ISO_ASSERT_FAILURE;
|
||||
}
|
||||
}
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/* This function was implemented according to doc/boot_sectors.txt section
|
||||
"MIPS Volume Header" which was derived by Thomas Schmitt from
|
||||
cdrkit-1.1.10/genisoimage/boot-mips.c by Steve McIntyre which is based
|
||||
on work of Florian Lohoff and Thiemo Seufer who possibly learned from
|
||||
documents of MIPS Computer Systems, Inc. and Silicon Graphics Computer
|
||||
Systems, Inc.
|
||||
This function itself is entirely under copyright (C) 2010 Thomas Schmitt.
|
||||
*/
|
||||
static int make_mips_volume_header(Ecma119Image *t, uint8_t *buf, int flag)
|
||||
{
|
||||
char *namept, *name_field;
|
||||
uint32_t num_cyl, idx, blocks, num, checksum;
|
||||
off_t image_size;
|
||||
static uint32_t bps = 512, spt = 32;
|
||||
Ecma119Node *ecma_node;
|
||||
IsoNode *node;
|
||||
IsoStream *stream;
|
||||
off_t file_size;
|
||||
uint32_t file_lba;
|
||||
int ret;
|
||||
|
||||
/* Bytes 512 to 32767 may come from image or external file */
|
||||
memset(buf, 0, 512);
|
||||
|
||||
image_size = t->curblock * 2048;
|
||||
|
||||
/* 0 - 3 | 0x0be5a941 | Magic number */
|
||||
iso_msb(buf, 0x0be5a941, 4);
|
||||
|
||||
/* 28 - 29 | num_cyl_l | Number of usable cylinder, lower two bytes */
|
||||
num_cyl = (image_size + (bps * spt) - 1) / (bps * spt);
|
||||
iso_msb(buf + 28, num_cyl & 0xffff, 2);
|
||||
|
||||
/* 32 - 33 | 1 | Number of tracks per cylinder */
|
||||
iso_msb(buf + 32, 1, 2);
|
||||
|
||||
/* 35 - 35 | num_cyl_h | Number of usable cylinders, high byte */
|
||||
buf[35] = (num_cyl >> 16) & 0xff;
|
||||
|
||||
/* 38 - 39 | 32 | Sectors per track */
|
||||
iso_msb(buf + 38, spt, 2);
|
||||
|
||||
/* 40 - 41 | 512 | Bytes per sector */
|
||||
iso_msb(buf + 40, bps, 2);
|
||||
|
||||
/* 44 - 47 | 0x00000034 | Controller characteristics */
|
||||
iso_msb(buf + 44, 0x00000034, 4);
|
||||
|
||||
/* 72 - 87 | ========== | Volume Directory Entry 1 */
|
||||
/* 72 - 79 | boot_name | Boot file basename */
|
||||
/* 80 - 83 | boot_block | ISO 9660 LBA of boot file * 4 */
|
||||
/* 84 - 87 | boot_bytes | File length in bytes */
|
||||
/* 88 - 311 | 0 | Volume Directory Entries 2 to 15 */
|
||||
|
||||
for (idx = 0; idx < t->image->num_mips_boot_files; idx++) {
|
||||
ret = boot_nodes_from_iso_path(t, t->image->mips_boot_file_paths[idx],
|
||||
&node, &ecma_node, "MIPS boot file", 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
namept = (char *) iso_node_get_name(node);
|
||||
name_field = (char *) (buf + (72 + 16 * idx));
|
||||
strncpy(name_field, namept, 8);
|
||||
|
||||
file_lba = ecma_node->info.file->sections[0].block;
|
||||
|
||||
iso_msb(buf + (72 + 16 * idx) + 8, file_lba * 4, 4);
|
||||
|
||||
stream = iso_file_get_stream((IsoFile *) node);
|
||||
file_size = iso_stream_get_size(stream);
|
||||
|
||||
/* Shall i really round up to 2048 ? Steve says yes.*/
|
||||
iso_msb(buf + (72 + 16 * idx) + 12,
|
||||
((file_size + 2047) / 2048 ) * 2048, 4);
|
||||
|
||||
}
|
||||
|
||||
/* 408 - 411 | part_blks | Number of 512 byte blocks in partition */
|
||||
blocks = (image_size + bps - 1) / bps;
|
||||
iso_msb(buf + 408, blocks, 4);
|
||||
/* 416 - 419 | 0 | Partition is volume header */
|
||||
iso_msb(buf + 416, 0, 4);
|
||||
|
||||
/* 432 - 435 | part_blks | Number of 512 byte blocks in partition */
|
||||
iso_msb(buf + 432, blocks, 4);
|
||||
iso_msb(buf + 444, 6, 4);
|
||||
|
||||
/* 504 - 507 | head_chk | Volume header checksum
|
||||
The two's complement of bytes 0 to 503 read
|
||||
as big endian unsigned 32 bit:
|
||||
sum(32-bit-words) + head_chk == 0
|
||||
*/
|
||||
checksum = 0;
|
||||
for (idx = 0; idx < 504; idx += 4) {
|
||||
num = iso_read_msb(buf + idx, 4);
|
||||
/* Addition modulo a natural number is commutative and associative.
|
||||
Thus the inverse of a sum is the sum of the inverses of the addends.
|
||||
*/
|
||||
checksum -= num;
|
||||
}
|
||||
iso_msb(buf + 504, checksum, 4);
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/* The following two functions were implemented according to
|
||||
doc/boot_sectors.txt section "MIPS Little Endian" which was derived
|
||||
by Thomas Schmitt from
|
||||
cdrkit-1.1.10/genisoimage/boot-mipsel.c by Steve McIntyre which is based
|
||||
on work of Florian Lohoff and Thiemo Seufer,
|
||||
and from <elf.h> by Free Software Foundation, Inc.
|
||||
|
||||
Both functions are entirely under copyright (C) 2010 Thomas Schmitt.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Read the necessary ELF information from the first MIPS boot file.
|
||||
* This is done before image writing starts.
|
||||
*/
|
||||
int iso_read_mipsel_elf(Ecma119Image *t, int flag)
|
||||
{
|
||||
uint32_t phdr_adr, todo, count;
|
||||
int ret;
|
||||
uint8_t elf_buf[2048];
|
||||
IsoNode *iso_node;
|
||||
Ecma119Node *ecma_node;
|
||||
IsoStream *stream;
|
||||
|
||||
if (t->image->num_mips_boot_files <= 0)
|
||||
return ISO_SUCCESS;
|
||||
|
||||
ret = boot_nodes_from_iso_path(t, t->image->mips_boot_file_paths[0],
|
||||
&iso_node, &ecma_node, "MIPS boot file", 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
stream = iso_file_get_stream((IsoFile *) iso_node);
|
||||
|
||||
ret = iso_stream_open(stream);
|
||||
if (ret < 0) {
|
||||
iso_msg_submit(t->image->id, ret, 0,
|
||||
"Cannot open designated MIPS boot file '%s'",
|
||||
t->image->mips_boot_file_paths[0]);
|
||||
return ret;
|
||||
}
|
||||
ret = iso_stream_read(stream, elf_buf, 32);
|
||||
if (ret != 32) {
|
||||
cannot_read:;
|
||||
iso_stream_close(stream);
|
||||
iso_msg_submit(t->image->id, ret, 0,
|
||||
"Cannot read from designated MIPS boot file '%s'",
|
||||
t->image->mips_boot_file_paths[0]);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* 24 - 27 | e_entry | Entry point virtual address */
|
||||
t->mipsel_e_entry = iso_read_lsb(elf_buf + 24, 4);
|
||||
|
||||
/* 28 - 31 | e_phoff | Program header table file offset */
|
||||
phdr_adr = iso_read_lsb(elf_buf + 28, 4);
|
||||
|
||||
/* Skip stream up to byte address phdr_adr */
|
||||
todo = phdr_adr - 32;
|
||||
while (todo > 0) {
|
||||
if (todo > 2048)
|
||||
count = 2048;
|
||||
else
|
||||
count = todo;
|
||||
todo -= count;
|
||||
ret = iso_stream_read(stream, elf_buf, count);
|
||||
if (ret != count)
|
||||
goto cannot_read;
|
||||
}
|
||||
ret = iso_stream_read(stream, elf_buf, 20);
|
||||
if (ret != 20)
|
||||
goto cannot_read;
|
||||
|
||||
/* 4 - 7 | p_offset | Segment file offset */
|
||||
t->mipsel_p_offset = iso_read_lsb(elf_buf + 4, 4);
|
||||
|
||||
/* 8 - 11 | p_vaddr | Segment virtual address */
|
||||
t->mipsel_p_vaddr = iso_read_lsb(elf_buf + 8, 4);
|
||||
|
||||
/* 16 - 19 | p_filesz | Segment size in file */
|
||||
t->mipsel_p_filesz = iso_read_lsb(elf_buf + 16, 4);
|
||||
|
||||
iso_stream_close(stream);
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Write DEC Bootblock from previously read ELF parameters.
|
||||
* This is done when image writing has already begun.
|
||||
*/
|
||||
static int make_mipsel_boot_block(Ecma119Image *t, uint8_t *buf, int flag)
|
||||
{
|
||||
int ret;
|
||||
uint32_t seg_size, seg_start;
|
||||
IsoNode *iso_node;
|
||||
Ecma119Node *ecma_node;
|
||||
|
||||
/* Bytes 512 to 32767 may come from image or external file */
|
||||
memset(buf, 0, 512);
|
||||
|
||||
if (t->image->num_mips_boot_files <= 0)
|
||||
return ISO_SUCCESS;
|
||||
|
||||
ret = boot_nodes_from_iso_path(t, t->image->mips_boot_file_paths[0],
|
||||
&iso_node, &ecma_node, "MIPS boot file", 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* 8 - 11 | 0x0002757a | Magic number */
|
||||
iso_lsb(buf + 8, 0x0002757a, 4);
|
||||
|
||||
/* 12 - 15 | 1 | Mode 1: Multi extent boot */
|
||||
iso_lsb(buf + 12, 1, 4);
|
||||
|
||||
/* 16 - 19 | load_adr | Load address */
|
||||
iso_lsb(buf + 16, t->mipsel_p_vaddr, 4);
|
||||
|
||||
/* 20 - 23 | exec_adr | Execution address */
|
||||
iso_lsb(buf + 20, t->mipsel_e_entry, 4);
|
||||
|
||||
/* 24 - 27 | seg_size | Segment size in file. */
|
||||
seg_size = (t->mipsel_p_filesz + 511) / 512;
|
||||
iso_lsb(buf + 24, seg_size, 4);
|
||||
|
||||
/* 28 - 31 | seg_start | Segment file offset */
|
||||
seg_start = ecma_node->info.file->sections[0].block * 4
|
||||
+ (t->mipsel_p_offset + 511) / 512;
|
||||
iso_lsb(buf + 28, seg_start, 4);
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/* The following two functions were implemented according to
|
||||
doc/boot_sectors.txt section "SUN Disk Label and boot images" which
|
||||
was derived by Thomas Schmitt from
|
||||
cdrtools-2.01.01a77/mkisofs/sunlabel.h
|
||||
cdrtools-2.01.01a77/mkisofs/mkisofs.8
|
||||
by Joerg Schilling
|
||||
|
||||
Both functions are entirely under copyright (C) 2010 Thomas Schmitt.
|
||||
*/
|
||||
|
||||
/* @parm flag bit0= copy from next lower valid partition table entry
|
||||
*/
|
||||
static int write_sun_partition_entry(int partition_number,
|
||||
char *appended_partitions[],
|
||||
uint32_t partition_offset[], uint32_t partition_size[],
|
||||
uint32_t cyl_size, uint8_t *buf, int flag)
|
||||
{
|
||||
uint8_t *wpt;
|
||||
int read_idx, i;
|
||||
|
||||
if (partition_number < 1 || partition_number > 8)
|
||||
return ISO_ASSERT_FAILURE;
|
||||
|
||||
/* 142 - 173 | ========== | 8 partition entries of 4 bytes */
|
||||
wpt = buf + 142 + (partition_number - 1) * 4;
|
||||
if (partition_number == 1)
|
||||
iso_msb(wpt, 4, 2); /* 4 = User partition */
|
||||
else
|
||||
iso_msb(wpt, 2, 2); /* 2 = Root partition with boot image */
|
||||
iso_msb(wpt + 2, 0x10, 2); /* Permissions: 0x10 = read-only */
|
||||
|
||||
/* 444 - 507 | ========== | Partition table */
|
||||
wpt = buf + 444 + (partition_number - 1) * 8;
|
||||
read_idx = partition_number - 1;
|
||||
if (flag & 1) {
|
||||
/* Search next lower valid partition table entry. #1 is default */
|
||||
for (read_idx = partition_number - 2; read_idx > 0; read_idx--)
|
||||
if (appended_partitions[read_idx] != NULL)
|
||||
if (appended_partitions[read_idx][0] != 0)
|
||||
break;
|
||||
}
|
||||
iso_msb(wpt, partition_offset[read_idx] / (uint32_t) ISO_SUN_CYL_SIZE, 4);
|
||||
iso_msb(wpt + 4, partition_size[read_idx] * 4, 4);
|
||||
|
||||
/* 510 - 511 | checksum | The result of exoring 2-byte words 0 to 254 */
|
||||
buf[510] = buf[511] = 0;
|
||||
for (i = 0; i < 510; i += 2) {
|
||||
buf[510] ^= buf[i];
|
||||
buf[511] ^= buf[i + 1];
|
||||
}
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write SUN Disk Label with ISO in partition 1 and unused 2 to 8
|
||||
*/
|
||||
static int make_sun_disk_label(Ecma119Image *t, uint8_t *buf, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Bytes 512 to 32767 may come from image or external file */
|
||||
memset(buf, 0, 512);
|
||||
|
||||
/* 0 - 127 | label | ASCII Label */
|
||||
if (t->ascii_disc_label[0])
|
||||
strncpy((char *) buf, t->ascii_disc_label, 128);
|
||||
else
|
||||
strcpy((char *) buf,
|
||||
"CD-ROM Disc with Sun sparc boot created by libisofs");
|
||||
|
||||
/* 128 - 131 | 1 | Layout version */
|
||||
iso_msb(buf + 128, 1, 4);
|
||||
|
||||
/* 140 - 141 | 8 | Number of partitions */
|
||||
iso_msb(buf + 140, 8, 2);
|
||||
|
||||
/* 188 - 191 | 0x600ddeee | vtoc sanity */
|
||||
iso_msb(buf + 188, 0x600ddeee, 4);
|
||||
|
||||
/* 420 - 421 | 350 | Rotations per minute */
|
||||
iso_msb(buf + 420, 350, 2);
|
||||
|
||||
/* 422 - 423 | 2048 | Number of physical cylinders (fixely 640 MB) */
|
||||
iso_msb(buf + 422, 2048, 2);
|
||||
|
||||
/* 430 - 431 | 1 | interleave factor */
|
||||
iso_msb(buf + 430, 1, 2);
|
||||
|
||||
/* 432 - 433 | 2048 | Number of data cylinders (fixely 640 MB) */
|
||||
iso_msb(buf + 432, 2048, 2);
|
||||
|
||||
/* 436 - 437 | 1 | Number of heads per cylinder (1 cyl = 320 kB)*/
|
||||
iso_msb(buf + 436, 1, 2);
|
||||
|
||||
/* 438 - 439 | 640 | Number of sectors per head (1 head = 320 kB) */
|
||||
iso_msb(buf + 438, 640, 2);
|
||||
|
||||
/* 508 - 509 | 0xdabe | Magic Number */
|
||||
iso_msb(buf + 508, 0xdabe, 2);
|
||||
|
||||
/* Set partition 1 to describe ISO image and compute checksum */
|
||||
t->appended_part_start[0] = 0;
|
||||
t->appended_part_size[0] = t->curblock;
|
||||
ret = write_sun_partition_entry(1, t->appended_partitions,
|
||||
t->appended_part_start, t->appended_part_size,
|
||||
ISO_SUN_CYL_SIZE, buf, 0);
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
||||
{
|
||||
int ret, int_img_blocks, sa_type, i, will_append = 0;
|
||||
int first_partition = 1, last_partition = 4;
|
||||
uint32_t img_blocks;
|
||||
|
||||
if ((t == NULL) || (buf == NULL)) {
|
||||
return ISO_NULL_POINTER;
|
||||
@ -128,30 +697,47 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
||||
/* set buf to 0s */
|
||||
memset(buf, 0, 16 * BLOCK_SIZE);
|
||||
|
||||
sa_type = (t->system_area_options >> 2) & 0x3f;
|
||||
if (sa_type == 3) {
|
||||
first_partition = 2;
|
||||
last_partition = 8;
|
||||
}
|
||||
for (i = first_partition - 1; i <= last_partition - 1; i++)
|
||||
if (t->appended_partitions[i] != NULL) {
|
||||
will_append = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
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 &&
|
||||
} else if (sa_type == 0 && 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,
|
||||
&img_blocks, (char*)buf, 0);
|
||||
&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 isimple partition table */
|
||||
ret = make_grub_msdos_label(img_blocks, buf, 0);
|
||||
if (ret != 1) /* error should never happen */
|
||||
if (sa_type == 0 && (t->system_area_options & 1)) {
|
||||
/* Write GRUB protective msdos label, i.e. a simple partition table */
|
||||
ret = make_grub_msdos_label(img_blocks, t->partition_secs_per_head,
|
||||
t->partition_heads_per_cyl, buf, 0);
|
||||
if (ret != ISO_SUCCESS) /* error should never happen */
|
||||
return ISO_ASSERT_FAILURE;
|
||||
} else if(t->system_area_options & 2) {
|
||||
} else if(sa_type == 0 && (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
|
||||
@ -160,9 +746,66 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
||||
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);
|
||||
(uint32_t) 0, t->partition_heads_per_cyl,
|
||||
t->partition_secs_per_head, 0, 1, 0x17, buf, 1);
|
||||
if (ret != 1)
|
||||
return ret;
|
||||
} else if (sa_type == 1) {
|
||||
ret = make_mips_volume_header(t, buf, 0);
|
||||
if (ret != ISO_SUCCESS)
|
||||
return ret;
|
||||
} else if (sa_type == 2) {
|
||||
ret = make_mipsel_boot_block(t, buf, 0);
|
||||
if (ret != ISO_SUCCESS)
|
||||
return ret;
|
||||
} else if ((t->partition_offset > 0 || will_append) && sa_type == 0) {
|
||||
/* Write a simple partition table. */
|
||||
ret = make_grub_msdos_label(img_blocks, t->partition_secs_per_head,
|
||||
t->partition_heads_per_cyl, buf, 2);
|
||||
if (ret != ISO_SUCCESS) /* error should never happen */
|
||||
return ISO_ASSERT_FAILURE;
|
||||
if (t->partition_offset == 0) {
|
||||
/* Re-write partion entry 1 : start at 0, type Linux */
|
||||
ret = write_mbr_partition_entry(1, 0x83, 0, img_blocks,
|
||||
t->partition_secs_per_head, t->partition_heads_per_cyl,
|
||||
buf, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
} else if (sa_type == 3) {
|
||||
ret = make_sun_disk_label(t, buf, 0);
|
||||
if (ret != ISO_SUCCESS)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (t->partition_offset > 0 && sa_type == 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;
|
||||
}
|
||||
|
||||
/* This eventually overwrites the partition table entries made so far */
|
||||
for (i = first_partition - 1; i <= last_partition - 1; i++) {
|
||||
if (t->appended_partitions[i] == NULL)
|
||||
continue;
|
||||
if (sa_type == 3) {
|
||||
ret = write_sun_partition_entry(i + 1, t->appended_partitions,
|
||||
t->appended_part_start, t->appended_part_size,
|
||||
ISO_SUN_CYL_SIZE,
|
||||
buf, t->appended_partitions[i][0] == 0);
|
||||
} else {
|
||||
ret = write_mbr_partition_entry(i + 1, t->appended_part_types[i],
|
||||
t->appended_part_start[i], t->appended_part_size[i],
|
||||
t->partition_secs_per_head, t->partition_heads_per_cyl,
|
||||
buf, 0);
|
||||
}
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
@ -46,4 +46,16 @@ int make_isohybrid_mbr(int bin_lba, int *img_blocks, char *mbr, int flag);
|
||||
*/
|
||||
int iso_write_system_area(Ecma119Image *t, uint8_t *buf);
|
||||
|
||||
|
||||
/**
|
||||
* Read the necessary ELF information from the first MIPS boot file.
|
||||
* See doc/boot_sectors.txt "DEC Boot Block" for "MIPS Little Endian".
|
||||
*/
|
||||
int iso_read_mipsel_elf(Ecma119Image *t, int flag);
|
||||
|
||||
|
||||
/* Compute size and position of appended partitions.
|
||||
*/
|
||||
int iso_compute_append_partitions(Ecma119Image *t, int flag);
|
||||
|
||||
#endif /* SYSTEM_AREA_H_ */
|
||||
|
@ -11,6 +11,10 @@
|
||||
* Functions that act on the iso tree.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "node.h"
|
||||
#include "image.h"
|
||||
|
@ -9,6 +9,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "util.h"
|
||||
#include "libisofs.h"
|
||||
#include "messages.h"
|
||||
|
@ -7,6 +7,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "util.h"
|
||||
#include "libisofs.h"
|
||||
|
||||
|
@ -7,6 +7,10 @@
|
||||
* See COPYING file for details.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "util.h"
|
||||
#include "libisofs.h"
|
||||
|
||||
@ -281,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) {
|
||||
@ -292,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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user